今天我们来裁剪U-BOOT,使其更加易用,修改默认参数,以及制作最终修改好得补丁文件方便以后的快速移植。

那么如果想看之前的关于网卡以及flash等的移植,请点击链接查看:点击链接查看

在裁剪修改之前呢,我们先来了解一下U-BOOT的环境参数(环境变量):
uboot在启动的时候首先会读取环境参数,然后判断环境参数是否有效,如果设置的环境参数是无效的,那么就使用默认的参数。

我们还要知道整个Linux系统在硬盘中(FLASH)中是如何分区的:

我们可以看到,uboot放到第一个分区,环境参数放到第二个分区,内核放到第三个分区,文件系统放到第四个分区。

之前我们修改的U-BOOT启动后,一直有一个警告:

显示说CRC的参数错误,使用默认的环境变量。那么我们就从这个问题引入吧。在uboot中搜索字符串:using default environment
从而找到了:
Env_common.c(common目录下)

const uchar default_environment[] = {
#ifdef  CONFIG_BOOTARGS"bootargs=" CONFIG_BOOTARGS         "\0"
#endif
#ifdef  CONFIG_BOOTCOMMAND"bootcmd="  CONFIG_BOOTCOMMAND      "\0"
#endif
.......
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)"bootdelay="    MK_STR(CONFIG_BOOTDELAY)    "\0"
#endif
......
#ifdef  CONFIG_ETHADDR"ethaddr="  MK_STR(CONFIG_ETHADDR)      "\0"
#endif
......
#ifdef  CONFIG_IPADDR"ipaddr="   MK_STR(CONFIG_IPADDR)       "\0"
#endif
}

bootargs是传给内核的启动参数,可以设置文件系统的相关分区等。我们在配置文件smdk2440.h中159行的地方定义一下:

#define CONFIG_BOOTARGS "console=ttySAC0 root=dev/mtdblock3" //代表内核从串口0启动,文件系统放到第3个分区

bootcmd是uboot用来启动内核的参数,我们也在配置文件中定义(bootargs定义的下面)定义一下(先随便定义一个值):

#define CONFIG_BOOTCOMMAND "nand read 30000000 0xbac 0x200000;bootm 30000000"
//因为现在还无得知内核的分区的具体地址,先随便设置一个值,用于演示,等我们把整个FLASH分区规划好了之后,再来设置

bootdelay是uboot启动后的那个倒数计时的参数,当uboot启动后,进入倒计时启动,我们按下任意键,进入uboot交互界面开始进行一些设置等操作。这里我们就去默认值。

ipaddr我们已经很熟悉了,是uboot单板的ip地址,这个我们可以修改一下看看,这个在配置文件smdk2440.h中已经由定义,我们找到将其修改为:

#define CONFIG_IPADDR       192.168.1.103

ethaddr表示网卡的MAC地址,再定义一下MAC地址:

#define CONFIG_ETHADDR      00:0c:29:4d:e4:f4  //lyy

好了,设置好我们常用的参数后,我们先来裁剪一下uboot,因为这个uboot实在是太大了。
我们在uboot命令行输入help,发现有各种命令,有些命令根本不需要,那么我们就需要把相关的宏定义给去掉。
这里我就不记录了,去掉的地方太分散了,大概是去掉了usb,文件系统的支持等。
然后重新编译uboot,发现有一些错误,说我的有一些定义没定义,但是,我已经把相关定义去掉了。重新:make distclean,然后make smdk2440_config,再make。没有错误了(至于为什么,我也不清楚,没必要细究。)。

然后我们现在来分区:
首先看一下之前是怎么分区的,启动内核看一下之前是怎么分区的:
0x00000000-0x00040000 : “bootloader” (0~256k)
0x00040000-0x00060000 : “params”
0x00060000-0x00260000 : “kernel”
0x00260000-0x10000000 : “root”
我们先来设置一下我们的参数的存放地址吧,因为之前我们设置好参数之后,每次都不敢save,就是怕破坏FLASH。

在配置文件中,找到如下环境变量的相关定义:

