在学校的时候,曾经采用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. T100——作业action执行其他P作业,后台背景执行完后才能继续操作改作业

    范例:如axmt500订单,查询开单占用量: 客制作业cxmp500,通过参数-订单号,查询该订单下的料件,目前有库存量.开单占用量.库存可用量,查询后更新到该订单下的单身对应栏位: 现在axmt50 ...

  2. 使用python的ctypes库实现内存的动态申请和释放

    1.申请前内存占用情况 2.申请内存 from ctypes import * import time #在这里申请1G的内存,单位k mem = create_string_buffer(1024* ...

  3. BufferedImage类、Image类、Graphics类

    BufferedImage Image是一个抽象类,BufferedImage是其实现类,是一个带缓冲区图像类,主要作用是将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像 ...

  4. Js的原型和原型链讲解

    原型:每个对象都会在其内部初始化一个属性,就是prototype 原型链:当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype中去找,这个prototype中会有 ...

  5. 创建LEANGOO看板

    转自:https://www.leangoo.com/leangoo_guide/leangoo_guide_create_kanban.html#toggle-id-3 Leangoo使用看板来管理 ...

  6. 如何源码编译安装并控制nginx

    安装nginx 注意 Linux操作系统需要2.6及其以上的内核(支持epoll) 使用nginx的必备软件 gcc编辑器 yum -y install gcc gcc-c++ pcre库(支持正则表 ...

  7. Action向视图传值的6种方式(转)

    在使用ASP.NET MVC进行项目开发时,经常会碰到从Action向视图传值的问题,今天我就把我所知道的方式总结了一下,分成了以下六种: 1.使用ViewData进行传值 在Action中,有如下代 ...

  8. Delphi RS-232C标准

  9. 【2017-03-28】JS基础、windows对象、history对象、location对象

    一.JS基础 JS - javaScript 1.js功能: 1).进行数据的运算.2).控制浏览器的一些功能.3).控制元素(属性.内容.样式) js引用位置: 可以放在html页的任意位置. 推荐 ...

  10. Manticore search加一个中文分词

    Sphinx search 是一款非常棒的开源全文搜索引擎,它使用C++开发,索引和搜索的速度非常快,我使用sphinx的时间也有好多年了.最初使用的是coreseek,一个国人在sphinxsear ...