Linux嵌入式uboot使用tftp网络启动加载zImage、设备树
文章目录
- 一、前言
- 二、Linux U-boot 相关命令
- (1)help 命令
- (2)printenv 命令
- (3)setenv 函数
- (4)saveenv 函数
- 三、tftp启动linux内核步骤
- (1)进入u-boot模式
- (2)ping通主机
- (3)修改IP
- (4)从网络启动
一、前言
先来讲一下为什么要使用tftp网络启动加载zImage和设备树。
在做驱动开发学习的时候,我们每次涉及到一个学习目标,比如学习led灯设备驱动开发,我们需要去设备树中添加节点,然后进行编译,编译好之后需要将我们的设备树和zImage文件上传到开发板,替换掉开发板上面相对应的文件,然后进行sudo reboot
重新启动。
所以为了方便,可以使用Linux嵌入式uboot使用tftp网络启动加载zImage、设备树。也就是每次开启的时候,会从我们虚拟机tftpboot
路径下去寻找我们的zImage和设备树启动,就不需要每次都下载然后重新reboot了。
如何搭建tftp服务器可以参考这篇文章:wpa_supplicant无线网络配置imx6ull以及搭建tftp服务器
在重启开发板的时候,随意按键即可进入u-boot模式。
二、Linux U-boot 相关命令
- help: printenv命令描述/用法
- printenv: 打印环境变量
- setenv: 设置环境变量
- saveenv: 将环境变量保存到持久存储
接下来我们详细讲解这几个命令。
(1)help 命令
可用于察看当前开发板所支持的命令。
[u-boot@igkboard]# help
? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
blkcache - block cache diagnostics and control
bmode - sd1|sd2|qspi1|normal|usb|sata|ecspi1:0|ecspi1:1|ecspi1:2|ecspi1:3|esdhc1|esdhc2|esdhc3|esdhc4
bmode - getprisec
bmp - manipulate BMP image data
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootefi - Boots an EFI payload from memory
bootelf - Boot from an ELF image in memory
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootvx - Boot vxWorks from an ELF image
bootz - boot Linux zImage image from memory
clocks - display clocks
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
dcache - enable or disable data cache
dhcp - boot image via network using DHCP/TFTP protocol
dm - Driver model low level access
echo - echo args to console
editenv - edit environment variable
env - environment handling commands
erase - erase FLASH memory
exit - exit script
ext2load - load binary file from a Ext2 filesystem
ext2ls - list files in a directory (default /)
ext4load - load binary file from a Ext4 filesystem
ext4ls - list files in a directory (default /)
ext4size - determine a file's size
ext4write - create a file in the root directory
false - do nothing, unsuccessfully
fastboot - run as a fastboot usb or udp device
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fatmkdir - create a directory
fatrm - delete a file
fatsize - determine a file's size
fatwrite - write file into a dos filesystem
fdt - flattened device tree utility commands
flinfo - print FLASH memory information
fstype - Look up a filesystem type
fstypes - List supported filesystem types
fuse - Fuse sub-system
go - start application at address 'addr'
gpio - query and control gpio pins
gpt - GUID Partition Table
help - print command description/usage
i2c - I2C sub-system
icache - enable or disable instruction cache
iminfo - print header information for application image
imxtract - extract a part of a multi-image
itest - return true/false on integer compare
lcdputs - print string on video framebuffer
ln - Create a symbolic link
load - load binary file from a filesystem
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
ls - list files in a directory (default /)
md - memory display
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mtest - simple RAM read/write test
mw - memory write (fill)
net - NET sub-system
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
panic - Panic with optional message
ping - send ICMP ECHO_REQUEST to network host
pinmux - show pin-controller muxing
printenv - print environment variables
protect - enable or disable FLASH write protection
qspihdr - Q(F)SPI Boot Config sub-system
random - fill memory with random pattern
read - Load binary data from a partition
reset - Perform RESET of the CPU
run - run commands in an environment variable
save - save file to a filesystem
saveenv - save environment variables to persistent storage
setcurs - set cursor position within screen
setenv - set environment variables
setexpr - set environment variable as the result of eval expression
sf - SPI flash sub-system
showvar - print local hushshell variables
size - determine a file's size
sleep - delay execution for some time
source - run script from memory
test - minimal test like /bin/sh
tftpboot - boot image via network using TFTP protocol
true - do nothing, successfully
ums - Use the UMS [USB Mass Storage]
usb - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker version
videolink - list and select video link
(2)printenv 命令
printenv 命令查看环境变量也可以使用缩写:print
[u-boot@igkboard]# printenv
author=weihuihong
baudrate=115200
bbl=tftp ${loadaddr} u-boot-igkboard.imx && mmc dev ${mmcdev} 1 && mmc write ${loadaddr} 2 0x500
bdtb=tftp $fdt_addr $fdt_file && fatwrite mmc 1:1 $fdt_addr $fdt_file $filesize
bker=tftp $loadaddr $image&& fatwrite mmc 1:1 $loadaddr $image $filesize
board_name=EVK
board_rev=14X14
bootcmd=run mmcbootdto
bootdelay=3
bsys=run bdtb && run bker
console=ttymxc0
dtbo_addr=0x83010000
dtbo_dir=overlays
emmc_ack=1
emmc_dev=1
env_conf=config.txt
eth1addr=be:19:97:40:6d:ff
ethact=ethernet@20b4000
ethaddr=3e:0a:c4:12:ae:e2
ethprime=eth1
fastboot_dev=mmc1
fdt_addr=0x83000000
fdt_file=igkboard.dtb
fdt_size=0x10000
fdtcontroladdr=9de744c0
image=zImage
ipaddr=192.168.137.213
loadaddr=0x80800000
loadenvconf=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${env_conf};env import -t ${loadaddr} ${filesize}
loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}
loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}
mmc_no=1
mmcargs=setenv bootargs console=${console},${baudrate} root=/dev/mmcblk${mmc_no}p2 rootwait rw net.ifnames=0
mmcboot=echo Booting from mmc ...; mmc dev ${mmcdev}; run mmcargs; run loadenvconf;run loadimage; run loadfdt; bootz ${loadaddr} - ${fdt_addr}
mmcbootdto=echo Booting from mmc with overlay...; mmc dev ${mmcdev}; run mmcargs; run loadenvconf; run loadimage; run loadfdt; if env exists dtoverlay_lcd && test ${dtoverlay_lcd} = 1 -o ${dtoverlay_lcd} = yes ; then setenv dtbo_file lcd.dtbo; echo Applying DT overlay ==> ${dtbo_file}; fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file}; fdt addr ${fdt_addr}; fdt resize ${fdt_size}; fdt apply ${dtbo_addr}; fi; if env exists dtoverlay_cam && test ${dtoverlay_cam} = 1 -o ${dtoverlay_cam} = yes ; then setenv dtbo_file cam.dtbo; echo Applying DT overlay ==> ${dtbo_file}; fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file}; fdt addr ${fdt_addr}; fdt resize ${fdt_size}; fdt apply ${dtbo_addr}; fi; if env exists dtoverlay_i2c1 && test ${dtoverlay_i2c1} = 1 -o ${dtoverlay_i2c1} = yes ; then setenv dtbo_file i2c1.dtbo; echo Applying DT overlay ==> ${dtbo_file}; fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file}; fdt addr ${fdt_addr}; fdt resize ${fdt_size}; fdt apply ${dtbo_addr}; fi; if env exists dtoverlay_spi1 && test ${dtoverlay_spi1} = 1 -o ${dtoverlay_spi1} = yes ; then setenv dtbo_file spi1.dtbo; echo Applying DT overlay ==> ${dtbo_file}; fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file}; fdt addr ${fdt_addr}; fdt resize ${fdt_size}; fdt apply ${dtbo_addr}; fi; if env exists dtoverlay_uart; then for i in ${dtoverlay_uart}; do setenv dtbo_file uart$i.dtbo; echo Applying DT overlay ==> ${dtbo_file}; fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file}; fdt addr ${fdt_addr}; fdt resize ${fdt_size}; fdt apply ${dtbo_addr}; done;fi; if env exists dtoverlay_can; then for i in ${dtoverlay_can}; do setenv dtbo_file can$i.dtbo; echo Applying DT overlay ==> ${dtbo_file}; fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file}; fdt addr ${fdt_addr}; fdt resize ${fdt_size}; fdt apply ${dtbo_addr}; done;fi; if env exists dtoverlay_pwm; then for i in ${dtoverlay_pwm}; do setenv dtbo_file pwm$i.dtbo; echo Applying DT overlay ==> ${dtbo_file}; fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file}; fdt addr ${fdt_addr}; fdt resize ${fdt_size}; fdt apply ${dtbo_addr}; done;fi; if env exists dtoverlay_extra; then for f in ${dtoverlay_extra}; do setenv dtbo_file $f.dtbo; echo Applying DT overlay ==> ${dtbo_file}; fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file}; fdt addr ${fdt_addr}; fdt resize ${fdt_size}; fdt apply ${dtbo_addr}; done;fi; bootz ${loadaddr} - ${fdt_addr}
mmcdev=1
mmcpart=1
netboot=echo Booting from net ...; tftp $loadaddr $image; tftp $fdt_addr ${fdt_file};run mmcargs; bootz ${loadaddr} - ${fdt_addr}
serial#=303769d759a6d668
serverip=192.168.137.91
splashimage=0x8c000000
tee=no
upmode=fastboot 0Environment size: 4012/8188 bytes
里面的内容也是学长之前写好的或者添加的,直接拿来用就可。
也可以查看某一个环境变量的值:
[u-boot@igkboard]# printenv serverip
serverip=192.168.137.91
(3)setenv 函数
setenv name value 添加/修改环境变量:
[u-boot@igkboard]# setenv serverip 192.168.137.99
修改后:
setenv name 删除环境变量:
[u-boot@igkboard]# setenv serverip
修改后:
(4)saveenv 函数
保存环境变量,将当前定义的所有变量及其值存入flash中。
[u-boot@igkboard]# saveenv
Saving Environment to MMC... Writing to MMC(1)... OK
当设置完环境变量之后,如果执行了saveenv的话,则下次重新运行的时候环境变量则会被保存为上次保存的值;如果不保存,只会在设置好时还没重启之前生效,重启之后设置值会恢复成原来的值。
三、tftp启动linux内核步骤
(1)进入u-boot模式
开始启动的时候在倒数三秒时间按随机键进入到u-boot模式:
Hit any key to stop autoboot: 0
[u-boot@igkboard]#
(2)ping通主机
查看是否ping通tftp所在服务器主机:
[u-boot@igkboard]# ping 192.168.137.91
Using ethernet@20b4000 device
host 192.168.137.91 is alive
提示 xxx alive说明成功,可以ping通。
(3)修改IP
需要修改环境变量中的主机IP和服务器IP,注意,一般服务器IP都是不会变的,主机IP会变,但是主机IP需要在一个网段内就可,不需要每次都去修改的。
[u-boot@igkboard]# setenv ipaddr 192.168.137.99
[u-boot@igkboard]# setenv serverip 192.168.137.91
[u-boot@igkboard]# print ipaddr
ipaddr=192.168.137.99
[u-boot@igkboard]# print serverip
serverip=192.168.137.91
然后我们需要保存一下saveenv
(4)从网络启动
执行命令run netboot
[u-boot@igkboard]# run netboot
Booting from net ...
Using ethernet@20b4000 device
TFTP from server 192.168.137.91; our IP address is 192.168.137.99
Filename 'zImage'.
Load address: 0x80800000
Loading: #####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################1.4 MiB/s
done
Bytes transferred = 9466232 (907178 hex)
Using ethernet@20b4000 device
TFTP from server 192.168.137.91; our IP address is 192.168.137.99
Filename 'igkboard.dtb'.
Load address: 0x83000000
Loading: ####1.1 MiB/s
done
说明成功了。
具体实现的代码在配置中写了,但是还不是很清楚,后面学到再补充。
相关文章:

Linux嵌入式uboot使用tftp网络启动加载zImage、设备树
文章目录 一、前言二、Linux U-boot 相关命令(1)help 命令(2)printenv 命令(3)setenv 函数(4)saveenv 函数 三、tftp启动linux内核步骤(1)进入u-boot模式&…...

使用Serv-U搭建FTP服务器并公网访问【内网穿透】
文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天,移动电子设备似乎成了我们生活的主角,智能…...

后端大厂面试总结大全六
目录: 1、Transactional注解控制事务有哪些不生效的场景2、MySQL的优化 1、Transactional注解控制事务有哪些不生效的场景 数据库引擎不支持事务数据源没有配置事务管理器没有被spring管理方法不是public的同一个类中方法调用,导致Transactional失效 举…...

2023五一数学建模A题B题C题思路模型代码
占个位置吧,开始在本帖实时更新五一数学建模赛题思路代码,文章末尾获取! 持续为更新参考思路 赛题思路 会持续进行思路模型分析,下自行获取。 A题思路: (比赛开始后第一时间更新) B题思路…...

Redis --- 入门、数据类型
一、前言 1.1、什么是Redis Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。 基于内存存储,读写性能高适合存储热点…...

超级详解MySQL执行计划explain
1、什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解。 MySQL本身的功能架构分为三个部分,分别是 应用层、逻辑层、物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构…...