#define CONFIG_ENV_ADDR         (CONFIG_SYS_FLASH_BASE + 0x070000)
#define CONFIG_ENV_IS_IN_FLASH
#define CONFIG_ENV_SIZE         0x10000
/* allow to overwrite serial and ethaddr */
#define CONFIG_ENV_OVERWRITE

那么我们重新定义这些宏,该怎么定义呢?
在uboot命令行使用help命令查看save相关的信息:

然后我们在uboot源码中搜索字符串:saveenv
找到了类似这样的语句:
搜索信息:Env_flash.c (common):int saveenv(void)
我们去common目录下看看Makefile,看看Env_flash.c的编译依赖哪个宏?找到了下面这句:
COBJS-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o
说明编译Env_flash.c依赖的是CONFIG_ENV_IS_IN_NAND这个宏的定义。那么我们就定义这个宏CONFIG_ENV_IS_IN_NAND:
所以我们将上面环境变量的宏重新定义如下:

#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET       0x00040000
#define CONFIG_ENV_SIZE         0x20000
#define CONFIG_ENV_RANGE        CONFIG_ENV_SIZE

然后重新编译,没有错误。
用tftp下载,先设置好ip等(参考上一篇文章):
tftp 30000000 u-boot.bin
protect off all
erase 0 3ffff (因为uboot经过裁剪后,大小变了,所以擦除和拷贝的地址会发生变化)
cp.b 30000000 0 40000
然后重启:

由启动知,已经有了倒数的命令,以及我们设置的ip等,都直接就存在了。
但是还是有呢个关于CRC的警告信息,那是因为,那个CRC的变量没有写到FLSAH中,我们执行save命令,再重启:

此时,就没有那个警告信息了,说明参数已经成功被写进flash,说明上面修改的的参数保存的地址的区域,也设置成功了。
然后我们烧写内核:
tftp 30000000 uImage_4.3
nand erase 60000 200000
nand write 30000000 60000 200000
从这里,就可以感觉到,烧写个程序要这么麻烦。下面我们就来修改代码,让烧写程序变得简单:
在配置文件中定义宏:CONFIG_CMD_MTDPARTS(寻找方法类似于上面的找Makefile的方法)

#define CONFIG_CMD_MTDPARTS
#define MTDIDS_DEFAULT      "nand0=jz2440-0"    /* 表示哪一个设备 */
#define MTDPARTS_DEFAULT    "mtdparts=jz2440-0:256k(u-boot),"   \"128k(params),"     \"2m(kernel),"   \"-(rootfs)"     \

在board.c中657行添加:

run_command("mtdparts default",0);

重新编译,出现错误:
common/libcommon.o: In function get_mtd_info':
/work/system/u-boot-2012.04.01/common/cmd_mtdparts.c:306: undefined reference to
get_mtd_device_nm’
make: * [u-boot] Error 1
通过查找,发现Mtdcore.c函数(在drivers/mtd目录下)定义了get_mtd_device_nm这个函数,应该是没有被编译进内核,所以才显示错误,去Makefile中查看,发现,还需要定义这个宏:CONFIG_MTD_DEVICE,那么我们在配置文件中再定义这个宏:

#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define MTDIDS_DEFAULT      "nand0=jz2440-0"    /* 表示哪一个设备 */
#define MTDPARTS_DEFAULT    "mtdparts=jz2440-0:256k(u-boot),"   \"128k(params),"     \"2m(kernel),"   \"-(rootfs)"     \

再重新编译,没有错误。烧写uboot,重启,在uboot命令行输入:mtdparts,显示如下:

再来烧写内核时,就可以这样烧写内核了:
tftp 30000000 uImage_4.3
nand erase.part kernel
nand write 30000000 kernel
然后我们再回过头把配置文件中的这句话:

#define CONFIG_BOOTCOMMAND "nand read 30000000 0xbac 0x200000;bootm 30000000"

修改为:

#define CONFIG_BOOTCOMMAND "nand read 30000000 kernel 0x200000;bootm 30000000"

