[文章] 鸿蒙HarmonyOS烧录方法总结

2020-9-10 16:33:59  199 鸿蒙OS HarmonyOS
分享
4
本帖最后由 o_dream 于 2020-9-10 17:31 编辑

1.  烧录工具
理解HarmonyOS驱动框架,用户态APP和内核态驱动之间的通信机制。
HarmonyOS烧录使用的海思自研的烧录工具Hitool,使用起来相对来说比较简单。整体界面如下所示:
2.png

2.  烧录内容
烧录内容主要分为两部分,一部分是引导文件FASTBOOT。烧录,另一部分为项目文件烧录这些文件分别是:OHOS_Image.bin可执行文件,rootfs.img和useRFs.img镜像文件。

3.  烧录方法
本文以sample_test demo为例讲解烧录方法,开发板类型是Hi3516DV300。
烧录的第一步是打开Hitool工具,选择对应的芯片类型。如果你的开发板使用的是Hi3518ev300的,请选择对应的芯片。
3.png

3.1  串口烧录3.1.1   fastboot烧录
Hiburn请按照以下进行设置:
①  我手上用的开发板是Hi3516DV300的,它的外挂flash是spi nor类型的,你们自己的设置请根据实际情况确定。
②  本示例所用的外接设备,计算机识别成COM1,你们做开发时请设置成相应的端口号。
③  烧录方式选择fastboot。
4.png
5.png
Uboot所在目录(如果uboot不能正常启动,请从其他地方寻找相对老一点的版本uboot):
6.png
点击开始烧录,开发板电源拔掉并重新接上。
7.png
烧写成功后,打开终端,连接串口可以进入hisilion命令行。
8.png

3.1.2  应用文件烧录3.1.2.1  Hitool设置:
首先软件的设置如下图所示,请参考图例正确设置:
9.png
这里面比较重要的就是开始地址和文件长度的确定,这个部分的规则如下:
①   的Uboot占用了1M的存储空间,所以OHOS_Image.bin的开始地址是1M,
②  文件大小不足1M的取值1M,例如本示例中OHOS_Image.bin的大小是5656kb,Hiburn中它的长度设置为6M。所以rootfs.img烧录的起始地址是1M + 6M = 7M。
③  其余情况,以此类推。
本示例中,各文件长度如下图所示:
10.png

3.1.2.2 主轴
开始烧录前,首先先扩展打印信息的串口链接,把串口腾出来给烧录器使用。
11.png

3.1.2.3 开始烧录
16M的文件,用串口11500bps的烧写速度,是需要花费少量的,所以系统及应用文件的烧录一般不建议,请单击“烧写”,并给开发板重新上电,烧录就开始了。使用串口。
烧录过程截图:
12.png
烧写完成,耗时28分钟。
13.png

3.2  网口烧录
本示例网口烧录,硬件设备使用的是UGREEN的usb转RJ45网线接口,值得参考。
3.2.1  网口增加IP地址
首先为开发板互联网口添加IP地址:192.168.1.3,增加方法如下:
14.png
1.        控制面板中找到与单板连接的网卡,右键打开属性。
2.        选择Internet协议版本4(TCP / ipv4)。
3.        按图配置IP地址和网关。
4.        单击“确定”完成配置保存。

3.2.2 单板IP配置
单板与PC间连接串口后,将单板电,自动进入U-boot,按键盘“回车”键可在命令窗口输入命令,为单板配置192.168.1.10的IP地址,并指定192.168.1.3的服务器IP地址,命令如下。
setenvserverip 192.168.1.3
setenvipaddr 192.168.1.10
保存环境
配置完成后使用pri命令确认查看配置结果,如下图所示。
15.png
检查网络:在PC端使用ping命令确定单板与PC的网络,命令为“ ping 192.168.1.3”。
16.png

3.2.3断开串口
开始烧录前,首先先扩展打印信息的串口链接,把串口腾出来给烧录器使用。
17.png

3.2.4配置Hitool并烧录
Hitool配置如下,请参考。
18.png
配置完成后,点击烧录。烧录成功截图:
19.png

3.2.5网口烧录的命令分析
网口烧录的命令删除去中间的细节输出,整理如下所示:
start download process.

Boot started successfully!

Send command:       getinfo version
version: U-Boot 2016.11
[EOT](OK)

Send command:       sf probe 0//选择spi flash 0
[EOT](OK)