C++流操作
C引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含<sstream>这个头文件。 在C中标准库提供三个类用于文件操作,统称为文件流类: ifstream:专用于从文件中读取数据;ofs…...

Django连接Redis、数据库、mongodb密码明文存储问题以及方案
文章目录 DDjango连接Redis、数据库、mongodb密码明文存储问题以及方案需求背景常见解决方案Django中redis、数据库密码明文加密存储方案 DDjango连接Redis、数据库、mongodb密码明文存储问题以及方案 需求背景 密码不应以明文出现在代码或配置文件中。 常见解决方案 在Dja…...

Qt实现仿微信在线聊天工具(服务器、客户端)V1_ 02
上一篇设计了登录和聊天窗口,并实现了窗口切换,本章将继续实现其他模块 本章内容 完善登录验证实现自定义窗口的拖动效果 完善登录验证 对登录的输入框进行输入限定,这里我限制登录id为6位纯数字组合,密码长度不超过16位 设置…...

Direct local .aar file dependencies are not supported when building an AAR.
前言 起因:项目中含有视频播放功能,使用的是GSYVideoPlayer,因为公司网络问题经常依赖添加不了,所以将关于它的aar包全部下载下来直接本地依赖。 因为多个业务都可能涉及视频播放功能,为了复用,就想着将视频…...

