Ник:
Пароль:

Контакты

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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:7
Форум » starterkit.ru » Embedded Linux
Описание FPGA в device tree
Romantic
Добавлено 18.09.2014 12:00
0
Сообщение: 1
Romantic
3

Пункты: 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
Добавлено 18.09.2014 18:52 Редактировалось 18.09.2014 18:56 Сообщение: 2
sasamy
4.70

Пункты: 77362
Регистрация: 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
Добавлено 18.09.2014 23:17 Сообщение: 3
Romantic
3

Пункты: 2214
Регистрация: 20.11.2009
Пол: Мужчина
Спасибо за ответ. С pinctrl все в принципе понятно, они везде встречаются. Чего мне не хватает - это как запрограммировать SMC (нестандартные значения PULSE, CYCLE, SETUP) - это вот нигде не встречается. И еще - настроить прерывание на один из пинов (это видимо, в dts придется делать, но в примерах не упоминаются пины, только какие-то числа (номера каналов контроллера прерываний, видимо), а в модуле ядра - установить обработчик на него, для этого нужно еще как-то указать, куда вешать обработчик, а констант AT91_PIN_PA1 нет.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 19.09.2014 00:51 Редактировалось 19.09.2014 00:52 Сообщение: 4
sasamy
4.70

Пункты: 77362
Регистрация: 14.08.2009
Внешнее прерывание от GPIO в DTS настраивается достаточно просто, ближе для атмела пример

http://lxr.free-electrons.com/source/arch/arm/boot/dts/at91sam9n12ek.dts#L61

interrupt-parent = <&pioA>;
interrupts = <2 IRQ_TYPE_EDGE_FALLING>;

это настраивается прерывание от PA2

Посмотрите эту презентацию - там достаточно кратко и понятно описано что откуда берется в драйвере

http://events.linuxfoundation.org/sites/events/files/slides/petazzoni-device-tree-dummies.pdf
Спуститься к концу Подняться к началу
Персональная информация
Romantic
Добавлено 25.09.2014 19:48 Сообщение: 5
Romantic
3

Пункты: 2214
Регистрация: 20.11.2009
Пол: Мужчина
Спасибо, очень полезная презенташка. Вот, нашел еще по связи с драйвером:
http://xillybus.com/tutorials/device-tree-zynq-1

Разобрался, с программированием pinctrl (пока в теории), пространства ввода-вывода и прерываний, но одна проблемка:

Вот никак не могу найти, как запрограммировать параметры static memory controller (регистры Setup, Pulse, Cycle) - без них регистровые операции с плис на одном из chip select как минимум работает неправильно.
Спуститься к концу Подняться к началу
Персональная информация
Romantic
Добавлено 25.09.2014 21:40 Сообщение: 6
Romantic
3

Пункты: 2214
Регистрация: 20.11.2009
Пол: Мужчина
UPD: решено, все-таки sam9_smc_configure в модуле ядра вроде скомпилялась
Спуститься к концу Подняться к началу
Персональная информация
Romantic
Добавлено 26.09.2014 09:22 Сообщение: 7
Romantic
3

Пункты: 2214
Регистрация: 20.11.2009
Пол: Мужчина
UPD2: не совсем. функция-то есть, но io-remap для регистров, которые она использует, не выполняется. Все-таки, придется сырцы ядра менять, не получается по-чистому, одним только dts обойтись
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux