---
title: uboot修改代码增加环境变量
date: 2019-12-27 21:26:39
categories:
tags:
- uboot
---

以"tftp下载kernel和自动挂载NFS根文件系统" 为例。

背景

为了开发的方便我们一般都会有这么一个需求:

  1. uboot启动不做任何操作从nand启动

  2. 执行一个简单的命令, 从网络下载内核并启动, 启动之后自动挂接NFS根文件系统

为了实现上述的需求我们就不能修改nand启动的bootcmd, 那我们可以新建一个启动命令. 姑且叫它netboot 吧, 下边我们来看如何实现netboot

修改uboot代码

第一处

include/configs/com335x.h 里添加 netboot(可以添加到CONFIG_BOOTCMD上方)

#define CONFIG_NETBOOT "tftp 0x81000000 uImage;"\
"run netargs;"\
"bootm 0x81000000"

第二处

include/env_default.h 里添加 netboot

#ifdef CONFIG_NETBOOT
"netboot=" CONFIG_NETBOOT "\0"
#endif

重新编译uboot, 并烧写

make com335x_nand_512_config

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

代码里修改之后直接烧写到nand里还是不能立刻生效。

因为uboot是先读取nand里有没有环境变量, 如果有的话就用nand里的 如果nand里没有才使用默认的环境变量.所以我们在烧写uboot的时候需要将环境变量分区一起擦掉, 这样就可以使用我们代码里的默认环境变量了.

首先看下板子的分区信息

U-Boot# mtdpart
device nand0 <omap2-nand.0>, # parts = 9
#: name size offset mask_flags 0: SPL 0x00020000 0x00000000 0
1: SPL.backup1 0x00020000 0x00020000 0
2: SPL.backup2 0x00020000 0x00040000 0
3: SPL.backup3 0x00020000 0x00060000 0
4: u-boot 0x001e0000 0x00080000 0
5: u-boot-env 0x00020000 0x00260000 0
6: logo 0x00300000 0x00280000 0
7: kernel 0x00500000 0x00580000 0
8: rootfs 0x1f580000 0x00a80000 0 active partition: nand0,0 - (SPL) 0x00020000 @ 0x00000000 defaults:
mtdids : nand0=omap2-nand.0
mtdparts:
mtdparts=omap2-nand.0:
128k(SPL),128k(SPL.backup1),128k(SPL.backup2),128k(SPL.backup3),
1920k(u-boot),128k(u-boot-env),3m(logo),5m(kernel),-(rootfs)

然后执行如下语句:

nand erase.part u-boot
nand erase.part u-boot-env
tftp 0x81000000 u-boot.img
nand write 0x81000000 u-boot ${filesize}

重新设置ip等环境变量, 添加netargs

ip地址的配置需要根据自身的情况进行更改

U-Boot# setenv serverip 192.168.1.102
U-Boot# setenv ipaddr 192.168.1.105
U-Boot# setenv gatewayip 192.168.1.1
U-Boot# setenv netargs setenv bootargs noinitrd console=ttyO0,115200n8 lcdtype=AUO_AT070TN94 root=/dev/nfs ip=ipaddr:{serverip}:gatewayip:
{netmask}:com335x:eth0:off nfsroot=192.168.1.102:/home/eac/nfsboot U-Boot# save
U-Boot# run netboot

问题

问题1: 为什么不用setenv netboot tftp 0x81000000 uImage; run netboot; bootm 0x81000000 这条命令而要去修改uboot代码?

因为这条语句执行了之后效果只有 netboot=tftp 0x81000000 第一个分号之后的内容丢失了, 所以必须更该代码

问题2: 如果不设置netargs会有什么后果? netargs各部分是什么含义?

设置netargs是为了能够挂载nfs, 如果netboot 设置为: tftp 0x81000000 uImage; bootm 0x81000000 就会因为没有设置根文件系统这个环境变量而出错.

setenv netargs 'setenv bootargs noinitrd console=ttyO0,115200n8 lcdtype=AUO_AT070TN94 root=/dev/nfs ip=ipaddr:{serverip}:gatewayip:
{netmask}:com335x:eth0:off nfsroot=192.168.1.102:/home/eac/nfsboot' ${ipaddr} 开发板本身的地址
${serverip} tftp及nfs目录所在系统的地址
${gatewayip} 网关
${netmask} 子网掩码
com335x eth0:off 网卡名(这里随意)
nfsroot=192.168.1.102:/home/eac/nfsboot nfs主机ip地址以及目录

