以下内容源于朱有鹏课程的学习,以及海思方案的学习资料整理。如有侵权,请告知删除。
这里主要讲“使用tftp,烧写映像文件(uboot、kernel、rootfs)到SPI Flash”。(对比:开发阶段,我们一般使用NFS来烧写rootfs)海思还提供了“烧写映像文件到NAND Flash”、“烧写映像文件到eMMC”的方法,但大同小异,只是命令和地址空间不同而已。因为所用的板子默认从SPI Flash启动,因此介绍烧写映像文件到SPI Flash的方法。
一、烧录uboot
假如没有烧录uboot,可以使用Hi_tool(/software/pc/Hi_TOOL目录下,效果类似于三星的DNW工具)来烧录uboot。使用Hi_tool时,需要先安装jre。
知识储备:
(1)DDR(64MB的SDRAM)的地址范围:80000000-83FFFFFF,地址范围是由手册查知的。
(2)一些命令含义
sf probe 0 (spiflash,probe表示查找探测,0表示板载spiflash(可能有多个,这里0表示编号);整句表示查找spiflash)
sf erase 0 100000 (擦除分区,0表示要擦除的起始地址,10000表示长度,这里刚好1M,和之前设置uboot长度1M相符)
sf write 82000000 0 100000(写spiflash分区,82000000表示源文件所在的SDRAM地址,后二者表示起始位置和长度)
mw.b 82000000 ff 100000(mw.b表示以字节为单位写内存,82000000表示起始地址,100000表示1M长度,ff表示全写成ff)
(2)烧写过程
a、将映像文件从上位机下载到开发板的sdram中
b、擦除开发板的spiflash相应的分区
c、将sdram的镜像烧录到spi的分区内
二、烧录uboot后
1、配置tftp服务器
2、参数配置
setenv serverip xx.xx.xx.xx
setenv ipaddr xx.xx.xx.xx
setenv ethaddr xx:xx:xx:xx:xx:xx
setenv netmask xx.xx.xx.xx
setenv gatewayip xx.xx.xx.xx
ping serverip,确保能够ping通,使得网络畅通。
3、在板载uboot界面中,烧写映像文件到SPI Flash(以16M SPI Flash为例)
从下图可以知道各文件的大小
(1)地址空间说明
| 1M | 3M | 12M |
|---------------|---------------|---------------|
| boot | kernel | rootfs |
分区 | 大小 | 起始地址 | 截止地址 |
bootloader | 1M | 0x00000000 | 0x00100000 |
kernel | 3M | 0x00100000 | 0x00400000 |
rootfs | 12M | 0x00400000 | 0x01000000 |
以下的操作均基于图示的地址空间分配,也可以根据实际情况进行调整,但注意对应。
(2)烧写u-boot
sf probe 0
mw.b 82000000 ff 100000
tftp 0x82000000 u-boot-hi3518ev200.bin
sf probe 0
sf erase 0 100000
sf write 82000000 0 100000
reset
(3)烧写内核
mw.b 82000000 ff 300000
tftp 82000000 uImage_hi3518ev200
sf probe 0
sf erase 100000 300000
sf write 82000000 100000 300000
(4)烧写文件系统
mw.b 82000000 ff C00000
tftp 0x82000000 rootfs_hi3518ev200_64k.jffs2
sf probe 0
sf erase 400000 C00000
sf write 82000000 400000 C00000
(5)设置启动参数
1)参数含义
sf probe 0,表示查找spiflash;
sf read 0x82000000 0x100000 0x300000,表示从spiflash的0x100000开始,读取长度为0x300000的内容,写到SDRAM以0x82000000开始的位置中;(从spiflash的kernel分区中读取kernel)
root=/dev/mtdblock2,表示根文件系统在第2个分区中(0,1,2);
mtdparts=hi_sfc:1024K(boot),3072K(kernel),12288K(rootfs),表示分区表(对比以前说过的、写死的、静态分区表,这里是传参的、动态的分区表,传参分区表优先级比静态分区表高)。
2)注意mem=32M,实际硬件是64M
硬件上的64M内存有两个用途,部分分给OS用,部分分给MPP使用。这里32M指的是OS使用的。
set bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000'
set bootargs 'mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1024K(boot),3072K(kernel),12288K(rootfs)'
save