TaterLi's LazyBlog

自言自语,不喜绕路,科学上网,远离天国.

@TaterLi4月前

10/31
16:43
技术控

U-Boot 不神秘指南

U-Boot 其实就是个Loader,引导程序而已,但是他也是能干不少事情,可以理解成开发U-Boot功能犹如开发MCU,后续Linux是Linux,两码事.

一般新手入手最喜欢分析U-Boot源码,其实这并没什么卵用(分析过后发现并没得到什么.)

U-Boot 开发FAQ我自己整理下.

  • 如何开发新的硬件,首先确定是NAND启动MMC启动还是什么鬼,知道怎么阅读处理器手册,用mx28evk举例.修改board\freescale\mx28evk.c,为什么不修改iomux.c呢,因为我没用SPL,
    board_early_init_f就是初始化,这是第一步初始化,这里把引脚什么都初始化好,不存在的东西删掉,接触到几个函数,一眼看得明白,gpio_direction_output,udelay,很明白名称的.这里花不了不少时间,能有多少条指令呢,对不对,纠结那点时间到时候代码不好维护不是更麻烦.
  • U-Boot 开发,更多是在开发不同的cmd,可以把cmd理解成一个一个小程序,比如看看version这个命令,在version.c文件中.套用格式U_BOOT_CMD(name,maxargs,rep,cmd,usage,help),name就是命令名称,maxargs就是这个命令最多有多少个参数,这个决定他用多少ram,rep就是回车时候这个命令是否会重复,cmd就是对应的执行体,比如version这个,他的执行体是do_version,当然还可以是其他名字,usage是简单说明,help是详细说明,其中执行体函数他自己可以另外再调用别的函数.还是看看这do_version(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]),他第一个参数出来的内容就是刚才定义的内容本身,flag好像是个内部使用变量,反正他不是个指针,也没什么东西给他传递,argc,argv这个不用说了,当做是普通main程序的argc,argv就行.
  • 在common目录中,关于init_sequence_r和init_sequence_f,他们两个都是初始化序列,是UBoot的必经之路,有兴趣按部就班往下看,没兴趣不看一点影响也没有,另外,通过make menuconfig已经可以做很多配置了.
  • drivers目录,芯片自己的库函数,记得前面说的gpio_direction_output,就在gpio的mxs_gpio.c驱动中实现了,这里的驱动跟Linux驱动不一样,Linux驱动一切皆文件,全部文件操作,ioctl之类,这里不是,这里直接调用就可以了.当然,也有使用U_BOOT_DRIVER方式的.要给出name,id,probe,ops等参数,还有他们具体实现,然后用U_BOOT_DEVICE连接.使用U_BOOT_DEVICE声明后,probe就被执行了,然后再调用里面的函数.(烦不烦啊),所以很多人就直接把函数拿出来,不要封在里面了.
  • 剩下env,fs,lib,net我们根本不用管,env是环境变量在不同储存介质储存读取的实现,如果不是发明一个新的储存介质,没必要开发他,fs是文件系统什么的,lib就是各种库的集合,net是网络功能.

那么怎么提高U-Boot启动速度,既然是个Boot,当然干最小的活,马上给大佬工作最好,所以,他不要吃太多时间.用力优化时间只需关心几点.

  • 关掉不要的功能.比如不需要网络BOOT之类的,就关掉网络,不需要TF卡就关掉TF卡,初始化网络,TF卡什么也是需要时间的.通过make menuconfig就可以完成.
  • 减少输出,除非要进控制台,否则你可以把UBoot的所有输出都关掉,分两部分,一部分可以通过make menuconfig关掉,另一部分你非常有信心的话,通过改代码把剩余的隐藏了.当然改善不大了,通过菜单配置已经很足够.
  • 不要延迟,要进入控制台的话直接按住某个按键就可以,不需延迟.这个时间是白白浪费啊.
  • 减少env的内容,每次load进env都花掉不少时间,env比较小,自然就比较快了.对于量产产品,完全就只有一个启动设备啊.
  • 查找一切延迟函数,寻找其突破口.(不过一般改善甚微,而且需要很多功夫.)

U-Boot除了干这点小事还能干什么?

  • 开机Logo覆盖,他可以一直显示直到Linux重新初始化fb(不会闪动,两张图都设置成一样即可,因为初始化时间极短.),这样增加一个错觉,总觉得已经开机了,只是在播放一个广告.
  • 调试某些状态,简单的一级BL干不了什么,这个可以干更多事情.

下面这张图是只通过menuconfig,能缩减成这样,速度极快.

另外说一下我目前结果,优化后的内核可以10秒内完全启动,这其中还包括了网络(1.2 秒),内核解压(4.5秒),其实还有不少空间的,内核解压的可以换LZ4(猜测),不过要看看我NAND速度可观还是怎样了.

 

U-Boot 不神秘指南