在学校的时候,曾经采用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/

Plx9030通讯卡驱动开发与接口封装的更多相关文章

  1. Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个主要的介绍.事实上SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法.当然不同的控制器对硬件控制的方法不尽同样,可是他们终于都能像core层提交一个统一的封 ...

  2. 驱动开发:内核封装WSK网络通信接口

    本章LyShark将带大家学习如何在内核中使用标准的Socket套接字通信接口,我们都知道Windows应用层下可直接调用WinSocket来实现网络通信,但在内核模式下应用层API接口无法使用,内核 ...

  3. Linux 下wifi 驱动开发(三)—— SDIO接口WiFi驱动浅析

    SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈.可以实现用户主平台数据通过SDIO口到无线网络之间的转 ...

  4. S3C2416裸机开发系列十六_sd卡驱动实现

    S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子    1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.传输数据快.可插拔.安全性好等长 ...

  5. iOS开发-网络-合理封装请求接口

    概述 如今大多App都会与网络打交道,作为开发者,合理的对网络后台请求接口进行封装十分重要.本文要介绍的就是一种常见的采用回调函数(方法)的网络接口封装,也算的是一种构架吧. 这个构架主要的idea是 ...

  6. Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析

    源: Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析

  7. 基于Zabbix API文档二次开发与java接口封装

    (继续贴一篇之前工作期间写的经验案例) 一.           案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...

  8. 【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean

    写在前面 在上一篇关于Spring的@Import注解的文章<[Spring注解驱动开发]使用@Import注解给容器中快速导入一个组件>中,我们简单介绍了如何使用@Import注解给容器 ...

  9. SD card技术了解并WINCE下SDHC驱动开发(updated)

    Suumary: 简单介绍了一下SD卡的历史和发展,同时结合MX31 ADS上的WINCE 下SDHC驱动更深入的了解该硬件的一些行为特点. 了解SD card SD是Secure Digital C ...

随机推荐

  1. 两个链表的第一个公共结点——牛客offer

    题目描述: 输入两个链表,找出它们的第一个公共结点. 题目分析: 只是数据域相同不是公共节点.公共结点代表该节点在两个链表中的数据域和指针域都是相同的,这意味着从该公共节点开始,后面的结点都是两个链表 ...

  2. Asp.net core Enum as string + ef core value convertor

    更新 : 2019-06-08 build in convertor https://docs.microsoft.com/en-us/ef/core/modeling/value-conversio ...

  3. windows上pip安装及使用详解

    windows上pip安装及使用详解 2018-11-21 19:49:58 十二笔 阅读数 8229更多 分类专栏: Python学习   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  4. 【web性能优化】当用户输入网址后发生了什么?

    简单叙述 这个过程可以大致分为两个部分:网络通信和页面渲染. 一.网络通信 互联网内各网络设备间的通信都遵循TCP/IP协议,利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信.分层由 ...

  5. 无障碍开发(四)之ARIA aria-***状态值

    aria-***状态值

  6. JS基础_算数运算符

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. axios跨域问题(包括开发环境和生产环境)

    之前写过一篇axios跨域问题,写的过于片面,没有考虑过实际开发中遇到的问题,以及如何全局使用axios,这次再写一篇,以后再有新发现再更新... 1.在static文件夹下新建/js/config. ...

  8. 能当壁纸用的Git常用命令速查表

    使用Microsoft Office 2016手工绘制. 链接: https://pan.baidu.com/s/18KsH-u5T2iSTHaXd6iQWGA 提取码: w8da 复制这段内容后打开 ...

  9. Shell脚本grep命令

    三剑客:grep  sed  awk grep:文本行过滤工具 sed:  文本行编辑器(流编辑器) awk: 报告生成器,输出格式化 grep包含三个命令: grep egrep fgrep .他们 ...

  10. GraphX介绍

    转自:https://www.cnblogs.com/txq157/p/5978747.html 1.GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理框架,它 ...