在上一章使uboot支持网卡传输文件后,但是每次启机时,环境变量都要变为默认值,需要重新设置ip,MAC地址才行,由于没有配置mtdparts命令,启动内核也不成功

所以本章主要学习:

  • 1)修改环境变量默认值
  • 2)裁剪uboot
  • 3)分区,设置mtdparts命令

1.修改之前,先来理解下uboot的环境参数

首先,uboot会去校验(CRC)存放环境变量的一段空间 ,若CRC有效则使用该空间里的环境变量,无效则用默认的环境变量.

而我们移植的uboot,由于一直没有使用save,所以没有读不出CRC校验,使用的默认环境变量,如下图所示:

2.来修改uboot的默认环境变量

(PS:uboot此时的内存分区还没修改,所以每次设置环境后,不能用save保存,怕破坏掉nand里面的内容)

2.1搜索using default environment,找到位于set_default_env()函数:

从上面代码可以看到, default_environment这个变量,这是个全局字符数组,从字面上就可知道,这个是默认环境变量数组,里面保存了各个环境值

2.2进入default_environment[]看看

这个数组比较长,所以只剪切一部分,其中MK_STR()的作用就是将数值转换为字符串

这些都是环境参数,比如"bootargs="(环境变量里最重要的一个),里面会保存文件系统位置,控制台console等等

我们以bootargs为例:

在default_environment[]数组里,若CONFIG_BOOTARGS宏有值,便会组成一串字符串"bootargs=... ..."

比如在以前的uboot里,可以看到:

bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
//root:指定文件系统位置
//init:指定内核启动后执行的第一个应用程序
//console:指定使用哪个终端,比如串口0,使用ttySAC0

其它宏也是这样.比如我们熟悉的有:

  • "bootcmd=", 用来启动内核的命令
  • "bootdelay=",uboot启动的倒计时,默认值为5S,只有设置了bootcmd,该倒计时才有用
  • "baudrate=",波特率,默认为115200
  • "ethaddr=",网卡的MAC地址(也叫物理地址)
  • "ipaddr=",ip地址
  • "serverip=",使用tftp时的服务器地址
  • "netmask=",掩码, 默认值为255.255.255.0
  • "mtdparts=",mtd分区表

2.3所以接下来,便修改smdk2440.h里面与环境相关的宏

设置默认环境变量宏(位于include/configs/smdk2440.h):

#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"   //bootargs
#define CONFIG_BOOTCOMMAND "nand read 0x30000000 0x60000 0x200000; bootm 0x30000000" //bootcmd
#define CONFIG_BOOTDELAY 10 //uboot 倒计时
#define CONFIG_NETMASK 255.255.255.0 //掩码
#define CONFIG_IPADDR 192.168.2.103 //本机IP
#define CONFIG_SERVERIP 192.168.2.101 //电脑IP
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b //MAC地址

其中bootcmd是随意写的,因为此时的内核位置还不确定放在哪(后面配置mtdparts命令后,会在4.6小节修改)

由于nand中要划分bootload空间、环境变量空间、内核空间、系统空间

而uboot就有400多k,所以我们需要裁剪uboot,裁剪后再来划分内存分区

3.裁剪uboot

uboot很多文件都是基于Makefile,里面通过判断宏来加载文件.而宏大部分都定义在include/configs/smdk2440.h

3.1进入smdk2440.h,把不需要的功能的宏去掉,比如usb,文件系统,rtc等

1)去掉usb支持

/************************************************************
// * USB support (currently only works with D-cache off)
// ************************************************************/

//#define CONFIG_USB_OHCI
//#define CONFIG_USB_KEYBOARD
//#define CONFIG_USB_STORAGE
//#define CONFIG_DOS_PARTITION

2)去掉rtc支持

/************************************************************
// * RTC
// ************************************************************/ //#define CONFIG_RTC_S3C24X0

3)去掉BOOTP选项

