"); //-->
经过之前吐血分析power_perp,我在看boot_perp的时候就已经没有精力细细看寄存器设置了。知道它是对DDR的初始化和配置。
这样看完了就有很多的疑问,这个power_perp和boot_perp是如何关联起来的,又是如何跳转到uboot,或者linux_perp的呢?首先,前面的power_perp和boot_perp没有代码的搬运过程,而且这两个程序看起来互相并不知道对方的存在,各自的link.lds都是从0地址开始的,这不符合常规单片机运行情况啊 !!!
那么我推测肯定elftosb在把所有文件转换成sb文件的时候搞了什么鬼。后来发现MX28中ivt这种机制貌似实现了自动搬运。大体应该是有个HAB库,在芯片复位的时候,OCROM会检测引脚和熔丝设置,根据设置调用外设驱动,从外设读取命令流,这些命令流就是HAB库里的LOAD,LOAD DCD,SKIP,HAB JUMP,HAB CALL。这是启动代码在OCROM中执行,并翻译上面的命令,把外设中的boot image拷贝到RAM中,执行HAB JUMP或者HAB CALL。调用了HAB JUMP或者HAB CALL就执行boot image中的内容了。调用完boot image后,返回在继续调用给下一个LOAD命令,然后再CALL。。。
// STMP378x ROM command script to load and run U-Boot sources { power_prep="./power_prep/power_prep"; sdram_prep="./boot_prep/boot_prep"; hello="./hello_world/hello_world"; } section (0) { //---------------------------------------------------------- // Power Supply initialization //---------------------------------------------------------- load power_prep; load ivt (entry = power_prep:_start) 0x8000; hab call 0x8000; //---------------------------------------------------------- // SDRAM initialization //---------------------------------------------------------- load sdram_prep; load ivt (entry = sdram_prep:_start) 0x8000; hab call 0x8000; //---------------------------------------------------------- // Load and call u_boot - ELF ARM image //---------------------------------------------------------- load hello; load ivt (entry = hello:main) 0x8000; hab call 0x8000; }
我仿照自带的bd文件改成自己的helloworld,并且把我的hellowrold的链接地址放到过0x0,0x2000,0x40000000结果并没有什么区别,只是在打印main的地址的时候出现在对应的地址上了,诡异吧。中间出现的0x8000我推测应该是把带有入口地址的IVT放到了0x8000的位置。当调用hab call 0x8000的时候,就会跳转到hello的入口地址,去运行用户代码。这个bd文件的详细内容在文档《Kinetis Elftosb User's Guide》(KBLELFTOSBUG.pdf),英语水平有限只是粗略的看了一下,上面的内容只是结合自己看到的以及实验的过程的一种推测,等有时间把文档再详细的看一下。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。