From 2b9295570fdef3c530c8ceea11423df4781f3302 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Thu, 6 Jan 2022 16:31:07 +0800 Subject: [PATCH 1/2] update docs Signed-off-by: shawn_he --- en/device-dev/subsystems/subsys-ota-guide.md | 473 +++++-------------- 1 file changed, 130 insertions(+), 343 deletions(-) diff --git a/en/device-dev/subsystems/subsys-ota-guide.md b/en/device-dev/subsystems/subsys-ota-guide.md index dac093e437e..6844a06c404 100644 --- a/en/device-dev/subsystems/subsys-ota-guide.md +++ b/en/device-dev/subsystems/subsys-ota-guide.md @@ -1,413 +1,204 @@ -# OTA Update +# OTA Update -- [Introduction](#section753413913562) -- [Constraints](#section61232796162135) -- [Generating a Public/Private Key Pair](#section1392711588162135) -- [Generating an Update Package](#section704519924162135) - - [Mini and Small Systems](#section527064658162135) - - [Standard System](#section1291354584162135) +- [Constraints](#section691733275418) +- [Generating a Public/Private Key Pair](#section94411533155010) +- [Generating an Update Package](#section632383718539) +- [Uploading the Update Package](#section5772112473213) +- [Downloading the Upgrade Package](#section251732474917) +- [Integrating OTA Update Capabilities](#section298217330534) +- [API Application Scenario \(Default\)](#section7685171192916) + - [How to Develop](#section0745926153017) + - [Sample Code](#section1337111363306) -- [Uploading the Update Package](#section1040019352162135) -- [Downloading the Update Package](#section1870792413162135) -- [Integrating OTA Update Capabilities](#section2107348555162135) -- [API Application Scenario \(Default\)](#section1308521557162135) - - [How to Develop](#section2103641927162135) - - [Sample Code](#section1918621904162135) +- [API Application Scenario \(Custom\)](#section1686395317306) + - [How to Develop](#section524515314317) + - [Sample Code](#section525974743120) -- [API Application Scenario \(Custom\)](#section1332839930162135) - - [How to Develop](#section2120976727162135) - - [Sample Code](#section1743369672162135) +- [Updating the System](#section151997114334) -- [Upgrading the System](#section1704276175162135) +Over the Air (OTA) is a technology that makes it easier for you to remotely update devices, such as IP cameras. A device can be updated with a full or differential package. A full package contains all content of a new system, and a differential package contains the differences between the old and new systems. Currently, only the full-package update is supported. -## Introduction +## Constraints -Over the Air \(OTA\) is a technology that makes it easier for you to remotely update devices, such as IP cameras. Currently, the mini and small systems support update using a full package, but not a differential package. A full package contains all content of a new system, and a differential package contains the differences between the old and new systems. +- Only the open source suites for devices powered by Hi3861, Hi3518E V300, and Hi3516D V300 are supported. +- Devices developed based on Hi3518E V300 and Hi3516D V300 must support the SD card in the Virtual Festival of Aerobatic Teams (VFAT) format. -## Constraints +## Generating a Public-Private Key Pair -- Only the open-source suites for devices powered by Hi3861, Hi3518E V300, and Hi3516D V300 are supported. -- Devices developed based on Hi3518E V300 and Hi3516D V300 must support the SD card in the Virtual Festival of Aerobatic Teams \(VFAT\) format. +1. Download the OpenSSL tool from the following website and install it on a Windows PC. Then, configure environment variables. - >![](../public_sys-resources/icon-note.gif) **NOTE:** - >Generation of update packages can only be performed on the Linux system. + [http://slproweb.com/products/Win32OpenSSL.html](http://slproweb.com/products/Win32OpenSSL.html) +2. Download the packaging tool from the **tools\\update\_tools\\update\_pkg\_tools** directory, and save it to a local path on your PC, for example, **D:\\ota\_tools**. +3. Run **Generate\_public\_private\_key.bat** in **ota\_tools\\key** to generate the **Metis\_PUBLIC.key** file, **private.key** file, and the **public\_arr.txt** file that contains public values, as shown in the following figure. Keep **private.key** properly. -## Generating a Public/Private Key Pair + **Figure 1** Generating a public-private key pair + -1. Download the [OpenSSL](http://slproweb.com/products/Win32OpenSSL.html) tool, install it on a Windows PC, and configure environment variables. -2. Use the OpenSSL tool to generate a public/private key pair. -3. Keep the private key file properly as this file stores the private key used to sign the update package. You need to specify the private key file in the command used for preparing the update package. The public key is used to verify the signature of the update package during the upgrade, and it is stored as follows: + ![](figure/en-us_image_0000001060200050.png) - For the mini and small systems, the generated public key is preset in the code. The vendor needs to implement the **HotaHalGetPubKey** API to obtain the key. For the standard system, the generated public key is stored in the **./device/hisilicon/hi3516dv300/build/updater\_config/signing\_cert.crt** file. +4. Use the array in the **public\_arr.txt** file to replace the **g\_pubKeyBuf** content in **base\\update\\ota\_lite\\frameworks\\source\\verify\\hota\_verify.c** of the OTA module. -4. For the mini and small systems that use the Hi3518E V300 or Hi3516D V300 suite, also use the content in **public\_arr.txt** to replace the content in **g\_pub\_key** in the **device\\hisilicon\\third\_party\\uboot\\u-boot-2020.01\\product\\hiupdate\\verify\\update\_public\_key.c** file of the U-Boot module. - - Example configuration for the public key of the U-Boot module: - - ``` - static unsigned char g_pub_key[PUBKEY_LEN] = { - 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xBF, 0xAA, 0xA5, 0xB3, 0xC2, 0x78, 0x5E, - } - ``` - - -## Generating an Update Package - -### Mini and Small Systems - -1. Create the **target\_package** folder with the following directory structure: + Example array in the **public\_arr.txt** file: ``` - target_package - ├── OTA.tag - ├── config - ├── {component_1} - ├── {component_2} - ├── ... - ├── {component_N} - └── updater_config - └── updater_specified_config.xml + 0x30,0x82,0x1,0xa,0x2,0x82,0x1,0x1,0x0,0xc7,0x8c,0xf3,0x91,0xa1,0x98,0xbf,0xb1,0x8c, + 0xbe,0x22,0xde,0x32,0xb2,0xfa,0xec,0x2c,0x69,0xf6,0x8f,0x43,0xa7,0xb7,0x6f,0x1e,0x4a,0x97, + 0x4b,0x27,0x5d,0x56,0x33,0x9a,0x73,0x4e,0x7c,0xf8,0xfd,0x1a,0xf0,0xe4,0x50,0xda,0x2b,0x8, + 0x74,0xe6,0x28,0xcc,0xc8,0x22,0x1,0xa8,0x14,0x9,0x46,0x46,0x6a,0x10,0xcd,0x39,0xd,0xf3, + 0x4a,0x7f,0x1,0x63,0x21,0x33,0x74,0xc6,0x4a,0xeb,0x68,0x40,0x55,0x3,0x80,0x1d,0xd9,0xbc, + 0xd4,0xb0,0x4a,0x84,0xb7,0xac,0x43,0x1d,0x76,0x3a,0x61,0x40,0x23,0x3,0x88,0xcc,0x80,0xe, + 0x75,0x10,0xe4,0xad,0xac,0xb6,0x4c,0x90,0x8,0x17,0x26,0x21,0xff,0xbe,0x1,0x82,0x16,0x76, + 0x9a,0x1c,0xee,0x8e,0xd9,0xb0,0xea,0xd5,0x50,0x61,0xcc,0x9c,0x2e,0x78,0x15,0x2d,0x1f,0x8b, + 0x94,0x77,0x30,0x39,0x70,0xcf,0x16,0x22,0x82,0x99,0x7c,0xe2,0x55,0x37,0xd4,0x76,0x9e,0x4b, + 0xfe,0x48,0x26,0xc,0xff,0xd9,0x59,0x6f,0x77,0xc6,0x92,0xdd,0xce,0x23,0x68,0x83,0xbd,0xd4, + 0xeb,0x5,0x1b,0x2a,0x7e,0xda,0x9a,0x59,0x93,0x41,0x7b,0x4d,0xef,0x19,0x89,0x4,0x8d,0x5, + 0x7d,0xbc,0x3,0x1f,0x77,0xe6,0x3d,0xa5,0x32,0xf5,0x4,0xb7,0x9c,0xe9,0xfa,0x6e,0xc,0x9f, + 0x4,0x62,0xfe,0x2a,0x5f,0xbf,0xeb,0x9a,0x73,0xa8,0x2a,0x72,0xe3,0xf0,0x57,0x56,0x5c,0x59, + 0x14,0xdd,0x79,0x11,0x42,0x3a,0x48,0xf7,0xe8,0x80,0xb1,0xaf,0x1c,0x40,0xa2,0xc6,0xec,0xf5, + 0x67,0xc1,0x88,0xf6,0x26,0x5c,0xd3,0x11,0x5,0x11,0xed,0xb1,0x45,0x2,0x3,0x1,0x0,0x1, ``` -2. Place the components to be updated, including the image file \(for example, **rootfs.img**\), as \{component\_N\} in the root directory of the **target\_package** folder. -3. Configure the **updater\_specified\_config.xml** file in the **update\_config** folder. - - Example configuration of the **updater\_specified\_config.xml** file: + Example configuration for the public key of the OTA module: ``` - - - - head info - - - ./OTA.tag - ./config - ./u-boot-xxxx.bin - - + #define PUBKEY_LENGTH 270 + + static uint8 g_pubKeyBuf[PUBKEY_LENGTH] = { + 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xBF, 0xAA, 0xA5, 0xB3, 0xC2, 0x78, 0x5E, + 0x63, 0x07, 0x84, 0xCF, 0x37, 0xF0, 0x45, 0xE8, 0xB9, 0x6E, 0xEF, 0x04, 0x88, 0xD3, 0x43, 0x06, ``` - **Table 1** Description of nodes in the component configuration file +5. If Hi3518E V300 or Hi3516D V300 is used, also use the content in **public\_arr.txt** to replace the content in **g\_pub\_key** in the **device\\hisilicon\\third\_party\\uboot\\u-boot-2020.01\\product\\hiupdate\\verify\\update\_public\_key.c** file of the U-Boot module. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Type

-

Node Name

-

Node Label

-

Mandatory

-

Description

-

Header information (head node)

-

info

-

/

-

Yes

-

Content of this node: head info

-

fileVersion

-

Yes

-

This field is reserved and does not affect the generation of the update package.

-

prdID

-

Yes

-

This field is reserved and does not affect the generation of the update package.

-

softVersion

-

Yes

-

Software version number, that is, the version number of the update package. The version number must be within the range specified by VERSION.mbn. Otherwise, an update package will not be generated.

-

date

-

Yes

-

Date when the update package is generated. This field is reserved and does not affect the generation of the update package.

-

time

-

Yes

-

Time when the update package is generated. This field is reserved and does not affect the generation of the update package.

-

Component information (group node)

-

component

-

/

-

Yes

-

Content of this node: path of the component or image file to be packed into the update package. It is the root directory of the version package by default.

-

compAddr

-

Yes

-

Name of the partition corresponding to the component, for example, system or vendor.

-

compId

-

Yes

-

Component ID, which must be unique.

-

resType

-

Yes

-

This field is reserved and does not affect the generation of the update package.

-

compType

-

Yes

-

Image type, which can be a full or differential package. The value 0 indicates a full package, and value 1 indicates a differential package.

-
- - >![](../public_sys-resources/icon-note.gif) **NOTE:** - >As mini and small systems do not support update using a differential package, **compType** must be set to **0**, other than **1**. - >For mini and small systems, an update package cannot be created by changing partitions. - -4. Create the **OTA.tag** file, which contains the magic number of the update package. The magic number is as follows: - - ``` - package_type:ota1234567890qwertw - ``` - -5. Create the **config** file, and configure the **bootargs** and **bootcmd** information in the file. - - Example configuration: - - ``` - setenv bootargs 'mem=128M console=ttyAMA0,115200 root=/dev/mmcblk0p3 rw rootfstype=ext4 rootwait blkdevparts=mmcblk0:1M - (u-boot.bin),9M(kernel.bin),50M(rootfs_ext4.img),50M(userfs.img)' setenv bootcmd 'mmc read 0x0 0x82000000 0x800 0x4800;bootm 0x82000000' - ``` - -6. Generate the update package. - - ``` - python build_update.py ./target_package/ ./output_package/ -pk ./rsa_private_key3072.pem -nz -nl2x - ``` - - - **./target\_package/**: path of **target\_package** - - **./output\_package/**: output path of the update package - - **-pk ./rsa\_private\_key3072.pem**: path of the private key file - - **-nz**: **not zip** mode - - **-nl2**: non-standard system mode - - -### Standard System - -1. Create the **target\_package** folder with the following directory structure: - - ``` - target_package - ├── {component_1} - ├── {component_2} - ├── ... - ├── {component_N} - └── updater_config - ├── BOARD.list - ├── VERSION.mbn - └── updater_specified_config.xml - ``` - -2. Place the components to be updated, including the image file \(for example, **system.img**\), as \{component\_N\} in the root directory of the **target\_package** folder. - -3. Configure the component configuration file in the **update\_config** folder. - -4. Configure the list of products supported by the current update package in **BOARD.list** in the **update\_config** folder. - - Example configuration: + Example configuration for the public key of the U-Boot module: ``` - HI3516 - HI3518 + static unsigned char g_pub_key[PUBKEY_LEN] = { + 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xBF, 0xAA, 0xA5, 0xB3, 0xC2, 0x78, 0x5E, ``` -5. Configure the versions supported by the current update package in **VERSION.mbn** in the **update\_config** folder. - - Version number format: Hi3516DV300-eng 10 QP1A.XXXXXX.\{Major version number \(6 digits\)\}.XXX\{Minor version number \(3 digits\)\} - - For example, Hi3516DV300-eng 10 QP1A.190711.020, where **190711** is the major version number, and **020** is the minor version number. - - Example configuration: - - ``` - Hi3516DV300-eng 10 QP1A.190711.001 - Hi3516DV300-eng 10 QP1A.190711.020 - Hi3518DV300-eng 10 QP1A.190711.021 - ``` -6. For update using an incremental \(differential\) package, also prepare a source version package \(source\_package\) in the same format as the target version package \(target\_package\), and then compress it as a **.zip** file, that is, **source\_package.zip**. +## Generating an Update Package -7. If you create an update package with partitions changed, also provide the partition table file named **partition\_file.xml**. You can specify the file using the **-pf** parameter. For details about the configuration nodes, see the description below. +1. Store the update files in the **ota\_tools\\Components** directory. - The partition table is generated with the image. The format is as follows: + **Figure 2** Location of the original image files + - ``` - - - - - - ``` + ![](figure/en-us_image_0000001061889268.png) - **Table 2** Description of labels in the partition table + ** Table 1** Files in the update package - -

Label

+ + - - - - - - - - - - - - - - - - -

File Name

Description

+

Description

Sel

-

Whether the partition is effective. The value 1 indicates that the partition is effective, and value 0 indicates the opposite.

-

PartitionName

-

Partition name, for example, fastboot or boot.

-

FlashType

+

u-boot.bin

Flash type, for example, emmc or ufs.

+

Renamed from the **u-boot-hi351XevX00.bin** file generated after compilation.

FileSystem

+

kernel.bin

File system type, for example, ext3/4 or f2fs. The value can also be none.

+

Renamed from the **liteos.bin/kernel** file generated after compilation.

Start

+

rootfs.img

Start address of the partition, in MB. The start address of all partitions is 0.

+

Renamed from the **rootfs_xxxxx.img** file generated after compilation.

Length

+

config

Size of the partition, in MB.

+

Provides development board and kernel information. For details, see the SD card burning description of the corresponding open source suite.

SelectFile

+

OTA.tag

Actual path of the image or file.

+

Contains 32 bytes in the **package_type:otaA1S2D3F4G5H6J7K8** format. The last 16 bytes are random, varying according to the version.

-8. Generate the update package. +2. Open the **packet\_harmony.xml** file in the **ota\_tools\\xml** directory, and modify **compAddr** as follows. Keep other items unchanged. - **Full package** - - Run the following command: + Example configuration for **compAddr**: ``` - python build_update.py ./target_package/ ./output_package/ -pk ./rsa_private_key3072.pem + + + .\Components\rootfs_jffs2.img + .\Components\liteos.bin + .\Components\userfs_jffs2.img + ``` - - **./target\_package/**: path of **target\_package** - - **./output\_package/**: output path of the update package - - **-pk ./rsa\_private\_key3072.pem**: path of the private key file - - **Incremental \(differential\) package** +3. Configure the paths of private and public keys in **packet\_harmony.xml**. - Run the following command: + Example configuration for paths of private and public keys: ``` - python build_update.py ./target_package/ ./output_package/ -s ./source_package.zip -pk ./rsa_private_key3072.pem + + .\key\private.key + .\key\Metis_PUBLIC.key + ``` - - **./target\_package/**: path of **target\_package** - - **./output\_package/**: output path of the update package - - **-s ./source\_package.zip**: path of the **source\_package.zip** file. For update using a differential package, use the **-s** parameter to specify the source version package. - - **-pk ./rsa\_private\_key3072.pem**: path of the private key file +4. Configure the product name and software version in **ota\_tools\\VersionDefine.bat** for anti-rollback. - **Update package with partitions changed** - - Run the following command: + Example configuration for the product name and software version: ``` - python build_update.py ./target_package/ ./output_package/ -pk ./rsa_private_key3072.pem -pf ./partition_file.xml + set FILE_PRODUCT_NAME=Hisi + + @rem Set the software version number to a string of no more than 16 characters. + set SOFTWARE_VER=OpenHarmony 1.1 ``` - - **./target\_package/**: path of **target\_package** - - **./output\_package/**: output path of the update package - - **-pk ./rsa\_private\_key3072.pem**: path of the private key file - - **-pf ./partition\_file.xml**: path of the partition table file - +5. Run **Make\_Harmony\_PKG.bat** in the **ota\_tools** directory to generate the **Hisi\_OpenHarmony 1.1.bin** update package. The update package is signed using SHA-256 and RSA 2048 to ensure its integrity and validity. -## Uploading the Update Package - -Upload the update package to the vendor's OTA server. - -## Downloading the Update Package - -1. Download the update package from the OTA server. -2. \(Optional\) Insert an SD card \(with a capacity greater than 100 MB\) if the device is developed based on Hi3518E V300 or Hi3516D V300. + **Figure 3** Packaging tool + -## Integrating OTA Update Capabilities + ![](figure/en-us_image_0000001059334449.png) -1. For mini and small systems - - If a vendor requests OTA capabilities, use the dynamic library **libhota.so** and include the header files **hota\_partition.h** and **hota\_updater.h** in **base\\update\\ota\_lite\\interfaces\\kits**. +## Uploading the Update Package - - The **libhota.so** source code is stored in **base\\update\\ota\_lite\\frameworks\\source**. +Upload the **Hisi\_OpenHarmony 1.1.bin** update package to the vendor's OTA server. - - For details about how to use APIs, see _API Application Scenario_ and OTA APIs in _API Reference_. +## Downloading the Update Package - - If the development board needs to be adapted, see the **base\\update\\ota\_lite\\hals\\hal\_hota\_board.h** file. - -2. For the standard system, see the _JS Reference Specifications_ for details. +1. Download the **Hisi\_OpenHarmony 1.1.bin** update package from the OTA server. +2. \(Optional\) Insert an SD card \(with a capacity greater than 100 MB\) if the device is developed based on Hi3518E V300 or Hi3516D V300. +## Integrating OTA Update Capabilities -## API Application Scenario \(Default\) +- Use the dynamic library **libhota.so** and include the header files **hota\_partition.h** and **hota\_updater.h** in **base\\update\\ota\_lite\\interfaces\\kits**. +- The **libhota.so** source code is stored in **base\\update\\ota\_lite\\frameworks\\source**. +- For details about how to use APIs, see API Application Scenario and OTA APIs in API Reference. +- If the development board needs to be adapted, see the **base\\update\\ota\_lite\\hals\\hal\_hota\_board.h** file. -The update package is generated by following the instructions provided in Generating a Public/Private Key Pair and Generating an Update Package. +## API Application Scenario \(Default\) -### **How to Develop** +The update package is generated by following the instructions provided in **Generating a Public/Private Key Pair** and **Generating an Update Package**. -1. Download the update package for the current device, and then call the **HotaInit** function to initialize the OTA module. +### **How to Develop** -2. Call the **HotaWrite** function to verify, parse, and write data streams into the device. +1. Download the update package for the current device, and then call the **HotaInit** function to initialize the OTA module. +2. Call the **HotaWrite** function to verify, parse, and write data streams for the update into the device. +3. Call the **HotaRestart** function to restart the system. -3. Call the **HotaRestart** function to restart the system for the update to take effect. Call the **HotaCancel** function if you want to cancel the update. + If you want to cancel the update, call the **HotaCancel** function. -### **Sample Code** +### **Sample Code** Perform an OTA update using the update package format and verification method provided by OpenHarmony. @@ -461,26 +252,23 @@ int main(int argc, char **argv) } ``` -## API Application Scenario \(Custom\) - -The update package is generated in other ways instead of following the instructions provided in Generating a Public/Private Key Pair and Generating an Update Package. - -### **How to Develop** +## API Application Scenario \(Custom\) -1. Download the update package for the current device, and then call the **HotaInit** function to initialize the OTA module. +The update package is generated in other ways instead of following the instructions provided in **Generating a Public/Private Key Pair** and **Generating an Update Package**. -2. Call the **HotaSetPackageType** function to set the package type to **NOT\_USE\_DEFAULT\_PKG**. +### **How to Develop** -3. Call the **HotaWrite** function to write data streams into the device. +1. Download the update package for the current device, and then call the **HotaInit** function to initialize the OTA module. +2. Call the **HotaSetPackageType** function to set the package type to **NOT\_USE\_DEFAULT\_PKG**. +3. Call the **HotaWrite** function to write data streams into the device. +4. Call the **HotaRead** function to read data. Vendors can choose whether to verify the data. +5. (Optional) Call the **HotaSetBootSettings** function to set the startup tag used for entering the U-Boot mode during system restarting. +6. Call the **HotaRestart** function to restart the system. -4. Call the **HotaRead** function to read data. Vendors can choose whether to verify the data. + If you want to cancel the update, call the **HotaCancel** function. -5. \(Optional\) Call the **HotaSetBootSettings** function to set the startup tag used for entering the U-Boot mode during system restarting. -6. Call the **HotaRestart** function to restart the system for the update to take effect. Call the **HotaCancel** function if you want to cancel the update. - - -### **Sample Code** +### **Sample Code** Perform an OTA update using the update package format and verification method not provided by OpenHarmony. @@ -551,11 +339,11 @@ int main(int argc, char **argv) } ``` -## Upgrading the System +## Updating the System Vendor applications call APIs of the OTA module to perform functions such as signature verification of the update package, anti-rollback, burning and data flushing-to-disk. After the update is complete, the system automatically restarts. -For the mini and small systems that use the Hi3518E V300 or Hi3516D V300 open source suite, add the value of **LOCAL\_VERSION** to the version that needs to implement the anti-rollback function. For example, for **"ohos default 1.0"-\>"ohos default 1.1"**, add the value of **LOCAL\_VERSION** in **device\\hisilicon\\third\_party\\uboot\\u-boot-2020.01\\product\\hiupdate\\ota\_update\\ota\_local\_info.c**. +If the Hi3518E V300 or Hi3516D V300 open source suite is used, add the value of **LOCAL\_VERSION** to the version that needs to implement the anti-rollback function. For example, for **"ohos default 1.0"-\>"ohos default 1.1"**, add the value of **LOCAL\_VERSION** in **device\\hisilicon\\third\_party\\uboot\\u-boot-2020.01\\product\\hiupdate\\ota\_update\\ota\_local\_info.c**. Example for modification of the local version: @@ -563,8 +351,7 @@ Example for modification of the local version: const char *get_local_version(void) { #if defined(CONFIG_TARGET_HI3516EV200) || \ - defined(CONFIG_TARGET_HI3516DV300) || \ - defined(CONFIG_TARGET_HI3518EV300) + defined(CONFIG_TARGET_HI3516DV300) || \ + defined(CONFIG_TARGET_HI3518EV300) #define LOCAL_VERSION "ohos default 1.0" /* increase: default release version */ ``` - -- Gitee From 8b591518b474e8d536d45073b3d20518f52f835a Mon Sep 17 00:00:00 2001 From: shawn_he Date: Thu, 6 Jan 2022 08:35:32 +0000 Subject: [PATCH 2/2] update en/device-dev/subsystems/subsys-ota-guide.md. Signed-off-by: shawn_he --- en/device-dev/subsystems/subsys-ota-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/device-dev/subsystems/subsys-ota-guide.md b/en/device-dev/subsystems/subsys-ota-guide.md index 6844a06c404..69b1dd9ae92 100644 --- a/en/device-dev/subsystems/subsys-ota-guide.md +++ b/en/device-dev/subsystems/subsys-ota-guide.md @@ -30,7 +30,7 @@ Over the Air (OTA) is a technology that makes it easier for you to remotely upda [http://slproweb.com/products/Win32OpenSSL.html](http://slproweb.com/products/Win32OpenSSL.html) 2. Download the packaging tool from the **tools\\update\_tools\\update\_pkg\_tools** directory, and save it to a local path on your PC, for example, **D:\\ota\_tools**. -3. Run **Generate\_public\_private\_key.bat** in **ota\_tools\\key** to generate the **Metis\_PUBLIC.key** file, **private.key** file, and the **public\_arr.txt** file that contains public values, as shown in the following figure. Keep **private.key** properly. +3. Run **Generate\_public\_private\_key.bat** in **ota\_tools\\key** to generate the **Metis\_PUBLIC.key** file, the **private.key** file, and the **public\_arr.txt** file that contains public values, as shown in the following figure. Keep **private.key** properly. **Figure 1** Generating a public-private key pair -- Gitee