惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 靖意风

使用QT 将可执行程序 进行打包 对使用的屏幕的整理 对mmc 设备进行分区 开发板启动时间优化 nmcli 设置网络配置 虚拟机下 安装 ubuntu 18.04 硬件基础知识__串口 字节对齐问题和 小端格式 在ubuntu下 编译23位的测试文件 31_了解 x6818开发板是 如何使用/dev/ttySAC0 进行打印log 10_linux dirver platform 框架 ubuntu24.04.02 下安装软件 记录 ubuntu 更新源 vmware 虚拟机的三种网卡 vmware 安装 ubuntu 24.04.02 07_linux 字符设备了解 04_kernel编程框架和 printk传参 05_使用linux内核的gpio库函数 01_stm32 裸板程序 01_了解嵌入式开发
03_uboot 命令整理
靖意风 · 2025-05-28 · via 博客园 - 靖意风

1.1 uboot下的命令

print // 显示环境变量
ping 192.168.1.8 //

注:tftp在上位机已经设置好
tftp 0x48000000 rootfs.ext4.img // 将 rootfs.ext4.img从上位机下载到下位机的0x48000000内存处
tftp 0x48000000 led.bin // 将led.bin从上位机下载到下位机的0x48000000内存处
go 0x48000000 // 让CPU跑到内存的0x48000000地址去运行该地址的led.bin

1.2 分区

对EMMC进行分区,现使用fdisk对emmc分4个区

说明:
fdisk:uboot自带的分区命令
第一个参数2:明确:TF卡,SD卡,EMMC硬件特性一模一样,统称MMC
如果传递0:表示对SD0卡槽的TF进行分区
如果传递1:表示对SD1卡槽的TF进行分区
如果传递2:表示对EMMC进行分区
第二个参数4:表示要分四个分区,分别是uImage, rootfs.ext4, rootfs.cramfs, rootfs.qt_ext4 等4个
注意:uboot所在的分区从0x200开始,这是芯片已经确定的, 不需要使用fdisk 设置起始地址,对应mmcblk0boot1
0x400000:0x3c00000:指定 uImage所在的分区起始地址和大小, 对应 mmcblk0p1
0x4000000:0x2000000:指定rootfs.ext4所在的分区起始地址和大小,对应 对应 mmcblk0p2

1.3 下载uboot, 并烧写

tftp 0x48000000 ubootpak.bin
update_mmc 2 2ndboot 0x48000000 0x200 0x78000 //将uboot image 烧写到闪存中
说明:
update_mmc:专门用于将内存中的uboot烧写到emmc闪存上的一个命令
2:注意TF卡,SD卡和EMMC他们统称MMC,硬件操作协议都是一模一样,指示物理尺寸大小不一样而已
如果第一个参数传递0:表示向SD0卡的TF烧写uboot
如果第一个参数传递1:表示向SD1卡的TF烧写uboot
如果第一个参数传递2:表示向EMMC的TF烧写uboot
2ndboot:表示uboot所在的EMMC区域的分区名
0x48000000:uboot所在的内存地址
0x200:注意EMMC闪存内部的存储地址编址从0开始
三星规定,如果采用S5P6818处理器,必须将uboot烧写到EMMC的512(0x200)字节开始的地方
0x78000:指定烧写的uboot文件大小

1.4 烧写uImage 和 rootfs.ext4 等镜像

tftp 0x48000000 uImage //利用tftp服务从上位机的/tftpboot共享目录中下载uImage到下位机内存0x480000000
mmc write 0x48000000 0x2000 0x3000 //将uImage从内存的0x48000000写入到EMMC的0x2000起始地址(4M, 以sector=512字节为单位)
烧写0x3000这么多块(6M),比文件本身大即可

tftp 0x48000000 rootfs.ext4 //利用tftp服务从上位机下载 rootfs.ext4
mmc write 0x48000000 0x20000 0x5000 //将rootfs.ext4从内存的0x48000000写入到EMMC的0x20000起始地址(以sector=512字节为单位)
烧写0x5000这么多块(10M)

1.5 设置uboot的启动参数

setenv bootcmd mmc read 0x48000000 0x2000 0x3000 \; bootm 0x48000000 // 设置内核启动

setenv bootargs root=/dev/mmcblk0p2 init=/linuxrc console=ttySAC0,115200 maxcpus=1
说明:设置环境变量bootargs的值为:root=/dev/mmcblk0p2 ...
root=/dev/mmcblk0p2:告诉linux内核将来要挂接找的根文件系统rootfs在第二分区
init=/linuxrc:linux内核一旦找到根文件系统rootfs,执行的第一个进程就是根目录下的linuxrc程序
注意:linuxrc会帮你启动第一号进程:/sbin/init
console=ttySAC0,115200:指定将来linux内核打印输出的信息通过第一个串口来输出到上位机上,波特率115200
ttySAC0:第一个串口
ttySAC1:第二个串口
maxcpus=1:只启动一个CPU核,CPU0核

setenv bootargs root=/dev/mmcblk0p3 console=ttySAC0,115200 rootfstype=cramfs maxcpus=1 // 注,该烧写分区是 /dev/mmcblk0p3

1.6 设置rootfs是nfs启动

//重新设置bootargs,告诉内核跟文件系统rootfs在上位机,而不是在下位机EMMC的分区了
setenv bootargs root=/dev/nfs nfsroot=192.168.1.8:/opt/rootfs ip=192.168.1.110:192.168.1.8:192.168.1.1:255.255.255.0 init=/linuxrc console=ttySAC0,115200
maxcpus=1 lcd=wy070ml tp=gslx680-linux
saveenv
print //确认设置的bootargs正确无误!

1.8 设置rootfs从内存启动

烧写ramdisk.img 到第4分区
tftp 0x48000000 ramdisk.img
mmc write 0x48000000 0x8000000 0x4000

设置系统启动参数
setenv bootcmd mmc read 0x48000000 0x2000 0x3000 \; mmc read 0x49000000 0x8000000 0x4000 \; bootm 0x48000000
setenv bootargs root=/dev/ram initrd=0x49000000,8M console=ttySAC0,115200 init=/linuxrc maxcpus=1
saveenv