# uboot高级进阶 ## uboot环境变量说明 uboot支持四种启动方式,系统默认使用第二种 1. 启动命令`boot_mtd`:`Kernel` ,`dtb`,`rootfs` 都存放于 都存放于 都存放于SPI NorFlash ,这种情况下 ,rootfs使用 squashfs压缩只读文件系统,如何制作squashfs文件系统请参考章节; 2. 启动命令`boot_mmc`:`Kernel` ,`dtb`存放SPI NorFlash,`rootfs`存放在eMMC; 3. 启动命令`boot_nfs`:`Kernel` ,`dtb`存放SPI NorFlash,`rootfs`使用nfs网络文件系统; 4. 启动命令`boot_tftp`:`Kernel` ,`dtb`通过tftp服务器获取,`rootfs`使用nfs网络文件系统。 **uboot参数说明如下**: ```bash env_version 1.1.00 a_uboot_flags 0x0 baudrate 115200 # 定义变量boot_xxx,一共定义了四个,方便下面执行uboot命令bootcmd时候使用,具体功能如下 # 1:run setmtd_boot:运行设置bootargs的命令 # 2: run read_dtb : 运行读取dtb命令 # 3:run read_kernel : 运行读取内核命令 # 4:bootm : 运行bootm命令从${loadaddr}地址开始运行,加载dtb地址为${dtb_loadaddr} boot_mtd run setmtd_boot; run read_dtb;run read_kernel; bootm ${loadaddr} - ${dtb_loadaddr} boot_mmc run setmmc_boot; run read_dtb;run read_kernel; bootm ${loadaddr} - ${dtb_loadaddr} boot_nfs run setnfs_boot; run read_dtb;run read_kernel; bootm ${loadaddr} - ${dtb_loadaddr} boot_tftp run setnfs_boot; tftp ${dtb_loadaddr} ${dtb_file}; tftp ${loadaddr} ${kernel_file}; bootm ${loadaddr} - ${dtb_loadaddr} # 根据上面设置的变量boot_xxx,执行bootcmd命令. bootcmd run boot_mmc bootdelay 1 # uboot 延时时间 console ttySAK0,115200n8 # 控制台参数,端口号ttySAK0 波特率115200 dtb_addr 0x82000 # dt拷贝到ram的地址 dtb_loadaddr 0x81300000 # dtb在flash存储地址,启动的时候会从这个地址读到ram里面 dtb_size 0x20000 # dtb大小 dtb_file zmp1107_evb_dsi.dtb #dtb 文件名字 ethaddr 00:55:7b:b5:7d:f7 # 默认网卡地址 fdt_high 0xFFFFFFFF # 设置dtb在u-boot中不做重定位 init /sbin/init # 内核启动后的init进程 ipaddr 192.168.100.17 # uboot阶段开发板ip地址 kernel_addr 0xa2000 # 内核拷贝到ram的地址 kernel_size 0x300000 # 内核大小 loadaddr 0x80008000 # 内核在flash地址 kernel_file uImage # 内核文件名字 memsize 128M # ram内存大小128M # 定义4个变量xxx_root mtd_root /dev/mtdblock6 rootfstype=squashfs #文件系统为只读的squashfs类型,对应boot_mtd启动方式 mmc_root /dev/mmcblk0 rootfstype=ext4 rw rootwait # nfs_root /dev/nfs rootfstype=nfs rw nfs_rootfs /work/zmp1107/nfs_rootfs #nfs共享目录 # 定义变量mtdparts:定制spi-flash的MTD分区,要求,burntool烧写工具,U-Boot,Kernel要保持一致。 # 如果 没有使用环境变量env.img中的mtdpart参数,而是使用u-boot代码中默认的配置,则需要在 # include/configs/zmp110x_evb.h文件中修改CONFIG_DEFAULT_MTDPARTS宏定义如下: # #define CONFIG_DEFAULT_MTDPARTS \ # "mtdparts=spi0.0:512K@0x0(UBOOT),4K@0x80000(ENV),4K@0x81000(ENVBK),\ # 128K@0x82000(DTB),3072K@0xa2000(KERNEL),376K@0x3a2000(LOGO),\ # 3968K@0x400000(ROOTFS),128K@0x7e0000(WORK)" # 然后把宏定义CONFIG_DEFAULT_MTDPARTS 放到宏定义CONFIG_EXTRA_ENV_SETTINGS中。如下: # #define CONFIG_EXTRA_ENV_SETTINGS \ # CONFIG_DEFAULT_MTDPARTS\ # "a_uboot_flags=0x0\0" # 可以在uboot命令行输入 mtdparts 查看当前的mtd分区配置 mtdparts mtdparts=spi0.0:512K@0x0(UBOOT),4K@0x80000(ENV),4K@0x81000(ENVBK),128K@0x82000(DTB),3072K@0xa2000(KERNEL),376K@0x3a2000(LOGO),3968K@0x400000(ROOTFS),128K@0x7e0000(WORK) #定义 read_dtb变量,方便上面调用:功能是读取flash上的dtb到ram中。解释如下 # sf probe 0:0 ${sf_hz} :初始化flash设备,在spi总线0上片选0,频率sf_hz # sf read :从flash的dtb_addr地址,读取dtb_size字节,到ram的dtb_loadaddr地址 # fdt addr ${dtb_loadaddr}:从arm的dtb_loadaddr地址,加载dtb文件 read_dtb sf probe 0:0 ${sf_hz} 0; sf read ${dtb_loadaddr} ${dtb_addr} ${dtb_size};fdt addr ${dtb_loadaddr} #定义read_kernel变量,方便上面调用,功能:从kernel_addr读取kernel_size字节到ram的loadaddr地址 read_kernel sf probe 0:0 ${sf_hz} 0; sf read ${loadaddr} ${kernel_addr} ${kernel_size} #设置三个变量setxxx_boot,方面上面调用,功能设置环境命令bootargs,会覆盖设备树chosen节点的bootargs属 #性。作为cmdline参数传给kernel setmtd_boot setenv bootargs console=${console} root=${mtd_root} init=${init} mem=${memsize} memsize=${memsize} ${mtdparts} setmmc_boot setenv bootargs console=${console} root=${mmc_root} init=${init} mem=${memsize} memsize=${memsize} ${mtdparts} setnfs_boot setenv bootargs console=${console} root=${nfs_root} nfsroot=${serverip}:${nfs_rootfs},v3,tcp ip=dhcp init=${init} mem=${memsize} memsize=${memsize} ${mtdparts} netmask 255.255.255.0 # 掩码地址 serverip 192.168.100.5 # tftp服务端的IP地址 sf_hz 80000000 # spi 频率 update_flag 0 # vram 12M # ``` ## 挂载网络文件系统boot_tftp ```bash setenv ipaddr 192.168.3.2 setenv serverip 192.168.3.100 setenv gatewayip 192.168.3.1 setenv nfs_rootfs /home/xym/nfs_rootfs setenv setnfs_boot setenv bootargs console=${console} root=${nfs_root} nfsroot=${serverip}:${nfs_rootfs},v3,tcp ip=${ipaddr}:${serverip}:${gateway}:${netmask} init=${init} mem=${memsize} memsize=${memsize} ${mtdparts} saveenv run boot_tftp ``` 或则直接修改环境变量配置文件env.cfg ```bash env_version 1.1.00 a_uboot_flags 0x0 baudrate 115200 boot_mtd run setmtd_boot; run read_dtb;run read_kernel; bootm ${loadaddr} - ${dtb_loadaddr} boot_mmc run setmmc_boot; run read_dtb;run read_kernel; bootm ${loadaddr} - ${dtb_loadaddr} boot_nfs run setnfs_boot; run read_dtb;run read_kernel; bootm ${loadaddr} - ${dtb_loadaddr} boot_tftp run setnfs_boot; tftp ${dtb_loadaddr} ${dtb_file}; tftp ${loadaddr} ${kernel_file}; bootm ${loadaddr} - ${dtb_loadaddr} bootcmd run boot_tftp bootdelay 1 console ttySAK0,115200n8 dtb_addr 0x82000 dtb_loadaddr 0x81300000 dtb_size 0x20000 dtb_file zmp1107_evb_dsi.dtb ethaddr 00:55:7b:b5:7d:f7 fdt_high 0xFFFFFFFF init /sbin/init gateway 192.168.3.1 ipaddr 192.168.3.2 kernel_addr 0xa2000 kernel_size 0x300000 loadaddr 0x80008000 kernel_file uImage memsize 128M mtd_root /dev/mtdblock6 rootfstype=squashfs mmc_root /dev/mmcblk0 rootfstype=ext4 rw rootwait nfs_root /dev/nfs rootfstype=nfs rw nfs_rootfs /home/xym/nfs_rootfs mtdparts mtdparts=spi0.0:512K@0x0(UBOOT),4K@0x80000(ENV),4K@0x81000(ENVBK),128K@0x82000(DTB),3072K@0xa2000(KERNEL),376K@0x3a2000(LOGO),3968K@0x400000(ROOTFS),128K@0x7e0000(WORK) read_dtb sf probe 0:0 ${sf_hz} 0; sf read ${dtb_loadaddr} ${dtb_addr} ${dtb_size};fdt addr ${dtb_loadaddr} read_kernel sf probe 0:0 ${sf_hz} 0; sf read ${loadaddr} ${kernel_addr} ${kernel_size} setmtd_boot setenv bootargs console=${console} root=${mtd_root} init=${init} mem=${memsize} memsize=${memsize} ${mtdparts} setmmc_boot setenv bootargs console=${console} root=${mmc_root} init=${init} mem=${memsize} memsize=${memsize} ${mtdparts} setnfs_boot setenv bootargs console=${console} root=${nfs_root} nfsroot=${serverip}:${nfs_rootfs},v3,tcp ip=${ipaddr}:${serverip}:${gateway}:${netmask} init=${init} mem=${memsize} memsize=${memsize} ${mtdparts} netmask 255.255.255.0 serverip 192.168.3.100 sf_hz 80000000 update_flag 0 vram 12M ```