User Info
Добро пожаловать, Guest Пользователей: 1 Поисковых ботов: 3 Гостей: 1
Google Bot forum oBot forum Yandex Bot forum yhysafok account
Стыковка SAMA5D + MCP2515 (по SPI)
mike_mvk
Пункты: 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
Пункты: 150
Регистрация: 19.02.2015
Прошу тему вернуть на предыдущее место, "Embedded Linux". Вопрос не касается чисто процессорного модуля SAMA5D. Вопрос скорее в корректном формировании DTS файла.
sasamy
Пункты: 83540
Регистрация: 14.08.2009
Цитата
Судя по всему не заводится именно SPI.
как тогда тачскрин работает ? и зачем было весь dts перекореживать - там же в ядре готовые dts есть для платы, и в драйвере mcp251x.c в ядре 3.10 нет поддержки device tree.
mike_mvk
Пункты: 150
Регистрация: 19.02.2015
Цитата Цитата
Судя по всему не заводится именно SPI.
как тогда тачскрин работает ? и зачем было весь dts перекореживать - там же в ядре готовые dts есть для платы, и в драйвере mcp251x.c в ядре 3.10 нет поддержки device tree.
Плата собственной разработки и со своей периферией. Тач скрина там нет в помине. Собственно dts в любом случае пришлось корежить.
Насчет поддержки device tree - попробую проверить, может быть в этом и есть проблема.
sasamy
Пункты: 83540
Регистрация: 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
Пункты: 150
Регистрация: 19.02.2015
Что-то я не вижу там поддержки Device Tree...
Код
struct mcp251x_platform_data *pdata = dev_get_platdata(&spi->dev);
Как было через platform_data, так и осталось.
mike_mvk
Пункты: 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>;
};
};