我所理解的u-boot移植可以分为以下几个部分:
1、内核级的配置与初始化
这个主要就是在start.S文件里面那些汇编代码,这部分呢我觉得基本上没有改的必要,除非你很熟悉内核相关的东西。
2、SOC级别的配置与初始化
这部分的内容是比较多的,而且可以说贯穿整个u-boot,但基本上必要的都集中在lowlevel_init,其它的就取决于你是否要在u-boot阶段使用某些硬件资源了,比如网卡是在board_init_r里面,已经是靠后的位置了,有些板子甚至可能都不会在u-boot阶段使用网络,自然也就不需要初始化。这部分是移植过程中修改较多的地方,而且基本上都是使用汇编编码,只要这部分搞定了,那u-boot基本就可以成功启动了。
3、board_init_f阶段
这个阶段主要是对u-boot之后重定位进行内存的规划,虽然执行的子函数多,但都不复杂。移植内容少。
4、u-boot比较核心的重定位
现在版本比较新的的u-boot重定位的意义和以前感觉都发生了变化,以前只需要让u-boot运行在链接地址就对了,主要就是将u-boot搬到DDR运行,而现在不一样,即使已经运行在链接地址了还不够,还需要更加合理的规划内存,现在u-boot重定位后,内存变得更加连续,我们也基本不担心将内核拷贝到DDR后覆盖掉u-boot本身,所以重定位还是比较重要的。可以说不用改。
5、board_init_r阶段
这个阶段干的事主要就是准备终端,初始化需要用到的硬件资源,如果使用新的驱动模型的话,还要像kernel一样将硬件进行抽象。这个根据自己的需求,用了什么就要改什么。
6、启动内核或者处理用户命令
u-boot最大的使命就是启动内核,所以这部分也是核心的内容。board_init_r最后会调用run_main_loop进入一个循环,要么就是直接去启动内核,要么就是进入终端处理用户命令和用户交互。也可以说不用改,差不多已经是纯软件干的事了。
在移植2020.04版本之前,我也移植过2018.04版本,两个版本大致内容差不多,感觉最大的变化就是重定位这部分,在各个大版本中,重定位代码基本上是一直在变的,但确实感觉是变得越来越容易理解。
移植之前还觉得有很多的内容都不清楚,可能移植会失败什么的,也怕写到中途发现很多错误而放弃,但做了才发现,也不是想象的那么困难,虽然反反复复的修改了好几次,但大的方向都是正确的,这也让我对以前很多不理解的地方有了新的认识,如果当时我没去做,可能现在还停留在对u-boot迷迷糊糊的状态,对很多东西一知半解,下次遇到还是一脸懵,庆幸的是我做了,并且做到了。
接下来计划的内容还有网络的支持,及MMC卡检测失败的问题,可能还会分析一下驱动模型。
欢迎扫码关注我的微信公众号