uboot环境变量总结
uboot环境变量设置(大地小神之个人收藏)
u-boot的环境变量u-boot的环境变量是使用u-boot的关键,它可以由你自己定义的,但是其中有一些也是大家经常使用,约定熟成的,有一些是u-boot 自己定义的,更改这些名字会出现错误,下面的表中我们列出了一些常用的环境变量:上面只是一些最基本的环境变量,请注意,板子里原本是没有环境变量的,u-boot的缺省情况下会有一些基本的环境变量,在你执行了saveenv之后,环境变量会第一次保存到flash中,之后你对环境变量的修改,保存都是基于保存在flash中的环境变量的操作。
U-boot的环境变量值得注意的有两个:bootcmd 和bootargs◆b o o t c m d前面有说过bootcmd是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。
◆b o o t a r g sbootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。
bootargs的种类非常非常的多,我们平常只是使用了几种而已,感兴趣的可以看看这篇文章说的很全:/u2/79570/showart_1675071.html。
bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置bootargs,而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置),正是这些原因导致了bootargs使用上的困难。
下面介绍一下bootargs常用参数,bootargs的种类非常的多,而且随着kernel的发展会出现一些新的参数,使得设置会更加灵活多样。
A.r o o t用来指定r o o t f s的位置,常见的情况有:root=/dev/ram rwroot=/dev/ram0 rw请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。
《uboot环境变量:详谈bootcmd和bootargs》
《uboot环境变量:详谈bootcmd和bootargs》1.uboot中的环境变量bootdelay:执⾏⾃动启动的等候秒数baudrate:串⼝控制台的波特率netmask:以太⽹接⼝的掩码ethaddr:以太⽹卡的⽹卡物理地址bootfile:缺省的下载⽂件bootargs:传递给内核的启动参数bootcmd:⾃动启动时执⾏的命令serverip:服务器端的ip地址ipaddr:本地ip 地址stdin:标准输⼊设备stdout:标准输出设备stderr:标准出错设备 以上是⼀些基本的环境变量。
uboot中⼀般会有⼀些缺省的环境变量。
在启动uboot后会将参数放在特定的FLASH区域,之后由kernel去获取解析。
还有另⼀种⽅法设置环境变量就是在uboot启动后进⼊命令⾏模式,设置环境变量,然后执⾏saveenv后,会将设置的环境变量保存到特定区域的FLASH中,由kernel去获取解析。
其中bootargs和bootcmd相对⽐较重要。
2.bootargs解析root: ⽬前很多新的开发板都是使⽤FLASH作为存储。
因为很多都直接使⽤MTD驱动程序。
MTD 驱动程序的主要优点在于 MTD 驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的⽀持、更好的管理和基于扇区的擦除和读写操作的更好的接⼝。
Linux 下的 MTD驱动程序接⼝被划分为两类模块:⽤户模块和硬件模块。
有两个流⾏的⽤户模块可启⽤对闪存的访问: MTD_CHAR 和 MTD_BLOCK 。
MTD_CHAR 提供对闪存的原始字符访问,⽽ MTD_BLOCK 将闪存设计为可以在上⾯创建⽂件系统的常规块设备(象 IDE 磁盘)。
与MTD_CHAR 关联的设备是 /dev/mtd0、mtd1、mtd2(等等),⽽与 MTD_BLOCK 关联的设备是 /dev/mtdblock0、mtdblock1(等等)。
由于 MTD_BLOCK 设备提供象块设备那样的模拟,通常更可取的是在这个模拟基础上创建象 FTL 和 JFFS2 那样的⽂件系统。
UBoot操作和常用命令
UBoot常用命令
• usb start: 起动usb 功能 • usb info: 列出设备 • usb scan: 扫描usb storage(u 盘)设备 • f的at文ls:件列出DOS FAT文件系统, 如:fatls usb 0列出第一块U盘中 • fatload: 读入FAT中的一个文件,如:fatload usb 0 0x30000000
• 通常,Boot Loader 是严重地依赖于硬件而实现的, 特别是在嵌入式世界。因此,在嵌入式世界里建 立一个通用的Boot Loader 几乎是不可能的。尽管 如此,我们仍然可以对Boot Loader 归纳出一些通 用的概念来,以指导用户特定的Boot Loader 设计 与实现。
UBoot来源
• nand write [内存地址] [NAND地址] [大小]
– 将SDRAM中地址0x31000000中大小为0x00200000的内容写入NAND Flash的0x100000地址。
– nand write 0x31000000 0x00100000 0x00200000 – NAND write: device 0 offset 1048576, size 2097152 ... 2097152 bytes
Creating 5 MTD partitions on "NAND 256MiB 3,3V 8-bit": 0x000000000000-0x000000040000 : "supervivi" ftl_cs: FTL header not found. 0x000000040000-0x000000060000 : "param" uncorrectable error : 0x000000060000-0x000000560000 : "Kernel" ftl_cs: FTL header not found. 0x000000560000-0x000040560000 : "root" mtd: partition "root" extends beyond the end of device "NAND 256MiB 3,3V 8-bit" -- size truncated to 0xfaa0000 ftl_cs: FTL header not found. 0x000000000000-0x000040000000 : "nand" mtd: partition "nand" extends beyond the end of device "NAND 256MiB 3,3V 8-bit" -- size truncated to 0x10000000
uboot笔记uboot命令分析+实现
uboot笔记uboot命令分析+实现uboot笔记:uboot命令分析+实现Ubootuboot命令分析+实现先贴⼀个重要结构,位于uboot/include/command.h,这个结构代表每个uboot命令struct cmd_tbl_s {char *name; /* Command Name */int maxargs; /* maximum number of arguments*/int repeatable;/* autorepeat allowed? *//* Implementation function */int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);char *usage; /* Usage message (short)简短⽤法信息*/#ifdef CFG_LONGHELPchar *help; /* Help message (long) 长的帮助信息*/#endif#ifdef CONFIG_AUTO_COMPLETE/* do auto completion on the arguments */ int (*complete)(intargc, char *argv[], charlast_char, intmaxv, char *cmdv[]); #endif};typedefstruct cmd_tbl_s cmd_tbl_t;============================================================uboot的第⼀阶段:硬件相关初始化0.reset执⾏arm920t/start.s 过程如下1.设置cpu svc管理模式2.关看门狗中断,mmu等3.设置时钟,sdram,外部总线4.代码重定位,搬运代码,从flash到sdram5.设置栈,bss段清零, bss⽤于未初始化的全局变量和静态变量6.ldr pc, _start_armboot即进⼊uboot启动的第⼆阶段,调⽤c函数start_armboot()从start_armboot开始经过⼀系列外设初始化⽐如falsh_initnand_init...最后循环调⽤mian_loop()main_loop主要流程{1. ⽣成环境变量mtdparts, 调⽤mtdparts_init2. 在启动过程中若⽆空格键按下则boot_zImage,即run_command(getenv("bootcmd"),0)有空格键按下则run_command("menu",0)3. shell过程,读取⽤户的输⼊并执⾏相应的命令{从控制台获得命令,保存在全局变量comsole_buffer中解析命令⾏字符串,分割命令与参数,最后执⾏run_command(...); }}也就是说在mian_loop中,是处理环境变量和控制台⼈机交互,mian_loop调⽤readline ()读取命令⾏到console_buffer,再把console_buffer复制到lastcommand中去,还要设置flag,最后调⽤run_command (lastcommand, flag)函数,run_command (lastcommand, flag)函数中,⾸先定义cmd_tbl_t *cmdtp,再解析命令⾏。
u-boot中分区和内核MTD分区关系
u-boot中分区和内核MTD分区关系⼀、u-boot中环境变量与uImage中MTD的分区关系分区只是内核的概念,就是说A~B地址放内核,C~D地址放⽂件系统,(也就是规定哪个地址区间放内核或者⽂件系统)等等。
⼀般我们只需要分3-4个区,第⼀个为boot区,⼀个为boot参数区(传递给内核的参数),⼀个为内核区,⼀个为⽂件系统区。
(但是有的内核就会有很多分区,⽐如内核参数会有两个,还有会Logo的地址)⽽对于bootloader中只要能将内核下载到A~B区的A地址开始处就可以,C~D区的C起始地址下载⽂件系统…….这些起始地址在MTD的分区信息中能找到。
所以bootloader对分区的概念不重要,只要它能把内核烧到A位置,把⽂件系统烧到C位置即可。
所以,在bootloader对Flash进⾏操作时,哪块区域放什么是以内核为主(内核中MTD的分区信息可以从内核的代码中看到)。
传递给u-boot 的参数只要和内核中MTD分区信息⼀致即可。
⽽为了⽅便操作,bootloader类似也引⼊分区的概念。
例如,可以使⽤“nandwrite 0x3000000 kernel 200000”命令将uImage烧到kernel分区,⽽不必写那么长:nand write 3000000 A 200000,也就是⽤分区名来代替具体的地址。
这要对bootloader对内核重新分区:这需要重新设置⼀下bootloader环境参数,就可以同步更新内核分区信息如:setenv bootargs 'noinitrd console=ttySAC0root=/dev/mtdblock3 rootfstype=jffs2 mtdparts=nand_flash:128k(u-boot)ro,64k(u-bootenvs),3m(kernel),30m(root.jffs2),30m(root.yaffs)'解析:在这⾥的挂载⽂件系统的地⽅mtdblock3,可以从mtdparts中看出来,第⼀个⽂件系统(jffs2格式)在第四个分区,所以使⽤mtdblock3,关于分区和⽂件系统的挂载在下⾯有解释。
uboot命令使用教程(uboot参数设置)
uboot命令使⽤教程(uboot参数设置)1. Printenv 打印环境变量。
uboot> printenvbaudrate=115200ipaddr=192.168.0.111ethaddr=32:34:46:78:9A:DCserverip=192.168.0.100Environment size: 80/8188 bytes2. Setenv 设置新的变量如:uboot> setenv myboard AT91RM9200DKuboot> saveenvuboot> printenvbaudrate=115200ipaddr=192.168.0.111ethaddr=32:34:46:78:9A:DCserverip=192.168.0.100myboard=AT91RM9200DKEnvironment size: 102/8188 bytes⼜如想重置启动参数bootargs:uboot> setenv bootargs 'noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0'uboot> saveenv3. saveenv 保存变量命令将当前定义的所有的变量及其值存⼊ flash 中。
⽤来存储变量及其值的空间只有 8k 字节,应不要超过。
(如上例,每次与setenv配合使⽤)4. loadb 通过串⼝ Kermit 协议下载⼆进制数据。
5. tftp 通过⽹络下载程序,需要先设置好⽹络配置简单配置:uboot> setenv ethaddr 32:34:46:78:9A:DCuboot> setenv ipaddr 192.168.0.111uboot> setenv serverip 192.168.0.100//下载 bin ⽂件到地址 0x20000000 处。
环境变量详解
环境变量详解
环境变量是指在计算机系统中用来存储和传递操作系统或应用程序运行所需信息的一种机制。
它们通常以键值对的形式存在,可以用来控制操作系统或应用程序的行为。
环境变量在计算机系统中扮演着重要的角色。
它们可以提供系统配置信息,如路径、语言、时区等,还可以存储用户个性化设置,如字体、桌面壁纸等。
通过设置环境变量,用户可以自定义计算机系统的行为,使其更符合个人习惯和需求。
在操作系统中,环境变量一般分为系统环境变量和用户环境变量。
系统环境变量对所有用户可见,而用户环境变量只对当前用户可见。
这样的设计可以确保不同用户之间的环境设置互不干扰。
环境变量的设置和使用非常灵活方便。
用户可以通过命令行工具或操作系统的图形界面来设置和修改环境变量。
在编写脚本或程序时,也可以通过读取环境变量的值来实现不同的逻辑判断和行为控制。
除了操作系统和应用程序,许多开发工具和框架也利用环境变量来进行配置。
比如,Java开发中常用的JAVA_HOME环境变量可以指定JDK的安装路径;Python开发中的PYTHONPATH环境变量可以指定模块搜索路径。
这样的设计使得开发者可以轻松地切换不同的开发环境,提高了开发效率。
环境变量是计算机系统中重要的一部分,它们提供了一种灵活、方
便的机制来管理和传递系统和应用程序的配置信息。
通过合理设置和使用环境变量,可以使计算机系统更加符合个人需求,提高工作效率。
让我们一起充分利用环境变量的优势,打造一个更加智能、高效的计算环境!。
uboot的bootcmd bootargs参数详解
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
上面就是我们经常使用的几种bootargs的组合,老实说,bootargs非常非常的灵活,所以设置的方法有很多中形式,具体的还应该根据你的平台具体的情况来设置。
mtdparts的格式如下:
mtdparts=[;
:= :[,]
:= [@offset][][ro]
:= unique id used in mapping driver/device
:= standard linux memsize OR "-" to denote all remaining space
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。
说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
uboot源码分析(2)uboot环境变量实现简析
uboot源码分析(2)uboot环境变量实现简析uboot 环境变量实现简析----------基于u-boot-2010.03u-boot的环境变量是使⽤u-boot的关键,它可以由你⾃⼰定义的,但是其中有⼀些也是⼤家经常使⽤,约定熟成的,有⼀些是u-boot⾃⼰定义的,更改这些名字会出现错误,下⾯的表中我们列出了⼀些常⽤的环境变量:bootdelay 执⾏⾃动启动的等候秒数baudrate 串⼝控制台的波特率netmask 以太⽹接⼝的掩码ethaddr 以太⽹卡的⽹卡物理地址bootfile 缺省的下载⽂件bootargs 传递给内核的启动参数bootcmd ⾃动启动时执⾏的命令serverip 服务器端的ip地址ipaddr 本地ip 地址stdin 标准输⼊设备stdout 标准输出设备stderr 标准出错设备上⾯只是⼀些最基本的环境变量,请注意,板⼦⾥原本是没有环境变量的,u-boot的缺省情况下会有⼀些基本的环境变量,在你执⾏了saveenv之后,环境变量会第⼀次保存到flash或者eeprom中,之后你对环境变量的修改,保存都是基于保存在flash中的环境变量的操作。
环境变量可以通过printenv命令查看环境变量的设置描述,通过setenv 命令进⾏重新设置,设置完成后可以通过saveenv将新的设置保存在⾮易失的存储设备中(nor flash 、nand flash 、eeprom)。
例如:setenv bootcmd "nand read 0x30008000 0x80000 0x500000;bootm 0x30008000"saveenv通过这两条命令就完成了环境变量bootcmd的重新设置,并讲其保存在固态存储器中。
下⾯简单分析下uboot中环境变量的实现流程。
uboot启动后,执⾏玩start.S中的汇编程序,将跳⼊board.c 中定义的start_arm_boot()函数中,在该函数中,uboot讲完成板⼦外设和相关系统环境的初始化,然后进⼊main_loop循环中进⾏系统启动或者等待与⽤户交互,这其中就包括环境变量的初始化和重定位。
uboot常用的命令
uboot常用的命令
U-Boot是一款开源的引导加载程序,它是嵌入式系统中常用的引导加载程序之一。
U-Boot提供了一系列的命令,可以用来进行系统的启动、调试、烧写等操作。
下面是U-Boot常用的命令:
1. help:显示所有可用的命令列表。
2. printenv:显示环境变量的值。
3. setenv:设置环境变量的值。
4. saveenv:保存环境变量的值。
5. bootm:启动内核。
6. tftpboot:从TFTP服务器下载文件。
7. ping:测试网络连接。
8. md:以16进制格式显示内存内容。
9. mw:以16进制格式写入内存内容。
10. cp:复制内存内容。
11. fatload:从FAT文件系统中加载文件。
12. fatls:列出FAT文件系统中的文件。
13. mmc:MMC卡操作命令。
14. usb:USB操作命令。
15. dhcp:获取IP地址。
16. run:执行脚本。
17. reset:重启系统。
以上是U-Boot常用的命令,这些命令可以满足大部分的需求。
在实
际使用中,我们可以根据具体的需求来选择合适的命令。
如果需要更
多的命令,可以通过添加自定义命令的方式来扩展U-Boot的功能。
总之,U-Boot是一款非常强大的引导加载程序,它提供了丰富的命令,
可以用来进行系统的启动、调试、烧写等操作。
熟练掌握U-Boot的命令,可以提高嵌入式系统的开发效率。
uboot的常用命令及用法
uboot的常⽤命令及⽤法uboot是bootloader的⼀种,主要是⽤于引导内核启动.uboot除此功能外, 还带有很多其它功能. 功能是通过命令来调⽤.uboot的命令:help //列出当前uboot所有⽀持的命令help 命令 //查看指定命令的帮助reset //重启ubootbootm //⽤于启动内核⽤法: bootm 0x42000000 //从内存地址0x42000000启动内核, 启动前需把内核镜像uImage存放到指定的内存地址printenv //打印所有环境变量的值printenv 环境变量名 //查看指定的环境变量值常⽤环境变量:bootdelay // uboot启动后, 倒计时多少秒后⾃动执⾏环境变量bootcmd的语句bootcmd // 倒计时到0后,⾃动执⾏⾥⾯的语句bootargs // 是⽤于提供给内核的启动参数语句setenv //设置/修改/删除环境变量的值⽤法:setenv 环境变量名 //删除指定的环境变量setenv myargs "hello" //设置环境变量myargs=hello, 如果环境变量没有会创建出来,如果已存则会修改它的值saveenv //保存环境变量,环境变量修改过后必须执⾏此命令才可以保存起来,否则重启后环境变量就恢复了.loady //⽤于从uart线下载⽂件到板上内存⾥(loadb, loads, loadx基本⼀样) ⽤法:loady 0x40008000 //把下载的⽂件从内存地址0x40008000开始存放执⾏"loady 0x40008000"后, uboot就会进⼊等待状态,等着接收数据minicom具有通过uart传输⽂件的功能.按"ctrl+a", 松⼿后再按"s", 选择"ymodem", 在弹出的界⾯⾥按空格键选中要传的⽂件.md 内存地址 //⽤于查看内存地址上的值⽤法:md.b 0x40008000 100 //从内存地址0x40008000开始,查看0x100个字节并输出值md.w 0x40008000 100 //从内存地址0x40008000开始,查看0x100个16位值并输出值md.l 0x40008000 100 //从内存地址0x40008000开始,查看0x100个32位值并输出值mw //⽤于修改内存地址上的值⽤法:mw.b 0x40008000 0xab 100 //从内存地址0x40008000开始的0x100字节空间,设值为0xabmw.w 0x40008000 0xabcd 100 //从内存地址0x40008000开始的0x200字节空间,每16位值设为0xabcdmw.l 0x40008000 0xabcdef88 100 //从内存地址0x40008000开始的0x400字节空间,每32位值设为0xabcdef88 go //执⾏指定内存地址上的指令⽤法:go 0x40008000mmc // sd/mmc接⼝设备(sd卡, emmc)操作命令, 按扇区操作(每扇区512字节)⽤法:mmc read addr blk cnt //从mmc设备上的第blk个扇区开始,共读出cnt个扇区到内存地址addr上mmc write addr blk cnt //把内存地址addr上的数据写⼊mmc设备的第blk个扇区,共cnt个扇区⼤⼩mmc dev //⽤于当看当前的mmc设备是第⼏个mmc erase blk cnt //把mmc设备的第blk个扇区开始清零,共清除cnt个扇区⼤⼩ mmc part //列出当前mmc设备的分区信息mmc list //列出所有的mmc设备信息ext4ls //查看存储设备的ext2/3/4分区⾥的内容⽤法:ext4ls mmc 0:2 //查看第0个存储设备的第⼆个分区ext4load //从ext2/3/4分区⾥读出⽂件到指定的内存地址⽤法:ext4load mmc 0:2 0x40008000 /uImage //从第0个存储设备的第2个分区的根⽬录读出uImage⽂件到内存地址0x40008000 fatls //查看存储设备的fat分区⾥的内容⽤法:fatls mmc 0:1 //查看第0个存储设备的第1个分区(fat分区)fatload //从fat分区⾥读出⽂件到指定的内存地址⽤法:fatload mmc 0:1 0x40008000 /uImage //从第0个存储设备的第1个分区的根⽬录读出uImage⽂件到内存地址0x40008000fatwrite //把内存上的数据存储到fat分区的⼀个⽂件⾥⽤法:fatwrite mmc 0:1 0x40008000 /my.txt 0x35 //把内存地址0x40008000开始的0x35个字节数据写⼊到第0个设备的第1个分区⾥,⽂件名为my.txtrun //执⾏指定的环境变量⾥的语句⽤法:run bootcmd //执⾏环境变量bootcmd⾥的语句//如uboot上已驱动好⽹络设备并环境变设好IP及PC端IP,还可以使⽤以下命令:tftpboot 0x40008000 ⽂件名 // 通过⽹络下载⽂件到内存地址0x40008000, PC端需配置好tftp服务器nfs 0x40008000 pc端IP:/带路径的⽂件名 //pc端需配置好nfs服务器ping ip //检测⽹络是否通指令: bootmbootm ⽤于将内核镜像加载到内存的指定地址处例:bootm 0x82000000查看和修改环境变量指令常⽤环境变量列表bootdelay 执⾏⾃动启动(bootcmd中的命令)的等候秒数baudrate 串⼝控制台的波特率bootfile 默认的下载⽂件名bootargs 传递给Linux内核的启动参数bootcmd ⾃动启动时执⾏命令stdin 标准输⼊设备,⼀般是串⼝stdout 标准输出,⼀般是串⼝,也可是LCD(VGA)stderr 标准出错,⼀般是串⼝,也可是LCD(VGA)serverip TFTP服务器端的IP地址ipaddr 本地的IP地址ethaddr 以太⽹的MAC地址netmask 以太⽹的⽹络掩码gatewayip 以太⽹的⽹关指令: setenvname value第1个参数是环境变量的名称。
uboot setenv函数
uboot setenv函数uBoot是一种开源的引导程序,广泛应用于嵌入式系统中。
在uBoot中,setenv函数是非常重要的一个函数,它用于设置环境变量。
环境变量可以在系统启动过程中提供一些参数,例如设备的IP 地址、MAC地址等。
setenv函数的作用就是将这些参数设置到uBoot的环境变量中,以供后续的操作使用。
setenv函数的语法如下:```setenv <variable> <value>```其中,<variable>是要设置的环境变量的名称,<value>是要设置的环境变量的值。
通过这个函数,我们可以方便地设置各种环境变量,以满足系统的需求。
在使用setenv函数设置环境变量时,需要注意以下几点:1. 环境变量的名称必须是唯一的,不能与其他环境变量重复。
2. 环境变量的值可以是字符串、整数或其他类型的数据。
3. 对于字符串类型的值,可以使用引号将其括起来,以防止包含特殊字符。
4. 使用setenv函数设置的环境变量在系统重启后会丢失,如果需要永久保存,可以使用saveenv命令将其保存到闪存中。
下面是一些常用的setenv命令的示例:1. 设置IP地址:```setenv ipaddr 192.168.1.100```上述命令将IP地址设置为192.168.1.100。
2. 设置网关地址:```setenv gatewayip 192.168.1.1```上述命令将网关地址设置为192.168.1.1。
3. 设置MAC地址:```setenv ethaddr 00:11:22:33:44:55```上述命令将MAC地址设置为00:11:22:33:44:55。
4. 设置启动参数:```setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p1```上述命令将启动参数设置为console=ttyS0,115200 root=/dev/mmcblk0p1。
uboot常用命令
U-Boot(Universal Bootloader)是一款常用的开源引导加载程序,用于嵌入式系统的启动 和管理。以下是一些常用的 U-Boot 命令示例:
1. printenv :打印环境变量列表。
2. setenv <variable> <value> :设置环境变量的值。
8. mw <addr> <value> [<length>] :将指定的十六进制数值写入到指定的内存地址。
9. mmc list :显示支持的 MMC 存储设备列表。
10. tftpboot <addr> <filename> :通过 TFTP 协议从网络下载一个文件到指定的内存 地址。
11. fatls <interface> <partition> :列出指定接口(如 mmc、usb 等)上指定分区 中的文件列表。
3. saveenv :保存环境源自量到存储设备中,以便下次启动时使用。
4. boot :启动操作系统,根据环境变量中的配置来加载内核镜像和根文件系统。
5. bootm :直接从指定的内存地址启动指定的内核镜像。
6. help :显示帮助信息,列出可用的 U-Boot 命令和它们的功能说明。
7. md <addr> <length> :在指定的内存地址处以十六进制格式显示指定长度的数据。
12. run <script> :运行一个预定义的 U-Boot 脚本。
13. reset :重启设备。
这些命令只是 U-Boot 中的一部分,U-Boot 还提供了很多其他的命令和功能来管理和配 置系统。请注意,具体可用的命令和支持的功能取决于 U-Boot 版本以及不同的硬件平台 和配置。在实际使用时,您可能需要参考特定版本的 U-Boot 的文档或提供的帮助信息来 获取更详细和准确的命令列表和说明。
uboot 命令详解
u-boot 技术文档1.U boot 命令详解1.1查看帮助命令使用help 或者?1.2环境变量打印环境变量:printenv设置环境变量:setenv(不会保存)保存环境变量:saveenv这个时候就有了1.3nandflash命令使用nand查看nandflash 所有指令擦除nand erase1.4norflash命令查看Flash信息命令: flinfo加/解写保护命令: protect擦除命令: erase1.5内存命令nm1.5USB指令使用help usb 查看usb具体指令使用usb 启动使用usb tree查看信息f atls usb 0 罗列u盘信息1.5.1实例演练usb指令烧写1.6实例演练ftp指令烧写环境变量中体现了开发板上的IP地址为192.168.0.2,网关为192.168.0.1,要求电上的tftp 服务器的IP为192.168.0.1;运行电脑上tftp服务器,指定好根目录,将内核和根文件系统放在根目录下。
注:线接上后,电脑上的本地连接可能是显示网络电缆没插好,这很正常!在使用过程中它们会自动去连接!<2>分别下载内核和根文件系统到内存0x30008000开始的空间先检查坏块nand bad再擦除坏块清理某个区域0x560000 0x3b22c00将根文件系统加载到0x30008000然后再将根文件系统写到0x560000 0x3b22c00这个位置然后重启:重复上面的步骤:nand erase 0x60000 0x267000将内核文件保存到0x60000 0x267000这块区域运行1.8系统重启指令2.U boot 内核移植在cpu/arm920t/start.S中添加以下代码在修改并添加为以下代码在include/configs/mini2440.h修改为如下:将以下代码修改为:将以下代码修改为:将以下代码修改为:在drivers/mtd/nand/s3c2410_nand.h 在最后下面代码上添加如下带码:。
Uboot命令详解
U-Boot提供了更加详细的命令帮助,通过help命令还可以查看每个命令的参数说明。
由于开发过程的需要,有必要先把U-Boot命令的用法弄清楚。
接下来,根据每一条命令的帮助信息,解释一下这些命令的功能和参数。
1、bootmdKNLinux联盟bootm [addr [arg ...]]- boot application image stored in memorypassing arguments 'arg ...'; when booting a Linux kernel,'arg' can be the address of an initrd imagebootm命令可以引导启动存储在内存中的程序映像。
这些内存包括RAM和可以永久保存的Flash。
第1个参数addr是程序映像的地址,这个程序映像必须转换成U-Boot的格式。
第2个参数对于引导Linux内核有用,通常作为U-Boot格式的RAMDISK映像存储地址;也可以是传递给Linux内核的参数(缺省情况下传递bootargs环境变量给内核)。
dKNLinux联盟2、bootpbootp [loadAddress] [bootfilename]bootp命令通过bootp请求,要求DHCP服务器分配IP地址,然后通过TFTP协议下载指定的文件到内存。
第1个参数是下载文件存放的内存地址。
第2个参数是要下载的文件名称,这个文件应该在开发主机上准备好。
3、cmpcmp [.b, .w, .l] addr1 addr2 count- compare memorycmp命令可以比较2块内存中的内容。
.b以字节为单位;.w以字为单位;.l以长字为单位。
注意:cmp.b中间不能保留空格,需要连续敲入命令。
第1个参数addr1是第一块内存的起始地址。
第2个参数addr2是第二块内存的起始地址。
uboot分析之bootm
uboot分析之bootmbootm命令执⾏过程中调⽤了bootm_start函数,这个函数⽐较重要,所以先分析它。
mon/cmd_bootm.cCpp代码1. static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])2. {3. void *os_hdr;4. int ret;5. memset ((void *)&images, 0, sizeof (images));//images是⼀个bootm_headers_t类型的全局变量。
见下⾯的分析。
6. images.verify = getenv_yesno ("verify");//从环境变量中检查是否要对镜像的数据(不是镜像头)进⾏校验。
7. bootm_start_lmb();//不做任何有意义的⼯作,除了定义# define lmb_reserve(lmb, base, size)8. /* get kernel image header, start address and length */寻找可⽤的内核镜像,见下⾯的分析。
主要根据传⼊的参数检查镜像的合法性并获取信息。
9. os_hdr = boot_get_kernel (cmdtp, flag, argc, argv,10. &images, &images.os.image_start, &images.os.image_len);//返回指向内存中镜像头的指针11. if (images.os.image_len == 0) {12. puts ("ERROR: can't get kernel image!\n");13. return 1;14. }15. /* get image parameters */16. switch (genimg_get_format (os_hdr)) {//根据镜像魔数获取镜像类型17. case IMAGE_FORMAT_LEGACY:18. images.os.type = image_get_type (os_hdr);//镜像类型19. p = image_get_comp (os_hdr);//压缩类型20. images.os.os = image_get_os (os_hdr);//操作系统类型21. images.os.end = image_get_image_end (os_hdr);//当前镜像的尾地址22. images.os.load = image_get_load (os_hdr);//镜像数据的载⼊地址23. break;24. default:25. puts ("ERROR: unknown image format type!\n");26. return 1;27. }28. /* find kernel entry point */29. if (images.legacy_hdr_valid) {//如果镜像已经通过验证30. images.ep = image_get_ep (&images.legacy_hdr_os_copy);//获取⼊⼝地址,填充images.ep 。
uboot分析和笔记
uboot一、uboot是ppcboot和armboot合并而成,现在主流的bootloader为uboot和redboot二、bootm addr_kernel addr_initrd三、移植uboot时最好(一定)要找到一个自己板子的原形(即自己的板子是在这个板子上做一些修改而来的)的版本,这样就可以事半功倍。
这样要修改的地方就比较少,也比较容易了。
uboot支持很多平台,与一个具体平台相关的主要有三个地方:1、./include/configs/xxxxx.h, 主要定义了flash、sdram的起始地址等信息,一般要修改flash的起始地址、大小,有时候会有位宽等。
2、./board/xxxxx/*,这个目录下主要有两三个.c文件,主要为该平台的初始化和flash操作的函数。
有时候flash的操作需要修改,不过一般都是找一个现有的支持该flash的驱动,一般情况在uboot 别的./board/平台下就会有现成的,拷贝过了就可以了。
3、./cpu/xxxxxx/arch_xxx/xxxxxx/*, 一般是此cpu的初始等函数。
四、具体移植的时候最多涉及到的会是./include/configs/xxxx.h,如果有现成的平台(uboot现在支持绝大部分我们常用的平台),可能只需要对着原来的xxxx.h文件,修改几个我们在硬件上修改了的地方,一般会是flash的起始地址、大小;内存大小(内存的起始地址应该都是0);uboot设置信息保存的地址和长度;console 口和它的波特率;默认的设置;uboot的入口地址等(具体情况可能会有一些变化),如果不是从相同的平台移植,可能会比较麻烦,因为这时候要修改一些和此cpu相关的一些寄存器、频率和内存等硬件方面的东西了(也在这个xxxx.h中),虽然这时改动的地方也不多,但是会很痛苦,因为经常不知道要改哪里或者改为多少。
所以可能需要参考cpu的datasheet和到网上找一些资料了并且慢慢试了。
uboot-配置文件
uboot-配置⽂件uboot配置⽂件⼀般在configs下⾯,但是这⾥的配置⽂件⾥⾯的内容很少,⼀般相关的c和h配置⽂件在:board/freescare(⼚家)/imx6ullevk(扳⼦)/imx6ullevk.c(板⼦c⽂件)头⽂件在:include/configs/mx6ullevk.h(板⼦头⽂件)其中头⽂件引⼊了⼀个很重要的⽂件(mon.h),这⾥⾯存放了这⼀系列的板⼦的所有通⽤配置⽂件,可以修改改⽂件进⾏配置。
DDR在uboot中的board/freescare(⼚家)/imx6ullevk(扳⼦)/imx6ullevk.c(板⼦c⽂件)的统计⽬录下存在⼀个imximage.cfg⽂件,该⽂件⽤于校准DDR,在这⾥进⾏ddr的校准测试。
环境变量如果我们没有配置环境变量,那么在系统启动的时候,他会条⽤⾃⼰的环境变量,这个环境变量的配置⽂件在:include/env_default.h中定义。
⽐如说⾥⾯的:#ifdef CONFIG_BOOTCOMMAND “bootcmd=” CONFIG_BOOTCOMMAND “\0”这⾥的CONFIG_BOOTCOMMAND在之前配置的.h⽂件中有定义(include/configs/mx6ullevk.h(板⼦头⽂件))。
bootcmdbootcmd主要是⽤来启动内核的,⾥⾯存放了⼀些列命令,⽤于uboot启动内核。
可以直接在include/configs/mx6ullevk.h(板⼦头⽂件)的头⽂件中通过修改CONFIG_BOOTCOMMAND直接将bootcmd进⾏写死bootargsbootargs会将其值传递给内核。
在头⽂件中CONFIG_EXTRA_ENV_SETTINGS下⾯运⾏了⼀个"run mmcargs的脚本,在该脚本中定义了bootargs: "mmcargs=setenv console,bootargs console={baudrate} "将其展开:bootargs console = ttymxc0,115200,root=/dev/mmcblk1p2root设置的是根⽂件系统。
UBOOT:env(环境变量)
UBOOT:env(环境变量)env包含以下⽂件:cmd/nvedit.ccommon/env_common.ccommon/env_flags.ccommon/env_common.cenv_htab为环境变量的哈希表。
uchar env_get_char(int index)返回(gd->env_addr+index)的字符串指针。
common/env_flags.cint env_flags_validate(const ENTRY *item, const char *newval, enum env_op op, int flag)在创建、修改、删除⼀个环境变量时进⾏⼀致性检查的函数。
cmd/Nvedit.cint getenv_f(const char *name, char *buf, unsigned len)在gd->env_addr中查找name=value对,找到则将gd->env_addr中的name对应的值拷贝到buf中,返回拷贝的字符串长度。
char *getenv(const char *name)(1)如果gd->flags & GD_FLG_ENV_READY(已经导⼊env_htab哈希表),以name作为key,在env_htab哈希表⾥查找条⽬(2)未导⼊哈希表,则在gd->env_addr中查找name=value对,找到则返回gd->env_addr中的name对应的值。
ulong getenv_ulong(const char *name, int base, ulong default_val)获取name环境变量对应的value,若有环境变量则转化为base指定的进制数并返回,若没有则返回default_val。
env_default.h定义默认的环境变量default_environment。
env_common.cuchar env_get_char(int index)获取gd->env_addr+index处的字符,若gd->env_valid⽆效,则获取int getenv_yesno(const char *var)查找env_htab哈希表中是否有key=var的条⽬,若有则判断此条⽬的data是不是数值。
uboot常用命令详解
uboot常⽤命令详解dnw:在进⼊系统之前进⼊指令⾏,输⼊该指令可下载烧录⽂件。
re:重新启动嵌⼊式系统。
printenv:打印当前系统环境变量。
setenv:设置环境变量,格式:setenv name value ...,表⽰将name 变量设置成value 值;如果没有这个参数,表⽰删除该变量。
saveenv:保存环境变量到NAND中。
sleep:延迟执⾏,格式:sleep N,可以延迟N秒钟执⾏。
run:执⾏环境变量中的命令,格式:run var,可以跟⼏个环境变量名。
crc32:计算校验值,格式:crc32 address count [addr],第⼀个参数是需校验的起始地址,第⼆个参数是校验的数据字节数,第三个参数是保存校验值的地址。
cp:在内存中复制数据块,格式:cp source target count,第⼀个参数是源地址,第⼆个参数是⽬的地址,第三个参数是复制数⽬。
cmp:⽐较内存中的数据块,格式:cmp addr1 addr2 count,第⼀个参数是内存地址⼀,第⼆个参数是内存地址⼆,第三个是⽐较长度(单位是字节数除以4,以WORDS为单位)。
bootm:可以引导启动存储在内存中的程序映像。
格式:bootm addr1 addr2,第⼀个参数是程序映像的地址,第⼆个参数⼀般是RAMDISK 地址。
nand scrub:暴⼒擦除指令,擦除整个NAND,会擦除bad block标记。
nand erase:擦除NAND,格式:nand erase addr1 count,第⼀个参数是OFFSET,第⼆个参数是擦除字节数。
其中OFFSET是相对于Download地址。
nand write:下载的内存数据写⼊NAND,格式:nand write addr offset count,第⼀个参数是写⼊基地址,第⼆个参数是偏移地址,第三个参数是写⼊字节数。
nand read:讲NAND数据读取到内存,格式:nand read addr offset count,第⼀个参数是读取的NAND地址,第⼆个参数是内存位置偏移,第三个参数是读取字节数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Common目录下面与环境变量有关的文件有以下几个:env_common.c,env_dataflash.c,env_eeprom.c,env_flash.c,env_nand.c,env_nowhere.c,env_nvram.c,environment.c。
env_common.c中包含的是default_environment[]的定义;
env_dataflash.c,env_eeprom.c,env_flash.c,env_nand.c, env_nvram.c
中包含的是相应存储器与环境变量有关的函数:env_init(void),saveenv(void),env_relocate_spec (void),env_relocate_spec (void),use_default()。
至于env_nowhere.c,因为我们没有定义CFG_ENV_IS_NOWHERE,所以这个文件实际上没有用。
environment.c这个文件时是我真正理解环境变量的一个关键。
在这个文件里定义了一个完整的环境变量的结构体,即包含了这两个ENV_CRC(用于CRC校验),Flags(标志有没有环境变量的备份,根据CFG_REDUNDAND_ENVIRONMENT这个宏定义判断)。
定义这个环境变量结构体的时候还有一个非常重要的关键字:
__PPCENV__,而__PPCENV__在该.c文件中好像说是gnu c编译器的属性,如下:
# define __PPCENV__ __attribute__ ((section(".text")))
意思是把这个环境变量表作为代码段,所以在编译完UBOOT后,UBOOT的代码段就会有环境变量表。
当然,这要在我们定义了ENV_IS_EMBEDDED之后才行,具体而言,环境变量表会在以下几个地方出现(以nand flash为例):
1、UBOOT中的代码段(定义了ENV_IS_EMBEDDED),
2、UBOOT中的默认环
境变量, 3、紧接UBOOT(0x0 ~ 0x1ffff)后面:0x20000 ~ 0x3ffff 之间,包括备份的环境变量,我们读取,保存也是对这个区域(即参数区)进行的。
3、SDRAM中的UBOOT中,包括代码段部分和默认部分,4、SDRAM中的melloc分配的内存空间中。
Environment.c代码如下:
env_t environment __PPCENV__ = {
ENV_CRC, /* CRC Sum */
#ifdef CFG_REDUNDAND_ENVIRONMENT
1, /* Flags: valid */
#endif
{
#if defined(CONFIG_BOOTARGS)
"bootargs=" CONFIG_BOOTARGS "\0"
#endif
#if defined(CONFIG_BOOTCOMMAND)
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
#endif
#if defined(CONFIG_RAMBOOTCOMMAND)
"ramboot=" CONFIG_RAMBOOTCOMMAND "\0"
#endif
#if defined(CONFIG_NFSBOOTCOMMAND)
"nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"
#endif
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0) "bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
#endif
#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0) "baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"
#endif
#ifdef CONFIG_LOADS_ECHO
"loads_echo=" MK_STR(CONFIG_LOADS_ECHO) "\0"
#endif
#ifdef CONFIG_ETHADDR
"ethaddr=" MK_STR(CONFIG_ETHADDR) "\0"
#endif
#ifdef CONFIG_ETH1ADDR
"eth1addr=" MK_STR(CONFIG_ETH1ADDR) "\0"
#endif
#ifdef CONFIG_ETH2ADDR
"eth2addr=" MK_STR(CONFIG_ETH2ADDR) "\0"
#endif
#ifdef CONFIG_ETH3ADDR
"eth3addr=" MK_STR(CONFIG_ETH3ADDR) "\0"
#endif
#ifdef CONFIG_ETHPRIME
"ethprime=" CONFIG_ETHPRIME "\0"
#endif
#ifdef CONFIG_IPADDR
"ipaddr=" MK_STR(CONFIG_IPADDR) "\0"
#endif
#ifdef CONFIG_SERVERIP
"serverip=" MK_STR(CONFIG_SERVERIP) "\0"
#endif
#ifdef CFG_AUTOLOAD
"autoload=" CFG_AUTOLOAD "\0"
#endif
#ifdef CONFIG_ROOTPATH
"rootpath=" MK_STR(CONFIG_ROOTPATH) "\0"
#endif
#ifdef CONFIG_GATEWAYIP
"gatewayip=" MK_STR(CONFIG_GATEWAYIP) "\0"
#endif
#ifdef CONFIG_NETMASK
"netmask=" MK_STR(CONFIG_NETMASK) "\0"
#endif
#ifdef CONFIG_HOSTNAME
"hostname=" MK_STR(CONFIG_HOSTNAME) "\0"
#endif
#ifdef CONFIG_BOOTFILE
"bootfile=" MK_STR(CONFIG_BOOTFILE) "\0"
#endif
#ifdef CONFIG_LOADADDR
"loadaddr=" MK_STR(CONFIG_LOADADDR) "\0"
#endif
#ifdef CONFIG_PREBOOT
"preboot=" CONFIG_PREBOOT "\0"
#endif
#ifdef CONFIG_CLOCKS_IN_MHZ
"clocks_in_mhz=" "1" "\0"
#endif
#if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0) "pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY) "\0"
#endif
#ifdef CONFIG_EXTRA_ENV_SETTINGS
CONFIG_EXTRA_ENV_SETTINGS
#endif
"\0" /* Term. env_t.data with 2 NULs */
}
};。