Uboot移植(二)

 

1、bootcmd

bootcmd保存了着 uboot 的默认命令,uboot倒计时结束之后就会执行bootcmd中的命令。这些命令一般都是用来启动Linux内核的,比如将EMMC或者flash中的Linux内核镜像和设备树文件加载到DDR中,然后启动Linux内核。
NXP官方设置的CONFIG_BOOTCOMMAND如下:
#define CONFIG_BOOTCOMMAND \
    run findfdt;" \
    mmc dev ${mmcdev};" \    // $(mmcdevc) = 1,切换到emmc
    mmc dev ${mmcdev}; if mmc rescan; then " \    // 如果能扫描出来emmc,则从emmc启动,否则从net启动
        if run loadbootscript; then " \
            run bootscript; " \
        else " \
            if run loadimage; then " \
                run mmcboot; " \
            else run netboot; " \
            fi; " \
        fi; " \
    else run netboot; fi"

"mmcboot=echo Booting from mmc ...; " \
    "run mmcargs; " \
    "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
        "if run loadfdt; then " \
            "bootz ${loadaddr} - ${fdt_addr}; " \
        "else " \
            "if test ${boot_fdt} = try; then " \
                "bootz; " \
            "else " \
                "echo WARN: Cannot load the DT; " \
            "fi; " \
        "fi; " \
    "else " \
        "bootz; " \
    "fi;\0" \

"findfdt="\
"if test $fdt_file = undefined; then " \
"if test $board_name = EVK && test $board_rev = 9X9; then " \
        "setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \
    "if test $board_name = EVK && test $board_rev = 14X14; then " \
        "setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \
    "if test $fdt_file = undefined; then " \
        "echo WARNING: Could not determine dtb to use; fi; " \
"fi;\0" \ 

loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};    // 展开mmcdev = 1,mmpart = 1,loadaddr = 0x80800000,script = boot.scr,boot.src不存在

loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image};    // 展开就是loadimage=fatload mmc 1:1 0x80800000 zImage

loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file};    // 展开后就是loadfdt=fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb
findfdt根据board_name和board_rev设置fdt_file的环境变量,也就是dtb文件名字
根据上面的分析,从EMMC中读取zImage和dtb,总的就是下面的4行:
mmc dev 1                                         //切换到 EMMC
fatload mmc 1:1 0x80800000 zImage                 //读取 zImage 到 0x80800000 处
fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb  //读取设备树到 0x83000000 处
bootz 0x80800000 - 0x83000000                     //启动 Linux
所以,在自己的移植的Uboot中,可以如下设置:
#define CONFIG_BOOTCOMMAND \
     "mmc dev 1;" \
     "fatload mmc 1:1 0x80800000 zImage;" \
     "fatload mmc 1:1 0x83000000 imx6ull-alientek-emmc.dtb;" \
     "bootz 0x80800000 - 0x83000000;"
或者直接在Uboot中设置bootcmd的值,这个值就是保存到EMMC中的,即:
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;'
 

2、bootargs

bootargs是为了启动Linux内核
mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot}
其中console=ttymxc0,baudrate=115200,mmcroot=/dev/mmcblk1p2 rootwait rw,所以上面展开之后就是:
mmcargs=setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw
可以看出环境变量 mmcargs 就是设置 bootargs 的值为“console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw”,bootargs 就是设置了很多的参数的值,这些参数 Linux 内核会使用到,常用的参数有:
1、console
console=ttymxc0,115200 :设置 ttymxc0(也就是串口 1)作为 Linux 的终端,并且串口波特率设置为 115200。
2、root
root 用来设置根文件系统的位置,root=/dev/mmcblk1p2 用于指明根文件系统存放在mmcblk1 设备的分区 2 中。root 后面有“rootwait rw”,rootwait 表示等待 mmc 设备初始化完成以后再挂载,否则的话
mmc 设备还没初始化完成就挂载根文件系统会出错的。rw 表示根文件系统是可以读写的,不加rw 的话可能无法在根文件系统中进行写操作,只能进行读操作。
3、rootfstype
此选项一般配置 root 一起使用,rootfstype 用于指定根文件系统类型,如果根文件系统为ext 格式的话此选项无所谓。如果根文件系统是ramf、yaffs等文件系统的话就需要设置此选项,指定根文件系统的类型。
4、rdinit
rdinit=/linuxrc: 指定了 init 程序的路径为 /linuxrc,init 程序是系统启动时的第一个用户空间进程。
5、boot_delay
boot_delay=32: 设置了引导延迟时间为 32 秒,在 U-Boot 启动后会等待 32 秒再继续引导内核。
6、loglevel
loglevel=8: 设置了内核日志级别为 8,用于控制内核消息的输出级别。
 

个人单板使用:

setenv bootcmd 'nfs 0x80800000 192.168.31.230:/home/lethe/linux/nfs/zImage;nfs 0x83000000 192.168.31.230:/home/lethe/linux/nfs/imx6ull-lethe2.dtb;bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
boot
0
 可看到在kernel启动时就会打印uboot时设置的bootargs参数
posted @ 2024-03-21 21:47  lethe1203  阅读(29)  评论(0编辑  收藏  举报