|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
第一次在vxWorks下开发PCI9054的驱动,问题多多.
板卡在Windows系统下,用Memory映射方式访问是正确,没有测试过
I/O的方式访问.而在vxWorks下访问,板卡没有任何动静,像是PCI9054
没有对Local端进行任何操作,因为在访问时测试LADS/LBLAST/LHOLD等
信号均无输出.我不知道我的访问有什么不对,我在vxWorks下试过MEMORY
和I/O访问,均不正确. 具体的配置是:BAR0为memory映射,BAR1为I/O映射.
PCI9054的LOCAL端的0X20地址是我的测试地址,向0X20写什么数据读出来
也应该是什么数据,PCI工作在8b模式下.具体的vxWorks代码如下:
pci9054()
{
STATUS error;
int BusNo, DeviceNo, FuncNo;
unsigned int bar0, bar1;
int ConfigData;
error = pciFindDevice(0x10B5, 0x9054, 0, &BusNo, &DeviceNo, &FuncNo);
if(error == OK)
{
printf("Bus Number: %d \n", BusNo);
printf("Device Number: %d \n", DeviceNo);
printf("Function Number: %d \n", FuncNo);
}
else
{
printf("PCI Device Not found!");
return error;
}
error = pciConfigInLong(BusNo, DeviceNo, FuncNo, 0x10, &bar0);
if(error == OK)
{
printf("BAR0: 0x%x \n", bar0);
}
else
{
printf("BAR0 Read Error!");
return error;
}
if((bar0&0x1)==0) //the memory map
{
bar0&= PCI_MEMBASE_MASK;//获得BAR0的基地址
if (sysMmuMapAdd ((void *)(bar0),
256,//内存大小为256字节
VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE |
VM_STATE_MASK_CACHEABLE,
VM_STATE_VALID | VM_STATE_WRITABLE |
VM_STATE_CACHEABLE
) == ERROR)
{
return (ERROR);
}
}
error = pciConfigInLong(BusNo, DeviceNo, FuncNo, 0x14, &bar1);
if(error == OK)
{
printf("BAR1: 0x%x \n", bar1);
}
else
{
printf("BAR1 Read Error!");
return error;
}
bar1 &=PCI_IOBASE_MASK;//获得BAR1的基地址 I/O映射
//测试PCI9054本地0X20地址
char j;
char i=0xab;
sysOutByte(bar0+ 0x20,i);
j = sysInByte(bar0 + 0x20);
if(i==j)
{
printf("OK");
}
sysOutByte(bar1+ 0x20,i);
j = sysInByte(bar1 + 0x20);
if(i==j)
{
printf("OK");
}
/////测试发现当访问bar0+0x20/bar1+0x20,PCI9054的LADS/LBLAST/LHOLD均无输出
//百思不得其解,特在此请教各位高手
} |
|