myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5989回复:11

vxworks PCI驱动请教

楼主#
更多 发布于:2004-07-15 11:03
对于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),小弟不胜感激!
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
Sunbeam
驱动小牛
驱动小牛
  • 注册日期2001-10-29
  • 最后登录2010-01-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-15 12:27
前几天写BT878的功能时候,直接写成了普通的应用程序了。
堂堂正正做人,明明白白做事
myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-15 13:39
Sunbeam兄,这样也行的?那岂不是很难控制?一般的卡只要完成发送、接收、中断处理,你就这样直接调用了吗?有没有别的例子啊,发个给我参考参考啊~~~~~~~~~~
谢~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
Sunbeam
驱动小牛
驱动小牛
  • 注册日期2001-10-29
  • 最后登录2010-01-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于: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);
}
堂堂正正做人,明明白白做事
myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-15 19:23
不错,好主意,这样就不要IO了~~~~:)WINDOWS涉及到内核态的切换吧,有这么自由吗?~~~~~~~~
不过这只是简单的 PCI卡的操作封装,应用程序然后调用就可以了,那中断什么的都可以这样做了?比如我需要PCI卡实时动态接收数据过来,传给PC处理,这时要有硬件中断(中断函数里面的函数调用也有限制的吧),中断里面可以用个信号量或消息队列,这样和应用任务协调,有没有其他idea?
对了,是不是一定要用vxVMI啊?
多谢Sunbeam!!!!
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
Sunbeam
驱动小牛
驱动小牛
  • 注册日期2001-10-29
  • 最后登录2010-01-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-16 12:01
中断函数里面的函数调用肯定受限制的,是必然的。看看中断方面的文档。嵌入式系统一般来说没有什么核心态,主要是可能是考虑实时性和硬件操作特性。一般来说大致按照文档要求来做就可以了。

WINDOWS也有好多后门。
堂堂正正做人,明明白白做事
myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-27 08:59
忘了放分给你了,sunbeam~~~~~~~~~~~~~`哈哈
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
dongyupeng
驱动牛犊
驱动牛犊
  • 注册日期2003-12-31
  • 最后登录2005-04-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-28 20:58
我开发的7146a的驱动程序也是直接在应用层里开发的,基地址搞定后直接写就ok,不用搂主说的那么麻烦
beatles
驱动牛犊
驱动牛犊
  • 注册日期2002-01-07
  • 最后登录2008-06-24
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-09-01 10:35
VXWORKS下面的驱动有两种方式,一种是用标准的IO库来操作,使用标准的IO的一套函数;另外一种就是把驱动作为一个应用来之间调用。
beatles
驱动牛犊
驱动牛犊
  • 注册日期2002-01-07
  • 最后登录2008-06-24
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-09-01 10:35
VXWORKS下面的驱动有两种方式,一种是用标准的IO库来操作,使用标准的IO的一套函数;另外一种就是把驱动作为一个应用来直接调用。
myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-09-01 15:53
good!
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
lhsundriver
驱动牛犊
驱动牛犊
  • 注册日期2005-10-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望181点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2010-04-12 10:47
xue xi
hdjasfhkjasdhfkj
游客

返回顶部