- 22
- 0
- 约1.39万字
- 约 18页
- 2021-05-17 发布于湖北
- 举报
字符设备驱动程序
字符设备驱动程序与块设备不同。所涉及的键盘驱动、控制台显示驱动和串口
驱动以及与这些驱动有关的接口、算法程序都紧密相关。他们共同协作实现控制台
终端和串口终端功能。
下图反映了控制台键盘中断处理过程。
以上为总的处理流程,下面对每一个驱动分开分析。首先是键盘驱动。键盘驱动用
汇编写的,比较难理解,牵涉内容较多,有键盘控制器 804X 的编程,还有扫描码
(共3 套,这里用第二套)和控制命令及控制序列( p209~210有讲解)。由于键
盘从 XT 发展到 AT 到现在 PS/2,USB,无线键盘,发展较快,驱动各有不同,此
版本驱动为兼容 XT ,将扫描码映射为 XT 再处理,因此仅供参考。 CNIX 操作系
统的键盘驱动实现为 C 语言,可读性更好。
键盘驱动
键盘驱动就是上图键盘硬件中断的过程。 keyboard.S中的_keyboard_interrupt
函数为中断主流程,文件中其他函数均被其调用。
ds, es置为内核数据段
读取键盘扫描码
Y
扫描码是否为 0xe0
或 0xe1?
设置 e0标志位
N
通过函数跳转表调用键处理程序
复位 e0标志(即 0xe0 或 0xe1 的标志)
对用 8255A 的 PC键盘电路复位并向 8259
发 EOI (中断结束)信号
调用 do_tty_interrupt 函数
中断返回
以上打星处为键盘驱动的核心,即主要处理过程,针对不同扫描码分别处理,并最
终将转换后所得 ASCII 码或控制序列放入控制台 tty 结构的读缓冲队列 read_q 中。
键处理程序跳转表为 key_table,根据扫描码调用不同处理程序,对于“普通
键”,即只有一个字符返回且没有含义变化的键,调用 do_self 函数。其他均为
“特殊键”:1. crtrl 键的按下和释放 2. alt 键的按下和释放 3. shift 键的按下和释放
4. caps lock键的按下和释放(释放直接返回,不作任何处理) 5. scroll lock 键的按
下 6. num lock 的按下 7. 数字键盘的处理(包括 alt-ctrl+delete 的处理,因为老式键
盘 delete键在数字小键盘上。还包括对光标移动键的分别处理) 8. 功能键
(F1~F12)的处理 9. 减号的处理(老键盘 ’/ ’与 ’- ’以 0xe0 加以区分,可能其中一键
要按 shift )
do_self 是最常用的流程,即跳转表中使用频率最高的流程:
根据 alt 键按下或 shift 键按下或都不按,确定扫描码 ASCII 码映射表基址
原创力文档

文档评论(0)