2、.h>#include#include#include#include#include#include#defineDEVICE_NAME"buttons"/*定义中断所用的结构体*/structbutton_irq_desc{ intirq;//按键对应的中断号 intpin;//按键所对应的GPIO端口 intpin_
3、setting;//按键对应的引脚描述,实际并未用到,保留 intnumber;//定义键值,以传递给应用层/用户态 char*name;//每个按键的名称};/*结构体实体定义*/staticstructbutton_irq_descbutton_irqs[]={ {IRQ_EINT8,S3C2410_GPG(0),S3C2410_GPG0_EINT8 ,0,"KEY0"}, {IRQ_EINT11,S3C2410_GPG(3),S3C2410_GPG3_EINT11,1,"KEY1"}, {IRQ_EINT
4、13,S3C2410_GPG(5),S3C2410_GPG5_EINT13,2,"KEY2"}, {IRQ_EINT14,S3C2410_GPG(6),S3C2410_GPG6_EINT14,3,"KEY3"}, {IRQ_EINT15,S3C2410_GPG(7),S3C2410_GPG7_EINT15,4,"KEY4"}, {IRQ_EINT19,S3C2410_GPG(11),S3C2410_GPG11_EINT19,5,"KEY5"},};/*开发板上按键的状态变量,注意这里是’0’,对应的ASCII码为30*/s
5、taticvolatilecharkey_values[]={'0','0','0','0','0','0'};/*因为本驱动是基于中断方式的,在此创建一个等待队列,以配合中断函数使用;当有按键按下并读取到键值时,将会唤醒此队列,并设置中断标志,以便能通过read函数判断和读取键值传递到用户态;当没有按键按下时,系统并不会轮询按键状态,以节省时钟资源*/staticDECLARE_WAIT_QUEUE_HEAD(button_waitq);/*中断标识变量,配合上面的队列使用,中断服务程序会把它设置为1,read函数会把它清零*/staticvo
6、latileintev_press=0;/*本按键驱动的中断服务程序*/staticirqreturn_tbuttons_interrupt(intirq,void*dev_id){ structbutton_irq_desc*button_irqs=(structbutton_irq_desc*)dev_id; intdown; /*获取被按下的按键状态*/ down=!s3c2410_gpio_getpin(button_irqs->pin); /*状态改变,按键被按下,从这句可以看出,当按键没有被按下
7、的时候,寄存器的值为1(上拉),但按 键被按下的时候,寄存器对应的值为0*/ if(down!=(key_values[button_irqs->number]&1)){//Changed /*如果key1被按下,则key_value[0]就变为’1’,对应的ASCII码为31*/ key_values[button_irqs->number]='0'+down; ev_press=1;/*设置中断标志为1*/ wake_up_interruptible(&button_waitq)
8、;/*唤醒等待队列*/ } returnIRQ_RETVAL(IRQ_HANDLED);}/* *在应用程序执行open