资源描述:
《3+1键盘驱动学习.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、3+1键盘驱动学习(fgsink@gmail.com)实验环境:2键盘的实现2键盘原理图:2键盘使用引脚资源:2键盘原理分析:2驱动分析:3一、文件中包含的函数列表3二、函数层次关系3三、各函数分析41、file_operations结构体42、初始化工作53、当有键被按下时发生了什么54、当应用程序调用了read(fd,buf,2)时发生了什么7程序88实验环境:硬件:Mini4020v1.1软件:U-Boot1.3.3Linuxversion2.6.16(root@localhost.localdomain)(gccversion3.4.1)SEP4020ARMLinux-2.6.16
2、SDK3.1nfs:MINI4020资料光盘Mini4020SDK开发软件包Mini4020fs编译内核Linux-v3.4编译器:arm-linux-gccversion3.4.1键盘驱动文件:sep4020_key.c(见附件)键盘的实现键盘原理图:键盘使用引脚资源:键盘原理分析:初始化键盘时,将ROW1,ROW2,ROW3三条线输出高电平,如果有键被按下,三极管基极变为高电平,三极管导通,集电极被拉低,产生一个下降沿,触发中断,进入中断程序。8扫描时,输出ROW[1:3]=100,若INT0还是低电平,则是第一行有键被按下,否则输出ROW[1:3]=010,查第二行是否有键被
3、按下,INT0为低电平,第二行有键被按下,否则输出ROW[1:3]=001,记录行号。假设是第一行有键被按下(row=0),即输出ROW[1:3]=100,再将管脚方向改为ROW1输出,ROW2输入,ROW3输入,保持ROW1输出高电平,此时读ROW2和ROW3,若ROW[3:2]=00,则K1被按下(col=0);若ROW[3:2]=01,则K2被按下(col=1);若ROW[3:2]=10,则K3被按下(col=2)。计算公式keynum=row*3+col。假设K3被按下则row=0,col=2键值应该为keynum=0*3+2=2。驱动分析:一、文件中包含的函数列表//硬件操作函数
4、:staticvoidunmaskkey(void)//开启键盘中断staticvoidmaskkey(void)//关闭键盘中断staticvoidsep4020_key_setup(void)//初始化中断staticvoidwrite_row(intindex,intHighLow)staticintReadCol(void)voidrow_input(intx)intread_col(intx)staticintkeyevent(void)staticintsep4020_request_irqs(void)//向内核申请中断,并将中断服务子程序注册进去staticvoidsep4
5、020_free_irqs(void)//告诉内核释放硬件中断staticvoidkey_timer_handler(unsignedlongarg)staticirqreturn_tsep4020_key_irqhandler(intirq,void*dev_id,structpt_regs*reg)//驱动与操作系统接口函数staticintsep4020_key_open(structinode*inode,structfile*filp)staticssize_tsep4020_key_read(structfile*filp,char__user*buff,size_tsize,
6、loff_t*ppos)staticssize_tsep4020_key_write(structfile*filp,constchar__user*buf,size_tsize,loff_t*ppos)staticintsep4020_key_release(structinode*inode,structfile*filp)staticint__initsep4020_key_init(void)staticvoid__exitsep4020_key_exit(void)module_init(sep4020_key_init);module_exit(sep4020_key_exit
7、);MODULE_AUTHOR("Leexiang");MODULE_LICENSE("GPL");8二、函数层次关系sep4020_key_fopssep4020_key_readsep4020_key_writesep4020_key_opensep4020_key_releasekey_dev->buf[]sep4020_key_irqhandlerkey_timer_handlerread_colkeyevent