在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 6912|回复: 9

一个困扰了很久的问题,希望能得到大侠们的帮助 (VXWORKS PCI9054)

[复制链接]
发表于 2007-5-22 09:36:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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均无输出
        //百思不得其解,特在此请教各位高手        
}
发表于 2007-9-23 11:18:52 | 显示全部楼层
您的问题解决了吗?有一位高手说这中情况是因为所映射的内存空间还
未分配,说是映射的内存空间是在BSP中调用后分配的,我也不大明白,
还找调试阶段,怎么用BSP调用呢?
发表于 2007-10-28 21:25:30 | 显示全部楼层
good!
发表于 2010-2-8 11:22:08 | 显示全部楼层
帮你顶起来。。。。
发表于 2010-2-11 10:42:17 | 显示全部楼层
偶在高LINUX下的PCI9054驱动
头痛啊
发表于 2010-5-1 16:21:38 | 显示全部楼层
have a look
发表于 2010-9-8 17:10:41 | 显示全部楼层
9054没有申请本地总线使用权。   在LOCAL端的space 0 remap或space 1 remap寄存器即LAS0BA或LAS1BA的bit 0位要配为1 才能发起直接存取的读写,(手册上原话Space 0 Enable.Writing a 1 enables decoding of PCI addresses for PCI
Target access to Local Bus Space 0.Writing a 0 disables decoding.)
这就是为什么 RDK上 的EEPROM里18H处 space 0 remap 这里是20000001而不是20000000了
发表于 2011-3-31 16:24:26 | 显示全部楼层
不错~
发表于 2011-4-2 11:45:13 | 显示全部楼层
sssssssssssssssssssssssssssssssssss
发表于 2016-9-9 10:31:05 | 显示全部楼层
好资料,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 13:55 , Processed in 0.043985 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表