Send command:       getinfo spi
Block:64KB Chip:16MB*1
ID:0xC2 0x20 0x18
Name:"MX25L128XX"
[EOT](OK)
waiting phy ready, it will take 8s.
Send command:       setenv serverip 192.168.1.3
[EOT](OK)
Send command:       setenv ethaddr 00:8c:55:07:b0:88
[EOT](OK)
Send command:       setenv ipaddr 192.168.1.10
[EOT](OK)
Send command:       setenv netmask 255.255.255.0
[EOT](OK)
Send command:       setenv gatewayip 192.168.1.1
[EOT](OK)
         Tftpserver Download Home switched to <\\10.175.126.15\zhuanjia\zfdz\camera0825\out\ipcamera_hi3516dv300_liteos_a>
Send command:       mw.b 0x81000000 0xFF 0x590000//把内存中从0x81000000 开始的0x590000个字节全部置1
[EOT](OK)

Send command:       tftp 0x81000000 OHOS_Image.bin//把OHOS_Image.bin文档加载到内存中去,起始地址为0x81000000.
Hisilicon ETH net controler
eth0 : phy status change : LINK=UP :DUPLEX=FULL : SPEED=100M
Using eth0 device
TFTP from server 192.168.1.3; our IPaddress is 192.168.1.10
Filename 'OHOS_Image.bin'.
Load address: 0x81000000
Bytes transferred = 5791744 (586000 hex)
[EOT](OK)

Send command:       crc32 81000000 586000
crc32 for 81000000 ... 81585fff ==>78b90ed7
[EOT](OK)
Send command:       sf probe 0//选择spi flash 0
[EOT](OK)
Send command:       sf erase 0x100000 0x600000//把flash存储器中从0x100000开始的6M字节的存储空间清零。
Send command:       sf write 0x81000000 0x100000 0x590000//把内存中从0x81000000开始的0x590000字节的内容copy到flash中,flash中存储的起始地址是0x100000
device 0 offset 0x100000, size 0x590000
Send command:       mw.b 0x81000000 0xFF 0x780000//把内存中从0x81000000 开始的0x780000个字节全部置1

[EOT](OK)
Send command:       tftp 0x81000000 rootfs.img//加载rootfs.img到内存中去,存储单位的起始地址是0x81000000
Hisilicon ETH net controler
eth0 : phy status change : LINK=UP :DUPLEX=FULL : SPEED=100M
Using eth0 device
TFTP from server 192.168.1.3; our IPaddress is 192.168.1.10
Filename 'rootfs.img'.
Send command:       crc32 81000000 772314
crc32 for 81000000 ... 81772313 ==>ba26d341
[EOT](OK)
Send command:       sf probe 0//选择spi flash 0
[EOT](OK)
Send command:       sf erase 0x700000 0x800000//把flash存储器中从0x700000开始的8M字节的存储空间清零。
Send command:       sf write 0x81000000 0x700000 0x780000//把内存中从0x81000000开始的0x780000字节的内容copy到flash中,flash中存储的起始地址是0x700000
device 0 offset 0x700000, size 0x780000
Send command:       mw.b 0x81000000 0xFF 0x10000//把内存中从0x81000000 开始的0x10000个字节全部置1

[EOT](OK)
Send command:       tftp 0x81000000 userfs.img//加载userfs.img到内存中去,存储单位的起始地址是0x81000000
Hisilicon ETH net controler
eth0 : phy status change : LINK=UP :DUPLEX=FULL : SPEED=100M
Using eth0 device
TFTP from server 192.168.1.3; our IPaddress is 192.168.1.10
Filename 'userfs.img'.
Load address: 0x81000000
Loading: *##
          0 Bytes/s
done
Bytes transferred = 3020 (bcc hex)
[EOT](OK)
Send command:       crc32 81000000 bcc
crc32 for 81000000 ... 81000bcb ==>0361fc92
[EOT](OK)
Send command:       sf probe 0//选择spi flash 0
[EOT](OK)
Send command:       sf erase 0xf00000 0x100000//把flash存储器中从0xF00000开始的1M字节的存储空间清零。
Send command:       sf write 0x81000000 0xf00000 0x10000//把内存中从0x81000000开始的0x10000字节的内容copy到flash中,flash中存储的起始地址是0xf00000
device 0 offset 0xf00000, size 0x10000
Writing at 0xf10000 -- 100% complete.
SF: 65536 bytes @ 0xf00000 Written: OK
[EOT](OK)
Partition burnt successfully!
Send command:       reset
reset success!
Partition burnt completed!
Serial channels were closed successfully.

