您的位置:首页 > 运维架构 > Linux

uclinux-2008R1-RC8(bf561)到VDSP5的移植(41):PLL造成的困扰

2008-06-03 11:19 549 查看

出现一个很奇怪的问题:
DSP上电后直接在仿真器上运行uclinux内核,串口无法接收到正常输出,仅有一两个异常字符。但是用VDSP4.5运行原来写的一个串口程序,可以正常输出。
第一个郁闷的问题在于这个串口程序运行过一遍之后,再怎么运行uclinux内核都没有问题(除非断电)。中断后比较这两个程序的UART_*相关的寄存器配置,完全相同。况且前后两次运行uclinux,程序没有任何变动,应该跟配置没有关系才对。比较PLL的配置也是完全相同的(27M晶振,594M CCLK,99M SCLK)。
第二个郁闷的问题是,如果把uclinux内核编译成ldr文件烧到flash上,也没有任何问题。
究其原因,在head.s中有一段对PLL进行设置的代码:
r0 = CONFIG_VCO_MULT & 63; /* Load the VCO multiplier */
r0 = r0 << 9; /* Shift it over, */
r1 = CLKIN_HALF; /* Do we need to divide CLKIN by 2?*/
r0 = r1 | r0;
r1 = PLL_BYPASS; /* Bypass the PLL? */
r1 = r1 << 8; /* Shift it over */
r0 = r1 | r0; /* add them all together */

p0.h = hi(PLL_CTL);
p0.l = lo(PLL_CTL); /* Load the address */
cli r2; /* Disable interrupts */
ssync;
w[p0] = r0.l; /* Set the value */
ssync;
idle; /* Wait for the PLL to stablize */
sti r2; /* Enable interrupts */
程序运行到这里时,PLL设置并没有真正起作用,虽然寄存器的值改了。
在VDSP手册上有一段说明:
Note: In order to program the PLL, both cores must be in an idled state. Alternatively, it is acceptable for core B to be in the “SRAM init” state that it enters after processor reset. For more information about this state, refer to "Booting Methods" on another page.
在VDSP环境下,B核实际是处于Fullon状态,而设置PLL时要求B核没有运行或者处于IDLE状态。
原来的串口程序是两个核都使用了的。这样正确运行一次之后,即使后面的PLL设置没有成功也没什么关系。
烧写到flash之后,B核并没有运行,因此PLL的设置也是成功的!

知道原因后就容易解决了:
在仿真器下运行时,为B核加上一条IDLE指令并先于A核运行就可以搞定这个问题。

哈哈!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: