完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先简单说说这个键盘的实现原理,IIC总线工作原理没必要废话,s3c2410的手册中讲的很明白。硬件方面这个键盘通过一个AVR单片机(ATMEGA48)接在IIC总线上,也就是说,直接与IIC总线链接的设备并不是我们用的键盘,而是这个单片机,键盘产生的一切数据由这个单片机经过加工包装成一定的数据结构再发给s3c2410。当s3c2410芯片收到数据后会由IIC控制器触发一个中断,在中断处理程序中我们只要解析这个结构体就可以了。
软件方面,设备驱动实际上分为两层,其中之一就是AVR单片机的驱动,另一个就是键盘驱动,基本流程如下。内核启动时会自动调用设备初始化函数,这时候我们需要做的是通过IIC总线给这个单片机传送初始化信息。发送的数据一共包括两部分,前者用于设置目的设备(s3c2410芯片)的地址,也就是告诉AVR单片机收到键盘发来的数据后应该发给谁;后者是使能键盘,如果不发这个指令,AVR收到键盘传来的按键硬件编码后直接丢弃。(这里注意:AVR上可以同时管理多个设备,事实上我搞到的前人的资料也是支持多个设备,而这里我们只用到了一个键盘)完成初始化后,硬件方面就没有什么障碍了,如果我们按下一个按键,键盘会把一个8位的硬件键码发给AVR单片机。在AVR单片机中这个字节前会被再加上一个8位的设备编号,然后一起发给s3c2410。 //从下面开始有点没捋顺清楚 cpu收到数据后,会把自己的工作模式设置成SR,然后调用AVR单片机驱动中的i2c_mega8_slvRcv函数,并把接收到的后两个字节(键盘的设备码+按键硬件码)作为参数传给该函数。在该函数中,检测设备码,如果是键盘,那么调用键盘驱动程序中的mega8_kbd_raw函数,并最终添加入按键等待队列。当有程序打开键盘设备文件的时候,这个队列中的键码会被传递给相应的用户程序。 [转帖]armlinux学习笔记--LCD驱动程序分析 / #define Fld(Size, Shft) (((Size) << 16) (Shft)) 例:Fld(2,5); = 0x20005 #define FSize(Field) ((Field) >> 16) 例:FSize(0x20005); = 2 #define FShft(Field) ((Field) & 0x0000FFFF) 例:FShft(0x20005); = 5 #define FInsrt(Value, Field) \ (UData (Value) << FShft (Field)) 例:FInsrt(0x3, 0x20005); = 0x3 << 0x0005 = 0x60 |
|
|
|
只有小组成员才能发言,加入小组>>
2561 浏览 0 评论
1158浏览 2评论
761浏览 1评论
514浏览 0评论
271浏览 0评论
447浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 14:32 , Processed in 1.432860 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号