上一节S3C2440移植uboot之支持DM9000移植uboot支持了网卡驱动,这节裁剪和修改uboot默认参数

uboot的环境参数

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

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

修改uboot的默认环境变量

搜索using default environment,发现这句话是在set_default_env()函数



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

查看 default_environment[]



  bootargs="(环境变量里最重要的一个),是传递给内核的环境变量,里面会保存文件系统位置,控制台console等等。

  其他宏的含义如下

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

  更改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 5 //uboot 倒计时
#define CONFIG_NETMASK 255.255.255.0 //掩码
#define CONFIG_IPADDR 192.168.2.110 //本机IP
#define CONFIG_SERVERIP 192.168.2.1 //电脑IP
#define CONFIG_ETHADDR 08:00:3c:26:0b:5b //MAC地址

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

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

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

裁剪uboot

  进入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

解决rtc_xxx,cmd_date.c 错误

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

  所以输入:

make clean
make smdk2440_config
make

  make后,打印以下错误:



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

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



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

设置分区

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

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

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

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

如下图所示:



  然后在si里搜索saveenv

  搜索如下图所示:



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

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

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

  如下图所示:



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

  如下图所示:



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

设置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 30000000 uImage
nand erase 60000 200000
nand write 30000000 60000 200000 //保存在内核分区里
bootm 30000000 //启动内核

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

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

设置mtdparts命令

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

nand erase kernel              //这个kernel名字就等于: 60000 200000
nand write 30000000 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

  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)" \

  编译报错



  提示get_mtd_device_nm未定义,但是我们在Mtdcore.c中已经定义了,所以有可能是这个Mtdcore.c没有被编译进内核。

  查看 drivers/mtd/Makefile中的定义部分,需要定义CONFIG_MTD_DEVICE 宏



  重新编译烧写测试

以前擦除:nand erase 60000 200000

现在擦除:nand erase kernel

发现报错了



  执行 help medparts



  我们先执行mtdparts defaults,再执行nand erase kernel,成功了。



  接着我们把这条命令添加到代码中去自动执行。

  在board_init_r()函数里的for(;;)前面添加(位于arch/arm/lib/board.c):

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

       for (;;) {
main_loop();
}

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

  mtdparts命令就此设置好了

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

  将

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

  改为:

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

测试mtdparts分区

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



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

  步骤如下:

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

  下一节S3C2440移植uboot之支持烧写yaffs映像及制作补丁我们将移植uboot支持yaffs文件系统。

有任何问题,均可通过公告中的二维码联系我

S3C2440移植uboot之裁剪和修改默认参数的更多相关文章

  1. 移植最新u-boot(裁剪和修改默认参数)之韦东山笔记

    1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2012.04.01 make ...

  2. 移植最新u-boot(裁剪和修改默认参数)

    [参考]韦东山 教学笔记 ================================================== 最简单的bootloader的编写步骤: 1. 初始化硬件:关看门狗.设 ...

  3. 移植u-boot.2012.04.01

    /*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...

  4. python的位置参数、默认参数、关键字参数、可变参数区别

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_d ...

  5. Android系统移植与调试之------->如何修改Android设备的默认休眠时间

    1.找到~/mx0831-0525/frameworks/base/packages/SettingsProvider/res/values/ defaults.xml文件 2.修改默认休眠时间 3. ...

  6. Android系统移植与调试之------->如何修改Android默认字体大小和设置里面字体大小比例

    因为我修改 ro.sf.lcd_density的值,将它从160修改 为120,所以导致整个系统的字体都变得很小.因此需要将整个字体变大,并且在设置-->显示-->字体大小的4个选项的值都 ...

  7. mini2440移植uboot 2014.04(一)

    最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...

  8. 04.移植u-boot

    1.读readme获取信息    1.1 由Building the Software可知,需修改顶层makefile,指定架构和编译器    ifeq ($(HOSTARCH),$(ARCH))   ...

  9. mini2440移植uboot 2014.04(五)

    代码上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440 前几篇博文: <mini2440移植uboot 2014.04 ...

  10. mini2440移植uboot 2014.04(二)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <u-boot-2011 ...

随机推荐

  1. 文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题

    六.用go语言,考虑一棵二叉搜索树 T ,其关键字互不相同.证明:如果 T 中一个结点 x 的右子树为空,且 x 有一个后继 y ,那么 y 一定是 x 的最底层祖先,并且其左孩子也是 x 的祖先.( ...

  2. 虚拟机运行Hadoop | 各种问题解决的心路历程

    ps:完成大数据技术实验报告的过程,出项各种稀奇古怪的问题.(知道这叫什么吗?经济基础决定上层建筑,我当时配置可能留下了一堆隐患,总之如果有同样的问题,希望可以帮到你) 一.虚拟机网络连接不通的各种情 ...

  3. [AGC031E] Snuke the Phantom Thief

    Problem Statement A museum exhibits $N$ jewels, Jewel $1, 2, ..., N$. The coordinates of Jewel $i$ a ...

  4. Nougat:结合光学神经网络,引领学术PDF文档的智能解析、挖掘学术论文PDF的价值

    Nougat:结合光学神经网络,引领学术PDF文档的智能解析.挖掘学术论文PDF的价值 这是Nougat的官方存储库,Nougat是一种学术文档PDF解析器,可以理解LaTeX数学和表格. Proje ...

  5. 累加器Adder

    ① java8引⼊的,相⽐较是⼀个⽐较新的类 ② ⾼并发下LogAdder⽐AtomicLog效率⾼,不过本质是空间换时间 ③ 竞争激烈的时候,LongAdder把不同线程对应到不同的Cell上进⾏修 ...

  6. MySQL调优的一些总结

    SQL优化可以从那几个方面去优化 1.基本写法优化: 1.少使用select * ,尽量使用具体字段: 2.对于条件来说等号之类两边的字段类型要一致,字符串不加单引号索引会失效: 3.尽量少使用Ord ...

  7. adb shell getprop 获取系统属性

    adb shell getprop 以华为p30为例: [gsm.default.apn]: [gsm.defaultpdpcontext.active]: true [gsm.dualcards.s ...

  8. 制造业工厂生产管理MES系统中的设备管理模块

    制造业工厂万界星空科技生产管理MES系统中的设备管理模块介绍: 随时工厂数字化建设的大力推进,设备管理的效率得到了很大的提升,特别是作为机加工企业,设备是整个企业非常重要的核心资产. 1.MES设备管 ...

  9. MySQL面试题:一条SQL语句在MySQL中执行过程全解析

    一 .MySQL 基础架构分析 介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图. 连接/线程处理(连接器): 身份认证和权限相关(如连接处理.授权认证.安全等等). 查询缓存: 执行查询语句的 ...

  10. jumpserver连接ecs实例报错:UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh_exchange_identification: Connection closed by remote host", "unreachable": true

    报错分析思路: 1.是ssh密钥设置有没有对接 2.防火墙拦截问题 3.用户设置问题 4.sshd配置问题 问题解决: 无法与221.229.216.39端口35846进行协商:找不到匹配的主机密钥类 ...