PowerPC VxWorks rapidio调试问题

VxWorks_developer 2018-09-04 01:09:27
rapidio maintance access :
我的硬件环境是PowerPC8548,操作系统是VxWorks和fpga通过rapidio进行通信。
具体流程是:PowerPC作为主通过发起维护包来枚举自身,枚举连接的switch,枚举其他端口的设备(fpga)。
现在程序枚举自身和枚举switch完成,但枚举switch其他端口上的rapidio设备时,死在了执行lock这一步。无法读取从设备的BDIDCSR。
有没有大神帮忙分析一下到底问题出在哪了?感谢
...全文
1007 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
VxWorks_developer 2018-09-14
  • 打赏
  • 举报
回复
我这个表达能力不行啊,维护包其实就是一个通过窗口映射发现邻居的过程,host枚举自己,枚举switch,枚举一跳邻居,枚举两跳邻居。
operands 2018-09-08
  • 打赏
  • 举报
回复
agent如果id是0xff,应该是没问题的,说明问题不在这。
可以试一下把agent配成host,看看能否枚举到fpga,如果可以说明作为host没啥问题,而是作为agent时的问题
operands 2018-09-07
  • 打赏
  • 举报
回复
PEFCAR意思是这个设备有自身内存,可以通过NREAD、NWRITE直接访问,不是说不能通过维护包访问,一般设备都可以响应维护包。
不枚举,自己配置id也可以,这样的话需要手动配置switch的路由,可以把直接写到1432的eeprom上,也可以通过其中一个host启动时通过维护包配置1432的路由表,可能麻烦些,但是可行的。枚举方式是比较方便的,而且拓扑变化也能自适应。
上面我说的Port Disable位你检查了么?另外死在访问从设备 HBDIDLCSR_REG,也是和fpga一样读出来全F?你说一个ppc作为host,另一个作为agent是通过硬件配置的,是配置什么引脚么?如果两个ppc上都跑了枚举流程,那么软件上相当于两个host同时枚举,srio id不一样的话,应该是数值大的那一方获胜,不知道你这两个ppc的id分别配的多少?如果配置成一样的了就会出现这种情况。
VxWorks_developer 2018-09-07
  • 打赏
  • 举报
回复
Processing Element Features Capability Register (PEFCAR)
我读到PPC8548有一个只读寄存器PEFCAR,
Memory. PE has physically addressable local address space and can be accessed as an endpoint through non-maintenance operations. (MEM = 1)

看字面的意思,是否表示,ppc作为agent,不能通过maintenance访问呢?

VxWorks_developer 2018-09-07
  • 打赏
  • 举报
回复
您说的这几种方式,我试一试。
Port端口enable是访问ppc 从设备之前查看的,端口状态正常。ppc从设备读出来的自身的HBDIDLCSR_REG是全F。PPC的host和agent是通过拉高或者拉低硬件配置引脚来实现rapidio主从配置。

现在两边的ppc id分别为host为0x07, agent为0xff。host枚举,agent不枚举,只做初始化自身。

您说的两个都发起枚举也是可以的,是吧。只是需要把这两者配成不同的id。我试一下这种。

真是太感谢您了
VxWorks_developer 2018-09-06
  • 打赏
  • 举报
回复
谢谢,整个维护包的实现是先枚举自己,然后发送维护包去枚举switch(1432),最后去枚举挂接在switch上的其他的rapidio设备。现在可以确认的是ppc主枚举switch是没有问题的,枚举其他端口的设备(FPGA)时,串口打印会死在 读 FPGA的lock寄存器那里。读取从设备的lock寄存器状态是0xffff。主设备第一次访问就卡住了。AcquireDeviceLock() -->configureRead(读取FPGA的BDID寄存器)

