微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于嵌入式 Linux的键盘驱动设计

基于嵌入式 Linux的键盘驱动设计

时间:12-01 来源:中电网 点击:


图 2 中断处理程序 kd_ ctrl_irq( )

唤醒后台线程后,把列 GPI O口中断禁止, 随即调用 kd_ctrl_event( )进行处理键盘事件。其中又调用 pxa _kdc _scan( )进行键值的扫描: 设定 4 [1] 4小键盘的所有行 GPI O 口为输出状态,并设定它的值为 1 ,而所有列 GPIO口作为输入状态,然后采用逐行扫描的方法, 依次去读取四根列 GPI O 口状态,如果某列 GPIO 口电平为低, 就表示此行此列有键按下,根据行号和列号从对应的二维数组 (也就是键值映射表 )中找到该键 的键值。具体 实现方法 为: 先设第 一行( GPI O7)为 0 , 扫描列的值 ( GPI O3 、 GPI O2 、GPI O1、 GPI O0),如果其中一个列的值为 0 , 比如 GPI O3 , 则按下的键是 Key _5。扫描完列后,把第一行设为 1。第二行设为 0 , 再次扫描所有列的值。扫描结 束后, 设 定所有 行 ( GPI O7 、GPI O6 、GPI O5 、 GPI O4)的值为 0 , 并且再次恢复所有列为中断方式,设定下降沿有效。最后返回的是代表按键是否按下的参数pressure值。得到此值以后,调用 stati c i n line vo i d kd_c trl_ev t_add( struc t kd_ctrl* kdc , u8 pressure , u8 keyva l ue )函数把所得值保存在对应的结构中,并将其添加到事件队列中, 最后调用 w ake_up_ i nterrupti ble( & kdc- > read _ w a it)利用信号量 read_ w a it通知 read程序到缓冲区读取新数据。

4 . 5 应用程序读取键盘数据

由于用户程序需要不断轮询设备,以查询是否有数据读取, 如果程序不处于休眠状态, 则将会占用很多 CPU 的资源。因此当没有触摸数据时, 就阻塞此任务。此时用户空间则需要和内核同步, 代码会需要睡眠, 使用信号量是唯一的选择, 并且它适用于锁会被长时间持有的情况。如果有一个任务试图获得一个已经被占用的信号量时,信号量会先将其中推进一个等待队列, 然后让其睡眠。这时 CPU 能重获自由, 从而可以执行其他代码。当持有信号量的进程将信号量释放时, 处于等待队列中的那个任务将会被唤醒, 并获得该信号量。

等待队列是由等待某些事件发生的进程组成的简单链表。内核用 w ake_queue_head_t来表示等待队列。等待队列可通过 DECLARE _WAI TQUEUE ( )静态创建。一旦上层用户程序进行读操作, 系统调用将通过 kd_ctrl_read ( )函数来实现。

4 . 6 模块卸载

当内核需要卸载本驱动程序时, 最后会从本函数退出。

此时通过 modul e_ i nit( kd_ctrl_ i n it)函数需要将在驱动程序运行期间申请的系统资源全部释放掉,可以防止资源浪费。

5 结束语

本文介绍的嵌入式 Linux的一种矩阵小键盘, 成功实现了多键齐按和重复按键的功能, 已经用于手持嵌入式设备中, 实验证明性能稳定可靠。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top