uboot高级进阶

uboot环境变量说明

uboot支持四种启动方式,系统默认使用第二种

  1. 启动命令boot_mtdKerneldtbrootfs 都存放于 都存放于 都存放于SPI NorFlash ,这种情况下 ,rootfs使用 squashfs压缩只读文件系统,如何制作squashfs文件系统请参考章节;
  2. 启动命令boot_mmcKerneldtb存放SPI NorFlash,rootfs存放在eMMC;
  3. 启动命令boot_nfsKerneldtb存放SPI NorFlash,rootfs使用nfs网络文件系统;
  4. 启动命令boot_tftpKerneldtb通过tftp服务器获取,rootfs使用nfs网络文件系统。

uboot参数说明如下

 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

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

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