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. souce and bash 的区别

    对于一些环境变量的配置文件,如想使更改后立即生效,多用 souce +file 执行后即可.如/etc/profile 里加了配置, source 和  bash 的区别: source filena ...

  2. 【Python】机器学习之单变量线性回归 利用批量梯度下降找到合适的参数值

    [Python]机器学习之单变量线性回归 利用批量梯度下降找到合适的参数值 本题目来自吴恩达机器学习视频. 题目: 你是一个餐厅的老板,你想在其他城市开分店,所以你得到了一些数据(数据在本文最下方), ...

  3. 洛谷 题解 P1133 【教主的花园】

    $n<=10^5 $ O(n)算法 状态 dp[i][j][k]表示在第i个位置,种j*10的高度的树,且这棵树是否比相邻两棵树高 转移 dp[i][1][0]=max(dp[i-1][2][1 ...

  4. centOS服务器-firewall防火墙开放端口

    前言 日常开发中,我们常常会因为服务器各种端口未开放出现各种问题,下面我们就来简单了解下服务器上的端口开放!!! 作为一个后台开发,日常接触最多的除了代码就是服务器了: 产品:谁谁, 线上有个功能报错 ...

  5. [转帖]ECC公钥格式详解

    ECC公钥格式详解 https://www.cnblogs.com/xinzhao/p/8963724.html 本文首先介绍公钥格式相关的若干概念/技术,随后以示例的方式剖析DER格式的ECC公钥, ...

  6. SQL SERVER 使用游标删除所有主键

    Declare @Pk varChar(100);Declare @TBname varChar(100);declare cursor1 cursor for Select Sys2.name as ...

  7. 剑指offer42:数组和一个数字S,输出两个数的乘积最小的

    1 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. ...

  8. MGR+Consul集群

    [root@mydb1 ~]# wget https://releases.hashicorp.com/consul/1.4.0/consul_1.4.0_linux_amd64.zip[root@m ...

  9. 怎样通过html标签名获取元素节点集合

    方法1. 使用document.querySelectorAll(); 方法2. 使用document.getElementsByTagName(); document.querySelectorAl ...

  10. Jersey 写restful接口时QueryParam ,FormParam 等的区别

    今天用jersey写接口,发现有一个post方法中没有得到参数,查了半天发现自己一不小心将@formparam写成了@queryparam,真是一个悲伤的故事.在这里把几个参数类型整理了一下放出来. ...