zoukankan      html  css  js  c++  java
  • Plx9030通讯卡驱动开发与接口封装

    在学校的时候,曾经采用DDK+Driverstudio+VC6.0环境做过9054视频采集卡的驱动开发,回想起调试过程,记得最清楚的就是过无数次的计算机蓝屏重启。。。。今天第一天来到新公司,老大就说你以前不是做过PCI驱动的开发嘛,手头上刚好有一个PCI-CAN的通信卡项目,你把驱动程序写一写。那就干活吧。

    1. PCI设备上电与驱动加载

    PCI总线标准是一种将系统外部设备连接起来的总线标准,是PC中最重要的总线,实际上是系统的各个部分如何交互的接口。在当前的 PC 体系结构中,几乎所有的外部设备采用的各种各样的接口总线,均是通过桥接电路挂接到 PCI 系统上。在这种 PCI 系统中, Host/PCI 桥称为北桥,连接主处理器总线到基础 PCI 局部总线。 PCI 与其他总线的接口称为南桥,其中南桥还通常含有中断控制器、IDE 控制器、USB 控制器和 DMA 控制器等。南桥和北桥组成主板的芯片组。每个PCI设备由总线号、槽位号、功能号唯一确定。

    PCI设备分为bus和device,驱动分为bus driver和device driver,bus driver通常是主板厂商关心的,系统自带的驱动。系统加电后,PnP管理器要求(PCI)总线驱动程序枚举(enumerte)挂载的设备信息,bus diver响应此请求,扫描物理设备(IDSEL),与PCI设备交互,读取PCI设备EEPROM的配置数据,为PCI设备分配系统资源。

    2. EEPROM内容

    PCI设备上电后,会自动识别并加载EEPROM数据。plx公司提供的plxMON可以在线读写EEPROM数据,下图是我开发读到的EEPROM数据。加载PLX提供的默认EEPROM镜像后,修改一些相关数据,就可以写EEPROM啦。修改哪些数据呢?

    设备IDs:为了让你的设备在系统中有唯一的ID号,修改Dev/Ven ID或Subsystem ID。

    space寄存器:可以配置四个地址空间,每个地址空间都有一份一样功能的配置寄存器。Descriptor是描述,详细见Datasheet,关键是配置好数据位宽;Range表示空间大小;Remap有两个地方要注意,bit[0]是使能位,其余位是offset. 我使用了space0和space1,内存映射。space0,配置了16KB,偏移为0;space1,配置了16B,偏移为0x4000(0x4000即space0的16KB)。

    片选寄存器:包含三部分含义,bit[0]使能位,offset和space range. 与space寄存器保持一致。

    中断寄存器:开启PCI中断使能,Linti中断使能,中断触发方式等,与硬件设计沟通。

    修改EEPROM后保存镜像,写EEPROM。然后关闭系统电源,重启,看设备管理器内对新硬件的资源分配。注意,看到的内存资源起始地址是系统根据EEPROM的需求上电动态分配的,是保存在PCI配置寄存器内的地址。只要地址范围对应相等即可。

    3. inf文件修改

    根据PLX官方帮助文档的要求,“Shipping a product with a plx chip”,为了降低系统内设备冲突的风险,建议修改官方sys和dll文件名字,按照自己公司特色的方式命名。例如例如将9030.sys更名为Ray-Vision9030.sys,PlxApi.dll更名为Ray-Vision9030.dll.

    按照如下步骤修改inf文件

    (1)class guid. 为了在设备管理器中不是一个黄色大问号,采用guidgen.exe工具唯一GUID,并写[ClassInstall32]节在注册表中增加相关项;

    (2)公司名字及设备描述名字,这是在设备管理器中显示的,与功能无关;

    (3)修改[Manufacturer]节,根据EEPROM中设备ID信息,更新inf中设备ID,这样inf文件才是为我们的PCI设备服务的;否则安装时会提示安装失败;

    (4)文件名字和源目录、目标目录。

    4. API接口封装

    设备功能不同,接口会有所不同。但是本质上,包含五个基本的操作接口,open、write、interrupt、read、close,其余的功能接口是建立在此基础上的再次封装。借鉴PLX SDK提供的Samples和手册,搞清楚这5个基本的操作实现方式。

    open思路是:(1)先调用PlxPci_DeviceFind遍历PCI总线,将所有的PCI设备信息放到数组中,(2)根据设备的ID信息(_PLX_DEVICE_KEY结构中DEVICE_ID、VENDOR_ID、SUBDEVICE_ID、SUBVENDOR_ID),确定设备数组哪个是你关心的设备,取出其pKey,调用PlxPci_DeviceOpen得到设备句柄。到这里,open操作貌似已经比较清楚的可以实现了。

    http://www.cnblogs.com/yuqiao-ray-vision/

  • 相关阅读:
    Jsoup的学习
    String中对字符串进行操作的一些方法
    Httpclient的学习(一)
    初识爬虫见到的两个类 BufferedWriter和 BufferedReader
    ZooKeeper学习笔记(二)——内部原理
    FastDFS安装指南
    基于CentOS6.5的Dubbo及Zookeeper配置
    虚拟机克隆后遇到的网络相关的问题
    ElasticSerach 6.x的安装及配置
    YARN-HA高可用集群搭建
  • 原文地址:https://www.cnblogs.com/yuqiao-ray-vision/p/3607906.html
Copyright © 2011-2022 走看看