记录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"

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/adam-zheng/p/17614508.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!