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. 【手记】解决Intel Management Engine Interface黄色感叹号

    安装补丁KB2685811.重启.

  2. EuRoc V203数据集的坑

    EuRoc数据集时间戳问题 以前听别人说过V203序列有问题,今儿仔细看了才发现EuRoc的V203数据集中的左右相机 照片数量不相等,很僵硬,cam0存在大量丢帧,之前一直用单目数据,没什么感觉.. ...

  3. NDK学习笔记-增量更新

    虽然现在有插件化开发和热修复,但为何还需要增量更新?插件化开发和热修复依赖于宿主程序,增量更新适合更新宿主程序. 差分包生成的前提 差分包的生成依赖于BsDiff开源项目,而BsDiff又依赖于Bzi ...

  4. 最新 华云数据java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.华云数据等10家互联网公司的校招Offer,因为某些自身原因最终选择了华云数据.6.7月主要是做系统复习.项目复盘.Leet ...

  5. 使用 pyenv 可以在一个系统中安装多个python版本

    Installl related yum install readline readline-devel readline-static -y yum install openssl openssl- ...

  6. 洛谷 题解 P1353 【[USACO08JAN]跑步Running】

    动态规划 状态 dp[i][j]表示第i分钟疲劳值为j的最大值 初始 全部都为一个最小值"0" 转移 考虑休息和走 如果当前疲劳值比时间要大,显然不可能出现这种情况 如果比时间小 ...

  7. mysql的binlog安全删除的一种方法

    指定过期天数(expire_logs_days) ---适用于单机版mysql!    该参数为全局可动态调整参数,默认值为0,即关闭,取值范围0-99. 1.3.1 参数的查看: mysql> ...

  8. Oracle 10g 归档日志满了的解决办法

    如果Oracle的归档日志满了,应用连接数据库就会出错,这时需要手工删除过期的归档日志,方法如下: 1.指定数据库实例 $ export ORACLE_SID=db1 2.进入rman $ rman ...

  9. logstash grok

    input { file { path => "/opt/service/test-service/logs/catalina-error*.log" type => ...

  10. 【Python基础】11_Python中的字符串

    1.字符串的定义 可以使用""双引号,也可以使用''单引号定义字符串,一般使用双引号定义. 2.字符串的操作 判断类型: 查找和替换 大小写切换: 文本对齐 注:string.ce ...