重新编译,烧写uboot,烧写内核。重启,发现可以直接启动内核了,因为我们已经把读内核的地址修改好了。

移植U-BOOT之裁剪和修改默认参数(易用性)启动内核,以及对uboot进行分区相关推荐

  1. 移植uboot第八步:裁剪、修改默认参数、分区

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

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

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

  3. omapl138移植uboot系列之启动TI官方移植的Linux内核(启动内核第一篇)

    启动TI官方移植的Linux内核 和编译uboot一样,Linux内核的编译也是三板斧,首先修改Makefile中的ARCH和CROSS_COMPILE,然后找到你要编译的板卡执行make xx_de ...

  4. uboot启动内核的相关命令详解——boot、bootm

    1.boot和bootm命令的联系 当我们进入uboot的命令终端后,可以利用boot和bootm来启动内核,但是命令的使用方式有区别: 直接输入boot命令就可以启动内核,如果使用bootm命令,后 ...

  5. 详解Python位置参数、默认参数、关键字参数、可变参数

    Python中函数参数比较复杂,需要认清区别.合理利用,否则很麻烦.首先,认清参数的分类: 分类标准1:形参parameter,函数定义时用:实参argument,函数调用时用: 分类标准2:位置参数 ...

  6. 如何在Spring boot中修改默认端口

    文章目录 介绍 使用Property文件 在程序中指定 使用命令行参数 值生效的顺序 如何在Spring boot中修改默认端口 介绍 Spring boot为应用程序提供了很多属性的默认值.但是有时 ...

  7. Centos7多内核情况下修改默认启动内核方法

    1.1  进入grub.cfg配置文件存放目录/boot/grub2/并备份grub.cfg配置文件 [root@linux-node1 ~]# cd /boot/grub2/ [root@linux ...

  8. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码...

    原文:C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github. ...

  9. Centos7修改默认网卡名(改为eth0)以及网卡启动报错RTNETLINK answers: File exists处理...

    安装好centos7版本的系统后,发现默认的网卡名字有点怪,为了便于管理,可以手动修改.下面对centos7版本下网卡重命名操作做一记录: 1)编辑网卡信息 [root@linux-node2~]# ...

最新文章

  1. mysql关系表控制_mysql表关系
  2. Altium Designer快捷键失效恢复方法
  3. Spring Bean init-method 和 destroy-method实例
  4. IT英语2-编程词汇编程英语词汇
  5. 天池 在线编程 输入流
  6. 复合文档(Compound Document)读写栗子
  7. 大学计算机网络实验2,河南工业大学计算机网络实验报告2
  8. rhel6下,mysql 5.6.14 主从复制(也称mysql AB复制)环境配置[基于binlog]
  9. cisco接口模式转换
  10. 点石成金:访客至上的网页设计秘笈pdf
  11. 什么是内存碎片?如何避免?
  12. 系列学习 Gateway 之第 4 篇 —— 网关限流
  13. 梯度散度旋度常用基本关系
  14. 97年小伙“最牛简历”刷屏:面子算什么,我只想搞钱
  15. 视频教程-Windows Server 2016 IPAM 服务管理-Windows
  16. 阿里云国际站的对象存储oss与自建存储的区别
  17. css 设置字体渐变色
  18. go:linkname must refer to declared function or variable
  19. Unity模糊远处物体,近处清晰,景深效果
  20. Programming Languages PartA Week3学习笔记——SML基本语法第二部分

热门文章

  1. spring mvc学习(2):spring jar包下载
  2. java学习(81):静态代码块
  3. dockfile应用(二)
  4. Linux安装samba的过程,Samba安装全过程
  5. php直接导出csv,PHP百万级数据导出方案(生成器直接输出单个CSV)
  6. vue-cli proxy中跨域中pathRewrite配置理解
  7. 深入理解移动前端开发之viewport
  8. tensorflow 目标分割_Tensorflow中的控制流和优化器
  9. 使用 keytool 生成安卓应用程序签名
  10. 设置WordPress文章关键词自动获取,文章所属分类名称,描述自动获取文章内容,给文章的图片自动加上AlT标签...