Юзаю борду at91sam9x5ek, ядро взял с github.com/linux4sam/linux-at91 (branch linux-3.6.9-at91).
На прошлом ядре 2.6.39, gpio из кернел спейса юзал функциями at91_* и всё нормально работало:
Далее изменял значения через
На новом же ядре (3.6.9) так не выходит, значения gpio не меняет.
работают только функции:
Это косяк или нет? Какие gpio функции корректно использовать в кернел спейсе?
На сколько я знаю функции at91_* напрямую пишут в регистры, ну почему не меняются значения gpio на новом ядре...
Похоже что все пини теперь дефайнить только через pinctrl в device tree. Но до сих пор так и немогу назначить свои gpio пины в device tree в кастом секции.
Допустим я хочу задефайнить пин PB14 как GPIO pull down. Работает следующим образом:
Далее в другом файле ваше уровнем:
Так работает, при загрузки системы напряжение на пине PB14 падает в 0 тоесть мой дефайн пина сработал. Но как видите я его по кривому задефайнил в секции pinctrl_macb0_rmii. И похоже что пины начинают дефайниться только когда драйвер посылает запрос в pinctrl.
Моя цель - задефайнить несколько своих gpio пинов и потом использовать из кернел и юзер спейса. Выше приведённый пример чисто для теста, но как заставить чтобы пины дефайнились из моей собственной секции. Допустим я имею такую секцию:
Что нужно ещё прописть чтобы этот дефайн прошёл?
В инете так и немогу найти нормальной информации по этому поводу.
В вашем случае это работает так как я предполагаю что у вас инициализация борды выполняется через *.c файлы (Linux/arch/arm/mach-at91/at91sam9g45.c), и при старте ядра выполняется инициализация PIO периферии:
После этого вы можете дёргать gpio функциями at91_*.
В моём же случае это не покатит (борда at91sam9x25ek), специфик С код борды отсох и теперь используется только dts файлы, там же дефайн пинов выполняется через pinctrl, а кернел билдится уже НЕ под конкретную борду. Поэтому при такой загрузке at91_* функции будут фелится так как не была инициализирована GPIO subsystem а именно не выполнена функция at91_gpio_init(...
Поэтому в моём случае наиболее правильней будет инициализировать нужные мне пины в dts файле, а тоесть выставить у пина переферию, pull up/down резисторы. И потом с помощью ядерных функций дёргать gpio, к примеру:
Тоесть мой главный вопрос как правильно прописать в dts файле дефайн пинов?
По ходу дела, возник ещё один вопрос - функцию gpio_set_value(pin, value) можно ли использовать в хард интерапт хендлере?