BSP中uboot初体验

一. uboot源码获取

  1.1. 从板级厂家获取开发板BSP级uboot(就是由开发板厂家提供的)

  1.2. 从SOC厂家获取相同SOC的BSP级uboot

  1.3. 从uboot官方下载

  1.4. 什么是bsp

    a.  BSP就是board support package(板级支持包,一般由开发板供应商提供),里面的内容就是这个开发板的所有相关的源代码、文档、教程等。

二. uboot初体验

  1.1. 配置

    1.1.1. 将uboot 放到ubuntu下解压获取源码

      a. tar -jxvf qt_x210v3s_160307.tar.bz2 

      b. 解压后文件,其中uboot目录下放着uboot源码

buildroot  mk                         tools                  uboot    xboot
kernel     qt_x210v3s_160307.tar.bz2  tslib_x210_qtopia.tgz  version
View Code

    1.1.2. make x210_sd_config

      a. x210_sd_config是uboot目录下Makefile文件下的目标,用于指导后续的编译

root@ubuntu:~/repeat/uboot-jiuding/uboot# ls
api                            config.mk  fs           Makefile     post
api_examples                   COPYING    image_split  mk           README
arm_config.mk                  cpu        include      mkconfig     rules.mk
board                          CREDITS    lib_arm      mkmovi       sd_fusing
CHANGELOG                      disk       libfdt       nand_spl     tools
CHANGELOG-before-U-Boot-1.1.5  doc        lib_generic  net
Changelog_Samsung              drivers    MAINTAINERS  onenand_bl1
common                         examples   MAKEALL      onenand_ipl
root@ubuntu:~/repeat/uboot-jiuding/uboot# make x210_sd_config
Configuring for x210_sd board...
root@ubuntu:~/repeat/uboot-jiuding/uboot# 
View Code

  1.2. 编译

    1.2.1. 编译前要确认两点

      a. 检查当前编译环境中有没有安装合适的arm-linux-gcc。我们装的是arm-2009q3

      b. 检查当前目录下(uboot根目录)的Makefile中交叉编译链工具目录设置是否正确

    1.2.2. 直接make编译,得到u-boot.bin

root@ubuntu:~/repeat/uboot-jiuding/uboot# ls
api                            CREDITS      MAINTAINERS  README
api_examples                   disk         MAKEALL      rules.mk
arm_config.mk                  doc          Makefile     sd_fusing
board                          drivers      mk           System.map
CHANGELOG                      examples     mkconfig     tools
CHANGELOG-before-U-Boot-1.1.5  fs           mkmovi       u-boot
Changelog_Samsung              image_split  nand_spl     u-boot.bin
common                         include      net          u-boot.dis
config.mk                      lib_arm      onenand_bl1  u-boot.map
COPYING                        libfdt       onenand_ipl  u-boot.srec
cpu                            lib_generic  post
root@ubuntu:~/repeat/uboot-jiuding/uboot# du -h u-boot.bin
384K    u-boot.bin
root@ubuntu:~/repeat/uboot-jiuding/uboot# 
View Code

