海思u-boot烧写内核、文件系统的步骤笔记
1. fast-boot
fast-boot一般通过串口,使用HiTool进行烧写
2. 烧写uboot+内核+根文件系统
上电在串口按任意键进入uboot目录下
烧写
setenv serverip 192.168.1.xx; //设置pc端ip
setenv ipaddr 192.168.1.10; //设置板端ip为1.10
sf probe 0; //连接spi flash
mw.b 0x82000000 ff 0x1000000 //从0x82000000开始,长度为0x10000000填充为0xff
tftp 0x82000000 Hi3516A_SDI_20170627.bin; //从tftp服务器下载Hi3516A_SDI_20170627.bin到0x82000000开始的空间
sf erase 0x000000 0x1000000 //擦除从0x0开始,长度0x1000000空间
sf write 0x82000000 0x000000 0x1000000 //将0x82000000空间的数据写入到0x0开始的空间,写入长度0x1000000
reset; //重启
3. 附录
3.1 板子IP设置
setenv -f ethaddr 00:70:XX:00:00:01; //为mac地址
setenv gatewayip 172.19.24.254; //网关
setenv ipaddr 172.19.24.XXX; //板子IP
setenv netmask 255.255.255.0; //子网掩码
setenv serverip 172.19.24.XXX; //电脑IP
saveenv
3.2 uboot sf命令
uboot中如果支持spi/qspi flash, 那么可以使用sf的erase, read, write命令操作spi flash
-
sf read
用来读取flash数据到内存 -
sf write
写内存数据到flash -
sf erase
擦除指定位置,指定长度的flash内容, 在进行写flash的时候一定要先进行擦除,否则会失败,因为flash只能从1变为0。
具体用法
sf - SPI flash sub-system
Usage:
sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus
and chip select
sf read addr offset len - read `len' bytes starting at
`offset' to memory at `addr'
sf write addr offset len - write `len' bytes from memory
at `addr' to flash at `offset'
sf erase offset [+]len - erase `len' bytes from `offset'
`+len' round up `len' to block size
sf update addr offset len - erase and write `len' bytes from memory
at `addr' to flash at `offset'
用法:
sf probe 0
在使用sf的其他命令之前必须先进行此操作进行连接flash。否则会出现如下情况。
sf write 0x82000000 0x8000 0x20000
把内存0x8200 0000处的数据, 写入flash的偏移0x80000, 写入数据长度为0x20000(128KB), 操作偏移和长度最小单位是Byte
sf read 0x82000000 0x10000 0x20000
把flash偏移0x10000(64KB)处, 长度为0x20000(128KB)的数据, 写入到内存0x82000000, 操作偏移和长度最小单位是Byte
sf erase 0x0 0x10000
擦除偏移0x0处, 到0x10000之间的擦除块, 擦除操作是以erase block为单位的, 要求offset和len参数必须是erase block对齐的
从sf命令,可以看出几点:
-
spi flash没有oob数据存在, 也就是不用考虑EDC ECC, 也没有坏块管理概念.
-
支持Byte级的读写操作, 支持随机访问.
如何查看flash的内容
可以结合uboot md命令查看内存数据
md 0x82000000 0x100
打印0x82000000开始, 长度范围0x100字节的内存数据
3.3 uboot常用命令之mw
mw //用于修改内存地址上的值
用法:
mw.b 0x40008000 0xab 100 //从内存地址0x40008000开始的0x100字节空间,设值为0xab
mw.w 0x40008000 0xabcd 100 //从内存地址0x40008000开始的0x200字节空间,每16位值设为0xabcd
mw.l 0x40008000 0xabcdef88 100 //从内存地址0x40008000开始的0x400字节空间,每32位值设为0xabcdef88
mw填充内存命令
mw[.b,.w,.l] address value [count]
表示以[.b,.w,.l]为单位往开始地址为address的内存填充count 个值为 value 的数据
例:
mw.b 82000000 ff 100000从地址0x82000000地址开始填充0x100000(1M字节)个值为0xff的数据