以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、概述
因为所用的板子默认从SPI Flash启动,因此本文主要讲如何“使用tftp,烧写映像文件(uboot、kernel、rootfs)到SPI Flash”。另外海思还提供了“烧写映像文件到NAND Flash或者eMMC”的方法,但大同小异,只是命令和地址空间不同而已。
二、烧录uboot
(1)假如还没有烧录uboot,可以在PC端使用Hi_tool工具(/software/pc/Hi_TOOL目录下,效果类似于三星的DNW工具)来烧录uboot。
(2)使用Hi_tool时,需要先安装jre。
(3)烧写过程:
a、将映像文件从上位机下载到开发板的SDRAM中(即内存)。
b、擦除开发板的spiflash相应的分区。
c、将SDRAM中的镜像烧录到spi的分区内。
三、烧录uboot后
1、配置tftp服务器
(1)配置tftp服务器,见博客https://xiefor100.blog.csdn.net/article/details/125572043。
(2)将SDK中的/package/image_uclibc_hi3518ev200下的相关映像文件(这是SDK提供的已经制作好的镜像文件)拷贝到tftp服务器目录(我的是/tftpboot/)下。
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/package/image_uclibc_hi3518ev200# ls rootfs_hi3518ev200_128k.jffs2 rootfs_hi3518ev200_2k_128k_32M.img rootfs_hi3518ev200_32M.ext4 u-boot-hi3518ev200.bin rootfs_hi3518ev200_256k.jffs2 rootfs_hi3518ev200_2k_4bit.yaffs2 rootfs_hi3518ev200_64k.jffs2 uImage_hi3518ev200 root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/package/image_uclibc_hi3518ev200# cp u-boot-hi3518ev200.bin /tftpboot/ root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/package/image_uclibc_hi3518ev200# cp rootfs_hi3518ev200_64k.jffs2 /tftpboot/ root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/package/image_uclibc_hi3518ev200# cp uImage_hi3518ev200 /tftpboot/ root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/package/image_uclibc_hi3518ev200#
2、uboot的参数配置
(1)设置uboot的serverip(即tftp服务器的ip)、ipaddr(开发版ip)和ethaddr(开发板的MAC地址)、netmask、gatewayip,使得与tftp服务器同一网段。
(2)然后在开发板上ping虚拟机,确保能够ping通,使得网络畅通。
3、在uboot控制台中,烧写映像文件到SPI Flash
(1)执行“du -h *”得知待烧录的各文件的大小如下。
root@ubuntu:/tftpboot# ls rootfs_hi3518ev200_64k.jffs2 u-boot-hi3518ev200.bin uImage_hi3518ev200 root@ubuntu:/tftpboot# du -h * 4.8M rootfs_hi3518ev200_64k.jffs2 268K u-boot-hi3518ev200.bin 2.6M uImage_hi3518ev200 root@ubuntu:/tftpboot# du 7784 . root@ubuntu:/tftpboot#
(2)spiflash的地址空间如下,以下的烧写操作均基于该表格的地址空间分配,也可以根据实际情况进行调整。
分区 大小 起始地址 截止地址 bootloader 1M 0x00000000 0x00100000 kernel 3M 0x00100000 0x00400000 rootfs 12M 0x00400000 0x01000000 另外,由手册查知开发板的内存(64MB的SDRAM)的地址范围是80000000~83FFFFFF。
(3)烧写u-boot
在uboot控制台上分条执行以下指令。其表示从虚拟机中下载uboot镜像到以地址0x82000000开始的内存中,然后再从内存中读取数据写到spiflash中。
sf probe 0 mw.b 82000000 ff 100000 tftp 0x82000000 u-boot-hi3518ev200.binsf probe 0 sf erase 0 100000 sf write 82000000 0 100000 reset
注意,重启后要设置环境变量serverip、ipaddr为同一网段并save。
set serverip '192.168.1.141' set ipaddr '192.168.1.88' save
(4)烧写内核
在uboot控制台上分条执行以下指令。
mw.b 82000000 ff 300000 tftp 82000000 uImage_hi3518ev200sf probe 0 sf erase 100000 300000 sf write 82000000 100000 300000
(5)烧写文件系统
在uboot控制台上分条执行以下指令。
mw.b 82000000 ff C00000 tftp 0x82000000 rootfs_hi3518ev200_64k.jffs2sf probe 0 sf erase 400000 C00000 sf write 82000000 400000 C00000
(6)设置启动参数
在uboot控制台上分条执行以下指令。注意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
4、上述指令含义
sf probe 0
- 整句表示查找spiflash。
- sf表示spiflash,probe表示查找,0表示板载spiflash的编号(可能有多个,这里0表示编号)。
sf erase 0 100000
- 整句表示擦除uboot分区。
- 0表示要擦除的起始地址,(16进制的)100000表示长度,这里刚好1M,和设置uboot长度1M相符。
sf write 82000000 0 100000
- 整句表示将数据从SDRAM烧写到spiflash。
- 82000000表示源文件所在的SDRAM地址,后二者表示起始位置和长度。
mw.b 82000000 ff 100000
- mw.b表示以字节为单位写内存。
- 82000000表示写内存时的起始地址,100000表示要写1M长度,ff表示内存的每个字节都写成1111_1111。
sf read 0x82000000 0x100000 0x300000
- 整句表示从spiflash的kernel分区中读取kernel。
- 表示从spiflash的0x100000开始,读取长度为0x300000的内容,写到SDRAM以0x82000000开始的位置中。
root=/dev/mtdblock2
- 表示根文件系统在第2个分区。
mtdparts=hi_sfc:1024K(boot),3072K(kernel),12288K(rootfs)
- 表示分区表。
- 对比uboot移植专栏中写死的、静态分区表,这里是传参的、动态的分区表。传参分区表优先级比静态分区表高。