SBC-B1 TI 335x 启动分析(从哪里加载uboot和 uImage)

来源:互联网 发布:stm32跑linux 编辑:程序博客网 时间:2024/05/21 07:14



平时使用板子的时候一直是认为,板子的启动方式有TF(SD)卡、emmc、nandflash、usb……,认为如果是从TF启动,系统都会从TF卡加载uboot、kernal到内存运行,emmc同理。但在今天才发现,其实不是这样子的。


在使用SBC-B1板子的时候,发现这么一个现象。
1、如果没有插入TF卡,并且emmc有代码(镜像),CN5没有短接,CPU就直接从emmc第一分区(fat32)加载uboot和kernal到内存运行,最后挂载第二分区的文件系统(linux)。
2、如果插入TF卡并短接CN5(相当于sys_boot引脚),CPU就直接从TF第一分区(fat32)加载uboot和kernal到内存运行,最后挂载第二分区的文件系统(linux)。
3、如果插入TF卡,但是没有短接CN5,CPU首先会从emmc第一分区加载uboot到内存运行,再从TF卡的第二分区加载kernal到内存运行,最后再挂载emmc第二分区的文件系统。
下面先看代码
335x-B1-UBOOT/include/configs/am335x_evm.h


 "dfu_alt_info_emmc=rawemmc mmc 0 3751936\0" \
        "dfu_alt_info_nand=" DFU_ALT_INFO_NAND "\0" \
        "mmcdev=0\0" \
        "mmcroot=/dev/mmcblk0p2 rw\0" \
        "mmcrootfstype=ext3 rootwait\0" \
        "nandroot=ubi0:rootfs rw ubi.mtd=7,2048\0" \
        "nandrootfstype=ubifs rootwait=1\0" \
        "nandsrcaddr=0x280000\0" \
.
.
.


e CONFIG_BOOTCOMMAND \       
"mmc dev ${mmcdev}; if mmc rescan; then " \ 
      "    echo ; " \        "else " \        
"    setenv mmcdev 1;" \        "fi;" \        
"mmc dev ${mmcdev}; if mmc rescan; then " \ 
              "echo SD/MMC found on device ${mmcdev};" \ 
              "if run loadbootenv; then " \ 
                      "echo Loaded environment from ${bootenv};" \
                        "run importbootenv;" \ 
              "fi;" \


现象1和现象2容易理解,问题就是在现象3里面,下面就详细解释现象3,直接看代码:
在这个板子里面,TF是编号“0”(mmcdev=0), emmc编号是“1”(mmcdev=1)。
上电启动的时候,CPU先检查CN5(sys_boot引脚),CN5没有短接,则从emmc启动。大家都知道确定启动方式之后,先从存储器(emmc)加载uboot到内存运行,再加载kernal。看上面代码, uboot的代码里面, mmcdev 默认等于“0”,首先执行句代码,“ "mmc dev ${mmcdev}; if mmc rescan; then " \ ”,再运行“ "mmc dev ${mmcdev}; if mmc rescan; then " \ ”也就是说,这个时候如果插入TF卡,uboot会从TF卡加载kernal到内存(如果没有插入TF卡,uboot则从emmc加载kernal到内存)。运行kernal之后,再挂载文件系统(代码也是在这个文件 "mmcroot=/dev/mmcblk0p2 rw\0" \)。


                                             
0 0