目录
问题的由来
润和HarmonyOS鸿蒙开发板 HiSpark AI Camera开发套件(下图)是OpenHarmony的小型设备和标准设备的代表,基于华为海思Hi3516DV300芯片,支持Linux、LiteOS、鸿蒙OS,实现图像采集识别。OpenHarmony的ipcamea_hispark_taurus、ipcamera_hispark_taurus_linux和hispark_taurus_standard都是针对这款板子设计的。
润和还有另一套开发板Taurus HCIP 认证套件(下图),这款开发板的配置和AI Camera开发套件非常类似,板子上甚至印着AI Camera 2.0的字样。两个开发板有一个明显的区别:AI Camera开发套件是由4块小板组成的,而HCIP 认证套件是由一块开发板组成的。
在润和的网站上,只有AI Camera开发套件的技术资料,而没有 HCIP 认证套件的资料。原本我们认为两块开发板只是结构上的不同,两块板子的程序是兼容的。但是在测试中我们发现其实两块板子还是有一些差别的,在华为和润和工程师的帮助下,终于使OpenHarmony的程序在HCIP 认证套件上运行了起来,今天把相关的过程记录一下。
烧写问题
刚开始我们下载了OpenHarmony 3.1的官方代码,编译之后直接使用DevEco Device Tool进行烧写,发现烧写失败,采用Hitool烧写,发现也是失败的。失败的现象在我的另一篇博客中有详细说明。之所以会出现烧写失败,是因为官方代码中的U-Boot在HCIP 认证套件上会死机,无法启动,而海思的镜像烧写工具是先烧写U-Boot,然后启动U-Boot,再利用U-Boot的mmc write烧写其他的分区。U-Boot无法启动就意味着烧写不会成功。在另一篇博客中也说了,利用厂商提供的u-boot_hi3516_ytb_3.1.bin文件替代官方的UBoot文件,就可以正常启动U-Boot并烧写成功其他分区的镜像。
启动问题
我们使用厂商提供的U-Boot和Linux镜像对硬件进行了测试,发现其功能基本正常。然后就编译了ipcamea_hispark_taurus,这是基于LiteOS-A的小型设备代码,但是发现烧写后的程序无法启动,问题如下:
System startup
Uncompress Ok!
U-Boot 2020.01 (Nov 09 2022 - 11:01:28 +0800)hi3516dv300
DRAM: MMC:
EMMC/MMC/SD controller initialization.
scan edges:2 p2f:6 f2p:8
mix set temp-phase 3
scan elemnts: startp:117 endp:107
Tuning SampleClock. mix set phase:[03/07] ele:[7d/15]
MMC/SD Card:
MID: 0x15
Read Block: 512 Bytes
Write Block: 512 Bytes
Chip Size: 7456M Bytes (High Capacity)
Name: "8GTF4"
Chip Type: MMC
Version: 0.0
Speed: 100000000Hz
Bus Width: 4bitEMMC/MMC/SD controller initialization.
Card did not respond to voltage select!
mmc_init failed! err:-95
No SD device found !
himci: 0 (eMMC), himci: 1
Loading Environment from MMC... OK
In: serial
Out: serial
Err: serial
@@@ 5 blocks read: OK
@@@ g_isRecovery = 0
@@@ bootArgs from misc = mem=640M console=ttyAMA0,115200 mmz=anonymous,0,0xA8000000,384M clk_ignore_unused androidboot.selinux=permissive skip_initramfs rootdelay=10 hardware=Hi3516DV300 default_boot_device=soc/10100000.himci.eMMC init=/init root=/dev/ram0 blkdevparts=mmcblk0:1M(boot),15M(kernel),20M(updater),2M(misc),3307M(system),256M(vendor),-(userdata)
@@@ 1 blocks read: OK
@@@ bootArgs final from emmc = console=ttyAMA0,115200n8 root=emmc fstype=vfat rw rootaddr=10M rootsize=30M
Unable to use mmc for fat
Net: eth0
Error: eth0 address not set.Hit any key to stop autoboot: 0
MMC read: dev # 0, block # 2048, count 18432 ... 18432 blocks read: OK
45.27 MB/s
Wrong Image Format for bootm command
ERROR: can't get kernel image!
hisilicon #
从日志可以看出,U-Boot启动后无法加载内核镜像,显示“Wrong Image Format for bootm command”。
经过与厂商的讨论和反复尝试,厂商提供的u-boot_hi3516_ytb_3.1.bin是用于ipcamera_hispark_taurus_linux(Linux内核),u-boot-hi3516dv300-4L.bin用于ipcamea_hispark_taurus(LiteOS-A内核)。之所以会出现这个问题,是因为两个U-Boot版本所支持的分区格式不同,u-boot_hi3516_ytb_3.1.bin无法识别LiteOS-A所使用的vfat格式。
除了u-boot,其他模块都是用官方代码编译的。
总结
AI Camera开发套件和 HCIP 认证套件虽然非常相似,但是现在看还是有一些重要的区别导致U-Boot不兼容。当初采购 HCIP 认证套件是因为它便宜300块钱,但是没有想到遇到这么多麻烦。厂商的技术人员平时都是使用ipcamera_hispark_taurus_linux,所以他们对ipcamea_hispark_taurus也不太熟悉,所以我们以后的工作也会主要基于ipcamera_hispark_taurus_linux,否则出了问题,厂商也不能提供有力的支持。