- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
31键盘驱动学习(fgsink@gmailcom)实验环境:键盘的实现键盘
3+1键盘驱动学习
(fgsink@)
实验环境: 2
键盘的实现 2
键盘原理图: 2
键盘使用引脚资源: 2
键盘原理分析: 2
驱动分析: 3
一、文件中包含的函数列表 3
二、函数层次关系 3
三、各函数分析 4
1、file_operations结构体 4
2、初始化工作 5
3、当有键被按下时发生了什么 5
4、当应用程序调用了read(fd,buf,2)时发生了什么 7
程序 8
实验环境:
硬件:Mini4020 v1.1
软件:U-Boot 1.3.3
Linux version 2.6.16 (root@localhost.localdomain) (gcc version 3.4.1)
SEP4020 ARM Linux-2.6.16 SDK 3.1
nfs: MINI4020资料光盘\Mini4020 SDK开发软件包\Mini4020\nfs
编译内核 Linux-v3.4
编译器:arm-linux-gcc version 3.4.1
键盘驱动文件:sep4020_key.c (见附件)
键盘的实现
键盘原理图:
键盘使用引脚资源:
键盘原理分析:
初始化键盘时,将ROW1,ROW2,ROW3三条线输出高电平,如果有键被按下,三极管基极变为高电平,三极管导通,集电极被拉低,产生一个下降沿,触发中断,进入中断程序。
扫描时,输出ROW[1:3]=100,若INT0还是低电平,则是第一行有键被按下,否则输出ROW[1:3]=010,查第二行是否有键被按下,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。
驱动分析:
一、文件中包含的函数列表
//硬件操作函数:
static void unmaskkey(void) //开启键盘中断
static void maskkey(void) //关闭键盘中断
static void sep4020_key_setup(void)//初始化中断
static void write_row(int index,int HighLow)
static int ReadCol(void)
void row_input(int x)
int read_col(int x)
static int keyevent(void)
static int sep4020_request_irqs(void)//向内核申请中断,并将中断服务子程序注册进去
static void sep4020_free_irqs(void)//告诉内核释放硬件中断
static void key_timer_handler(unsigned long arg)
static irqreturn_t sep4020_key_irqhandler(int irq, void *dev_id, struct pt_regs *reg)
//驱动与操作系统接口函数
static int sep4020_key_open(struct inode *inode, struct file *filp)
static ssize_t sep4020_key_read(struct file *filp, char __user *buff, size_t size, loff_t *ppos)
static ssize_t sep4020_key_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
static int sep4020_key_release(struct inode *inode, struct file *filp)
static int __init sep4020_key_init(void)
static void __exit sep4020_key_exit(void)
module_init(sep4020_ke
原创力文档


文档评论(0)