阅读:6089回复:11
vxworks PCI驱动请教
对于PCI驱动,我看了一些老贴,是这样写的~~~
《1》 ――――――――――――――――――――――――――――――――――――――――――― 1。复制C:\Tornado\target\h\drv\pci目录下pciAutoConfigLib.h,pciConfigLib.h等PCI头文件文件和C:\Tornado\target\src\drv\pci目录下pciAutoConfigLib.c,pciConfigLib.c等PCI文件到BSP目录下。 2。根据实际的PCI硬件定义改写或从写这些PCI文件。 3。改写BSP配置文件 a. 在BSP 文件config.h中加入语句 #define INCLUDE_PCI (添加PCI模块)。 b. 在BSP 文件sysLib.c中加入语句 #include "pci/pciConfigLib.c"(主要PCI初始化函数在这个文件中)。 c。在BSP 文件sysLib.c中加入语句 IMPORT void sysOutLong(); (导入PCI需要的一些基本函数)。 IMPORT char sysInByte(); 。。。。。 ―――――――――――――――――――――――――――――――――――――――――― PCI初始化包括寄存器初始化,中断连接等,这些是不是一定要放在sysHwInit()?? 这我想只是一小部分,还要根据I/O系统写 create,open,close,read,write........(应用程序调用), VXworks按如下步骤初试化I/O和加载设备的: 《2》 ―――――――――――――――――――――――――――――――――――――――――― 1。调用iosInit初始化I/O系统 2。调用xxDrv初始化设备驱动程序 3。调用xxDevCreate创建设备 ―――――――――――――――――――――――――――――――――――――――――― 我想在BSP中的PCI初始化是不是可以放在 [2。调用xxDrv初始化设备驱动程序] 这里呢, 其实我就是《1》和《2》的关系不明白。 PCI驱动这样写不知对不对啊?帮我看看啊,或哪位有原代码给我共享一下(myswin@163.com),小弟不胜感激! |
|
|
沙发#
发布于:2004-07-15 12:27
前几天写BT878的功能时候,直接写成了普通的应用程序了。
|
|
|
板凳#
发布于:2004-07-15 13:39
Sunbeam兄,这样也行的?那岂不是很难控制?一般的卡只要完成发送、接收、中断处理,你就这样直接调用了吗?有没有别的例子啊,发个给我参考参考啊~~~~~~~~~~
谢~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
|
地板#
发布于:2004-07-15 15:00
什么叫很难控制? 在WINDOWS下也可以这样呀。呵呵,在VXWORKS下写功能模块,还不好好爽一把。在嵌入式系统上没有那么多限制。
PCI配置空间函数封装: #include "btvinter.h" #include "pcicfg.h" typedef struct { int32 busnum; int32 devnum; int32 funcnum; }PCI_CFG, *PPCI_CFG; static PCI_CFG dev[MAX_PCI_DEVICE]; static int32 dnum= 0; static int32 PciCfgOK= pciConfigLibInit(1, 0x0cf8, 0x0cfc, 0); /* 函数功能: 打开指定设备类的PCI配置信息 输入参数: devID: 设备ID vendID: VENDOR ID 输出参数 无 返回值: 返回指定设备类的数目 */ int32 OpenPciCfg(int32 devID, int32 vendID) { dnum= 0; int32 busnum, devnum,funcnum; for(int i= 0; i< MAX_PCI_DEVICE; i++) { if( pciFindDevice(vendID, devID, i,&busnum, &devnum,&funcnum) == OK ) { dev[dnum].busnum= busnum; dev[dnum].devnum= devnum; dev[dnum].funcnum= funcnum; } else break; dnum++; } return dnum; } /* 函数功能: 打开指定设备类的PCI配置信息 输入参数: classID:24位的CLASS ID 输出参数 无 返回值: 返回指定设备类的数目 */ int32 OpenPciCfg(int32 classID) { dnum= 0; int32 busnum, devnum,funcnum; for(int i= 0; i< MAX_PCI_DEVICE; i++) { if( pciFindClass(classID, i, &busnum, &devnum,&funcnum) == OK ) { dev[dnum].busnum= busnum; dev[dnum].devnum= devnum; dev[dnum].funcnum= funcnum; } else break; dnum++; } return dnum; } /* 函数功能: 更新指定的设备PCI配置信息 仅对Type 0 PCI Configuration Headers 输入参数: devIndex:以1为起点,表示第一个设备 IOBase:设定芯片在PCI地址空间中IO地址空间起点 MemBase:设定芯片在PCI地址空间中MEMORY空间起点 Cmd: 设定芯片PCI命令寄存器的值 输出参数 无 返回值: 0表示成功. 注意: 此函数不用于PCI桥芯片 */ int32 UpdatePciCfg(int32 devIndex, uint32 IOBase, uint32 MemBase, uint32 Cmd) { if(devIndex<1||devIndex>dnum) return E_PAR; return pciDevConfig( dev[devIndex-1].busnum, dev[devIndex-1].devnum, dev[devIndex-1].funcnum, IOBase, MemBase, Cmd); } uint32 PciCfgRead32(int32 devIndex, int32 reg) { uint32 dwVal; pciConfigInLong( dev[devIndex-1].busnum, dev[devIndex-1].devnum, dev[devIndex-1].funcnum, reg, &dwVal); return dwVal; } uint32 PciCfgWrite32(int32 devIndex, int32 reg, uint32 regVal) { uint32 dwVal; return pciConfigOutLong( dev[devIndex-1].busnum, dev[devIndex-1].devnum, dev[devIndex-1].funcnum, reg, regVal); } |
|
|
地下室#
发布于:2004-07-15 19:23
不错,好主意,这样就不要IO了~~~~:)WINDOWS涉及到内核态的切换吧,有这么自由吗?~~~~~~~~
不过这只是简单的 PCI卡的操作封装,应用程序然后调用就可以了,那中断什么的都可以这样做了?比如我需要PCI卡实时动态接收数据过来,传给PC处理,这时要有硬件中断(中断函数里面的函数调用也有限制的吧),中断里面可以用个信号量或消息队列,这样和应用任务协调,有没有其他idea? 对了,是不是一定要用vxVMI啊? 多谢Sunbeam!!!! |
|
|
5楼#
发布于:2004-07-16 12:01
中断函数里面的函数调用肯定受限制的,是必然的。看看中断方面的文档。嵌入式系统一般来说没有什么核心态,主要是可能是考虑实时性和硬件操作特性。一般来说大致按照文档要求来做就可以了。
WINDOWS也有好多后门。 |
|
|
6楼#
发布于:2004-07-27 08:59
忘了放分给你了,sunbeam~~~~~~~~~~~~~`哈哈
|
|
|
7楼#
发布于:2004-07-28 20:58
我开发的7146a的驱动程序也是直接在应用层里开发的,基地址搞定后直接写就ok,不用搂主说的那么麻烦
|
|
8楼#
发布于:2004-09-01 10:35
VXWORKS下面的驱动有两种方式,一种是用标准的IO库来操作,使用标准的IO的一套函数;另外一种就是把驱动作为一个应用来之间调用。
|
|
9楼#
发布于:2004-09-01 10:35
VXWORKS下面的驱动有两种方式,一种是用标准的IO库来操作,使用标准的IO的一套函数;另外一种就是把驱动作为一个应用来直接调用。
|
|
10楼#
发布于:2004-09-01 15:53
good!
|
|
|
11楼#
发布于:2010-04-12 10:47
xue xi
|
|
|