mkimage小工具代码分析(1)
前言:
背景:最近在学习uboot,使用的平台是AM335x提供的sdk,打算移植到我的飞凌ok335xs开发板上,spl/uboot用串口下载到板子上,是可以正常启动的,uboot启动之后我就想把uboot下载flash中,那自然需要用到uboot中的spi flash命令
sf probe 0
输入这个命令一直报错提示找不到flash,经过种种排查发现是设备树没选对,由于我的uboot文件是通过串口下载的,下载镜像u-boot-dtb.img中的设备树是拼接在uboot的尾部,我的整个操作过程如下:
-
既然是flash用不了,那大概率是驱动的问题,那么就应该首先想到是不是设备树没有对应的设备,因此先找到设备树的初始化函数,
common/board_f.c
文件的函数会调用到设备树的初始化函数fdtdec_setup
; -
fdtdec_setup
这个函数我这里就不分析了,总结就是找出设备树的基地址(判断是否使能了宏CONFIG_MULTI_DTB_FIT,从而确定想要的一个设备树地址),再检查设备树是不是有效的;由于我并没有使能宏CONFIG_MULTI_DTB_FIT,那么uboot加载设备树将会读取第一个设备树(为什么读取第一个设备树,可以从函数
fdtdec_setup
找到原因),第一个设备树地址是拼接在uboot的尾部; -
因此,可以从lds链接文件中找到uboot最尾部的标号是什么,从下图可以看到是
_image_binary_end
;
![image-20240101180405907](https://i-blog.csdnimg.cn/blog_migrate/7569244b2acaf3150c63bf144a045063.png)
- 再从u-boot.map文件中找到
_image_binary_end
标号的地址,下图中发现地址是0x80877c9c,由于这款芯片的DDR基地址是0x80800000,所以可以算出设备树在u-boot-dtb.img文件中的偏移0x80877c9c-0x80800000 = 0x77c9c(注意,这里找到的偏移只是一个大概的位置,因为u-boot-dtb.img是在uboot的基础上添加了头部,所以实际的偏移应该比0x77c9c大);
![image-20240101180650364](https://i-blog.csdnimg.cn/blog_migrate/bcbd32f7a74b76ea818b67afca5acef2.png)
- 就可以在偏移附近找到对应的第一个设备树,可以看到第一个设备树是
am335x-evm
,那我们就可以去设备树文件夹中找到对应的设备树文件,设备树源码路径是在arch/arm/dts
中;
![image-20240101182050996](https://i-blog.csdnimg.cn/blog_migrate/c75a76fd1c4dbfc3c75dbc236220fdb0.png)
- 由于我的uboot配置的是单设备树在dts文件夹中我们可以找到对应的dts,但是这个dts文件并没有spi flash,所以可以解释为什么我们一直挂载不上flash;
![image-20240101182905955](https://i-blog.csdnimg.cn/blog_migrate/b055864697d03096d38eba0e2f1d673e.png)
- 那到这里已经发现问题,解决办法可以是修改官方的设备树去支持spi flash,或者换一个官方支持spi flash的设备树;
硬件平台:ok335xs,基于am335x
软件平台:TI官方的sdk移植而来,ti-processor-sdk-linux-am335x-evm-06.00.00.07-Linux-x86-Install.bin
- 这篇文章只是介绍了背景,真正分析mkimage小工具在我的下一篇文章中。
https://blog.csdn.net/weixin_42648968/article/details/135431673