摘要
- 介绍了使用海思 CPU 的机顶盒的固件备份和烧录。通过 USB-TTL 串口烧录器 CH340 连接机顶盒,使用华为海思刷机工具 HiTool 创建和修改分区表文件,备份和烧写固件,通过升级包升级系统。
前提要求
- 软件:华为海思刷机工具HiTool,电视机顶盒工具开心电视助手(非必需)。
- 硬件:电脑,USB-TTL 串口烧录器 CH340,U 盘。
获取系统信息
- 使用网线将接机顶盒和电脑连接到网络,使用导线连接机顶盒和 USB-TTL 串口烧录工具。
- 打开HiTool后点击HiBurn。
- 设置PC 与板端配置参数。设置 本地 PC 配置下的串口 和 服务器 IP,板端配置下的IP 地址 和网关。串口 为 USB-TTL 串口烧录器所使用的端口号(查看方式:控制面板 -> 设备管理器 -> 端口(COM 和 LPT)),服务器 IP 为电脑的 IP 地址。 IP 地址 为机顶盒的 IP 地址,网关一般保持默认即可 。传输方式 选择 网口(推荐)。
- 获取中央处理器型号和管脚配置表。点击 打开终端工具 ,然后点击连接,最后给机顶盒上电。启动信息中的
Reg Name
包含管脚配置表、中央处理器型号、内存规格、PCB 板层数、闪存类型。
- 查看分区表。对于型号为
CM211-2
且 CPU 为Hi3798MV300H
的机顶盒,启动信息中会显示分区表信息。而对于型号为HG680-j
且 CPU 为Hi3798MV100
的机顶盒,启动信息中不会显示分区表,需要执行cat /proc/cmdline
命令查看分区表信息。
- 查看挂载信息。执行
mount
命令查看系统中所有的挂载文件系统。
- 查看闪存块分区。对于型号为
CM211-2
机顶盒,执行cd /dev/block/platform/soc/by-name
和ls -al
命令查看闪存块分区所指向的分区名。而对于型号为HG680-j
机顶盒,执行cd /dev/block/platform/hi_mci.1/by-name
和ls -al
命令查看闪存块分区所指向的分区名。对于其它机顶盒,可在/dev/block/platform
下的目录的子目录中寻找by-name
文件夹。
- 查看文件系统信息。执行
df
命令查看系统中分区的大小和使用量。
- 根据系统中分区的使用量,清理无用信息为数据备份做准备。软件卸载可使用开心电视助手软件,此软件还可以便捷的获取分区表、挂载信息、文件系统信息等。
创建和修改分区表
- 设置芯片型号。点击芯片 -> 切换芯片 -> Hi3798MV100 。
- 点击 烧写 eMMC,点击表格右侧的绿色的加号以创建新的分区。
- 点击名称项,根据
分区表
输入分区名,并遵循闪存块分区
中的区块顺序(从mmcblk0p1
到mmcblk0p17
)。 - 点击文件项里面的右侧的文件夹图标(选中时出现),在弹出的对话框中选择文件路径并在输入文件名后点击打开,建议文件名与分区名一致。
- 点击长度项,根据
分区表
设置对应分区的大小。 - 点击文件系统项,根据
挂载信息
选择对应分区的文件系统。此项只影响烧录的速度。 - 勾选要操作的分区前面的复选框。
- 点击
eMMC分区表文件
右侧的浏览,在弹出的对话框中选择文件路径并在输入文件名后点击打开,然后点击保存。建议文件名包含设备的 CPU 型号和闪存类型。
备份固件
方法一:TTL+HiTool
- 在创建和修改分区表的最后一步点击上载。
- 弹出对话框后关闭机顶盒电源。
- 开启机顶盒电源。
- 等待对话框中的上载的进度条结束。
方法二:TTL+U 盘
- 点击 打开终端工具 ,然后点击连接,最后给机顶盒上电。
- 执行
df
命令查看系统中分区的使用情况。 - 插入 U 盘(FAT32 格式)后执行
df
命令查看系统中分区的使用情况,新出现的/mnt/sda/sda1
表示 U 盘挂载成功。 - 执行
cd /dev/block/platform/soc/by-name
和ls -al
命令查看闪存块分区所指向的分区名。root@Hi3798MV300:/ # cd /dev/block/platform/soc/by-name root@Hi3798MV300:/dev/block/platform/soc/by-name # ls -al lrwxrwxrwx root root 1970-01-01 08:00 baseparam -> /dev/block/mmcblk0p5 lrwxrwxrwx root root 1970-01-01 08:00 boot -> /dev/block/mmcblk0p9 lrwxrwxrwx root root 1970-01-01 08:00 cache -> /dev/block/mmcblk0p14 lrwxrwxrwx root root 1970-01-01 08:00 fastboot -> /dev/block/mmcblk0p1 lrwxrwxrwx root root 1970-01-01 08:00 fastplay -> /dev/block/mmcblk0p8 lrwxrwxrwx root root 1970-01-01 08:00 logo -> /dev/block/mmcblk0p7 lrwxrwxrwx root root 1970-01-01 08:00 misc -> /dev/block/mmcblk0p10 lrwxrwxrwx root root 1970-01-01 08:00 partition -> /dev/block/mmcblk0p2 lrwxrwxrwx root root 1970-01-01 08:00 pqparam -> /dev/block/mmcblk0p6 lrwxrwxrwx root root 1970-01-01 08:00 recovery -> /dev/block/mmcblk0p3 lrwxrwxrwx root root 1970-01-01 08:00 securestore -> /dev/block/mmcblk0p12 lrwxrwxrwx root root 1970-01-01 08:00 swdb -> /dev/block/mmcblk0p13 lrwxrwxrwx root root 1970-01-01 08:00 swdevinfo -> /dev/block/mmcblk0p4 lrwxrwxrwx root root 1970-01-01 08:00 system -> /dev/block/mmcblk0p15 lrwxrwxrwx root root 1970-01-01 08:00 trustedcore -> /dev/block/mmcblk0p11 lrwxrwxrwx root root 1970-01-01 08:00 userdata -> /dev/block/mmcblk0p16
- 执行
cd /mnt/sda/sda1
命令以切换当前工作目录为/mnt/sda/sda1
,执行mkdir FW_BK
命令以在当前工作目录创建名为FW_BK
的文件夹。 - 使用下面的
dd
命令备份分区。对于比较大的分区,应执行dd if=/dev/block/platform/soc/by-name/userdata | gzip > /mnt/sda/sda1/FW_BK/userdata.bin.gz
命令以先压缩后输出。dd if=/dev/block/platform/soc/by-name/fastboot of=/mnt/sda/sda1/FW_BK/fastboot.bin dd if=/dev/block/platform/soc/by-name/partition of=/mnt/sda/sda1/FW_BK/partition.bin dd if=/dev/block/platform/soc/by-name/recovery of=/mnt/sda/sda1/FW_BK/recovery.bin dd if=/dev/block/platform/soc/by-name/swdevinfo of=/mnt/sda/sda1/FW_BK/swdevinfo.bin dd if=/dev/block/platform/soc/by-name/baseparam of=/mnt/sda/sda1/FW_BK/baseparam.bin dd if=/dev/block/platform/soc/by-name/pqparam of=/mnt/sda/sda1/FW_BK/pqparam.bin dd if=/dev/block/platform/soc/by-name/logo of=/mnt/sda/sda1/FW_BK/logo.bin dd if=/dev/block/platform/soc/by-name/fastplay of=/mnt/sda/sda1/FW_BK/fastplay.bin dd if=/dev/block/platform/soc/by-name/boot of=/mnt/sda/sda1/FW_BK/boot.bin dd if=/dev/block/platform/soc/by-name/misc of=/mnt/sda/sda1/FW_BK/misc.bin dd if=/dev/block/platform/soc/by-name/trustedcore of=/mnt/sda/sda1/FW_BK/trustedcore.bin dd if=/dev/block/platform/soc/by-name/securestore of=/mnt/sda/sda1/FW_BK/securestore.bin dd if=/dev/block/platform/soc/by-name/swdb of=/mnt/sda/sda1/FW_BK/swdb.bin dd if=/dev/block/platform/soc/by-name/cache of=/mnt/sda/sda1/FW_BK/cache.bin dd if=/dev/block/platform/soc/by-name/system of=/mnt/sda/sda1/FW_BK/system.bin dd if=/dev/block/platform/soc/by-name/userdata of=/mnt/sda/sda1/FW_BK/userdata.bin
烧录固件
方法一:TTL+HiTool
- 解压系统固件包
TTL-hi3798mv100-202301.zip
。 - 点击
eMMC分区表文件
右侧的浏览,在弹出的对话框中选择海纳思系统固件包中的 eMMC 分区表文件后点击打开。 - 勾选需要烧录的分区前面的复选框。
- 点击烧写。
- 弹出对话框后关闭机顶盒电源。
- 开启机顶盒电源。
- 等待对话框中的烧写的进度条结束。
方法二:TTL+U 盘
- 点击 打开终端工具 ,然后点击连接,最后给机顶盒上电。
- 执行
df
命令查看系统中分区的使用情况。 - 插入 U 盘(FAT32 格式)后执行
df
命令查看系统中分区的使用情况,新出现的/mnt/sda/sda1
表示 U 盘挂载成功。 - 执行
cd /dev/block/platform/soc/by-name
和ls -al
命令查看闪存块分区所指向的分区名。root@Hi3798MV300:/ # cd /dev/block/platform/soc/by-name root@Hi3798MV300:/dev/block/platform/soc/by-name # ls -al lrwxrwxrwx root root 1970-01-01 08:00 baseparam -> /dev/block/mmcblk0p5 lrwxrwxrwx root root 1970-01-01 08:00 boot -> /dev/block/mmcblk0p9 lrwxrwxrwx root root 1970-01-01 08:00 cache -> /dev/block/mmcblk0p14 lrwxrwxrwx root root 1970-01-01 08:00 fastboot -> /dev/block/mmcblk0p1 lrwxrwxrwx root root 1970-01-01 08:00 fastplay -> /dev/block/mmcblk0p8 lrwxrwxrwx root root 1970-01-01 08:00 logo -> /dev/block/mmcblk0p7 lrwxrwxrwx root root 1970-01-01 08:00 misc -> /dev/block/mmcblk0p10 lrwxrwxrwx root root 1970-01-01 08:00 partition -> /dev/block/mmcblk0p2 lrwxrwxrwx root root 1970-01-01 08:00 pqparam -> /dev/block/mmcblk0p6 lrwxrwxrwx root root 1970-01-01 08:00 recovery -> /dev/block/mmcblk0p3 lrwxrwxrwx root root 1970-01-01 08:00 securestore -> /dev/block/mmcblk0p12 lrwxrwxrwx root root 1970-01-01 08:00 swdb -> /dev/block/mmcblk0p13 lrwxrwxrwx root root 1970-01-01 08:00 swdevinfo -> /dev/block/mmcblk0p4 lrwxrwxrwx root root 1970-01-01 08:00 system -> /dev/block/mmcblk0p15 lrwxrwxrwx root root 1970-01-01 08:00 trustedcore -> /dev/block/mmcblk0p11 lrwxrwxrwx root root 1970-01-01 08:00 userdata -> /dev/block/mmcblk0p16
- 使用下面的
dd
命令烧录分区。备份的固件所在的位置为FW_BK
文件夹。对于比较大的分区,应执行gzip -dc /mnt/sda/sda1/FW_BK/userdata.bin.gz | dd of=/dev/block/platform/soc/by-name/userdata
命令以先解压后输出。dd if=/mnt/sda/sda1/FW_BK/fastboot.bin of=/dev/block/platform/soc/by-name/fastboot dd if=/mnt/sda/sda1/FW_BK/partition.bin of=/dev/block/platform/soc/by-name/partition dd if=/mnt/sda/sda1/FW_BK/recovery.bin of=/dev/block/platform/soc/by-name/recovery dd if=/mnt/sda/sda1/FW_BK/swdevinfo.bin of=/dev/block/platform/soc/by-name/swdevinfo dd if=/mnt/sda/sda1/FW_BK/baseparam.bin of=/dev/block/platform/soc/by-name/baseparam dd if=/mnt/sda/sda1/FW_BK/pqparam.bin of=/dev/block/platform/soc/by-name/pqparam dd if=/mnt/sda/sda1/FW_BK/logo.bin of=/dev/block/platform/soc/by-name/logo dd if=/mnt/sda/sda1/FW_BK/fastplay.bin of=/dev/block/platform/soc/by-name/fastplay dd if=/mnt/sda/sda1/FW_BK/boot.bin of=/dev/block/platform/soc/by-name/boot dd if=/mnt/sda/sda1/FW_BK/misc.bin of=/dev/block/platform/soc/by-name/misc dd if=/mnt/sda/sda1/FW_BK/trustedcore.bin of=/dev/block/platform/soc/by-name/trustedcore dd if=/mnt/sda/sda1/FW_BK/securestore.bin of=/dev/block/platform/soc/by-name/securestore dd if=/mnt/sda/sda1/FW_BK/swdb.bin of=/dev/block/platform/soc/by-name/swdb dd if=/mnt/sda/sda1/FW_BK/cache.bin of=/dev/block/platform/soc/by-name/cache dd if=/mnt/sda/sda1/FW_BK/system.bin of=/dev/block/platform/soc/by-name/system dd if=/mnt/sda/sda1/FW_BK/userdata.bin of=/dev/block/platform/soc/by-name/userdata
升级固件
- 方法一:使用 TTL+HiTool+U 盘。烧写
recovery
到recovery
,烧写emmc
到misc
,然后重启机顶盒以进入恢复模式,最后在恢复模式中选择apply update from external storage
后选择 U 盘中的update.zip
刷机包进行刷机。 - 方法二:使用 TTL+U 盘或者ADB+U 盘。使用
dd
命令输出recovery
到recovery
,emmc
到misc
,然后执行reboot
命令以重启进入恢复模式,最后在恢复模式中选择apply update from external storage
后选择 U 盘中的update.zip
刷机包进行刷机。 - 方法三:使用ADB或TTL或TTL+HiTool烧写
recovery
后安装原生版本的设置
软件包,进入原生版本的设置后选择本地升级以升级系统。升级包必须被命名为update.zip
并位于 U 盘的根目录。软件包一般被命名为SWProductCheck.apk
,可在卡刷救砖相关教程中搜寻。 - 方法四:把
fastboot.bin
、bootargs.bin
、recovery.img
三个文件复制到U盘根目录。短接强制刷机的短接点,然后打开机顶盒的电源,等待几秒后松开短接。机顶盒就会加载U 盘中的fastboot.bin
并引导 U 盘中的recovery.img
进入恢复模式,最后在恢复模式中选择apply update from external storage
后选择 U 盘中的update.zip
刷机包进行刷机。 - 方法五:把
fastboot.bin
、bootargs.bin
、recovery.img
三个文件复制到U盘根目录。使用ADB或TTL或TTL+HiTool擦除fastboot.bin
分区。重启后机顶盒就会加载U 盘中的fastboot.bin
并引导 U 盘中的recovery.img
进入恢复模式,最后在恢复模式中选择apply update from external storage
后选择 U 盘中的update.zip
刷机包进行刷机。
注意事项
- 关于芯片型号:魔百盒 CM211-2 的 CPU 型号有 MV100、MV300、MV300H。实际的 CPU 型号以
reg name
中包含 CPU 型号或芯片本身的丝印为准。 - 关于
reg name
:芯片待烧录固件的fastboot
中的reg name
与机顶盒现有的fastboot
中的reg name
在管脚配置表和中央处理器型号上应保持一致,否则无法烧录fastboot
。启动信息中显示的reg name
仅供参考,实际的管脚配置表以机顶盒现有的fastboot
中的reg name
包含的管脚配置表为准。
- 关于HiBurn中的传输方式:无论传输方式选择串口还是网口,烧写
fastboot
时,实际上都是通过串口来传输数据,因此非常慢。 - 关于HiBurn中的文件系统:如果实际上存在文件系统但软件中的文件系统被设置为
none
时,在进行烧写操作时,分区镜像将会以二进制的形式进行传输;如果设置为一个确定的文件系统,如ext3/4
时,在进行烧写操作时,分区镜像将会以压缩包的形式进行传输,即对镜像先压缩后传输,最后解压并写入分区。因此,在进行烧写操作时,设置文件系统可以减少分区镜像传输所需要的时间,最终加快总体的烧写速度。对于上载操作,无论是否设置软件中的文件系统,上载的分区镜像总是以二进制的形式进行传输,不会改变上载速度。 - 关于压缩:
userdata
分区的镜像大小会超过 4GB,超过 FAT32 文件系统限制,所以需要压缩。在使用dd
命令时,结合分区的大小和使用量来决定是否进行压缩可以有效的节省空间占用和传输时间。 - 关于终端内容被覆盖丢失:点击窗口 -> 首选项 ,点击终端后修改终端缓存行数。
- 关于使用 HiTool 烧录和备份固件失败:点击窗口 -> 首选项,然后点击HiBurn,修改TFTP设置和命令设置。根据控制台的报错信息来修改对应的参数。有时重新操作一次也会恢复正常。