u-boot移植易用性设置

以下设置使用的u-boot版本为u-boot-2012.04.01

环境参数

在Flash上划分了一块区域用于存储环境变量,所以当u-boot启动时会有如下操作:

  • 读取Flash上的环境变量;
  • 判断读取到的环境变量是否有效;
  • 如果判断有效则用,无效则使用默认参数;

当还没有在Flash上设置环境变量时,u-boot在启动的时候会打印出 Warning - bad CRC, using default environment,以下是如何设置默认参数(在Nand上区域的划分依次是:bootloader(0)、params(1)、kernel(2)、rootfs(3)):

/* 内核打印信息从串口0打印输出,文件系统在第3个分区 */
#define CONFIG_BOOTARGS "console=ttySAC0 root=/dev/mtdblock3" /* 根据此命令读出内核并启动内核
* 使用nand read 命令从0x60000地址处读取大小为0x200000(2M)数据,读到0x30000000处
* 从30000000地址处启动内核
*/
#define CONFIG_BOOTCOMMAND "nand read 30000000 60000 200000;bootm 30000000" /* 网络相关的设置 */
#define CONFIG_ETHADDR 00:0C:29:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.3.10
#define CONFIG_SERVERIP 192.168.3.6

此时还不能在u-boot命令模式中使用save命令保存环境变量,因为在代码中还没有修改代码(划分环境变量分区),如果使用有可能会破坏Flash中的内容;

设置时可以参考如下分区设置:

Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":

0x00000000-0x00040000 : "bootloader"(256k)

0x00040000-0x00060000 : "params"(128k)

0x00060000-0x00260000 : "kernel"(2M)

0x00260000-0x10000000 : "root"

设置环境变量(可参考save命令,判断如何设置):

/* 可以认为此宏定义后,环境变量存储在Nand上 */
#define CONFIG_ENV_IS_IN_NAND
/* 存储偏移地址,即存储的起始地址在哪(参考上面的分区划分) */
#define CONFIG_ENV_OFFSET 0x00040000
/* 存储的空间大小设置(参考上面的分区划分)
* 空间大小值得设置是有要求得,必须时所使用的Nandflash块大小的整数倍(因为Nand是以块为单位擦除* 的)
*/
#define CONFIG_ENV_SIZE 0x20000
#define CONFIG_ENV_RANGE CONFIG_ENV_SIZE /* 使用前擦除的范围,设置为同SIZE即可 */

u-boot代码按照上述修改后,重新编译烧写运行后,会出现启动倒数并且还会出现Warning - bad CRC, using default environment提示,是因为环境变量参数还未保存在Flash中,此时使用save命令保存下即可,重启发现已没有该提示信息;

程序烧写相关操作命令的使用

烧写程序到Norflash中的操作示例

loady 30000000  /* 使用loady命令,按照ymodem协议将程序发送到30000000地址处,即内存中 */
protect off all /* 解锁Flash的写保护 */
erase 0 7ffff /* 从Nor的0地址开始擦除,擦除的大小为0x80000(512k) */
cp.b 30000000 0 80000 /* 从30000000地址处,按照byte拷贝程序到Nor的0地址处,拷贝大小为 0x80000(512k) */

烧写程序到Nandflash中的操作示例

tftp 30000000 uImage /* 通过tftp服务下载内核镜像到30000000地址处 */
nand erase 60000 200000 /* 擦除Nand从0x60000地址处开始,大小为0x200000(2M) */
nand write 30000000 60000 200000 /* 将内存地址30000000处开始的代码写到Nand中起始地址为0x60000处,大小为2M */

分区划分及定义

上述的示例操作比较麻烦,可以用某些名字来代替数字(比如要写入的起始地址等);

可以使用mtd或者mtdparts命令操作

u-boot中的分区只是在代码中通过定义宏定义的方式实现,用一些名字替代上述示例操作中的某些数字,便于使用,并不会对内核有任何影响,并不会出入到内核中去,也并无其他任何作用;

操作方法

  • 首先确保有运行如下操作;
run_command("mtdparts default", 0); /* 运行后才会初始化默认分区表 */
  • 通过宏定义确定默认分区表:
#define CONFIG_CMD_MTDPARTS  /* 包含使用mtdparts命令 */
#define MTDIDS_DEFAULT "nand0=jz2440-0" /* 哪一个设备 */
#define MTDPARTS_DEFAULT "mtdparts=jz2440-0:256k(u-boot)," \
"128k(params)," \
"2m(kernel)," \
"-(rootfs)" /* 剩下空间默认都属于文件系统 */

在设置完分区表后,上述的烧写程序示例操作可以修改为如下(按照上面的分区设置):

