3351|2

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

一个困扰了很久的问题,希望能得到大侠们的帮助 (VXWORKS PCI9054 [复制链接]

 第一次在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均无输出
        //百思不得其解,特在此请教各位高手        
}

最新回复

关注 接分  详情 回复 发表于 2008-5-1 06:29
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我觉得有两个问题很明显:
其一:MMU的添加,应该是以页大小为最小单位,通常是4K,小于这个不行。
其二:既然你用了mmuMapAdd,肯定是x86系统,x86的IO和MEM是独立编址的,你对BAR0的操作如何能用sysInByte和sysOutByte呢?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
关注 接分
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表