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、颜色: 还能查看扫描历史等统计信息: 上述所有功能都是免…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
