Warning: touch() [function.touch]: Unable to create file /home/starterkit/starterkit.ru/html/error.log because Permission denied in /home/starterkit/starterkit.ru/html/errorhandler.php on line 51
Стыковка SAMA5D + MCP2515 (по SPI) - Embedded Linux - Форум - starterkit.ru
Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:2
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
Стыковка SAMA5D + MCP2515 (по SPI)
mike_mvk
Добавлено 20.02.2015 17:56
0
Сообщение: 1
mike_mvk
0

Пункты: 150
Регистрация: 19.02.2015
Имеется плата с установленным на ней модулем SAMA5D35. На плате установлен контроллер can MCP2515 и подключен по SPI к процессорному модулю (используется SPI1).


При старте системы ( Linux 3.10 at91, Buildroot 2013.11 ) с включенной расширенной отладкой драйверов имеем:
Код

...

bus: 'spi': add driver spidev
bus: 'platform': add driver atmel_spi
bus: 'platform': driver_probe_device: matched device f8008000.spi with driver atmel_spi
bus: 'platform': really_probe: probing driver atmel_spi with device f8008000.spi
atmel_spi f8008000.spi: could not get sleep pinstate
atmel_spi f8008000.spi: version: 0x213
atmel_spi f8008000.spi: Using dma1chan0 (tx) and dma1chan1 (rx) for DMA transfers
atmel_spi f8008000.spi: Atmel SPI Controller at 0xf8008000 (irq 24)
device: 'spi32766': device_add
PM: Adding info for No Bus:spi32766
atmel_spi f8008000.spi: registered master spi32766 (dynamic)
atmel_spi f8008000.spi: master is unqueued, this is deprecated
spi spi32766.0: setup: 14666666 Hz bpw 8 mode 0x0 -> csr0 00000902
spi spi32766.0: setup mode 0, 8 bits/w, 16000000 Hz max --> 0
device: 'spi32766.0': device_add
bus: 'spi': add device spi32766.0
PM: Adding info for spi:spi32766.0
atmel_spi f8008000.spi: registered child spi32766.0
driver: 'f8008000.spi': driver_bound: bound to device 'atmel_spi'
bus: 'platform': really_probe: bound device f8008000.spi to driver atmel_spi

...

bus: 'spi': add driver mcp251x
bus: 'spi': driver_probe_device: matched device spi32766.0 with driver mcp251x
bus: 'spi': really_probe: probing driver mcp251x with device spi32766.0
mcp251x spi32766.0: no default pinctrl state
mcp251x: probe of spi32766.0 rejects match -19




Фрагменты DTS касательно сабжа:

Код


clocks {

...
mcp251x_clock: mcp2515 {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <16000000>;
};

...

};




Код


ahb {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges;

apb {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges;

pinctrl@fffff200 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "atmel,at91sam9x5-pinctrl", "atmel,at91rm9200-pinctrl", "simple-bus";
ranges = <0xfffff200 0xfffff200 0xa00>;
atmel,mux-mask = <
/* A B C */
0xffffffff 0xc0fc0000 0xc0ff0000 /* pioA */
0xffffffff 0x0ff8ffff 0x00000000 /* pioB */
0xffffffff 0xbc00f1ff 0x7c00fc00 /* pioC */
0xffffffff 0xc001c0e0 0x0001c1e0 /* pioD */
0xffffffff 0xbf9f8000 0x18000000 /* pioE */
>;


...
spi1 {
pinctrl_spi1: spi1-0 {
atmel,pins =
<AT91_PIOC 22 AT91_PERIPH_A AT91_PINCTRL_NONE /* PC22 periph A SPI1_MISO pin */
AT91_PIOC 23 AT91_PERIPH_A AT91_PINCTRL_NONE /* PC23 periph A SPI1_MOSI pin */
AT91_PIOC 24 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* PC24 periph A SPI1_SPCK pin */
};
};

...

};



Код

spi1: spi@ff8008000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "atmel,at91rm9200-spi";
reg = <0xf8008000 0x100>;
interrupts = <25 IRQ_TYPE_LEVEL_HIGH 3>;
dmas = <&dma1 2 AT91_DMA_CFG_PER_ID(15)>,
<&dma1 2 AT91_DMA_CFG_PER_ID(16)>;
dma-names = "tx", "rx";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi1>;
cs-gpios = <&pioC 25 0>, <&pioC 26 0>, <0>, <0>;
status = "okay";

can2: mcp2515@0 {
compatible = "microchip,mcp2515";
reg=<0>;
spi-max-frequency = <20000000>;
oscillator-frequency = <16000000>;
clocks = <&mcp251x_clock>;
interrupt-parent = <&pioC>; /* MCP GPO Interrupt */
interrupts = <12 0x2>;
};

};


Судя по всему не заводится именно SPI. Устройство в /dev/ не появляется...

Что я делаю не так?
Спуститься к концу Подняться к началу
Персональная информация
mike_mvk
Добавлено 20.02.2015 18:58 Сообщение: 2
mike_mvk
0

Пункты: 150
Регистрация: 19.02.2015
Прошу тему вернуть на предыдущее место, "Embedded Linux". Вопрос не касается чисто процессорного модуля SAMA5D. Вопрос скорее в корректном формировании DTS файла.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 20.02.2015 20:29 Редактировалось 20.02.2015 20:47 Сообщение: 3
sasamy
4.70

Пункты: 76182
Регистрация: 14.08.2009
Цитата

Судя по всему не заводится именно SPI.


