您好!
目前遇见这样一个问题, 工程中使用了Hyperlink,使用仿真器下载程序运行正常。
但是,在EMAC方式下boot,可以检查出hyperlink一起起不来。目前hyperlink使用的是TI例程改写,但是初始化就是TI的代码,比如hyplnkExampleSysSetup()、hyplnkExamplePeriphSetup()、hyplnkExampleAddrMap。
现在测试出的结果是,boot下hyplnkExampleSysSetup()可以实现,但是hyplnkExamplePeriphSetup()、hyplnkExampleAddrMap中的Hyplnk_writeRegs (handle, hyplnk_LOCATION_REMOTE, &remoteRegs),只要是remote的寄存器,无论读写这句函数都过不去,程序直接就在这儿死掉了。
我们不知道哪里出现了问题,有点猜测是PLL没配对,因为TI自己的注释有一句话: The system PLL is not touched (but could be).
希望Andy或者论坛里的高手能够指导一下。
我的理解,虽然RBl有对PLL初始化,但是我们对IP模块的操作方式都是和TI一样,先断掉PSC,然后开启PSC,在进行配置,我理解这样的方法就不需要关心第二次配置pll和之前RBL配置的PLL冲突了,不知道我的理解正确否。
谢谢!
谢尘
chen xie:
这个问题很少有人遇见,但还是期待回复。
不是道写hyperlink代码的TI工程师之前是怎噩梦解决这个问题的。The system PLL is not touched (but could be).
Brighton Feng:
如果是访问remote寄存器才出错的话,可能是因为另一端没有正常跑起来。请尽量让两端同时加载。
另外,可以尝试以下:
1, 在通过PSC使能HyperLink Power domain/module后加5ms时延
2, 配置HyperLink Serdes时,把寄存器CFGPLL最后配
chen xie:
回复 Brighton Feng:
Feng,
您好!
两个DSP没同步是肯定的,之前我们boot的时候,initial的函数中有一端是可以访问对方的寄存器的,只是有一端出现了问题。但是同样的程序在仿真器下(没有gel文件初始化,同样是函数初始化)没问题。
按照您的方法修改后,两端DSP都无法访问对方寄存器了。代码如下:
/* Set up the HyperLink (vUSR) related portions of the boot config registers */ CSL_BootCfgUnlockKicker();
/* 这一句本来是放在pll之后的,现在提到前面来了 */
hyplnkExampleSerdesCfg (hyplnk_EXAMPLE_VUSR_RX_CONFIG, hyplnk_EXAMPLE_VUSR_TX_CONFIG);
CSL_BootCfgSetVUSRConfigPLL (hyplnk_EXAMPLE_VUSR_PLL); while (((*(volatile unsigned int *)0x2620160) & 1) == 0); CSL_BootCfgLockKicker();
我想有可能是初始化的时候出现的问题,比如RBL初始化执行了什么导致了时钟不对》但是RBL并不会对hyperlink的时钟进行操作啊。
目前仿真器下完好,boot下有错又不方面查询错误,只能定位那句话没有执行。很困扰,希望能帮助想一下问题出在哪里,毕竟用的TI的例程,我觉得boot应该是没问题才对。
谢谢您了!
Alan
chen xie:
回复 Brighton Feng:
还有就是EMAC boot下每个核的程序肯定是先后下载的,同步起来有困难。
详细说明:
仿真器:
1)gel文件初始化 工作正常;
2)不用gel文件,用API函数在代码在core 0、core 4先初始化后,第二次在加载其他程序,工作正常;
boot的方式:
1)两个DSP :0核 PLLC初始化时钟-》发送IPC到其他核-》所有核一起启动-》srio初始化-》hyperlink初始化 程序到这里就执行不下去了 因为hyperlink里面无法访问对方寄存器;
2)DSP0:0核 发送IPC到其他核-》所有核一起启动-》srio初始化-》hyperlink初始化-》ipc_start-》程序启动正常
DSP1:0核 发送IPC到其他核-》所有核一起启动-》srio初始化-》hyperlink初始化-》ipc_start-》hyplnkExampleAddrMap 程序到这里就执行不下去了 因为这个API里面无法访问对方寄存器;
3)采用2)中的方法,偶尔有一次能启动hyperlink,但是Srio无法接受doorbell中断,难道是SRIO没启动?
现在就很奇怪,因为我知道RBL是有main PLL、PA PLL、DDR PLL初始化的,但是我(1)重复初始化应该没错(PLL初始化步骤和UG里一样).
那么(2)我不做PLL初始化,那为什么还是不行?
做了快两个礼拜了,开始不着急,现在越想越奇怪了!希望得到一些指点。
Alan
Brighton Feng:
回复 chen xie:
很难从你的描述中判断问题的原因,我对你说的例程也不熟悉,它为什么要访问remote寄存器?感觉没有必要。
要不你试一下我的例程吧。
chen xie:
回复 Brighton Feng:
HI,Feng!
根据您的这个例程,重新修改了一下,hyperlink初始化工作应该能过了。谢谢您的帮助!
我们继续调试看后面的问题。
Alan