新闻中心

EEPW首页>嵌入式系统>设计应用> 嵌入式Linux设备驱动开发之:按键驱动程序实例

嵌入式Linux设备驱动开发之:按键驱动程序实例

作者: 时间:2013-09-13 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/257107.htm

按键扫描函数如下所示。首先根据中断号确定操作按键所在行的位置,然后采用逐列扫描法最终确定操作按键所在的位置。

/*

**进入中断后,扫描铵键码

**返回:按键码(1~16),0xff表示错误

*/

static__inlineunsignedcharbutton_scan(intirq)

{

unsignedcharkey_id=0xff;

unsignedcharcolumn=0xff,row=0xff;

s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_INP);/*GPF0*/

s3c2410_gpio_cfgpin(S3C2410_GPF2,S3C2410_GPF2_INP);/*GPF2*/

s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_INP);/*GPG3*/

s3c2410_gpio_cfgpin(S3C2410_GPG11,S3C2410_GPG11_INP);/*GPG11*/

switch(irq)

{/*根据irq值确定操作按键所在行的位置*/

caseIRQ_EINT0:

{

column=0;

}

break;

caseIRQ_EINT2:

{

column=1;

}

break;

caseIRQ_EINT11:

{

column=2;

}

break;

caseIRQ_EINT19:

{

column=3;

}

break;

}

if(column!=0xff)

{/*开始逐列扫描,扫描第0列*/

s3c2410_gpio_setpin(S3C2410_GPE11,0);/*将KSCAN0置为低电平*/

s3c2410_gpio_setpin(S3C2410_GPG6,1);

s3c2410_gpio_setpin(S3C2410_GPE13,1);

s3c2410_gpio_setpin(S3C2410_GPG2,1);

if(!s3c2410_gpio_getpin(key_info_matrix[column][0].irq_gpio_port))

{/*观察对应的中断线的输入端口值*/

key_id=key_info_matrix[column][0].key_id;

returnkey_id;

}

/*扫描第1列*/

s3c2410_gpio_setpin(S3C2410_GPE11,1);

s3c2410_gpio_setpin(S3C2410_GPG6,0);/*将KSCAN1置为低电平*/

s3c2410_gpio_setpin(S3C2410_GPE13,1);

s3c2410_gpio_setpin(S3C2410_GPG2,1);

if(!s3c2410_gpio_getpin(key_info_matrix[column][1].irq_gpio_port))

{

key_id=key_info_matrix[column][1].key_id;

returnkey_id;

}

/*扫描第2列*/

s3c2410_gpio_setpin(S3C2410_GPE11,1);

s3c2410_gpio_setpin(S3C2410_GPG6,1);

s3c2410_gpio_setpin(S3C2410_GPE13,0);/*将KSCAN2置为低电平*/

s3c2410_gpio_setpin(S3C2410_GPG2,1);

if(!s3c2410_gpio_getpin(key_info_matrix[column][2].irq_gpio_port))

{

key_id=key_info_matrix[column][2].key_id;

returnkey_id;

}

/*扫描第3列*/

s3c2410_gpio_setpin(S3C2410_GPE11,1);

s3c2410_gpio_setpin(S3C2410_GPG6,1);

s3c2410_gpio_setpin(S3C2410_GPE13,1);

s3c2410_gpio_setpin(S3C2410_GPG2,0);/*将KSCAN3置为低电平*/

if(!s3c2410_gpio_getpin(key_info_matrix[column][3].irq_gpio_port))

{

key_id=key_info_matrix[column][3].key_id;

returnkey_id;

}

}

returnkey_id;

}

以下是read函数接口的实现。首先在按键缓冲中删除已经过时的按键操作信息,接下来,从按键缓冲中读取一条信息(按键ID)并传递给用户层。

/*从缓冲删除过时数据(5s前的按键值)*/

staticvoidremove_timeoutkey(void)

{

unsignedlongtick;

spin_lock_irq(buffer_lock);/*获得一个自旋锁*/

while(key_buffer.head!=key_buffer.tail)

{

tick=get_tick_count()-key_buffer.jiffy[key_buffer.head];

if(tick5000)/*5s*/

break;

key_buffer.buf[key_buffer.head]=0;

key_buffer.jiffy[key_buffer.head]=0;

key_buffer.head++;

key_buffer.head=(MAX_KEY_COUNT-1);

}

spin_unlock_irq(buffer_lock);/*释放自旋锁*/

}

/*读键盘*/

staticssize_tbutton_read(structfile*filp,

char*buffer,size_tcount,loff_t*f_pos)

{

ssize_tret=0;

remove_timeoutkey();/*删除过时的按键操作信息*/

spin_lock_irq(buffer_lock);

while((key_buffer.head!=key_buffer.tail)(((size_t)ret)count))

{

put_user((char)(key_buffer.buf[key_buffer.head]),buffer[ret]);

key_buffer.buf[key_buffer.head]=0;

key_buffer.jiffy[key_buffer.head]=0;

key_buffer.head++;

key_buffer.head=(MAX_KEY_COUNT-1);

ret++;

}

spin_unlock_irq(buffer_lock);

returnret;

}

以上介绍了中的主要内容。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程


蜂鸣器相关文章:蜂鸣器原理


评论


相关推荐

技术专区

关闭