开发者

Embedded system interrupt / hardware handling from Linux

开发者 https://www.devze.com 2023-02-09 04:01 出处:网络
On my AT91SAM9RL-EK ARM board, running a Linux 2.6.30 buildroot, I have the following. cat /proc/interrupts

On my AT91SAM9RL-EK ARM board, running a Linux 2.6.30 buildroot, I have the following.

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

The right and left click are the buttons on my board. Now I want to modify the interrupt handlers for the buttons (for example that they give me an output when clicked).

Where can 开发者_如何学GoI find the interrupt handlers or drivers (or the sourcefiles for them) for the buttons?

Or can I write my own drivers and register them (while I am in user-space) for the buttons and how?

This is some data from the boards guide about the 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


I don't have a specific answer for your board, but I can give you some pointers with the information you need.

The simplest way to solve your problem is to drop the 'interrupt handlers' requirement and simply poll the GPIO lines. You can do this from userspace, so long as you're root. Many development environments supply a kernel module to do this for you, exposing the results as an entry in /dev or /proc.

If you're going to handle interrupts, you need to write a Linux device driver. The best place to start here is the awesome Linux Device Drivers book, downloadable at http://lwn.net/Kernel/LDD3/

A GPIO driver is very simple and will mostly consist of a call to register_irq() and your userspace interface code. The userspace interface code will be much larger than the rest of the code and also cause you the most headaches.


I don't have any experience with the specific board and buildroot, but it might be interesting to look into gpio.txt in the Documentation dir inside the kernel tree. There's some explanation on how to use GPIO from userspace using sysfs.

0

精彩评论

暂无评论...
验证码 换一张
取 消