在学校的时候,曾经采用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. 怎样理解 instanceof

    instanceof 运算符用来判断一个对象在其原型链中是否存在一个构造函数的 prototype 属性. 也就是说, instanceof 判断的实际上是某个对象是否为某个构造函数的实例, 因为es ...

  2. webmagic学习之路-2:采集安居客经纪人列表

    相比较 1 稍微成熟了一点,会用的东西多了. 正则用的不好,很多东西不会,大神轻喷! package com.action; import java.util.ArrayList; import ja ...

  3. golang(8):channel读写 & goroutine 通信

    goroutine 1.进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位 B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独 ...

  4. luogu题解 P2860[USACO冗余路径Redundant Paths] 缩点+桥

    题目链接 https://www.luogu.org/problemnew/show/P2860 https://www.lydsy.com/JudgeOnline/problem.php?id=17 ...

  5. Excel学习笔记:行列转换

    目录 offset函数 行列转换的三种方式 1.右键转置 2.转置公式TRANSPOSE 3.引用函数OFFSET+ROWS/COLUMN(支持随时更新数据) 一行(列)转多行多列 offset函数 ...

  6. The last packet successfully received from the server was 39,900 milliseconds ago问题解决

    1,之前用Mysql或者mycat的时候都没有这个问题.后来改为haproxy+keepalived+mycat后出现这个问题 2,网上查了很多说法,我按照网上说的改了 datasource: url ...

  7. 1 sql server 中cursor的简介

    1.游标的分类 游标共有3类:API服务器游标.Transaction-SQL游标和API客户端游标. 2 API服务器cursor共有如下几种 静态游标的完整结果集将打开游标时建立的结果集存储在临时 ...

  8. 深入分析 Docker 镜像原理

    摘要:近日, DaoCloud 软件工程师孙宏亮在 CSDN Container 微信群为大家带来了 Docker 镜像原理的深度分享,本次分享的重点是 Docker 镜像,分享的内容主要包含两个部分 ...

  9. Delphi 建立ODBC数据源

    樊伟胜

  10. Linux 链接脚本分析

    作者:答疑助手lizuobin 原文: https://blog.csdn.net/lizuobin2/article/details/51779064 在前面学习的过程中,看代码时遇到 arch_i ...