uboot高级进阶¶
uboot环境变量说明¶
uboot支持四种启动方式,系统默认使用第二种
- 启动命令
boot_mtd:Kernel,dtb,rootfs都存放于 都存放于 都存放于SPI NorFlash ,这种情况下 ,rootfs使用 squashfs压缩只读文件系统,如何制作squashfs文件系统请参考章节; - 启动命令
boot_mmc:Kernel,dtb存放SPI NorFlash,rootfs存放在eMMC; - 启动命令
boot_nfs:Kernel,dtb存放SPI NorFlash,rootfs使用nfs网络文件系统; - 启动命令
boot_tftp:Kernel,dtb通过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