5. 创龙button_test示例分析
时间:10-02
整理:3721RD
点击:
创龙提供的光盘里面为我们提供了丰富的资料和学习素材。我认为button_test是一个不错的例子,将这个例子前前后后,上上下下都研究透彻,非常有利于提高我们的水平。
编译一下,在am4379开发板上运行一下,不错,能够出现下面的信息,不过不论你们按开发板上的4个按键,程序也没有任何反应,当然你按了重启键,系统就会重启。
我们该怎么分析这个文件呢?代码逻辑很简单我们很容易找到有两处关键点,/dev/input/event2是linux设备节点,‘5’和‘6’代表是哪个key(猜测)。
这里就要提到一个概念linux input子系统.
输入设备(如按键,键盘,触摸屏,鼠标等)是典型的字符设备,其一般的工作机制是低层在按键,触摸等动作发生时产生一个中断(或驱动通过timer定时查询),然后cpu通过SPI,I2C或者外部存储器总线读取键值,坐标等数据,放一个缓冲区,字符设备驱动管理该缓冲区,而驱动的read()接口让用户可以读取键值,坐标等数据。从网上找来的这个图很清晰的解析其大概流程。
在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理。所以这使得我们输入设备的驱动部分不在用关心对设备文件的操作,而是要关心对各硬件寄存器的操作和提交的输入事件。
具体我们这里,我们就要找到keypad的input子系统的驱动代码在哪里?
/dev/input/event2似乎给我们指明了努力的方向,它就是一个input类型的设备节点,可是我们在无法找到其具体实现。我们可以通过命令: cat /proc/bus/input/devices查看到详细信息。
其实我们仔细分析input.c还是能其实现,具体实现大家可以自己研究input_proc_init函数。
这里我们知道其实我们应该打开/dev/input/event1,而不是event2.
在gpio_keys.c文件中,gpio_keys_get_devtree_pdata函数则是示例程序中'5'和‘6’的出处。
找到我们使用的devtree文件am437x-gp-evm.dts,两个button的定义显然应该是‘7’和‘8’。
将示例程序修改一下,编译,运行,按键,可以看到程序对按键动作有了反应。
好像sw7有两次down是连续的,这里就需要做一下反抖动处理。
如果我们在开发板提供的IO上外接两个button,代码和逻辑应该如何实现呢?
zxl_zxl新建驱动实现按键异步通知是一个方案,我们当然也可以在gpio_keys.c的基础上修改一下。
其实gpio_keys.c代码不用修改,只需要在am437x-gp-evm.dts中添加我们新加外设button按键的gpio设置即可。
理论上应该可行,自己测试一下,好像4379的板子无法启动了,等测试好了在完善这个帖子。