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
at91 gpio на ядре 3.6.9 - 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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:7
Форум » starterkit.ru » Embedded Linux
at91 gpio на ядре 3.6.9
Urrys
Добавлено 09.11.2013 03:16
0
Сообщение: 1
Urrys
5

Пункты: 1551
Регистрация: 07.07.2012
Привет,


Юзаю борду at91sam9x5ek, ядро взял с github.com/linux4sam/linux-at91 (branch linux-3.6.9-at91).
На прошлом ядре 2.6.39, gpio из кернел спейса юзал функциями at91_* и всё нормально работало:
Код
at91_set_gpio_output(AT91_PIN_PC11, 0);

Далее изменял значения через
Код
at91_set_gpio_value(AT91_PIN_PC11, 0);


На новом же ядре (3.6.9) так не выходит, значения gpio не меняет.
работают только функции:
Код
gpio_direction_output(AT91_PIN_PC11, 0);
gpio_set_value(AT91_PIN_PC11, 0);


Это косяк или нет? Какие gpio функции корректно использовать в кернел спейсе?

На сколько я знаю функции at91_* напрямую пишут в регистры, ну почему не меняются значения gpio на новом ядре...
Спуститься к концу Подняться к началу
Персональная информация
Urrys
Добавлено 11.11.2013 11:06 Сообщение: 2
Urrys
5

Пункты: 1551
Регистрация: 07.07.2012
Похоже что все пини теперь дефайнить только через pinctrl в device tree. Но до сих пор так и немогу назначить свои gpio пины в device tree в кастом секции.

Допустим я хочу задефайнить пин PB14 как GPIO pull down. Работает следующим образом:

Код
pinctrl@fffff400 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "atmel,at91sam9x5-pinctrl", "atmel,at91rm9200-pinctrl", "simple-bus";
ranges = <0xfffff400 0xfffff400 0x800>;

macb0 {
pinctrl_macb0_rmii: macb0_rmii-0 {
atmel,pins =
<1 0 0x1 0x0 /* PB0 periph A ERX0 */
1 1 0x1 0x0 /* PB1 periph A ERX1 */
1 2 0x1 0x0 /* PB2 periph A ERXER */
1 3 0x1 0x0 /* PB3 periph A ERXDV */
1 4 0x1 0x0 /* PB4 periph A ETXCK */
1 5 0x1 0x0 /* PB5 periph A EMDIO */
1 6 0x1 0x0 /* PB6 periph A EMDC */
1 7 0x1 0x0 /* PB7 periph A ETXEN */
1 9 0x1 0x0 /* PB9 periph A ETX0 */
1 10 0x1 0x0 /* PB10 periph A ETX1 */
1 14 0x0 0x8>; /* добавляю свой PB14 gpio pull down пин*/
};
};

macb0: ethernet@f802c000 {
compatible = "cdns,at32ap7000-macb", "cdns,macb";
reg = <0xf802c000 0x100>;
interrupts = <24 4 3>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_macb0_rmii>;
status = "disabled";
};


Далее в другом файле ваше уровнем:

Код
macb0: ethernet@f802c000 {
status = "okay";
};

Так работает, при загрузки системы напряжение на пине PB14 падает в 0 тоесть мой дефайн пина сработал. Но как видите я его по кривому задефайнил в секции pinctrl_macb0_rmii. И похоже что пины начинают дефайниться только когда драйвер посылает запрос в pinctrl.

Моя цель - задефайнить несколько своих gpio пинов и потом использовать из кернел и юзер спейса. Выше приведённый пример чисто для теста, но как заставить чтобы пины дефайнились из моей собственной секции. Допустим я имею такую секцию:

Код
yury0 {
pinctrl_yury0_test: yury0_test-0 {
atmel,pins =
<1 14 0x0 0x8>;
};
};


Что нужно ещё прописть чтобы этот дефайн прошёл?
В инете так и немогу найти нормальной информации по этому поводу.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 11.11.2013 18:14 Сообщение: 3
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Моя цель - задефайнить несколько своих gpio пинов и потом использовать из кернел и юзер спейса.

не знаю, как вы пользовали юзер-спейс, но в кернел-спейс все осталось как и было, в ванильном 3.10.9 в файле борды 9m109g45 например:
Код
/* If enabled, give a reset impulse */
at91_set_gpio_output(AT91_PIN_PD12, 0);
msleep(20);
at91_set_gpio_output(AT91_PIN_PD12, 1);

в ванильном 3.6.0 я пользуюсь mmap из проги пользователя и вполне себе, безо всяких tree-devices рулю пинами..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Urrys
Добавлено 11.11.2013 20:35 Сообщение: 4
Urrys
5

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

не знаю, как вы пользовали юзер-спейс, но в кернел-спейс все осталось как и было, в ванильном 3.10.9 в файле борды 9m109g45 например:


В вашем случае это работает так как я предполагаю что у вас инициализация борды выполняется через *.c файлы (Linux/arch/arm/mach-at91/at91sam9g45.c), и при старте ядра выполняется инициализация PIO периферии:
Код
330 static struct at91_gpio_bank at91sam9g45_gpio[] __initdata = {
331 {
332 .id = AT91SAM9G45_ID_PIOA,
333 .regbase = AT91SAM9G45_BASE_PIOA,
334 }, {
335 .id = AT91SAM9G45_ID_PIOB,
336 .regbase = AT91SAM9G45_BASE_PIOB,
. . . . . . .

375 /* Register GPIO subsystem */
376 at91_gpio_init(at91sam9g45_gpio, 5);


После этого вы можете дёргать gpio функциями at91_*.

В моём же случае это не покатит (борда at91sam9x25ek), специфик С код борды отсох и теперь используется только dts файлы, там же дефайн пинов выполняется через pinctrl, а кернел билдится уже НЕ под конкретную борду. Поэтому при такой загрузке at91_* функции будут фелится так как не была инициализирована GPIO subsystem а именно не выполнена функция at91_gpio_init(...

Поэтому в моём случае наиболее правильней будет инициализировать нужные мне пины в dts файле, а тоесть выставить у пина переферию, pull up/down резисторы. И потом с помощью ядерных функций дёргать gpio, к примеру:
Код
gpio_direction_output(AT91_PIN_PC11, 0);
gpio_set_value(AT91_PIN_PC11, 0);


Тоесть мой главный вопрос как правильно прописать в dts файле дефайн пинов?

По ходу дела, возник ещё один вопрос - функцию gpio_set_value(pin, value) можно ли использовать в хард интерапт хендлере?
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux