Встроенное системное прерывание / обработка оборудования из Linux - PullRequest
3 голосов
/ 07 февраля 2011

На моей плате AT91SAM9RL-EK ARM под управлением Linux 2.6.30 у меня есть следующее.

cat /proc/interrupts
           CPU0
  1:       6475         AIC  at91_tick, rtc0, ttyS0
 10:         11         AIC  mmc0
 13:          4         AIC  atmel_spi.0
 18:      23533         AIC  tc_clkevt
 20:          0         AIC  atmel_tsadcc
 22:          0         AIC  atmel_usba_udc
 23:          0         AIC  atmel_lcdfb
 24:          0         AIC  AC97C
 40:          1        GPIO  atmel_usba_udc
 47:          0        GPIO  mmc0
 64:          6        GPIO  Right Click
 65:         10        GPIO  Left Click

Правый и левый клик - это кнопки на моей доске. Теперь я хочу изменить обработчики прерываний для кнопок (например, чтобы они выдавали вывод при нажатии).

Где я могу найти обработчики прерываний или драйверы (или исходные файлы для них) для кнопок?

Или я могу написать свои собственные драйверы и зарегистрировать их (пока я в пользовательском пространстве) для кнопок и как?

Это некоторые данные из руководства по платам о PIO

.
IO... Per.... Application Usage............................................ Pow. by
PB0  TXD3 USER’S PUSH BUTTON 1 PB0 as LEFT CLICK VDDIOP
PB1  RXD3 USER’S PUSH BUTTON 2 PB1 as RIGHT CLICK VDDIOP

Ответы [ 2 ]

3 голосов
/ 07 февраля 2011

У меня нет конкретного ответа для вашей доски, но я могу дать вам несколько советов с необходимой вам информацией.

Самый простой способ решить вашу проблему - отменить требование «обработчики прерываний» и просто опросить линии GPIO. Вы можете сделать это из пользовательского пространства, если вы являетесь пользователем root. Многие среды разработки предоставляют для этого модуль ядра, предоставляя результаты в виде записей в /dev или /proc.

Если вы собираетесь обрабатывать прерывания, вам нужно написать драйвер устройства Linux. Лучшее место для начала - потрясающая книга драйверов устройств Linux, которую можно загрузить по адресу http://lwn.net/Kernel/LDD3/

Драйвер GPIO очень прост и состоит в основном из вызова register_irq() и кода вашего пользовательского интерфейса. Код интерфейса пользовательского пространства будет намного больше, чем остальная часть кода, а также вызовет у вас наибольшую головную боль.

1 голос
/ 07 февраля 2011

У меня нет опыта работы с конкретной платой и buildroot, но было бы интересно взглянуть на gpio.txt в директории Documentation внутри дерева ядра. Существует некоторое объяснение того, как использовать GPIO из пространства пользователя с помощью sysfs.

...