嵌入式Samsungs3c2410linux驱动中有一段函数判断是否有按键被按下代码如下,求理解

嵌入式Samsungs3c2410linux驱动中有一段函数判断是否有按键被按下代码如下,求理解,第1张

S3C2410_GPFDAT口上接了8个按键,S3C2410_GPGDAT中上接了8个按键,

一个bit位代表一个按键,一共16个按键。

当有按键按下时,通过轮询或中断方式知道了有按键信息,然后传进了一个irq号的参数,这个参数数值是44+(0~15)=44~59,这个数据可能是根据的接的中断号或者其它某些硬件的设计规则得到的(具体看你设备硬件的连接及配置),代表着哪一个按键按下了。

static int iskey_down(unsigned long irq)

{

int reg, gpio_no

irq_no = (int irq)// 取得中断号(按键标识)

irq_no = irq_no -44//EINT4~29 , 20~23 //减掉偏移量44得到0~15的键码,分别代表16个按键中的一个

if(irq_no<8) // 如果0~7,那就是按在GPFDAT口上的8个按键

{

reg = _raw_read(S3C2410_GPFDAT)//读取GPFDATA口上的按键状态,每bit代表一个按键

gpio_no = irq_no// 具体按键数值在GPFDATA中的位置(0~7)和按键编号(0~7)对应(0:7~0:7),可以直接用于后面取出具体的bit位

}

else

{

reg = raw_readl(S3C2410_GPGDAT)//读取GPGDATA口上的按键状态,每bit代表一个按键

gpio_no = irq_no - 8 // 具体按键数值在GPGDATA中的位置(0~7)和按键编号(8~15)有一个偏移的映射关系,所以直接减8让它位对应(0:7~0:7),以便于后面取出具体的bit位

}

if(reg&(1<gpio_no)) // 如果对应的按键bit位没有按下(此时gpio_no就代表着相应的按键在对应键盘状态数值中的bit位的位置第0~7位)

return 0//按键没有按下或者松开了噢

else

return 1//按键被按下了噢~~~

}

仔细看下这个头文件input.h 和结构体 input_event 的描述吧,对你应该有帮助;

/*

* The event structure itself

*/

struct input_event {

struct timeval time

__u16 type

__u16 code

__s32 value

}

里面有关于type、code、value值的介绍;

理解这个之后,你就明白什么时候代表按下鼠标左键,什么时候松开鼠标左键,什么时候按下鼠标右键、什么时候松开鼠标右键;

/*

* Event types

*/

......

#define EV_KEY 0x01

......

/*

* Keys and buttons , code values

*/

....

#define BTN_MOUSE 0x110

#define BTN_LEFT 0x110

#define BTN_RIGHT 0x111

#define BTN_MIDDLE 0x112

#define BTN_SIDE 0x113

#define BTN_EXTRA 0x114

#define BTN_FORWARD 0x115

#define BTN_BACK 0x116

#define BTN_TASK 0x117

.....

我没有实现过这个,但是以我的理解,不会出现按住3秒和5秒进入不同的功能函数中。

但是你可以自己实现这样的功能,就是按键的中断或者按键回调函数中,获得这个按键,应用程序去读取这个按键的按下时间,然后根据时间来进行相应的处理。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8791677.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-21
下一篇2023-04-21

发表评论

登录后才能评论

评论列表(0条)

    保存