原创 [博客大赛]U-Boot for AM335x (8) spl如何调用u-boot.img

2014-8-27 14:55 3189 17 19 分类: MCU/ 嵌入式 文集: U-Boot

U-Boot for AM335x (8) spl如何调用u-boot.img

am335x的mainline里面,有一个EEPROM,spl会使用I2C协议,读取存储在EEPROM里面的配置header,然后根据这个header来进行之后的操作。header是出厂的时候由厂家外部写入的,Forlinx的OK335xD板虽然也配有EEPROM芯片,但是里面的内容是空的。因此使用mainline来调试OK335xD板的时候,需要将有关EEPROM的内容去掉,将实际的硬件内容替换进入。

根据自己的硬件修改SPL,相对来说并不复杂。因为u-boot的mainline里面基本上包含了所有主流硬件的参数,只需传递和自己的硬件对应的就行,比如DDR时钟频率,PMIC的型号和输出,以及GPIO的MUX外设配置初始化等等。

到使用I2C0、设置PMIC都是比较简单的,真正麻烦的地方在于spl结束的时候读取u-boot.img。在前面的(6)spl中已经简单的提到了启动流程,而读取u-boot.img的关键在于common/spl/spl.c中的board_init_r函数:
void board_init_r(gd_t *dummy1, ulong dummy2)
----> spl_mmc_load_image();

--------> if (spl_start_uboot() || spl_load_image_fat_os(&mmc->block_dev, CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION))
(在这个函数中会试图读取CONFIG_SYS_SPL_ARGS_ADDR(=0x80F80000)的args文件,如果这个文件不存在,则退出这个函数,继续执行spl_mmc_load_image)

--------> err = spl_load_image_fat(&mmc->block_dev,
                CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION,
                CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME);
(在这个函数中会试图读取CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME,也就是u-boot.img。CONFIG_SYS_TEXT_BASE的值为0x80800000,而AM335x的存储器映射,分配给SDRAM的正是0x80000000。这里会调用file_fat_read函数读取两次u-boot.img,这应该和u-boot.img在SD卡上的存储方式有关。anyway,读取完成之后,跳出这个函数。)

----> jump_to_image_no_args(&spl_image);
--------> image_entry((u32 *)&gd->arch.omap_boot_params);
(跳到u-boot.img去执行。这里需要插入一个小tip,关于weak关键字的使用:)
========================================
http://www.valvers.com/programming/c/gcc-weak-function-attributes
========================================
插入一段gcc中weak关键字的用法:
若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误。链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号。当有函数或变量名可能被用户覆盖时,该函数或变量名可以声明为一个弱符号。弱符号也称为weak alias(弱别名)。
========================================
jump_to_image_no_args实际上在两个地方都有定义,分别是:
common/spl/spl.c:104
arch/arm/cpu/armv7/omap-common/boot-common.c:113
通过添加打印信息,能够观察到被调用的是后者。

通过添加打印信息,能够观察到&gd->arch.omap_boot_params的值,为0x40302868,它正好属于AM335x外部SRAM的存储器映射地址空间。spl此时完成了它的使命,除了初始化基本的GPIO、DDR、PMIC之外,还将u-boot.img搬到了SRAM(DDR3)中。
 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

DiracFatCat 2015-4-2 00:44

可以在死掉的函数那里添加打印信息试试。

用户1675562 2015-4-1 19:06

"因此使用mainline来调试OK335xD板的时候,需要将有关EEPROM的内容去掉,将实际的硬件内容替换进入。"怎么去掉啊,具体将那些硬件替换?能给点具体的吗,我试下,自己改了,会在差不多config_ddr()后的am33xx_spl_board_init()(../board/ti/am335x/board.c)就死了。。为什么呢?
相关推荐阅读
DiracFatCat 2018-09-05 12:14
【博客大赛】卡尔曼滤波学习笔记(11)从位置估计速度
卡尔曼滤波器,不仅仅是一个低通滤波器,否则也不会持续发展50年。 示例:桑先生需要测试高速列车的性能。测试的目的是判断列车在直线上能否保持80m/s的速度。速度和位置每0.1秒测量一次,但是由于...
DiracFatCat 2018-08-31 19:32
【博客大赛】卡尔曼滤波学习笔记(10)一个简单的示例
《Kalman Filtering: Theory and Practice Using MATLAB》第三章,看不懂,暂时略过。《Kalman Filtering: Theory and Pract...
DiracFatCat 2018-07-19 15:09
对sed命令的练习
sed是流编辑器。它每次处理一个输入,因此很有效率。官方手册:https://www.gnu.org/software/sed/manual/sed.html学习Linux命令,当然要阅读官方手册,所...
DiracFatCat 2018-06-19 15:10
【博客大赛】卡尔曼滤波学习笔记(八)可观测性和可控制性 ...
可观测性是指,在给定模型的情况下,动力学系统的状态是否由它的输入输出唯一确定。可观测性是系统模型的特征。如果传感器矩阵H是可逆的,则本系统可观测,因为有:如果传感器矩阵H某些时候是不可逆的,则本系统仍...
DiracFatCat 2018-06-19 10:56
【博客大赛】卡尔曼滤波学习笔记(七)Z变换
如果我们仅仅对离散线性系统感兴趣,那么就使用下面这个表达式:如果u是常量,那么可以写成:为了简化表达式,我们可以将上面写成:离散线性时不变系统的Φ求解,可以使用Z变换。(* 由于本人已经忘记了Z变换的...
DiracFatCat 2018-06-19 10:54
【博客大赛】卡尔曼滤波学习笔记(六)拉普拉斯变换
对于线性时变/时不变系统,求解Φ(t)有多种方式,拉普拉斯变换是其中一种。(* 由于本人已经忘记了拉普拉斯变换的内容,因此本节待续。)...
EE直播间
更多
我要评论
2
17
关闭 站长推荐上一条 /3 下一条