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
可看到在kernel启动时就会打印uboot时设置的bootargs参数