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/
Plx9030通讯卡驱动开发与接口封装的更多相关文章
- Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作
前面对SD卡控制器有了一个主要的介绍.事实上SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法.当然不同的控制器对硬件控制的方法不尽同样,可是他们终于都能像core层提交一个统一的封 ...
- 驱动开发:内核封装WSK网络通信接口
本章LyShark将带大家学习如何在内核中使用标准的Socket套接字通信接口,我们都知道Windows应用层下可直接调用WinSocket来实现网络通信,但在内核模式下应用层API接口无法使用,内核 ...
- Linux 下wifi 驱动开发(三)—— SDIO接口WiFi驱动浅析
SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈.可以实现用户主平台数据通过SDIO口到无线网络之间的转 ...
- S3C2416裸机开发系列十六_sd卡驱动实现
S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子 1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.传输数据快.可插拔.安全性好等长 ...
- iOS开发-网络-合理封装请求接口
概述 如今大多App都会与网络打交道,作为开发者,合理的对网络后台请求接口进行封装十分重要.本文要介绍的就是一种常见的采用回调函数(方法)的网络接口封装,也算的是一种构架吧. 这个构架主要的idea是 ...
- Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
源: Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
- 基于Zabbix API文档二次开发与java接口封装
(继续贴一篇之前工作期间写的经验案例) 一. 案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...
- 【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean
写在前面 在上一篇关于Spring的@Import注解的文章<[Spring注解驱动开发]使用@Import注解给容器中快速导入一个组件>中,我们简单介绍了如何使用@Import注解给容器 ...
- SD card技术了解并WINCE下SDHC驱动开发(updated)
Suumary: 简单介绍了一下SD卡的历史和发展,同时结合MX31 ADS上的WINCE 下SDHC驱动更深入的了解该硬件的一些行为特点. 了解SD card SD是Secure Digital C ...
随机推荐
- O026、Nova组件详解
参考https://www.cnblogs.com/CloudMan6/p/5436855.html 本节开始,我们将详细讲解 Nova 的各个子服务. 前面架构概览一节知道 Nova 有若干 ...
- MYSQL 增加语句(数据)
增加数据 如果你失忆了,希望你能想起曾经为了追求梦想的你. 前一节我们学习了查询语句 SELECT,这节课,我们学习增加 INSERT INTO **** VALUES ****,基 ...
- LINUX中lrzsz软件的使用
安装lrzsz 可以在Linux 和 windows直接相互传文件 Linux无论ssh跳过去也可以sz rz打开图像进行传输文件 [root@master2 ~]# yum install lrzs ...
- Tomcat项目自动部署脚本
一般情况下使用的Linux环境都是加固的,root路径只有超级管理员权限才能进入.我们新建一个自己的用户,在/home下会有一个用户目录,传输war包都放在这个目录下,此时不动webapps文件下的内 ...
- 第十五章、线程之queue模块的各种队列
目录 第十五章.线程之queue模块的各种队列 一.Queue 二.LifoQueue堆栈 三.PriorityQueue优先级队列 第十五章.线程之queue模块的各种队列 一.Queue impo ...
- Linux系统安装常用开发软件
vim.jdk.tomcat.mysql 安装vim(命令模式=>编辑模式=>底行模式) [root@localhost ~]# yum install vim*结束后一直确认即可,键入y ...
- 转载 如何使用批处理 动态改变path实现改变JDK版本
http://www.cnblogs.com/xdp-gacl/p/5209386.html 1 @echo off 2 3 rem --- Base Config 配置JDK的安装目录 --- 4 ...
- 单节点FastDFS与Nginx部署
一.安装基本组件 1.安装编译需要的组件,必安装组件. yum install gcc-c++ 2.安装libevent函数库.pcre-devel zlib-devel必安装组件. yum ...
- Toast的基本用法 吐司打印
//Toast.makeText(上下文,内容,显示时间);Toast toast =Toast.makeText(this,"位置="+position+"内容=&qu ...
- 数据结构---->数组
1.什么是数组? 数组是一种线性的数据结构.它同一组连续的内存空间,来存储一组具有相同类型的数据. 简单说明几点: (1).线性表:就是数据排成像一条线一样的结构.每个线性表的数据最多只有前和后两个方 ...