uboot 修改代码 增加 环境变量的更多相关文章

  1. centos增加环境变量

    在Linux CentOS系统上安装软件后,如果需要运行软件,一般是需要进入到软件的bin目录下进行才可以运行相应命令,否则会提示未找到命令.为了使用方便,我们一般把相应的bin目录增加到环境变量中( ...

  2. linux修改当前用户环境变量永久生效

    在linux环境中,修改当前用户环境变量,且永久生效的方法如下. 1,编辑~/.bash_profile文件 1 2 3 # Get the aliases and functions 4 if [ ...

  3. jenkins 参数化构建和增加环境变量

    1.参数化构建 2.增加环境变量 prepare an environment for the run,需要安装Environment Injector插件

  4. u-boot移植(十三)---代码修改---裁剪及环境变量 一

    一.内核裁剪 内核的裁剪首先就是修改我们的配置文件,即 include/configs/jz2440.h 文件,里面定义的很多宏,我们也许用不上的就要去掉. /* * (C) Copyright 20 ...

  5. U-Boot中的filesize环境变量

    U-Boot中的环境命令可以使用$(filesize)来确定刚下载(传输)得到的文件大小. 因为使用类似tftp命令传输文件后,会自动更新filesize环境变量.如:setenv updateroo ...

  6. U-BOOT分析之:环境变量

    (环境如下:U-BOOT  S3C2440  LINUX) 记录自己的学习过程,如果分析有问题,请帮忙指正. 最近在研究U-BOOT的代码,其中的环境变量个人觉得用处非常大,所以重点学习和分析一下. ...

  7. 设置环境变量遇到的难题,cmd管理员方式与普通方式的区别,通过C#代码设置环境变量

    在使用mingw64的过程中,需要手工添加环境变量,作为一个懒人,这怎么可以呢?于是想用命令的方式实现,结果遇到问题了,死活实现不了, 之前用过TDM-GCC,人家的安装完就可以用,还有试用过rust ...

  8. Xcode之增加环境变量(多种环境区分)

    序言: Xcode默认有DEBUG何RELEASE模式,如果我们在项目中想增加预发布环境或者再增加多个环境呢?如果在项目中用if else 弄个全局变量来控制,每次打包之前去手动修改,这样不仅繁琐,而 ...

  9. 如何快速有效的修改java的环境变量

    之前已经修改过jdk的环境变量,,,,在/etc/profile下,,, export JAVA_HOME=/usr/java/jdk1.7.0_67-cloudera export PATH=${J ...

  10. Linux目录终章,单用户模式修改密码、环境变量、第三方软件安装

    目录 今日内容概要 内容详细 解析映射文件 磁盘挂载文件 开机加载脚本 系统启动级别 使用单用户模式修改密码 变量加载文件 登录提示信息 第三方软件安装目录(编译安装目录) 系统日志目录 保存系统运行 ...

随机推荐

  1. 基于FPGA的二进制转BCD

    BCD码(nary-Coded Decimal‎)又称二-十进制代码,亦称二进码十进数.是一种二进制的数字编码形式,用二进制编码的十进制代码.这种编码形式利用了四个位元来储存一个十进制的数码. 在数字 ...

  2. SQL窗口分析函数使用详解系列三之偏移量类窗口函数

    1.综述 本文以HiveSQL语法进行代码演示. 对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库. 已更新第 ...

  3. NetCore开发第一步 Log4Net日志引入

    1.新建一个带mvc模板的项目: 2.引入Microsoft.Extensions.Logging.Log4Net.AspNetCore包,不要引入错了. 引入后后包的结果如下: 3.Startup类 ...

  4. 这几个好用的 Google 搜索技巧,让你飞起!

    搜索能力是被绝大多数人低估一项基本素质,绝大部分做编程技术相关的朋友应该都知道如何使用 Google,但是并不知道如何利用它的潜力.其实不管是 Google 还是 百度,会搜索的人一样都可以查找到需要 ...

  5. Linux 环境下安装redis

    目录 方法一 编辑安装 1.官网找到下载地址: 2.到目录下载redis安装包 3.下载后解压 4.安装工具 tcl (可以跳过) 5.编译安装 6.修改配置文件 7. 客户端连接 8.配置环境变量 ...

  6. 关于DDD和COLA的一些总结和思考

    写在前面: 其实之前一直想汇总一篇关于自己对于面向对象的思考以及实践的文章,但是苦于自己的"墨迹",一延再延,最近机缘巧合下仔细了解了一下COLA的内容,这个想法再次被勾起,所以这 ...

  7. .NET周刊【5月第2期 2024-05-12】

    国内文章 C#在工业数字孪生中的开发路线实践 https://mp.weixin.qq.com/s/b_Pjt2oii0Xa_sZp_9wYWg 这篇文章探讨了C#在工业数字孪生技术中的应用,介绍了三 ...

  8. PageOffice 6 保存数据区域数据同时保存文档

    在实际应用中,例如在线签订合同的时候,合同的签订日期,合同号等等这些信息既要保存到数据库,合同签订后又要将整个合同文件保存起来.这时候就需要用到PageOffice的保存数据区域数据的同时保存整个文件 ...

  9. 从 p12 格式 SSL 证书解出 pem 格式公钥私钥给 Postman 使用

    目的 Postman 的(非 Chrome 扩展版的)app 并不能读取系统中的客户端证书,这种调试要发送客户端证书的 https 请求的时候就得自己另外设置.系统直接导出证书有 cer 和 p12 ...

  10. Composer 的下载与安装

    一,Composer 的下载与安装 官网下载:https://getcomposer.org/download/ 打开  penssl的注释,在  D:\wamp\php7230\php.ini  文 ...