3.3 USB烧录
硬件使用的双母口USB线。

3.3.1 Hitool工具配置
20.png
文件目录中只要包含OHOS_Image.bin,rootfs.img,userfs.img三个文件即可,不限定位置。
烧写方式一定要选择DDR烧写。

3.3.2烧录步骤:3.3.2.1烧录OHOS_Image.bin文件
在串口终端中输入以下命令,每条命令的具体含义请参考网口烧录相关部分的描述:
mw.b 0x80000000 0xff 0x600000; // 0x600000 就是OHOS_Image.bin 所占的空间(取整)
usbtftp 0x80000000 OHOS_Image.bin;
sf探针0; sf擦除0x100000 0x600000; sfwrite 0x80000000 0x100000 0x600000; // 起始地址为0x100000
如果是Hi3518ev300的板子,请把命令中的0x80000000改成0x40000000。
21.png

3.3.2.2烧录rootfs.img文件
在串口终端中输入以下命令,每条命令的具体含义请参考网口烧录相关部分的描述:
mw.b 0x80000000 0xff 0x800000; // 0x800000 就是rootfs.img 所占的空间(取整)
usbtftp 0x80000000 rootfs.img;
sf探针0; sf擦除0x700000 0x800000; sfwrite 0x80000000 0x700000 0x800000; // 起始地址为0x100000 + 0x600000 = 0x700000
如果是Hi3518ev300的板子,请把命令中的0x80000000改成0x40000000。
22.png

3.3.2.3烧录userfs.img文件
在串口终端中输入以下命令,每条命令的具体含义请参考网口烧录相关部分的描述:
mw.b 0x80000000 0xff 0x100000; // 0x100000 就是userfs.img 所占的空间(取整)
usbtftp 0x80000000 userfs.img;
sf探针0; sf擦除0xf00000 0x100000; sfwrite 0x80000000 0xf00000 0x100000; // 起始地址为0x100000 + 0x600000 + 0x800000 = 0xf00000
如果是Hi3518ev300的板子,请把命令中的0x80000000改成0x40000000。
23.png

3.3.2.4烧录过程中控制台信息
24.png

4.开源板emmc烧录
烧录的时候,选择eMMC方式。我们这里选择通过网口烧录eMMC,网口的配置参考上文。
25.png

烧录完成之后,uboot的启动命令还有所不同,在eMMC中,存储以512B为单位的,如果我们的文件(通常是OHOS_Image.bin)大小为6M(10进制),我们需要把它转换成16进制,具体转换的公式如下:
10二进制中文件总大小:6 * 1024 * 1024 Byte = 6291456Byte,那么总共是多少个512KB的块呢?我们用6291456/512 = 12288个块(十进制),再把十进制中的12288个块转换成16二进制,得0x3000。那么最初一共有0x3000个512Byte的块。
setenv bootcmd“ sf探针0; mmc读取0x0 0x80000000 0x800 0x3000;”;
setenv bootargs“控制台= ttyAMA0,115200n8 root = emmc fstype = vfat rootaddr = 7M rootsize = 15Mrw”; saveenv;

5.不同烧录方法之间的比较
Usb烧录方式和网口烧录方式想象,不同之处比较如下:
  
烧录方式
  
  
文件导入命令
  
  
内存起始地址
  
  
命令输入方式
  
  
校正证据
  
  
USB烧录
  
  
usbtftp
  
  
0x80000000
  
  
手工的
  
  
  
  
网口烧录
  
  
ftp
  
  
0x81000000
  
  
自动
  
  
  
网口烧录和USB烧录的速度基本是相同的,大约在串口烧录就太慢了,所以正常情况下不推荐串口烧录。
综上比较,只从效率的角度看,烧录器的选择优先级为:
网口烧录> USB 烧录> 串口烧录

6.其他问题
我们现在用的开发板Flash只有16M,如果程序过大,则无法进行烧录。所以做项目的时候,外挂的flash会大一些,留有足够的预备空间。

注:文档和视频中所有的图片及代码截图皆为示意图,具体以HarmonyOS官网发布内容为准。

文章来源:张飞实战电子
颜刚YanG 2020-9-10 17:18:29
可以学习了 ,楼主转载了哈
回复

举报

评论

您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发文章