现在的位置: 首页 > 综合 > 正文

嵌入式实时Hypervisor:XtratuM (13)

2018年04月28日 ⁄ 综合 ⁄ 共 2112字 ⁄ 字号 评论关闭

2.7.2 UART驱动
上面一节中介绍了XtratuM驱动模型的架构。那么如何利用XtratuM驱动模型去创建和添加设备驱动呢?这就是接下来要讲的内容,基于XtratuM驱动模型的UART驱动。
2.7.2.1 UART设备
串口是一种串行通信物理设备,每一个周期信息只能读入或者写出一个位。通常,串口用来连接个人计算机和嵌入式开发板,用来调试设备或程序。由于串口每次只能读/写一位数据,因此传输能力相对较低,尤其是控制繁琐。为此,UART被引入到串口通信中。UART是Universal Asynchronous Receiver/Transmitter的缩写,也就是通用异步接收和传输设备,它通常作为一个独立的集成电路连接计算机和外围串口设设备。因此,UART的主要功能就是将数据进行串行与并行化转换,UART被用来连接一些支持通用串行通信标准的设备,例如EIA RS-232[48]。从计算机设备的外部看,用户只能看到RS-232串口,但是对于计算机,它可以访问的是UART设备。因此,设备驱动开发者只需要为UART撰写驱动,而无需关心底层的串口设备特性。
在一个机器上,有四个串行通信设备被预先定义。理想情况下,每一个设备应该都具有一个中断控制线,但是,由于中断控制线的匮乏,导致可能多个设备公用一个中断控制线。对与串口设备也是如此,四个串口设备只占用两个中断控制线,3和4。在UART设备中,共有8个寄存器。这8个寄存器就控制着发送和接收数据,配置设备,标示中断类型,控制FIFO、信号线以及MODEM,以及保存信号线和MODEM状态[49]。
2.7.2.2 驱动设计与实现
根据XtratuM设备驱动模型,串口驱动被分为两部分,一部分以Linux模块的方式被加载的Linux内核中,其主要目的是为串口设备请求资源,主要包括1)用来建立内部FIFO工具的物理内存,这里的FIFO是用来在驱动服务器和客户域之间传输数据;2)中断控制线;3)UART地址空间等。
在设备驱动中,共有16对Lock-Free FIFO被创建用做IDC工具。在每一个客户域和设备驱动域之间,都有一对独立的FIFO被使用。每一对FIFO有两个FIFO组成,并且这两个FIFO都是单向的,即一个FIFO用来从客户域向服务器域传输数据,另一个则相反。并且任何一对FIFO不会被多个客户域共享。当客户域被加载的时候,它会向串口驱动程序注册,其中包含域的优先级。
在设备驱动服务器中,提供了一个基于优先级的针对FIFO的调度器。当UART的Transmitter Holding Register空的时候,将会产生一个相关中断,该中断会触发设备驱动域,设备驱动域将会通过调度器选择具有最高优先级的非空FIFO作为数据源。如果所有的FIFO都没有数据,则Transmitter Holding Register空值中断将会被屏蔽。当客户域有数据向FIFO中写入数据时,该客户域将会启动相关Transmitter Holding Register的空值中断。图2-17给出了串口驱动架构以及图2-18给出了设备驱动的流程图。
图2-17. 串口驱动系统架构
图2-18. 串口驱动程序的流程图
本节内容只是仅仅对UART设备驱动的设计和实现进行了介绍,但是,如何基于串口驱动程序为客户域提供相关请求和服务,将是下面章节介绍的内容。
2.7.2.3 UART驱动的使用
设备驱动服务器为客户域提供基本的服务。但是用户关心的是如何使用设备驱动服务程序。在本节中,两个简单的客户域将会被建立,它们将通过串口进行通信。
在客户域中,设备的最大号和最小号是确定的。最大号是用来标记设备的类型,例如在XtratuM系统中,新建立的客户域采用的串口设备最大号是2。最小号表明不同的通信管道,例如在串口设备提供16个虚拟的通信管道(也就对应于16对Lock-Free FIFO)。客户域启动后,将会调用suspend_domain()函数初始化设备。
suspend_dmain(XM2DEV(minor, major), XMDEV_IO_OPEN);
suspend_domain()函数的第二个参数用来表明对设备操作,其中
XMDEV_IO_OPEN是用来打开底层的设备,即向串口驱动域提出设备使用请求,底层系统将会根据该请求将FIFO内存映射到该客户域的地址空间。接下来,客户域开始设置相应的串口属性,例如优先级,校验方式,设备速度等。
当所有的配置结束,客户域可以从相应FIFO中进行读或写数据。下面是一段简单的向底层设备中写数据的代码段。
integer Rt_serial_write(string, size)
BEGIN
dom_serial_fifo_write(out, string, size)
enable_empty_interrupt();
return …
END
dom_serial_fifo_write() 函数是客户域中的函数,它是直接用来向相应FIFO中写入数据的,从而提高了域对FIFO处理的灵活性。因此,该设备驱动模型可以提供整个设备驱动添加的灵活性和简单性。开发着可以根据具体的需求定制相应的客户域中设备驱动程序。

抱歉!评论已关闭.