tftp 30000000 uImage /* 通过tftp服务下载内核镜像到30000000地址处 */
nand erase.part kernel /* 擦除Nand从0x60000地址处开始,大小为0x200000(2M) */
nand write 30000000 kernel /* 将内存地址30000000处开始的代码写到Nand中起始地址为0x60000处,大小为2M */

BOOTCOMMAND命令可以修改如下:

/* 根据此命令读出内核并启动内核
* 使用nand read 命令从0x60000地址处读取大小为0x200000(2M)数据,读到0x30000000处
* 从30000000地址处启动内核
*/
#define CONFIG_BOOTCOMMAND "nand read 30000000 kernel;bootm 30000000"

u-boot移植易用性设置的更多相关文章

  1. 自定义的Spring Boot starter如何设置自动配置注解

    本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...

  2. [Java] Spring boot 的maven设置阿里云仓库

    Spring boot 的maven设置阿里云仓库 打开根目录下的 pom.xml 文件,在对应为止出加入如下 红色 代码: <build> <plugins> <plu ...

  3. 标题:u-boot 移植步骤详解

    1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目.从FADSROM.8xxROM.PPCBOOT逐步发展演化而来.其源码目录.编译形式与 ...

  4. spring boot跨域设置

    定义 跨域是指从一个域名的网页去请求另一个域名的资源 跨域背景 限制原因 如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题 为什么要跨域 公司内部有多个不 ...

  5. CMake根据平台移植检查设置文件编译选项

    #添加函数检查功能 include(CheckFunctionExists) //检查系统是否支持accpet4,将检查结果设置至HAVE_ACCEPT4 check_function_exists( ...

  6. -boot移植(十一)---代码修改---支持nandflash

    一.移植前的修改 1.1 include/configs/jz2440修改 原来的定义: 可以看出,要先定义CONFIG_CMD_NAND才能使能NANDFlash. 这个在我们文件中的82行有定义, ...

  7. Spring Boot 2.0 设置网站默认首页

    Spring Boot设置默认首页,方法实验OK如下 附上Application启动代码 /** * @ClassName Application * @Description Spring-Boot ...

  8. spring boot 的maven设置阿里云仓库

    <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> ...

  9. Spring Boot全日志设置

    说在前面 这里日志分两种.一种是tomcat的输出(系统)日志,一种是自己定义的日志. 系统日志设置 目标 当springboot接收到请求时记录日志到文件中 实现 你只需要在你的绿叶applicat ...

随机推荐

  1. Centos7系统下以RPM方式如何安装mysql-5.7

    检查系统是否装有mariadb rpm -qa | grep mariadb 卸载mariadb 强制卸载mariadb rpm -e --nodeps mariadb-libs-5.5.35-3.e ...

  2. Nginx sticky模块实现session粘滞

    一:下载,解压nginx sticky模块. 1 2 3 # cd /usr/local/src # wget http://nginx-sticky-module.googlecode.com/fi ...

  3. DOTS默认情况下的性能

    利用Unity全新的高性能多线程数据导向技术堆栈(DOTS),充分利用当今的多核处理器.您的游戏运行速度更快,您的代码更易于在其他项目中阅读和重用. 重建Unity的核心 我们正在使用高性能多线程数据 ...

  4. 开发工具之GIT

    GIT WORKFLOW this readme created on 2019.07.28 by Suarez7988 这是一遍介绍git版本控制流程的中文说明,必须通篇阅读一下 https://g ...

  5. linux中高级信号函数sigaction和sigqueue实例

    /************************************************************************* > File Name: sigquque. ...

  6. Mysql批量插入返回Id错乱(原因分析)

    在项目中经常会有如下场景: 往数据库中批量插入一批数据后,需要知道哪些插入成功,哪些插入失败了. 这时候往往会有两种思路,一个是在插入之前判断相同的记录是否存在,过滤掉重复的数据:另外一种就是边插入边 ...

  7. spring效验

    相关依赖 如果开发普通 Java 程序的的话,你需要可能需要像下面这样依赖: <dependency> <groupId>org.hibernate.validator< ...

  8. 第24课.经典问题解析(1.析构函数的顺序;2.const修饰对象;3.成员函数,成员变量是否属于具体对象)

    1.当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 单个对象 单个对象创建时构造函数的调用顺序 a.调用父类的构造函数 b.调用成员变量的构造函数(调用顺序与声明顺序相同) c.调用类自身的 ...

  9. Spring mybatis源码篇章-Mybatis主文件加载

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-SqlSessionFactory 前话 本文承接前文的内容继续往下扩展,通过Spring与Mybatis的 ...

  10. 华为CPU的类型

    主要分类: 以及 一句名言