uboot下tftp和nand flash启动linux配置总结及nand命令使用(实例)

一、简介

本文主要是实例讲述tftp和nand flash两种方式启动linux系统,同时讲解nand的读写命令实例操作。

二、tfpt方式

//网络配置
setenv ethaddr e2:a9:8d:e5:33:33
setenv ipaddr 192.168.22.248
setenv netmask 255.255.255.0
setenv serverip 192.168.21.199
//传入内核和设备树
tftp 0x8801000000 Image.gz
tftp 0x8800070000 tegra194-p2972-0000.dtb
//设置启动参数
setenv bootargs earlycon console=ttyS0  root=UUID=a080add7-cd8e-4950-a58c-e1d388e88c88  rw  init=/init
//解压内核到指定内存地址
unzip 0x8801000000 0x8800080000
//启动内核
booti 0x8800080000 - 0x8800070000

tftp服务器的搭建参考链接:
Ubuntu系统设置常见问题处理详细总结-第12点

三、nand flash方式

1、首先通过ftfp方式将Image.gz和dtb传至内存中缓存

setenv ethaddr e2:a9:8d:e5:33:33
setenv ipaddr 192.168.22.248
setenv netmask 255.255.255.0
setenv serverip 192.168.21.199
tftp 0x8801000000 Image.gz
tftp 0x8800070000 tegra194-p2972-0000.dtb

2、写至nand flash,若写报错,可通过下面的nand擦除命令擦除对应的nand区间

nand write 0x8801000000 kernel 0x3200000
nand write 0x8800070000 dts 0x1200000 
//注意:这里的读写nand中nand的起始地址直接用kernel和dts代替,因为在nand分区中已经指定,后面章节会详细讲解

3、手动读取nand

nand read 0x8801000000 kernel 0x3200000
nand read 0x8800070000 dts 0x1200000 
setenv bootargs earlycon console=ttyS0  root=UUID=a080add7-cd8e-4950-a58c-e1d388e88c88  rw  init=/init
unzip 0x8801000000 0x8800080000
booti 0x8800080000 - 0x8800070000 

4、自动执行uboot命令启动linux系统
需要在uboot源码中u-boot/include/configs/xxx_verify.h开发板对应的文件中设置:

#define CONFIG_BOOTCOMMAND             \
       "nand read 0x8808000000 kernel 0x3200000 ; " \
        "nand read 0x8800070000 dts 0x10000 ; " \
        "unzip 0x8808000000 0x8800080000 ;booti 0x8800080000 - 0x8800070000 ;"

同时bootargs可以在内核对应的dts下修改:

arch/arm64/boot/dts/xxxx.dts
bootargs = "console=ttyNORU0  root=UUID=a080add7-cd8e-4950-a58c-e1d388e88c88  rw  init=/init";

三、nand命令详解

1、nand erase命令

nand erase 命令用于擦除 NAND Flash,NAND Flash 的特性决定了在向 NAND Flash 写数据之前一定要先对要写入的区域进行擦除。“nand erase”命令有三种形式:

nand erase[.spread] [clean] off size //从指定地址开始(off)开始,擦除指定大小(size)的区域。
nand erase.part [clean] partition  //擦除指定的分区
nand erase.chip [clean] //全篇擦除

下面以把内存0x30008000起长度为0x20000的内容写到 Nand Flash 中的 0x100000 为例.

CRANE2410 # nand erase 0x100000 20000
NAND erase: device 0 offset 1048576, size 131072 ... OK
CRANE2410 # nand write 0x30008000 0x100000 0x20000
NAND write: device 0 offset 1048576, size 131072 ... 131072 bytes written: OK

2、nand write命令

此命令用于向 NAND 指定地址写入指定的数据,一般和“nand erase”命令配置使用来更新NAND 中的 uboot、linux kernel 或设备树等文件,命令格式如下:

nand write addr off size 

但是我们可以在 uboot 里面使用“nand write”命令烧写 kernel和dtb。先编译出来 NAND版本的 kernel 和 dtb 文件,在烧写之前要先对NAND进行分区,也就是规划好uboot、linux kernel、设备树和根文件系统的存储区域。I.MX6U-ALPHA 开发板的NAND分区如下:

0x000000000000-0x000004000000 : "boot"
0x000004000000-0x000006000000 : "kernel"
0x000006000000-0x000007000000 : "dtb"
0x000007000000-0x000020000000 : "rootfs"

一共有四个分区,第一个分区存放 uboot,地址范围为0x0-0x4000000(共 64MB);第二个分区存放 kernel(也就是 linux kernel),地址范围为 0x4000000-0x6000000(共 32MB);第三个分区存放 dtb(设备树),地址范围为 0x6000000-0x7000000(共 16MB);剩下的所有存储空间全部作为最后一个分区,存放 rootfs(根文件系统)。

可以看出kernel是从地址0x4000000开始存放的,将NAND版本kernel对应的zImage文件放到Ubuntu中的tftpboot目录中,然后使用tftp命令将其下载到开发板的0X87800000地址处,最终使用“nand write”将其烧写到NAND中,命令如下:

tftp 0x87800000 zImage //下载zImage到DRAM中
nand erase 0x4000000 0xA00000 //从地址 0x4000000 开始擦除 10MB 的空间
nand write 0x87800000 0x4000000 0xA00000  //将接收到的zImage写到 NAND 中
0x87800000:内存中地址
0x4000000:Flash内地址
0xA00000:写入长度

3、nand read命令

此命令用于从 NAND 中的指定地址读取指定大小的数据到 DRAM 中,命令格式如下:

nand read addr off size

addr 是目的地址,off 是要读取的 NAND 中的数据源地址,size 是要读取的数据大小。比如我们读取设备树(dtb)文件到 0x83000000 地址处,命令如下:

nand read 0x83000000 0x6000000 0x19000

四、其他相关链接

uboot方式启动硬盘手动制作的根文件系统方案

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值