реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Atmel AT91 linux 3.6.9 как назначить GPIO пины через device tree
Yury Sokolov
сообщение Nov 11 2013, 11:59
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 19-08-13
Пользователь №: 77 974



Привет всем,

Юзаю борду at91sam9x25ek, ядро взял с github.com/linux4sam/linux-at91 (branch linux-3.6.9-at91). На старом ядре 2.6.39 для дефайна gpio пинов просто вызывал из кернал спейса или из специфик кода инициализации платы:
Код
at91_set_gpio_output(unsigned pin, int value)
или
at91_set_gpio_input(unsigned pin, int use_pullup)

и далее юзал:
Код
at91_get_gpio_value(unsigned pin)
или
at91_set_gpio_value(unsigned pin, int value)


На новых же ядрах инициализация производится через dts (device tree) файлы. Так вот хотелось бы назначить свои кастом gpio пины которые в последствии буду использовать в модуле ядра. Для тестов добавил свой пин PB14 в инициялизацию пинов для сетевого драйвера:
Код
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>; /* !!!JUST for test, PB14 as 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 пинов и потом использовать из кернел и юзер спейса. Выше приведённый пример чисто для теста, но как заставить чтобы пины дефайнились из моей собственной секции. Допустим я имею такую секцию:
Код
custom_pins {
    pinctrl_custom_pins_test: custom_pins_test-0 {
        atmel,pins =
            <1 14 0x0 0x8>; /*PB14 gpio pull down*/
    };
};

Что нужно ещё прописать чтобы этот дефайн прошёл? Не могу разобраться как при загрузки инициализировать собственные gpio пины.

Заранее спасибо за ответы.
Go to the top of the page
 
+Quote Post
Harbour
сообщение Nov 12 2013, 07:56
Сообщение #2


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



мне понравился gpio-block patch, даже его спецом бэкпортировал в 3.6.9, борда на SAMA5D3x, выглядит так :

Код
blockgpio {
  compatible = "linux,gpio-block";

  buttons {
          gpios = <&pioA 16 0>,
                  <&pioA 17 0>,
                  <&pioA 18 0>,
                  <&pioA 19 0>;
  };

  leds {
          gpios = <&pioA 24 0>,
                  <&pioA 25 0>,
                  <&pioA 26 0>,
                  <&pioA 27 0>;
  };

  lcd_data {
          gpios = <&pioA 04 0>,
                  <&pioA 05 0>,
                  <&pioA 06 0>,
                  <&pioA 07 0>;
  };

  lcd_ctrl {
          gpios = <&pioA 00 0>,
                  <&pioA 01 0>,
                  <&pioA 02 0>;
  };
  lcd_settings {
          gpios = <&pioA 10 0>,
                  <&pioA 11 0>;
  };
};


gpio-block позволяет работать с набором пинов как с шиной, из userspace триггерить пины по select/poll, ну и kernel API тоже присутствует.
Go to the top of the page
 
+Quote Post
Yury Sokolov
сообщение Nov 12 2013, 08:47
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 19-08-13
Пользователь №: 77 974



В моём случае gpio-block не требуется. Если подругому никак нельзя инициализировать пины то как же вообще на ядре 3.x использовать gpio в кернел спейсе. На 2.6.х использовал at91_* функции но теперь они не катят так как инициализация борды выполняется через dts файлы.

В конечном итоге мне надо проинициализировать пин как gpio input pull down и потом ловить прерывания на нём.

У меня никак не получается это сделать на ядре 3.x
Go to the top of the page
 
+Quote Post
Harbour
сообщение Nov 12 2013, 09:06
Сообщение #4


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



думаю через стандартный стек вызовов:

...
gpio_request_one()
gpio_direction_input()
gpio_to_irq()
...

сам этим путем не шел, так как сразу юзал gpio-block
Go to the top of the page
 
+Quote Post
Yury Sokolov
сообщение Nov 12 2013, 10:41
Сообщение #5





Группа: Новичок
Сообщений: 6
Регистрация: 19-08-13
Пользователь №: 77 974



Цитата(Harbour @ Nov 12 2013, 13:06) *
думаю через стандартный стек вызовов:

...
gpio_request_one()
gpio_direction_input()
gpio_to_irq()
...

сам этим путем не шел, так как сразу юзал gpio-block



Всё бы хорошо, ну как включить pull up/down или deglitch. Разве никто не делал управление по gpio на linux 3.x.

На linux 2.6.39 даже и не задумывался об этом а просто дёргал at91_* функции. Если ктонибудь имел дело с gpio на ядре 3.x приведите примеры. Весь инет облазил не могу толкового ничего найти.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 14:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016