как тогда тачскрин работает ? и зачем было весь dts перекореживать - там же в ядре готовые dts есть для платы, и в драйвере mcp251x.c в ядре 3.10 нет поддержки device tree.
Спуститься к концу Подняться к началу
Персональная информация
mike_mvk
Добавлено 21.02.2015 12:27 Сообщение: 4
mike_mvk
0

Пункты: 150
Регистрация: 19.02.2015
Цитата
Цитата

Судя по всему не заводится именно SPI.


как тогда тачскрин работает ? и зачем было весь dts перекореживать - там же в ядре готовые dts есть для платы, и в драйвере mcp251x.c в ядре 3.10 нет поддержки device tree.


Плата собственной разработки и со своей периферией. Тач скрина там нет в помине. Собственно dts в любом случае пришлось корежить.
Насчет поддержки device tree - попробую проверить, может быть в этом и есть проблема.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 21.02.2015 12:53 Редактировалось 21.02.2015 13:23 Сообщение: 5
sasamy
4.70

Пункты: 76182
Регистрация: 14.08.2009
Цитата

Плата собственной разработки и со своей периферией. Тач скрина там нет в помине.


без разницы - раз уж вы на нашем форуме вопрос задали - на местных платах с тем же ядром на spi навешен тачскрин и spi работает без всяких сомнений.

Цитата

Собственно dts в любом случае пришлось корежить.


корежить ничего не надо - просто делаете инклуд - даже не важно dtsi или dts и прописываете только то что у вас отличается - остальное описание наследуется из вложенного(ых) описания(ий)

#include "sama5d3.dtsi"
...
ahb {
apb {
spi1: spi@f8008000 {
cs-gpios = <&pioC 25 0>, <&pioC 26 0>;
status = "okay";

can2: mcp2515@0 {
compatible = "microchip,mcp2515";
reg=<0>;
spi-max-frequency = <20000000>;
oscillator-frequency = <16000000>;
clocks = <&mcp251x_clock>;
interrupt-parent = <&pioC>; /* MCP GPO Interrupt */
interrupts = <12 0x2>;
};
};

поддержка device tree появилась в 3.14 у этого драйвера

http://lxr.free-electrons.com/source/drivers/net/can/mcp251x.c?v=3.14#L72

помоему достаточно будет просто заменить этот файл
Спуститься к концу Подняться к началу
Персональная информация
mike_mvk
Добавлено 22.02.2015 17:35 Сообщение: 6
mike_mvk
0

Пункты: 150
Регистрация: 19.02.2015
Что-то я не вижу там поддержки Device Tree...

Код

struct mcp251x_platform_data *pdata = dev_get_platdata(&spi->dev);


Как было через platform_data, так и осталось.
Спуститься к концу Подняться к началу
Персональная информация
mike_mvk
Добавлено 28.02.2015 10:01 Редактировалось 28.02.2015 10:07 Сообщение: 7
mike_mvk
0

Пункты: 150
Регистрация: 19.02.2015
Вроде удалось решить проблему самому. Написал некую "начальную" поддержку device tree. В параметрах пока передеается только частота кварца (mcp251x,oscillator-frequency). Параметр dma забит 1 по-умолчанию. Функции board_specific_setup, power_enable и transceiver_enable я пока не реализовывал (мне не требуются). Если нужно - могу помочь дописать.

По ссылкам (все для ядра 3.10 !!! на других не тестировал):
патчик для ядра https://dl.dropboxusercontent.com/u/3528410/mcp251x_dts_linux-3.10/mcp251x_dts.patch
и уже измененный файл драйвера https://dl.dropboxusercontent.com/u/3528410/mcp251x_dts_linux-3.10/mcp251x.c


Выдержки из моего DTS (на SPI1 висит 2 контроллера, CS - PIOC25 и PIOC26, сигналы перерываний - PIOC12 и PIOC14):

Код

ahb {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges;

apb {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges;

pinctrl@fffff200 {

....

can2 {
pinctrl_mcp2515_0: pinctrl_mcp2515_0-0 {
atmel,pins = <AT91_PIOC 12 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP>;
};
};

can3 {
pinctrl_mcp2515_1: pinctrl_mcp2515_1-0 {
atmel,pins = <AT91_PIOC 14 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP>;
};
};
...
}



Код


spi1: spi@ff8008000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "atmel,at91rm9200-spi";
reg = <0xf8008000 0x100>;
interrupts = <25 IRQ_TYPE_LEVEL_HIGH 3>;
dmas = <&dma1 2 AT91_DMA_CFG_PER_ID(15)>,
<&dma1 2 AT91_DMA_CFG_PER_ID(16)>;
dma-names = "tx", "rx";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi1>;
cs-gpios = <&pioC 25 0>, <&pioC 26 0>, <0>, <0>;
status = "okay";

can2: mcp2515@0 {
compatible = "microchip,mcp2515";
reg=<0>;
spi-max-frequency = <10000000>;
mcp251x,oscillator-frequency = <16000000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mcp2515_0>;
interrupt-parent = <&pioC>; /* MCP GPO Interrupt */
interrupts = <12 0x2>;
};

can3: mcp2515@1 {
compatible = "microchip,mcp2515";
reg=<1>;
spi-max-frequency = <10000000>;
mcp251x,oscillator-frequency = <16000000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mcp2515_1>;
interrupt-parent = <&pioC>; /* MCP GPO Interrupt */
interrupts = <14 0x2>;
};

};

Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux