J6X 支持的存储介质
====================

J6X支持的存储介质包括：emmc、Nor flash和ufs。

存储介质共存情况
-------------------

emmc和ufs可以同时接入到同一个板子中，但是刷写时，不能同时刷写。

硬件环境检查
===============

串口环境检查
---------------

J6X 使用uart作为控制/启动串口，刷写前需要首先确认uart
已经以正确的方式连接到了电脑。

网络环境检查
----------------

网络环境的配置请根据 J6X
的实际的网络拓扑结构，再参考 :ref:`网络设置 <network_config>` 章节内容来完成
IP 设置以及检查。

刷写方法
===========

.. <!-- Hbupdate
.. -----------

.. @TODO: 请参考专门的文档：:doc:`J6X升级工具使用指南 <../../pc_tools/download_tool/index>` -->

Fastboot
--------------

以上的所有存储介质都可以通过 fastboot 命令来刷写。

进入fastboot模式
~~~~~~~~~~~~~~~~~~~~~

重启开发板，在uboot倒计时结束前，ENTER打断，进入uboot命令行，执行fastboot命令：

::

   Hobot$ fastboot xxx


Fastboot版本
~~~~~~~~~~~~~~~~

.. note::

   早期版本的 fastboot 版本对 udp 的支持比较差，需要使用高版本的fastboot。

   建议版本：29.0.6 以及之后的版本

   fastboot version 29.0.6-6198805

切换刷写介质
~~~~~~~~~~~~~~~

J6X fastboot 支持同时刷写emmc/ufs和nor flash，可以在服务器端通过如下命令来切换：

.. code:: bash

   # emmc/ufs
   fastboot oem interface:blk
   # nor flash
   fastboot oem interface:mtd

刷写ufs时，Matrix6 E/M需要额外焊电阻，把R1712上的电阻焊接到R1711上：

.. image:: ./media/image1.jpg

单分区刷写命令
~~~~~~~~~~~~~~~~~

服务器端执行：

::

   fastboot flash boot_a ${image_base}/boot.img

全部刷写
~~~~~~~~~~~

J6X源码参考 :doc:`Build与生成镜像 <../build/j6_sysdev_build>` 整编之后，会在$HR_TOP_DIR/out/debug-gcc_12.2-64/target/product/img_packages目录下产生所有 fastboot 刷写所需要的文件，以及刷写脚本。

当板子进入刷写模式之后即可开始刷写。

服务器端执行：

::

   ./flash_all.sh


刷写方式
~~~~~~~~~~~~~~~~


Fastboot udp
^^^^^^^^^^^^^^^^^

此方式通过网络刷写镜像，需要开发板连接的网络支持dhcp且uboot中已经配置好IP地址、网络掩码、网关地址等信息。

刷写前，服务器端执行如下命令：

::

   export ANDROID_SERIAL=udp:xx.xx.xx.xx:5554 #其中xx.xx.xx.xx更换为板子所配ip

板端uboot：

::

   Hobot$ fastboot udp

随后进行刷写。


Fastboot USB
^^^^^^^^^^^^^^^^^

此方法适用于U-Boot网络不通的场景，通过USB烧写，详情可参考 :ref:`Fastboot(usb) <fastboot_usb>`。


使用mtd命令刷写
-------------------------------------------------------------

此方法也可适用于bringup时uboot下网络不通的场景，通常优先使用上述的fastboot 0方式，而不需要使用这个方法。

.. 如果要烧写某个分区镜像：uboot_a

.. 1. 镜像文件提前准备到内存中，如放到 image_addr 位置，大小为 image_size。

.. 使用 loady 命令来从串口加载镜像到内存中（loady的用法用户可自行学习，不在此赘述）。

.. 1. 查看分区信息 mtd list，找到对应分区的偏移0x000001700000，并计算出分区大小。

uboot下执行mtd list命令可查看系统当前分区信息，由于分区表后续可能调整，因此不在此展示该命令的执行结果。

.. 如上面的输出：

.. -  0x000001700000-0x000001900800 : "uboot_a"

.. uboot_a 分区的起始位置为 0x1700000， size 为 0x000001900800 - 0x000001700000 = 0x200800。

.. 1. 使用 mtd 命令刷写：

mtd的用法用户可自行学习，不在此赘述。

::

   Hobot$ mtd --help
   mtd - MTD utils

   Usage:
   mtd - generic operations on memory technology devices

   mtd list
   mtd read[.raw][.oob]                  <name> <addr> [<off> [<size>]]
   mtd dump[.raw][.oob]                  <name>        [<off> [<size>]]
   mtd write[.raw][.oob][.dontskipff]    <name> <addr> [<off> [<size>]]
   mtd erase[.dontskipbad]               <name>        [<off> [<size>]]

   Specific functions:
   mtd bad                               <name>

   With:
      <name>: NAND partition/chip name (or corresponding DM device name or OF path)
      <addr>: user address from/to which data will be retrieved/stored
      <off>: offset in <name> in bytes (default: start of the part)
         * must be block-aligned for erase
         * must be page-aligned otherwise
      <size>: length of the operation in bytes (default: the entire device)
         * must be a multiple of a block for erase
         * must be a multiple of a page otherwise (special case: default is a page with dump)

   The .dontskipff option forces writing empty pages, don't use it if unsure.

使用dd命令刷写
-------------------------------------------------------------

进入kernel命令行

1. 先将分区镜像文件下载到文件系统中，如放在/userdata/image.img。
2. 查看分区信息 ls /dev/block/platform/by-name/ 找到对应设备节点。

::

   root@hobot:~# ls /dev/block/platform/by-name/
   acore_cfg_a     boot_a         HSM_FW_bak        MCU_Cluster1_a    r52stl_a    system_cur
   acore_cfg_b     boot_b         HSM_RCA_a         MCU_Cluster1_b    r52stl_b    system_verity_a
   acore_cfg_cur   boot_cur       HSM_RCA_b         MCU_Cluster1_cur  r52stl_cur  system_verity_b
   app_a           ddrc_a         HSM_RCA_cur       MCU_Cluster2_a    recovery    system_verity_cur
   app_b           ddrc_b         keyimage_a        MCU_Cluster2_b    SBL_a       uboot_a
   app_cur         ddrc_cur       keyimage_b        MCU_Cluster2_cur  SBL_b       uboot_b
   app_param       ddrp_a         keyimage_cur      middleware_a      SBL_cur     uboot_cur
   backhaul        ddrp_b         log               middleware_b      scp_a       ubootenv
   basesystem_a    ddrp_cur       map               middleware_cur    scp_b       userdata
   basesystem_b    ddr_quickboot  mcu_cfg_a         minidump          scp_cur     vbmeta_a
   basesystem_cur  flashcmd       mcu_cfg_b         misc              spl_a       vbmeta_b
   bl31_a          fpt            mcu_cfg_cur       optee_a           spl_b       vbmeta_cur
   bl31_b          HB_APDP        MCU_Cluster0_a    optee_b           spl_cur     veeprom
   bl31_cur        hb_vspiflash   MCU_Cluster0_b    optee_cur         system_a
   blk             HSM_FW         MCU_Cluster0_cur  ota               system_b


1. 用dd命令将image.img写到app_a分区。

::

   dd if=app.img of=/dev/block/platform/by-name/app_a oflag=direct bs=1M

如果要烧写完整disk镜像，kernel下dd写/dev/mmcblk0设备节点即可。

::

   dd if=emmc_disk.img of=/dev/mmcblk0 oflag=direct bs=1M

版本号获取
===========

所有镜像版本号获取，在内核命令行执行命令：hb_version。

指定镜像版本号获取，在内核命令行执行以下命令：

::

   Release版本：cat /etc/version
   HSM版本：cat /proc/version_hsm
   SBL版本：cat /sys/class/remoteproc/remoteproc0/sbl_version
   DDR版本：cat /proc/ddr_version/version
   MCU版本：cat /sys/class/remoteproc/remoteproc0/mcu_version
   SCP版本：strings /dev/block/platform/by-name/scp_cur | grep "SCP: Built"
   SPL版本：strings /dev/block/platform/by-name/spl_cur | grep "U-Boot SPL"
   BL31版本：cat /proc/bl31_debug/version
   OPTEE版本：cat /proc/version_optee
   UBOOT版本：cat /proc/bootloader_log | grep U-Boot | head -n 1
   LINUX版本：cat /proc/version
   BPU版本：cat /sys/devices/system/bpu/bpu0/fw_version
   VDSP版本，启动VDSP后查看版本：cat /sys/class/remoteproc/remoteproc1/version