/*****************************************************************************/
static t_Error SrioEnumNeighbor(t_SrioPort *p_SrioPort,
uint16_t hostDevId,
uint8_t hopCount)
{
t_SrioDeviceDesc *p_DeviceDesc;
uint32_t delay = 0, status, i,portsel=0;
uint16_t hostLockId, currDevId, devId = 0;
t_Error retVal = E_OK;
uint8_t numOfPorts, currentPortId, portId;
uint16_t neighborId = (uint16_t)(SRIO_DEFAULT_AGENT_DEV_ID & p_SrioPort->devIdMask);

printf("%s: %d\n", __FUNCTION__, __LINE__);
retVal = AcquireDeviceLock (p_SrioPort,
neighborId,
hopCount,
hostDevId,
&hostLockId);

printf("\nAcquireDeviceLock is OK,hostLockId=0x%x,hostDevId=0x%x \n",hostLockId,hostDevId);


/* If some error occured */
if (retVal != E_OK)
{
RETURN_ERROR(MAJOR, retVal, NO_MSG);
}
. . . . . . .


static t_Error AcquireDeviceLock(t_SrioPort *p_SrioPort,
uint16_t destDevId,
uint8_t hopCount,
uint16_t hostDevId,
uint16_t *p_HostLockId)
{
uint32_t tmpVal;
t_Error retVal;

printf("\nAcquireDeviceLock:%d destDevId:0x%x,hopCount:0x%x,hostDevId:0x%x p_HostLockId:0x%x\r\n",__LINE__, destDevId,hopCount ,hostDevId , *p_HostLockId);


/* Checking if the device was already locked and by whom */
retVal = ConfigurationRead(p_SrioPort,
destDevId,
hopCount,
HBDIDLCSR_REG_OFFSET,
&tmpVal);
printf("%s: %d\n", __FUNCTION__, __LINE__);

if (retVal != E_OK)
RETURN_ERROR(MAJOR, E_READ_FAILED, NO_MSG);
. . . . . .
VxWorks_developer 2018-09-06
  • 打赏
  • 举报
回复
另一块从设备,link也是ok的。现象和fpga一样,死在了访问从设备 HBDIDLCSR_REG 。

逻辑换了一版,之前项目的逻辑代码。之前的问题可以说是逻辑这边不通。

您之前做过两个PCC之间rapidio通信吗?
我现在是让一个ppc为host,一个ppc为agent(通过硬件配的)。这么做应该也没什么问题。

您之前做过这种类似维护包的方式,是怎么实现的?有没有什么,比如直接从设备配死自身id的办法?
现在实现是束手无策了。。。。
operands 2018-09-06
  • 打赏
  • 举报
回复
另一块从设备也是link ok么?问题现象和fpga一模一样?
从设备应该不需要做什么事情的,你fpga逻辑改什么了?
VxWorks_developer 2018-09-06
  • 打赏
  • 举报
回复
最新进展:修改了一版逻辑,我现在ppc和fpga能正常收发了。感谢感谢

但是新问题是,我这一版能和fpga通信的ppc主,和另一块从设备ppc。依然存在刚才的主设备发维护包扫描不到从设备的情况。
作为从设备来讲,除了自身的rapidio初始化,还需要做什么工作呢?

求大神指教
operands 2018-09-04
  • 打赏
  • 举报
回复
另外,可以开启1432的包计数器功能,看下维护包是不是确实到了fpga所在端口,还是根本没过去
operands 2018-09-04
  • 打赏
  • 举报
回复
访问不了是说发出的维护包没有回应么?除了fpga外,有没有挂其他类型的设备?能枚举成功么?
确认下是没有回应,还是重复读写,加个打印看看log。如果是没有回应,查下1432以及fpga那端的port Control CSRs(0x158)寄存器的Port Disable是不是置位了,这个置位的话是无法回应任何包的。
VxWorks_developer 2018-09-04
  • 打赏
  • 举报
回复
switch是1432,其他端口是fpga(G7)。我也尝试两块ppc做通信(一块主,一块从)。所谓的死在lock这个地方,是在访问从设备的BDID设备寄存器时,访问不了,但从设备的端口link状态是ok的。我感觉并不是主设备在重复读写。
operands 2018-09-04
  • 打赏
  • 举报
回复
switch用的是什么型号?其他端口的rapidio设备是什么架构的?PPC?DSP?
lock的话应该是通过maintenance包对各个rapidio节点的Host Base Device ID Lock CSR进行读写,先根据id写入,再读出看是不是写入的值,如果不是可能会一直重复这个过程直到该CSR被释放。你说的死在lock这一步是不是指一直重复写和读,但就是获取不了?
检查一下出问题的节点的这个寄存器是不是枚举前已经写入id了?

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