欢迎来到天天文库
浏览记录
ID:41036836
大小:507.00 KB
页数:15页
时间:2019-08-14
《字符设备驱动程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、字符设备驱动程序字符设备驱动程序与块设备不同。所涉及的键盘驱动、控制台显示驱动和串口驱动以及与这些驱动有关的接口、算法程序都紧密相关。他们共同协作实现控制台终端和串口终端功能。下图反映了控制台键盘中断处理过程。以上为总的处理流程,下面对每一个驱动分开分析。首先是键盘驱动。键盘驱动用汇编写的,比较难理解,牵涉内容较多,有键盘控制器804X的编程,还有扫描码(共3套,这里用第二套)和控制命令及控制序列(p209~210有讲解)。由于键盘从XT发展到AT到现在PS/2,USB,无线键盘,发展较快,驱动各有不同,此版本驱动为兼容XT,将扫描码映射为XT再处理
2、,因此仅供参考。CNIX操作系统的键盘驱动实现为C语言,可读性更好。键盘驱动键盘驱动就是上图键盘硬件中断的过程。keyboard.S中的_keyboard_interrupt函数为中断主流程,文件中其他函数均被其调用。ds,es置为内核数据段读取键盘扫描码设置e0标志位通过函数跳转表调用键处理程序复位e0标志(即0xe0或0xe1的标志)对用8255A的PC键盘电路复位并向8259发EOI(中断结束)信号调用do_tty_interrupt函数中断返回扫描码是否为0xe0或0xe1?YN以上打星处为键盘驱动的核心,即主要处理过程,针对不同扫描码分别处
3、理,并最终将转换后所得ASCII码或控制序列放入控制台tty结构的读缓冲队列read_q中。键处理程序跳转表为key_table,根据扫描码调用不同处理程序,对于“普通键”,即只有一个字符返回且没有含义变化的键,调用do_self函数。其他均为“特殊键”:1.crtrl键的按下和释放2.alt键的按下和释放3.shift键的按下和释放4.capslock键的按下和释放(释放直接返回,不作任何处理)5.scrolllock键的按下6.numlock的按下7.数字键盘的处理(包括alt-ctrl+delete的处理,因为老式键盘delete键在数字小键盘
4、上。还包括对光标移动键的分别处理)8.功能键(F1~F12)的处理9.减号的处理(老键盘’/’与’-’以0xe0加以区分,可能其中一键要按shift)do_self是最常用的流程,即跳转表中使用频率最高的流程:根据alt键按下或shift键按下或都不按,确定扫描码àASCII码映射表基址从映射表取得ASCII码并进行有效性验证若ASCII码在’a’与’}’(0x61~0x7d)范围且capslock或ctrl键按下,则转换为大写字符若ASCII码在’’’与’-’(0x40~0x5f)之间且ctrl键按下,则转换为控制字符(0x00~0x1f)若左al
5、t键按下,字符的位7置位将所得字符放入tty读缓冲read_q控制台程序控制台程序分两部分:1.控制台初始化2.控制台写函数控制台初始化函数根据EGA单色、MDA单色、EGA彩色、CGA各种显卡设置显卡类型、显存占用内存的起始地址、结束地址、显示索引寄存器端口和显示数据寄存器端口。并将显卡类型打印在屏幕上。初始化滚屏变量和光标位置,设置键盘中断陷阱门,复位键盘。控制台写函数从终端对应的tty写缓冲队列中取字符,并显示在屏幕上。思路是利用状态机原理对缓冲队列中的字符逐一处理(若是字符写在显存对应位置,若是光标,设置光标位置),最后向显示控制器发送光标显
6、示位置。01234startend收到字符ESC[?;且数组par未遍历完1.非控制字符非扩展字符2.换行符垂直制表符换页符3.回车符4.DEL5.BackSpace6.水平制表符7.扬声器1.ESCE光标移到下一行开始处2.ESCM光标上移一行3.ESCD光标下移一行4.ESCZ发送终端应答字符序列5.ESC7保存光标位置6.ESC8恢复光标位置ESC[(?)2ESC[(?)28ESC[(?)2871.ESC[(?)GESC[(?)’光标移到指定列2.ESC[(?)A光标上移指定行数3.ESC[(?)BESC[(?)e光标下移指定行数4.ESC[(
7、?)C光标右移指定列数5.ESC[(?)D光标左移指定列数6.ESC[(?)E9.ESC[(?)H12.ESC[(?)L15.ESC[(?)@18.ESC[(?)s光标下移ESC[(?)f在光标处插在光标处删保存光标位指定列数光标移到入n行除n个字符置并回到0列移到指定13.ESC(?)M16.ESC[(?)m19.ESC[(?)u7.ESC[(?)F行、列在光标处删改变光标处恢复光标位光标上移10.ESC[(?)J除n行字符显示属置指定行数清屏14.ESC(?)P性并回到0列11.ESC[(?)K在光标处删17.ESC[(?)r8.ESC[(?)d
8、对行中字符除n个字符设置滚屏的光标移到删除始末行号上图中黑虚线表示不退出case循环读取下一字符,而是直接转
此文档下载收益归作者所有