SylixOS_x86_PCI串口驱动浅析

  

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所示:

 SylixOS_x86_PCI串口驱动浅析

图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   null

SylixOS_x86_PCI串口驱动浅析