当前位置: 技术问答>linux和unix
arm-pxa270 矩阵键盘驱动程序的疑问~请帮我看看哦~急!!
来源: 互联网 发布时间:2015-12-12
本文导语: 我开学升大三拉~今天接到任务老师让我注释arm-pxa270 的4*4 矩阵键盘的驱动 有些部分我看不大明白 尤其是扫描算fa部分 源程序用的是查询式方fa取得键状态的变化 扫描时用的大概是行扫描算fa; 但那些if我就基本上...
我开学升大三拉~今天接到任务老师让我注释arm-pxa270 的4*4 矩阵键盘的驱动
有些部分我看不大明白 尤其是扫描算fa部分
源程序用的是查询式方fa取得键状态的变化
扫描时用的大概是行扫描算fa;
但那些if我就基本上不明白。。。
可怜我mei学过接口。。。
请各位大虾帮我看看哦~谢谢啦~我对着这群东西已经一天了。。。
static unsigned char get_scancode(struct kp_event *kpe)//从缓冲区取出键值
{
static unsigned int curr, prev=ROTARY_DEFAULT;
unsigned int c;
c = NO_KEY;
if (kpe->flags & KP_DIRECT) { //#define KP_DIRECT 0x1
curr = kpe->rotary & 0xFF;
if (kpe->rotary & KPREC_OF0) { //#define KPREC_OF0 (0x1 matrix[0] >> 26) & 0x1f;
c = kpe->matrix[0] & 0xff;
/* key up */
if (!count) c |= 0x80;
}
return c;
}
static ssize_t kpdrv_read(struct file * filp, char * buf,
size_t count, loff_t *ppos)//keypad读取操作接口函数
{
struct kp_event kpe;
int err,left,timeout;
unsigned char c;
timeout = 0;
left = count;
do {
err = kp_wait(&kpe, timeout);//一个等待队列
if (err) {
if ( left != count ) return (count-left);
if (filp->f_flags & O_NONBLOCK) return err;
if (timeout) return err;
timeout = -1;
continue;
}
/* parse if direct/matrix flags are set*/
if ( (kpe.flags & KP_DIRECT) || (kpe.flags & KP_MATRIX) ) {//#define KP_DIRECT 0x1
//#define KP_MATRIX 0x2
c = get_scancode(&kpe);//读缓冲区数据
if (c != NO_KEY) {
put_user(c, buf++);//放到用户数据区
left --;
}
}
} while (left);
return (count-left);
}
有些部分我看不大明白 尤其是扫描算fa部分
源程序用的是查询式方fa取得键状态的变化
扫描时用的大概是行扫描算fa;
但那些if我就基本上不明白。。。
可怜我mei学过接口。。。
请各位大虾帮我看看哦~谢谢啦~我对着这群东西已经一天了。。。
static unsigned char get_scancode(struct kp_event *kpe)//从缓冲区取出键值
{
static unsigned int curr, prev=ROTARY_DEFAULT;
unsigned int c;
c = NO_KEY;
if (kpe->flags & KP_DIRECT) { //#define KP_DIRECT 0x1
curr = kpe->rotary & 0xFF;
if (kpe->rotary & KPREC_OF0) { //#define KPREC_OF0 (0x1 matrix[0] >> 26) & 0x1f;
c = kpe->matrix[0] & 0xff;
/* key up */
if (!count) c |= 0x80;
}
return c;
}
static ssize_t kpdrv_read(struct file * filp, char * buf,
size_t count, loff_t *ppos)//keypad读取操作接口函数
{
struct kp_event kpe;
int err,left,timeout;
unsigned char c;
timeout = 0;
left = count;
do {
err = kp_wait(&kpe, timeout);//一个等待队列
if (err) {
if ( left != count ) return (count-left);
if (filp->f_flags & O_NONBLOCK) return err;
if (timeout) return err;
timeout = -1;
continue;
}
/* parse if direct/matrix flags are set*/
if ( (kpe.flags & KP_DIRECT) || (kpe.flags & KP_MATRIX) ) {//#define KP_DIRECT 0x1
//#define KP_MATRIX 0x2
c = get_scancode(&kpe);//读缓冲区数据
if (c != NO_KEY) {
put_user(c, buf++);//放到用户数据区
left --;
}
}
} while (left);
return (count-left);
}
|
/* parse if direct/matrix flags are set*/
if ((kpe.flags & KP_DIRECT) || (kpe.flags & KP_MATRIX))
很明显呀,判断第0位或第1位是否置1
if ((kpe.flags & KP_DIRECT) || (kpe.flags & KP_MATRIX))
很明显呀,判断第0位或第1位是否置1
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。