6757|6

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

vxworks求助(关于pci配置和存储器映射) [复制链接]

 刚学vxworks不久,用的开发环境是tornado5.5,最近想使用一个pci的8串口板,设备是映射到存储器空间的而不是IO空间,硬件环境是PC104+,pci配置方式是动态配置,代码如下:
#include "vxworks.h"
#include "tasklib.h"
#include "syslib.h"
#include "config.h"
#include "vmlib.h"
#include "drv/pci/pciConfigLib.h"

#define xxx_DEBUG /*这里定义每一个VID和DID*/
#define xxx_VENDOR_ID 0x13A8
#define xxx_DEV_ID 0x0158

#define xxxUNKNOWN 0
#define xxx_MAX_UNITS 1  /*每一个板卡的资源*/
typedef struct xxxResource  /* xxx_RESOURCE */
{
int BoardVID;
int BoardDID;
int unitInx;
} xxx_RESOURCE;
/*板卡资源的定义,这里以相同的板卡为例子
板卡如果相同的话unitInx逐次递增,如果不同
的话则从零开始*/
LOCAL xxx_RESOURCE xxxRes [xxx_MAX_UNITS] =
    {
    {xxx_VENDOR_ID, xxx_DEV_ID, 0},
     };

/*这里就是PCI初始化部分了*/
void xxxPciInit (void)
    {
    xxx_RESOURCE *pReso;
    int pciBus;
    int pciDevice;
    int pciFunc;
    int unit;
    int iCommand;
    BOOL duplicate;
    UINT32 membaseCsr;
    UINT32 r_membase;/*用于计算地址映射的空间*/
    char irq;
    int ix;
     

    for (unit = 0; unit < xxx_MAX_UNITS; unit++)
{
  /*寻找板卡*/
        if (pciFindDevice (xxxRes[unit].BoardVID, xxxRes[unit].BoardDID,
    xxxRes[unit].unitInx, &pciBus, &pciDevice, &pciFunc) != OK)
     break;
    pReso = &xxxRes [unit];
  /*  PCI_CFG_TYPE can be defined to PCI_CFG_NONE,PC_CFG_AUTO,or PCI_CFG_FORCE.*/
  /*  在X86下,BIOS会分配好资源的,所以不需要再配置了*/
  for(ix=0; ix<6; ix++)/*总共是6个地址*/
  {
      pciConfigInLong (pciBus, pciDevice, pciFunc,
                    PCI_CFG_BASE_ADDRESS_0 + 0x04 * ix, &membaseCsr);  /*读回地址内容*/
   /*首先需要判断是内存还是端口,如果不是端口就映射*/
   if(!(membaseCsr&PCI_BAR_SPACE_IO))
   {
    /*首先,需要判断所需内存的大小
    根据PCI的规范,将内容写回就可以得到大小*/
    pciConfigOutLong (pciBus, pciDevice, pciFunc,
                           PCI_CFG_BASE_ADDRESS_0 + 0x04 * ix, 0xffffffff);
       pciConfigInLong (pciBus, pciDevice, pciFunc,
                     PCI_CFG_BASE_ADDRESS_0 + 0x04 * ix, &r_membase);
       r_membase &= PCI_MEMBASE_MASK; /*现在r_membase就是长度了*/
    /*再把地址写回去*/
       pciConfigOutLong (pciBus, pciDevice, pciFunc,
                           PCI_CFG_BASE_ADDRESS_0 + 0x04 * ix, membaseCsr);

    membaseCsr   &= PCI_MEMBASE_MASK;
#ifdef xxx_DEBUG
  /*如果现在是调试阶段,则不用映射,继续下一个*/
  printf("\nmemory space is : 0x%x", membaseCsr);
  printf("\nlength is : 0x%x", r_membase);
  continue;
#endif
    /*此时就可以将内存映射过去了*/
    if (sysMmuMapAdd((void *)membaseCsr, r_membase,
                           VM_STATE_MASK_FOR_ALL,
                           VM_STATE_FOR_PCI) == ERROR)
             break;
   }
  }
}
}
将这个文件保存在bsp目录下,然后在syslib.c里包含,在函数sysHwInit()里调用,
该代码来自所买的参考书,现在的问题是:
1、如果配置成功,和pc104连接的显示器上会打印出memory is 。。。和length is。。,可是屏幕上没有出现
2、如果对pci设备存储器空间进行地址映射后,如何使用这个地址,配置函数没有显示哪里可以将指针传出去?
3、如果屏幕上没有打印出配置结果,是不是打印到别的地方了?
4、我把这个函数放到usrAppInit()中运行,显示能够找到设备,读出pci的基地址是0xffeb1f000,地址长度为0xfffff000,地址超出了我的pc104实际内存,显然不对,这是为什么?
请高手帮忙解答,很纠结。。。。。
还有,如何配置pci设备,配置后如何使用?

最新回复

明白了,长度要取个反,也就是0xfffff000的反,为0xfff。感谢楼上各位的解惑,祝一切顺利!  详情 回复 发表于 2010-3-20 00:16
点赞 关注
 

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
期待vxworks高手
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
sysHwInit中STD都还没有初始化,肯定是打印不出来的。
要等到串口或者PCCONSOLE初始化之后,打印才会出来。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼上正解!
    sysMmuMapAdd必须在MMU初始化前调用(也就sysHwInit()内调用),你调用的位置是对的,但那时候printf不好用。
    可以在vxworks启动后,再打印看一下。通过全局变量就可以使用基地址。(定义在驱动文件的初始处)
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 tianxiapdw 的回复:
楼上正解!
sysMmuMapAdd必须在MMU初始化前调用(也就sysHwInit()内调用),你调用的位置是对的,但那时候printf不好用。
可以在vxworks启动后,再打印看一下。通过全局变量就可以使用基地址。(定义在驱动文件的初始处)

按照楼上说的试了下,在sysHwInit里用全局变量保存基地址membaseCsr 和映射空间长度r_membase,在usrAppInit里打印,显示membaseCsr 为0xfebff000,r_membase为0xfffff000,这是怎么回事呢,按照pci协议,先往配置空间写0xffffffff,再读就可以得到映射空间的长度了,地址不应该这么大?
我用的pci设备是RTD的CM17320HR,映射到存储器空间,长度为4K
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

6
 
设置了PCI_CFG_TYPE= PCI_CFG_NONE,
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

7
 
明白了,长度要取个反,也就是0xfffff000的反,为0xfff。感谢楼上各位的解惑,祝一切顺利!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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