Описание FPGA в device tree
Romantic |
|
|
|
|
|
|
|
Пункты: 2214 |
Регистрация: 20.11.2009 |
Пол: Мужчина |
|
|
Столкнулся с такой проблемой, продолжая ковырять ядро 3.16 для кастомной платы с at91sam9g45 и FPGA на одном из чип-селектов. Раньше я взаимодействие с ПЛИС программировал с помощью модуля ядра (настраивал и SMC, и порты GPIO, и прерывания от FPGA). Но в 3.16 обнаружилась новая подлянка - функции управления PIO (мультиплексирование (at91_set_A_periph), и даже макросы идентификации пинов) убрали из общедоступных заголовков в собственный gpio.h, который не входит в -I, то есть, пользоваться этими макровами и функциями можно только внутри ядра (в файлах arch/arm/mach-at91/board-*). А посколку я начал делать BSP для ядра на DTS, то теперь, очевидно, и параметры SMC, и прерывания тоже нужно описывать на DTS.
Как быть? Кто-нибудь описывал на DTS простое регистровое устройство с прерывателем? |
|
|
|
|
|
sasamy |
|
|
|
|
|
|
|
Пункты: 83540 |
Регистрация: 14.08.2009 |
|
|
|
Посмотрите как описан любой контроллер и сделайте по аналогии. Например spi0
arch/arm/boot/dts/at91sam9g45.dtsi
spi0: spi@fffa4000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "atmel,at91rm9200-spi";
reg = <0xfffa4000 0x200>;
interrupts = <14 4 3>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi0>;
status = "disabled";
};
pinctrl@fffff200 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "atmel,at91rm9200-pinctrl", "simple-bus";
ranges = <0xfffff200 0xfffff200 0xa00>;
............
spi0 {
pinctrl_spi0: spi0-0 {
atmel,pins =
<AT91_PIOB 0 AT91_PERIPH_A AT91_PINCTRL_NONE /* PB0 periph A SPI0_MISO pin */
AT91_PIOB 1 AT91_PERIPH_A AT91_PINCTRL_NONE /* PB1 periph A SPI0_MOSI pin */
AT91_PIOB 2 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* PB2 periph A SPI0_SPCK pin */
};
};
http://lxr.free-electrons.com/source/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt#L46 |
|
|
|
|
|
Romantic |
|
|
|
|
|
|
|
Пункты: 2214 |
Регистрация: 20.11.2009 |
Пол: Мужчина |
|
|
Спасибо за ответ. С pinctrl все в принципе понятно, они везде встречаются. Чего мне не хватает - это как запрограммировать SMC (нестандартные значения PULSE, CYCLE, SETUP) - это вот нигде не встречается. И еще - настроить прерывание на один из пинов (это видимо, в dts придется делать, но в примерах не упоминаются пины, только какие-то числа (номера каналов контроллера прерываний, видимо), а в модуле ядра - установить обработчик на него, для этого нужно еще как-то указать, куда вешать обработчик, а констант AT91_PIN_PA1 нет. |
|
|
|
|
|
sasamy |
|
|
|
|
|
|
|
Пункты: 83540 |
Регистрация: 14.08.2009 |
|
|
|
|
|
|
|
Romantic |
|
|
|
|
|
|
|
Пункты: 2214 |
Регистрация: 20.11.2009 |
Пол: Мужчина |
|
|
Спасибо, очень полезная презенташка. Вот, нашел еще по связи с драйвером:
http://xillybus.com/tutorials/device-tree-zynq-1
Разобрался, с программированием pinctrl (пока в теории), пространства ввода-вывода и прерываний, но одна проблемка:
Вот никак не могу найти, как запрограммировать параметры static memory controller (регистры Setup, Pulse, Cycle) - без них регистровые операции с плис на одном из chip select как минимум работает неправильно. |
|
|
|
|
|
Romantic |
|
|
|
|
|
|
|
Пункты: 2214 |
Регистрация: 20.11.2009 |
Пол: Мужчина |
|
|
UPD: решено, все-таки sam9_smc_configure в модуле ядра вроде скомпилялась |
|
|
|
|
|
Romantic |
|
|
|
|
|
|
|
Пункты: 2214 |
Регистрация: 20.11.2009 |
Пол: Мужчина |
|
|
UPD2: не совсем. функция-то есть, но io-remap для регистров, которые она использует, не выполняется. Все-таки, придется сырцы ядра менять, не получается по-чистому, одним только dts обойтись |
|
|
|
|
|
|