三. uboot 源码目录分析

  3.1. 板厂和SOC三星提供的区别

    a. 此uboot是板级厂家提供的,相比于三星SOC提供的uboot有些不必要的文件以及北删除

  3.2. uboot 目录下文件分析

    3.2.1. gitignore。git工具的文件,git是一个版本管理工具(类似的还有个svn),这个文件和git有关,和uboot本身无关的,不用去管。
    3.2.2. arm_config.mk。后缀是.mk,是一个Makefile文件,将来在某个Makefile中会去调用它。
    3.2.3. 三个Changelog文件,修改记录文件,该文件记录了这个uboot项目的版本变迁以及每个版本较上个版本修改的记录。正式的项目都有这些记录的。可以直接忽略,主要是给维护uboot的人用的。
    3.2.4. config.mk。和arm_config.mk差不多性质。
    3.2.5. COPYING。版权声明,uboot本身是GPL许可证的。
    3.2.6. CREDITS。鸣谢,里面记录了对uboot有贡献的人,感谢目录。
    3.2.7. image_split。一个脚本,看说明是用来分割uboot.bin到BL1的,暂时用不到,先不管。
    3.2.8. MAINTAINERS。维护者,就是当前在参与维护uboot源码的社区工作者。
    3.2.9. MAKEALL。一个脚本,应该是帮助编译uboot的。
    3.2.10. Makefile。这个很重要,是uboot源代码的主Makefile,将来整个uboot被编译时就是用这个Makefile管理编译的,所以我们在下个课程中研究uboot配置编译过程时就要分析这个Makefile。
    3.2.11. mk。快速编译的脚本,其实就是先清理然后配置然后编译而已。
    3.2.12. mkconfig。这个很重要,是uboot配置阶段的主要配置脚本。uboot的可移植性很大程度就是靠这个配置脚本在维护的。我们在下个课程中研究uboot配置编译过程时就要分析这个配置脚本。
    3.2.13. mkmovi。暂时不去管他,一个脚本,和iNand/SD卡启动有关
    3.2.14. README。所有的软件都有README,一般拿到一个东西要先读README,这个东西其实就是个简单的使用说明书。
    3.2.15. rules.mk。这个文件是我们uboot的Makefile使用的规则,本身非常重要,但是我们不去分析他,不去看他。

  3.3. uboot 目录下文件夹分析

    3.3.1. api. 硬件无关的功能函数的API。uboot移植时基本不用管,这些函数是uboot本身使用的。

    3.3.2. api_examples. API相关的测试事例代码。
    3.3.3. board。board是板的意思,板就是开发板。board文件夹下每一个文件都代表一个开发板,这个文件夹下面放的文件就是用来描述这一个开发板的信息的。board目录下有多少个文件夹,就表示当前这个uboot已经被移植到多少个开发板上了(当前的uboot支持多少个开发板)。但开发板越来越多,board目录下文件夹越来越多不方便管控。于是乎uboot就新增了一种机制,可以在board目录下不直接放开发板目录,而是在board下放厂家目录(vendor目录,以具体芯片厂商名字命名),然后将这个IC厂商的所有芯片开发板都丢到这个vendor目录下面去。所以大家会发现我们X210对应的开发板目录在board/samsung/x210。多了这层目录会影响配置阶段,在uboot的配置阶段要注意配置时的路径深度和实际存放要对应,不然配置后编译时找不到文件编译就会失败。注意一个细节就是历史原因造成的兼容性麻烦。最开始时board目录下就是开发板名字,后来才改成厂商名字的。但是因为要向前兼容,同一个厂商原来还是外面的开发板并没有挪移到厂商目录下面去。这样就造成后来的人不知道原委的感到很奇怪,感觉很混乱。

    3.3.4. common。common是普遍的普通的,这个文件夹下放的是一些与具体硬件无关的普遍适用的一些代码。譬如控制台实现、crc校验的。但是更多的主要是两类:一类是cmd开头的,是用来实现uboot的命令系统的;另一类是env开头的,是用来实现环境变量的。
    3.3.5. cpu。这个目录是SoC相关的,里面存放的代码都是SoC相关初始化和控制代码(譬如CPU的、中断的、串口等SoC内部外设的,包括起始代码start.S也在这里)。里面很多子文件夹,每一个子文件夹就是一个SoC系列。
注意:这个文件夹是严格和硬件相关的,因此移植时也是要注意的。但是因为这个文件夹内都是SoC有关的,我们自己的开发板和三星的开发板虽然板子设计不同但是SoC都是同一个,因此实际移植时这个目录几乎不用动。
    3.3.6. disk。磁盘有关的,没研究过,没用过。
    3.3.7. doc。文档目录,里面存放了很多uboot相关文档,这些文档可以帮助我们理解uboot代码。但是因为是纯英文的,而且很杂乱,所以几乎没用。
    3.3.8. drivers。顾名思义,驱动。这里面放的就是从linux源代码中扣出来的原封不动的linux设备驱动,主要是开发板上必须用到的一些驱动,如网卡驱动、Inand/SD卡、NandFlash等的驱动。要知道:uboot中的驱动其实就是linux中的驱动,uboot在一定程度上移植了linux的驱动给自己用。但是linux是操作系统而uboot只是个裸机程序,因此这种移植会有不同,让我说:uboot中的驱动其实是linux中的驱动的一部分。
    3.3.9. examples。示例代码,没用过。
    3.3.10. fs。filesystem,文件系统。这个也是从linux源代码中移植过来的,用来管理Flash等资源。
    3.3.11. include。头文件目录。uboot和linux kernel在管理头文件时都采用了同一个思路,就是把所有的头文件全部集中存放在include目录下,而不是头文件跟着自己对应的c文件。所以在uboot中头文件包含时路径结构要在这里去找。
    3.3.12. lib_开头的一坨。(典型的lib_arm和lib_generic)架构相关的库文件。譬如lib_arm里面就是arm架构使用的一些库文件。lib_generic里是所有架构通用的库文件。这类文件夹中的内容移植时基本不用管。
    3.3.13. libfdt。设备树有关的。linux内核在3.4左右的版本的时候更改了启动传参的机制,改用设备树来进行启动传参,进行硬件信息的描述了。
    3.3.14. nand_spl。nand相关的,不讲。
    3.3.15. net。网络相关的代码,譬如uboot中的tftp nfs ping命令 都是在这里实现的。
    3.3.16. onenand开头的,是onenand相关的代码,是三星加的,标准uboot中应该是没有的。
    3.3.17. post。没关注过,不知道干嘛的。
    3.3.18. sd_fusing。这里面代码实现了烧录uboot镜像到SD卡的代码。后面要仔细研究的。
    3.3.19. tools。里面是一些工具类的代码。譬如mkimage。

    

参考《朱老师.零距离初体验uboot.txt》

posted @ 2019-01-10 22:36  三七鸽  阅读(1387)  评论(0编辑  收藏  举报