【Java基础】day16
day16 一、switch-case 和 if-else 谁更快? switch-case 在 switch-case 中,case 的值是连续的话,会生成一个 TableSwitch 来进行优化,这样的情况下,只需要在表中进行判断即可。 这里使用 0-4 的连续值来进行测试 如…...

Neo4j | 一文入门Neo4j!
下面是一些基本的Cypher查询语句: 创建节点 CREATE (n:Person {name:Alice})这会创建一个标签为Person、属性name值为Alice的节点。 创建节点之间的关系 MATCH (a:Person {name:Alice}), (b:Person {name:Bob}) CREATE (a)-[:FRIEND]->(b)这会创建Alice和Bob…...

Python科研数据可视化
在过去的20 年中,随着社会产生数据的大量增加,对数据的理解、解释与决策的需求也随之增加。而固定不变是人类本身,所以我们的大脑必须学会理解这些日益增加的数据信息。所谓“一图胜千言”,对于数量、规模与复杂性不断增加的数据&…...

叫板IT部门和专业软件公司,低代码成为企业数字化的新选择
从2017年政府将“数字经济”写入工作报告,到今年两会将企业数字化转型列为重点议题,数字化的口号已喊了6年。政策对于数字化的支持越来越坚定,令人欣喜的是,越来越多具有远见卓识的企业已将数字化建设作为工作重心。 然而…...

leetcode 541. 反转字符串 II
题目描述解题思路执行结果 leetcode 541. 反转字符串 II 题目描述 反转字符串 II 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全…...

java数据类型的转换以及精度丢失
java数据类型的转换以及精度丢失_long转double会丢失精度吗_ღLiJia的博客-CSDN博客 一.浮点类型在计算机当中的存储 float存储需求是4字节(32位), 其中1位最高位是符号位,中间8位表示阶位,后32位表示值 float的范围: -2^128 ~ …...

网络通信基础 - 多路复用技术(频分多路复用、时分多路复用、波分多路复用)
文章目录 1 概述1.1 复用器 MUX 2 分类2.1 频分多路复用 FDM2.2 时分多路复用 TDM2.3 波分多路复用 WDM 1 概述 1.1 复用器 MUX 多路复用技术:把多个低速信道组合成一个高速信道的技术这种技术要用到两个设备,统称为 多路器(MUX)…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK的函数转换示Bayer格式为BGR8格式彩色图像(C++)
Baumer工业相机堡盟工业相机如何通过BGAPISDK的函数转换示Bayer格式为BGR8格式彩色图像(C) Baumer工业相机Baumer工业相机的Bayer彩色图像的技术背景Baumer工业相机通过BGAPI SDK在回调函数里显示Bayer彩色图像Baumer工业相机在BufferEvent转换Bayer格式…...

