分类: 嵌入式
2010-07-30 22:49:16
一、实现步骤
1. 硬件原理图分析。由原理图可知每个按键所用到的外部中断分别是EINT8、EINT11、EINT13、EINT14、EINT15、EINT19,所对应的IO口分别是GPG0、GPG3、GPG5、GPG6、GPG7、GPG11。再由按键的接口电路可知,当按键按下时按键接通,中断线上原有的VDD33V高电平被拉低,从而触发中断的产生。
1)按键驱动基本框架。这里我就指定主设备号为232,简单的注册为字符设备,另定义了一个结构体把按键要用到的资源组织起来
|
|
|
|
5)读设备的实现。从电路图可以看出按键设备相对于CPU来说为输入设备,所以这里只有read,而没有write
|
|
|
3. 完整的按键驱动代码
|
[root@localhost driver]# ls
Makefile my2440button.c
[root@localhost driver]# make
make -C /home/study/driver/Kernel/linux-2.6.29 M=/home/study/driver/mini2440_driver/button/driver modules
make[1]: Entering directory `/home/study/driver/Kernel/linux-2.6.29'
CC [M] /home/study/driver/mini2440_driver/button/driver/my2440button.o
/home/study/driver/mini2440_driver/button/driver/my2440button.c:186: warning: initialization from incompatible pointer type
Building modules, stage 2.
MODPOST 1 modules
CC /home/study/driver/mini2440_driver/button/driver/my2440button.mod.o
LD [M] /home/study/driver/mini2440_driver/button/driver/my2440button.ko
make[1]: Leaving directory `/home/study/driver/Kernel/linux-2.6.29'
6. 加载进入内核,查看已加载的设备:#cat /proc/devices,可以看到my2440_buttons的主设备号为232
[root@FriendlyARM mini2440]# ls
button_apply my2440button.ko
[root@FriendlyARM mini2440]# insmod my2440button.ko
[root@FriendlyARM mini2440]# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
29 fb
81 video4linux
89 i2c
90 mtd
116 alsa
128 ptm
136 pts
180 usb
188 ttyUSB
189 usb_device
204 s3c2410_serial
232 my2440_buttons
253 usb_endpoint
254 rtc
7.编写应用程序测试按键驱动,文件名:buttons_test.c
|
8.在开发主机上交叉编译测试应用程序。
|
9. 在开发板上的文件系统中创建一个按键设备的节点,然后运行测试程序,效果图如下,观测按开发板上的按键时,在串口工具中会输出对应按键被按下的信息,也不会出现抖动现象(即按某个按键时,不会多次产生该按键按下的情况)