/*
// * BOOTP options
// */ //#define CONFIG_BOOTP_BOOTFILESIZE
//#define CONFIG_BOOTP_BOOTPATH
//#define CONFIG_BOOTP_GATEWAY
//#define CONFIG_BOOTP_HOSTNAME

4)去掉部分不需要的命令行配置

// #define CONFIG_CMD_DHCP     //动态主机配置协议命令行
// #define CONFIG_CMD_USB //USB命令行

5)去掉文件系统

/*
// * File system
// */ //#define CONFIG_CMD_FAT
//#define CONFIG_CMD_EXT2
//#define CONFIG_CMD_UBI
//#define CONFIG_CMD_UBIFS
//#define CONFIG_CMD_MTDPARTS
//#define CONFIG_MTD_DEVICE
//#define CONFIG_MTD_PARTITIONS
//#define CONFIG_YAFFS2
//#define CONFIG_RBTR

3.2 编译

由于屏蔽的宏在其它文件也会用到,而make在之前用过,再次make只会编译修改过的文件.

所以输入:

make clean
make s3c2440config
make   

make后,打印以下错误:

common/libcommon.o: In function `do_date':
/work/system/u-boot-2012.04./common/cmd_date.c:: undefined reference to `rtc_reset'
/work/system/u-boot-2012.04./common/cmd_date.c:: undefined reference to `rtc_get'
/work/system/u-boot-2012.04./common/cmd_date.c:: undefined reference to `rtc_set'
/work/system/u-boot-2012.04./common/cmd_date.c:: undefined reference to `rtc_get'
make: *** [u-boot] 错误

上面的cmd_date.c文件以及出错变量rtc_xxx,从字面上来看显然是与RTC有关,我们直接屏蔽该文件

通过Makefile,找到需要屏蔽宏CONFIG_CMD_DATE(宏定义位于include/configs/smdk2440.h):

屏蔽后,make成功,可以看到uboot只有200kb了:

接下来,便开始分区,使我们的环境变量能保存在uboot指定位置里

4.设置分区

以前,我们每次启动内核时,都会打印以下分区信息:

Creating  MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00040000 : "bootloader" //存放uboot
0x00040000-0x00060000 : "params" //存放环境变量
0x00060000-0x00260000 : "kernel" //存放内核
0x00260000-0x10000000 : "root" //存放文件系统

所以,我们新的uboot,还是照着这个来分区

还记得之前,我们每次设置了环境变量,都不敢用save命令来保存.

4.1所以我们通过sava -help命令,看它位于哪个文件,找到save命令相关宏

如下图所示:

4.2然后在si里搜索saveenv

搜索如下图所示:

可以发现,在env_flash.c 和env_nand.c这两个文件都有saveenv()函数.

显然env_flash.c的作用是,通过save命令将环境变量保存在nor flash.

而env_nand.c,是将环境变量保存在nand flash里.

4.3接下来在common/Makefile搜索,看看这两个文件依赖哪两个宏

如下图所示:

4.4然后在smdk2440.h搜索这两个宏,看看板卡默认配置的是不是env_nand.c

如下图所示:

可以看到,smdk2440.h是将环境变量保存在nor flash,由于2440在nand启动下是无法支持nor,所以我们需要屏蔽这三处宏,重新设置宏

4.5设置save相关宏

在其它板卡里搜索CONFIG_ENV_IS_IN_NAND,看看别人是怎么通过宏配置save的,然后在env_nand.c文件里搜索宏,来看宏是怎么用的

最终宏修改为如下所示(位于include/configs/smdk2440.h):

//#define CONFIG_ENV_ADDR                    (CONFIG_SYS_FLASH_BASE + 0x070000)
//#define CONFIG_ENV_IS_IN_FLASH
//#define CONFIG_ENV_SIZE 0x10000 #define CONFIG_ENV_SIZE 0x20000 //环境变量空间大小
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET 0x40000 //位于0x40000~(0X40000+0x20000)
#define CONFIG_ENV_RANGE CONFIG_ENV_SIZE //环境变量的擦除范围,要>=SIZE

上面的CONFIG_ENV_RANGE宏,其实不定义,内核也会自动定义(位于env_nand.c):

然后重新编译新的uboot,就可以使用save命令保存环境变量了.

接着我们烧写内核:

tftp  uImage
nand erase
nand write //保存在内核分区里
bootm //启动内核

从这里,看出烧个内核还需要记录这些分区空间地址,非常麻烦

4.6 设置mtdparts命令(在旧版uboot里,是mtd命令)

其实,我们可以使用mtdparts命令,通过分区名字来代替这些地址,比如以前的uboot,直接输入:

nand erase kernel              //这个kernel名字就等于: 60000 200000
nand write kernel //这个kernel名字就等于: 60000 200000

由于smdk2440板卡里没有配置mtdparts命令,所以步骤如下所示:

1)搜索mtdparts,发现位于common/cmd_mtdparts.c

2) 在common/Makefile搜索,找到cmd_mtdparts.c文件依赖CONFIG_CMD_MTDPARTS宏

3)在其它板卡里搜索CONFIG_CMD_MTDPARTS,看看别人是怎么通过宏配置nand的,别人写的配置如下所示:

  • "-":表示剩余空间都是文件系统。

(PS:当执行mtdparts default命令时,uboot就会检测是否有CONFIG_CMD_MTDPARTS宏,然后再根据上面的MTDPARTS_DEFAULT宏保存的mtd分区信息,来将nand和nor分区)

4)设置mtdparts相关宏

接下来,便复制上面的宏到smdk2440.h中,改为:

/*-----------------------------------------------------------------------
* mtdparts
*/
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define MTDIDS_DEFAULT "nand0=smdk2440-0"
#define MTDPARTS_DEFAULT "mtdparts=smdk2440-0:256k(u-boot)," \
"128k(params)," \
"2m(kernel)," \
"-(rootfs)" \

然后重新修改,之前设置的环境参数bootcmd(位于smdk2440.h):

#define CONFIG_BOOTCOMMAND "nand read  0x30000000 0x60000 0x200000; bootm 0x30000000" //bootcmd

改为:

#define CONFIG_BOOTCOMMAND "nand read  0x30000000 kernel; bootm 0x30000000"    //bootcmd

5)修改好后,我们还需要在board_init_r()函数里的for(;;)前面添加(位于arch/arm/lib/board.c):

  run_command("mtdparts default", );       //添加此处代码

       for (;;) {
main_loop();
}

这样uboot每次启动时,都会执行一次mtdparts default命令,使它根据默认参数来自动分区.

mtdparts命令就此设置好了

接下来,便重新烧写uboot,来测试

5.测试mtdparts分区

输入mtdparts,查看默认分区名称:

如上图所示,接下来我们便可以直接使用kernel名字来擦除kernel分区,并烧写内核了

步骤如下:

tftp  uImage
nand erase.part kernel //等于nand erase 200000 60000
nand write kernel //从sdram拷贝到nand

接下来,下章来使uboot支持yaffs及制作补丁

5.移植uboot-设置默认环境变量,裁剪,并分区的更多相关文章

  1. 利用脚本,一键设置java环境变量(默认安装路径)

    Windows一键设置Java环境变量 右击以管理员方式运行,注意自行更改JAVA_HOME目录文件安装目录. JDKSetting.bat @echo off color 0a echo.----- ...

  2. 0、驱动及应用小技巧、uboot指令及环境变量配置、linux常用命令

    (内核make menuconfig之后,通过insmod安装的驱动都应该重新make,可能会出现一些莫名的问题) (nor flash/SDRAM/DM9000都受内存控制器控制,需要配置内存控制器 ...

  3. windows上自动设置java环境变量的脚本

    近期打算学习安卓开发,于是乎要准备java开发环境,安装好jdk后,就要设置java环境变量,java环境变量要设置JAVA_HOME,Path,CLASSPATH三个值,每次配置查百度复制粘贴都很麻 ...

  4. ubuntu12中设置PATH环境变量的几种方法(三种办法)

    如果在Ubuntu12系统中自行安装了一些软件,特别是使用tar.gz文件包安装的软件,通常会放在/usr/local或者/opt,甚至放在/home下,但是如果要调用或执行时,必须加上完整的路径才可 ...

  5. 【转】windows上自动设置java环境变量的脚本

    转载:http://www.cnblogs.com/flowwind/p/4066146.html 近期打算学习安卓开发,于是乎要准备java开发环境,安装好jdk后,就要 设置java环境变量,ja ...

  6. 在uboot里面加入环境变量使用run来运行

    Author:杨正  Date:2014.11.11   Email:yz2012ww@gmail.com QQ:1209758756 在移植uboot的时候,能够在uboot里面加入定义一些自己的环 ...

  7. 设置永久环境变量linux

    ========================================================================== http://www.cnblogs.com/Bi ...

  8. [uboot]在uboot里面添加环境变量使用run来执行

    转自:http://blog.csdn.net/yangzheng_yz/article/details/41038259 在移植uboot的时候,可以在uboot里面添加定义一些自己的环境变量,这些 ...

  9. 安装完Python之后,如何设置Python环境变量

    人生苦短,我用Python.最近有许多加群的萌新在咨询Python安装的事宜,Python安装问题不大,可以戳这篇文章:.本以为安装Python之后就可以万事大吉,高枕无忧了,往命令行中输入pytho ...

随机推荐

  1. 十四、Spring Boot 日志记录 SLF4J

    在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了. 其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增 ...

  2. (转)Maven依赖的jar包下载不了、jar更新不了的解决办法

    场景一: 使用Maven的同学可能偶尔会遇到这种情况:pom.xml中依赖了项目需要的某个jar文件,但是使用Maven –> update project 还是没办法下载该jar到项目中,你可 ...

  3. select的限制以及poll的使用

    1.先说select在多路IO中的限制:1)linux中每个程序能够打开的最多文件描述符是有限制的.默认是1024.可以通过ulimit -n进行查看和修改: xcy@xcy-virtual-mach ...

  4. [CSS]第一项和最后一项样式

    列表项的第一项距离顶部0.2rem,最后一项距离底部0.5rem .item:first-child { padding-top: .2rem; } .item:last-child { paddin ...

  5. How to use GitHub with Android Studio

    转载于:http://www.wfuyu.com/technology/22499.html 目前业界主流的版本管理工具主要是 svn/git.svn是1种集中式的代码管理工具,而git是1种散布式的 ...

  6. NanUI文档 - 使用网页来设计整个窗口

    NanUI文档目录 NanUI简介 开始使用NanUI 打包并使用内嵌式的HTML/CSS/JS资源 使用网页来设计整个窗口 如何实现C#与Javascript相互掉用(待更新...) 如何处理Nan ...

  7. Swift MD5加密 所需桥接文件

    Swift MD5加密在github有一个非常好的第三方库,使用也比较简单,还有很多加密方法,如果需要,点击这里下载 对于那些不需要太多的加密,只需要MD5加密的同学,我建议还是不要用第三方库. 因为 ...

  8. Hive数据倾斜解决方法总结

    数据倾斜是进行大数据计算时最经常遇到的问题之一.当我们在执行HiveQL或者运行MapReduce作业时候,如果遇到一直卡在map100%,reduce99%一般就是遇到了数据倾斜的问题.数据倾斜其实 ...

  9. 每周.NET前沿技术文章摘要(2017-05-10)

    汇总国内外.NET社区相关文章,覆盖.NET ,ASP.NET和Docker容器三个方面的内容: .NET Debugging .NET core with SOS everywhere 链接:htt ...

  10. bzoj 1179: [Apio2009]Atm

    Description Input 第 一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路 的起点和终点的 ...