字符设备驱动程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
字符设备驱动程序
字符设备驱动程序与块设备不同。所涉及的键盘驱动、控制台显示驱动和串口驱动以及与这些驱动有关的接口、算法程序都紧密相关。他们共同协作实现控制台终端和串口终端功能。
下图反映了控制台键盘中断处理过程。
以上为总的处理流程,下面对每一个驱动分开分析。首先是键盘驱动。键盘驱动用汇编写的,比较难理解,牵涉内容较多,有键盘控制器804X的编程,还有扫描码(共3套,这里用第二套)和控制命令及控制序列(p209~210有讲解)。由于键盘从XT发展到AT到现在PS/2,USB,无线键盘,发展较快,驱动各有不同,此版本驱动为兼容XT,将扫描码映射为XT再处理,因此仅供参考。CNIX操作系统的键盘驱动实现为C语言,可读性更好。
键盘驱动
键盘驱动就是上图键盘硬件中断的过程。keyboard.S中的_keyboard_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 是最常用的流程,即跳转表中使用频率最高的流程:
控制台程序
控制台程序分两部分:1. 控制台初始化 2. 控制台写函数
控制台初始化函数根据EGA单色、MDA单色、EGA彩色、CGA各种显卡设置显卡类型、显存占用内存的起始地址、结束地址、显示索引寄存器端口和显示数据寄存器端口。并将显卡类型打印在屏幕上。初始化滚屏变量和光标位置,设置键盘中断陷阱门,复位键盘。
控制台写函数从终端对应的tty写缓冲队列中取字符,并显示在屏幕上。思路是利用状态机原理对缓冲队列中的字符逐一处理(若是字符写在显存对应位置,若是光标,设置光标位置),最后向显示控制器发送光标显示位置。
上图中黑虚线表示不退出case循环读取下一字符,而是直接转到下一状态。状态1的5、6与状态4的18、19相同。(?)表示可能包含?
串口程序
一、串行通信原理
通信方式:方向、连接、异步/同步;
速度控制:波特率控制、收/发时钟、基准时钟; 差错控制:单/双端、信号重复、检错和纠错编码; 长距离传输:信号调制(调频、调幅、调相); 通道共享:时分多路、频分多路;
通信协议:异步串行/同步串行通信协议;
接口标准:类型(信号定义、逻辑特性、电气特性、机械特性)
二、起止式异步串行通信协议
通信前约定—波特率、字符(数据/校验/结束)格式;
字符识别—空闲状态、字符开始、数据格式、字符结束、起点漂移解决; 抗干扰(信号重复)实现--起始位采样、数据采样; 字符正确性—校验码编码技术、检错与纠错
三、串行通信接口标准
标准类型:RS-232C 、RS-422A 、RS-423、RS-485 RS-232C 接口标准:
信号定义:RxD、TxD、SG、DTR/DSR、RTS/CTS、DCD、RI
逻辑特性:连接、信号使用/不使用MODEM时握手规则
电气特性:信号电平、电平转换
机械特性:连接器、有效传输距离
四、INS8250内部结构
内部总体结构
中断控制逻辑
LSR
INTPR
T
端口定义和寄存器定义
LCR—使用时,最后一次使D7=0并设置其它位;
DLH/DLL—值为基准时钟频率÷(16×波特率);
IIR—中断请求→IIR过程,对IIR读操作时其值的变化原理;
与程序关系紧密的硬件是除数寄存器、接受缓冲、发送缓冲、中断允许寄存器、以及通信线路和Modem的控制和状态寄存器。所谓的DLH/DLL值在除数寄存器中设定,即波特率因子。同步控制时会以当前设定波特率的16倍频控制每一位信号的脉冲保持时间(即如果要求高信号必须是保持10ms,则同步控制会以10/16ms 的时间精度保证16次的10/16ms都为高脉冲),接收到信号以同样的原理检测信号。(通常检测16倍频中的第7,8,9三个倍频处的脉冲,以少数服从多数原则判断脉冲的高低)。
中断的屏蔽与否取决于中断允许寄存器。中断产生后都在中断标识寄存器中置位。因此只要有中断标识在中断标识寄存器中置位且不屏蔽就会发出中断。在实际处理中,在串口中断处理中循环判断是否在处理完上一中断后已产生下一中断,若有则直接处理,提高了效率。
串口程序分为初始化部分serial.c和中断处理部分rs_io.s。串口初始化相当简单:
串口中断处理程序也很简单:
针对4个中断源的处理函数中两个函数:Modem状态改变的处理和接收状态有错处理都未作实际处理,只是复位相应寄存器。另两个函数为已接收到数据处理和发送保持寄存器空的处理。
接收到数据中断的处理(read_char函数)(与读队列read_q 交互)
发送保持寄存器空中断的处理(write_char函数)(与写队列write_q交互)