一块钱看Android Debug: avc denied 已存在的目录不能访问
某三方应用,使用了USB摄像头,启动应用后功能不能使用,看log有如下错误, denied后面{}里的是要执行的动作,比如append,open,execmod,link等等 scontext指的是域,对应的是te文件 上面报错这条对应te文件是untrusted_app.te, scontex…...

URL 转为QR code(二维码)
推荐一个良心的网站,能够免费地将url、text编码为二维码,而且还能设计logo、颜色等。 https://www.the-qrcode-generator.com/ 如下图: 可以自己定义logo、颜色: 还能查看扫描历史等统计信息: 上述所有功能都是免…...

CentOS软件那么老为什么大家还要用它?
作为一个专业的服务器系统,RHEL 系统理论上每一个软件包都有 RedHat 内部的人员负责维护,这个维护包括长期(和系统生命周期一样长)的开发、更新、测试、运维等。也就是说你能从 RHEL 系统源上获得的每一个软件包,出现问…...

聚观早报|飞猪:五一出游需求爆发;特斯拉一季度盈利同比跌20%
今日要闻:飞猪:五一出游需求爆发;特斯拉一季度盈利同比暴跌20%;郑渊洁永远不再发表作品;KargoBot推出无人化自动驾驶卡车;中国6G通信技术研发取得重要突破 飞猪:五一出游需求爆发 4 月 19 日&a…...

Redis缓存雪崩、穿透、击穿
Redis缓存雪崩、穿透、击穿 解决方案正常的缓存流程Redis缓存雪崩Redis缓存雪崩解决方案 Redis缓存穿透Redis缓存穿透解决方案 Redis缓存击穿Redis缓存击穿解决方案 解决方案 布隆过滤器,分布式锁 正常的缓存流程 Redis缓存雪崩 Redis中的key大面积失效࿰…...

不要老盯着ChatGPT,这几家公司的产品同样不容小觑
Adept.ai 2022 年成立,致力于一款能够代替人类使用电脑、操控软件的AI助手,旗下模型 ACT-1 还处于雏形阶段,但根据官方示例,已经可以完成通过自然语言指令完成特定的任务。公司创始人曾任OpenAI的工程副总裁,后来进入谷…...

DataBinding 大坑总结(网上我暂时搜不到解决方法)
在使用多Module中使用DataBinding会引发一些奇怪的问题,最近好好的腾出时间来折腾这些奇怪的问题: 1:如果当Module启动DataBinding重启AS启动报错的话,就启用允许多行代码 android { defaultConfig {multiDexEnabled true} } de…...

Linux I/O复用函数的使用情况和select接口的介绍
I/O 复用使得程序能同时监听多个文件描述符,这对于提高程序的性能至关重要。通常, 网络程序在下列情况下需要使用 I/O 复用技术: 1.TCP服务器同时要处理监听套接字和连接套接字 2.服务器同时要处理TCP请求和UDP请求。 3.程序同时要处理多个套…...

leetcode:数字转换为十六进制数(详解)
前言:内容包括:题目,代码实现,大致思路,代码解读 题目: 给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。 注意: 十六进制中所有字…...

Android 10 设置人脸解锁时,锁屏显示人脸解锁图标
Android 10设置人脸解锁时,锁屏解锁图标不会显示人脸图标,若想显示人脸图标,可参考以下两点进行修改: 1.此处引用人脸图标资源,请参考如下修改: diff --git a/packages/SystemUI/src/com/android/systemui/…...

【嵌入式环境下linux内核及驱动学习笔记-(5-驱动的并发控制机制)】
目录 1、上下文和并发1.1 上下文1.2 共享与临界内核中并发控制机制分为以下几类:并发控制机制的使用场景: 2、 并发控制机制--中断屏蔽3、并发控制机制--原子变量3.1 相关函数原子量类型a.设置原子量的值b.获取原子量的值c.原子变量加减d.原子变量自增自…...

必学宝典 黑马《最新JavaWeb开发教程》上线
对于程序员,所在的行业更迭实属过快,如果是为了找一份好工作,学技术前一定要先了解技术在市场中的需求情况。不然等你学完之后,才发现自己学了已被淘汰、过时的技术,白白浪费了宝贵的学习时间,后悔都来不及…...