记录uboot中的一些指令。
uboot,也叫bootloader,是板子上电后的第一个程序,或者可以理解为此时就是一个单片机。需要一系列操作才能跳转到kernel,挂载文件系统,然后进入系统。
多数情况下,进入uboot需要输入一些特殊的字符,有的板子只需要敲enter,有的板子需要敲tpl,有的板子则可以敲任意键。
进入uboot后的界面大致为:
4: System Enter Boot Command Line Interface. U-Boot 1.1.3 (Feb 1 2023 - 10:23:39) MT7621 #
1. uboot跳转到kernel,是通过bootcmd来实现的,默认情况下,bootcmd是有值的,是一个十六进制的地址。具体随板子的情况而定,下面是一块MT7621 nor flash的板子的数据:
MT7621 # print bootargs=console=ttyS1,115200 root=/dev/mtdblock2 rootfstype=squashfs init=/etc/preinit mtdparts=raspi:256k(uboot),3200k(uImage),12864k@0x360000(rootfs),64k@0xff0000(ART) bootcmd=tftp bootdelay=0x1 baudrate=115200 ethaddr="00:AA:BB:CC:DD:10" ipaddr=192.168.0.1 serverip=192.168.0.5 stdin=serial stdout=serial stderr=serial Environment size: 323/4092 bytes MT7621 # re
而博主这里由于是刷机,所以需要重新给bootcmd赋值。
setenv set_ubi 'set mtdids nand0=nand0; set mtdparts mtdparts=nand0:0x7680000@0x900000(fs); ubi part fs' setenv bootkernel 'ubi read 0x84000000 kernel && bootm' setenv bootargs 'ubi.mtd=ubi root=/dev/ubiblock0_1 rootfstype=squashfs,ubi' setenv my_boot 'run set_ubi; run bootkernel' setenv bootcmd 'run my_boot' saveenv
倒着看:
- bootcmd会运行my_boot这个自定义的命令
- my_boot运行ubit的设置和启动kernel的代码逻辑
- set_ubi是指定读取某一块flash(指定id为nand0),然后按照mtd分区来展开,分区的起点为0x900000,区间长度为0x7680000,分区名称为fs,最后的ubi part fs,即指定当前获取的ubi设备为fs
- bootkernel则是从当前活跃的ubi设备中读取一个叫kernel的ubi分卷,然后调用bootm启动内核
- bootargs是uboot传给kernel的参数,这里主要是指定rootfs的名称为为ubi,然后root为这个ubi设备为ubiblock0的编号1分卷,这里ubi block即为上面的0x7680000@900000,然后该设备中有三个分卷,具体如下,关注vol_id,rootfs的vol_id为1,即为ubiblock0_1,即后面的1为vol_id。
[kernel] mode=ubi vol_id=0 vol_type=dynamic vol_name=kernel image=/home/ubuntu/openwrt/build_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/linux-ipq40xx_generic/tplink_deco-m9plus-v2-zImage.itb [rootfs] mode=ubi vol_id=1 vol_type=dynamic vol_name=rootfs image=/home/ubuntu/openwrt/build_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/linux-ipq40xx_generic/root.squashfs vol_size=5437440 [rootfs_data] mode=ubi vol_id=2 vol_type=dynamic vol_name=rootfs_data vol_size=10MiB vol_flags=autoresize
最后是指定rootfstype为squashfs和ubifs。
2. uboot中对Flash的擦除和写入:
QCA4019 nand flash:
nand erase 0x00900000 0x7700000 setenv serverip 192.168.0.15 && setenv ipaddr 192.168.0.71 && tftpboot root.ubi nand write 0x84000000 0x00900000 0x008c0000 re
QCA4019 nor flash:
set serverip 192.168.0.88 && set ipaddr 192.168.0.77 tftpboot 0x84000000 flash.bin sf probe && sf erase 0x0 +0x2000000 && sf write 0x84000000 0x0 0x2000000
MT7621 nor flash:
setenv ipaddr 192.168.0.33 && setenv serverip 192.168.0.88 tftp 0x80800000 flash.bin erase 0x9f000000 +0xffffff cp.b 0x80800000 0x9f000000 0xff0000 re
逻辑相对简单,erase是指定起点和长度,write是指定从某位置读取,写入到某个起点,最后是长度。
只是调用的指令不太一样,如cp等,具体应该结合help或者?来看。
至于起始地址和结束地址,则需要在进入系统后,通过mtd查看:
root@OpenWrt:/# cat /proc/mtd dev: size erasesize name mtd0: 00040000 00010000 "u-boot" mtd1: 00f60000 00010000 "firmware" mtd2: 002b6ab7 00010000 "kernel" mtd3: 00ca9549 00010000 "rootfs" mtd4: 00680000 00010000 "rootfs_data" mtd5: 00010000 00010000 "config" mtd6: 00040000 00010000 "tplink" mtd7: 00010000 00010000 "radio"
内容来源于网络如有侵权请私信删除
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!