1。适用范围
,,,,本文仅针对于3.0及上版本的SylixOS x86平台PCI转串口相关驱动架构进行简单的分析。
2。PCI简介
,,,,外部链接标准(或称个人电脑界面,个人电脑接口),实际应用中简称为PCI(外围组件互连),是一种连接电脑主板和外部设备的总线标准。一般PCI装置可分为以下两种形式:
,,,,直接内建于主板上的集成电路,在PCI规范中称作“嵌入装置”(平面设备),或者安装在插槽上的扩充界面卡。
,,,, PCI总线见于现代的个人电脑中,并已取代了ISA和VESA局部总线,成为了标准扩充总线.PCI总线亦常见于其他电脑类型中.PCI总线最终将被PCI Express和其他更先进的技术取代,这些技术现在已经被用于最新款的电脑中。
,,,, PCI规范规定了该总线的物理尺寸(包括线宽),电气特性,总线时序和协议。该规范可从美国一种总线标准团体协会购得。
,,,,常见的PCI卡包括网络卡,声卡,调变解调器(调制解调器),电视卡和硬盘控制器等,另外还有USB和串列埠等端口。原本显卡通常也是PCI装置,但很快其频宽已不足以支援显卡的性能.PCI显卡现在仅用在需要额外的外接显示器或主板上没有AGP和PCI Express槽的情况。
3。PCI串口卡简介
,,,,串口卡主要是用来扩展PC的串口数量和种类。常见的x86机器主板上可能只有一个或者两个RS232的串口接口,在某些场景下不能满足对串口的需求,于是就有了PCI串口卡。通常PCI串口卡会支持拓展2至8个串口,也会支持RS232, RS485, RS422这几种串口格式.PCI串口卡在工业和军工领域运用广泛。
4。PCI串口驱动架构分析
4.1,,,,,SylixOS下一般的PCI驱动架构
,,,,在x86的基础工程libsylixos SylixOS/司机/PCI/零路径下,提供了SylixOS PCI驱动示例:pciNullDev。c .
,,,,,,, pciNullDev。c中主要实现了如表41所示五个主体框架函数。
表41,pciNullDev。c中主体函数
函数名函数功能<强> pciNullDevInit 强> PCI设备驱动初始化<强> pciNullDevProbe 强> PCI设备ID探测和资源信息初始化<强> pciNullDevRemove >强删除PCI设备<强> pciNullDevIdTblGet 强>获取PCI设备ID表的表头与表头大小<强> pciNullDevIsr 强> PCI设备驱动中断服务程序- <李>
<强>函数pciNullDevInit 强>
李>,,,,,,,,该函数主要用来初始化PCI设备驱动,其调用pciNullDevIdTblGet等函数将相关的PCI设备结构体填充完成,并调用API_PciDrvRegister函数注册PCI设备驱动。
- <李>
<强>函数pciNullDevProbe 强>
李>,,,,,,,,该函数由SylixOS PCI子系统回调,主要完成更新设备驱动版本信息,设备索引号,获取设备MEM、IO、硬中断请求优先级别等资源信息以及中断连接与使能操作。
- <李>
<强>函数pciNullDevRemove 强>
李>,,,,,,,,该函数由SylixOS PCI子系统回调,主要完成删除PCI设备的一系列操作,在该示例中没有实现相关功能代码。
- <李>
<强>函数pciNullDevIdTblGet 强>
李>,,,,,,,,该函数主要由pciNullDevInit函数调用,用来获取相关PCI设备的ID表的表头与表的大小。
- <李>
<强>函数pciNullDevIsr 强>
李>,,,,,,,,该函数为驱动服务函数,主要提供了该PCI设备驱动的中断服务处理,在该示例中中断服务处理没有实现相关功能代码。
,,,,,,, pciNullDev。c示例中的PCI设备驱动的流程如图41所示:
图41,pciNullDev。c设备驱动大致流程
4.2,,,SylixOS下PCI串口设备的驱动架构
,,,,在x86的基础工程libsylixos SylixOS/司机/PCI/sio路径存放的是PCI串口卡驱动.pciSioExar.c和pciSioNetmos.c均是PCI串口卡的驱动,是针对不同厂商的适配。一般PCI串口卡都是使用了16 c500这一系列的串口芯片,这里着重分析pciSioNetmos。c .
4.2.1 ,PCI设备ID表
,,,,如程序清单41所示pciSioNetmos。c中有一个驱动支持的设备ID表结构体数组.PCI驱动通过PCI总线获取设备相关ID数据和驱动中的驱动支持设备ID表来匹配加载相关的驱动。
程序清单41,驱动支持设备ID表
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ,,驱动支持的设备,ID 表,,用于驱动与设备进行自动匹配,,与,Linux 参数保持一致。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */staticconstPCI_DEV_ID_CB , pciSioNetmosIdTbl [],=, { ,,,{ ,,,,,,,,,PCI_VENDOR_ID_NETMOS PCI_DEVICE_ID_NETMOS_9901, ,,,,,,,0 xa000, 0 x1000, 0, 0, ,,,,,,netmos_9912 ,,,}, ,,,{ ,,,,,,,,,PCI_VENDOR_ID_NETMOS PCI_DEVICE_ID_NETMOS_9912, ,,,,,,,0 xa000, 0 x1000, 0, 0, ,,,,,,netmos_9912 ,,,}, ,,,{ ,,,,,,,,,PCI_VENDOR_ID_NETMOS PCI_DEVICE_ID_NETMOS_9922, ,,,,,,,0 xa000, 0 x1000, 0, 0, ,,,,,,netmos_9912 ,,,}, ,,,{ ,,,,,,,,,PCI_VENDOR_ID_NETMOS PCI_DEVICE_ID_NETMOS_9904, ,,,,,,,0 xa000, 0 x1000, 0, 0, ,,,,,,netmos_9912 ,,,}, ,,,{ null null null null null null null null null null null null null null null null null null null null nullSylixOS_x86_PCI串口驱动浅析