From 31436f3a6258d8db4901c78de4e24da42f2b317a Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Tue, 29 Nov 2022 14:33:40 +0800 Subject: [PATCH] Fix link errors (10473) Signed-off-by: ester.zhou --- en/device-dev/Readme-EN.md | 5 +- en/device-dev/device-dev-guide.md | 19 +- en/device-dev/faqs/faqs-burning.md | 2 +- en/device-dev/guide/device-clock-guide.md | 4 +- en/device-dev/guide/device-driver-demo.md | 6 +- .../guide/device-outerdriver-demo.md | 4 +- .../guide/device-wlan-led-control.md | 4 +- en/device-dev/kernel/kernel-mini-overview.md | 6 +- .../kernel/kernel-small-start-user.md | 17 - en/device-dev/porting/Readme-EN.md | 37 +- .../figures/en-us_image_0000001378282213.png | Bin 0 -> 40570 bytes .../figures/en-us_image_0000001378481233.png | Bin 0 -> 53951 bytes .../porting/porting-asr582x-combo-demo.md | 2 - .../porting/porting-chip-board-bundle.md | 56 - .../porting/porting-chip-board-component.md | 23 - .../porting/porting-chip-board-driver.md | 49 - .../porting/porting-chip-board-hal.md | 70 -- .../porting/porting-chip-board-lwip.md | 64 -- .../porting/porting-chip-board-overview.md | 54 - .../porting/porting-chip-board-xts.md | 58 - .../porting/porting-chip-kernel-adjustment.md | 86 -- .../porting/porting-chip-kernel-overview.md | 59 -- .../porting/porting-chip-kernel-verify.md | 59 -- .../porting/porting-chip-prepare-knows.md | 67 -- .../porting/porting-chip-prepare-process.md | 119 --- .../porting/porting-minichip-kernel.md | 265 +++++ .../porting/porting-minichip-overview.md | 47 + .../porting/porting-minichip-prepare.md | 219 ++++ .../porting-minichip-subsys-communication.md | 133 +++ .../porting/porting-minichip-subsys-driver.md | 116 ++ .../porting-minichip-subsys-filesystem.md | 122 +++ .../porting/porting-minichip-subsys-others.md | 23 + .../porting-minichip-subsys-overview.md | 24 + .../porting-minichip-subsys-security.md | 113 ++ .../porting-minichip-subsys-startup.md | 157 +++ .../porting/porting-minichip-verification.md | 88 ++ en/device-dev/porting/porting-minichip.md | 11 - .../porting/porting-smallchip-kernel-linux.md | 2 +- .../porting-smallchip-prepare-building.md | 2 +- .../porting-smallchip-prepare-needs.md | 2 +- .../porting/porting-thirdparty-cmake.md | 4 +- en/device-dev/quick-start/Readme-EN.md | 2 +- .../figures/en-us_image_0000001275592884.png | Bin 0 -> 302 bytes .../quick-start/quickstart-ide-3516-burn.md | 11 +- .../quickstart-pkg-common-builderr.md | 4 +- .../quickstart-pkg-install_package.md | 3 +- ...ys-build-gn-kconfig-visual-config-guide.md | 2 +- en/device-dev/website.md | 995 ++++++++---------- 48 files changed, 1796 insertions(+), 1419 deletions(-) create mode 100644 en/device-dev/porting/figures/en-us_image_0000001378282213.png create mode 100644 en/device-dev/porting/figures/en-us_image_0000001378481233.png delete mode 100644 en/device-dev/porting/porting-chip-board-bundle.md delete mode 100644 en/device-dev/porting/porting-chip-board-component.md delete mode 100644 en/device-dev/porting/porting-chip-board-driver.md delete mode 100644 en/device-dev/porting/porting-chip-board-hal.md delete mode 100644 en/device-dev/porting/porting-chip-board-lwip.md delete mode 100644 en/device-dev/porting/porting-chip-board-overview.md delete mode 100644 en/device-dev/porting/porting-chip-board-xts.md delete mode 100644 en/device-dev/porting/porting-chip-kernel-adjustment.md delete mode 100644 en/device-dev/porting/porting-chip-kernel-overview.md delete mode 100644 en/device-dev/porting/porting-chip-kernel-verify.md delete mode 100644 en/device-dev/porting/porting-chip-prepare-knows.md delete mode 100644 en/device-dev/porting/porting-chip-prepare-process.md create mode 100644 en/device-dev/porting/porting-minichip-kernel.md create mode 100644 en/device-dev/porting/porting-minichip-overview.md create mode 100644 en/device-dev/porting/porting-minichip-prepare.md create mode 100644 en/device-dev/porting/porting-minichip-subsys-communication.md create mode 100644 en/device-dev/porting/porting-minichip-subsys-driver.md create mode 100644 en/device-dev/porting/porting-minichip-subsys-filesystem.md create mode 100644 en/device-dev/porting/porting-minichip-subsys-others.md create mode 100644 en/device-dev/porting/porting-minichip-subsys-overview.md create mode 100644 en/device-dev/porting/porting-minichip-subsys-security.md create mode 100644 en/device-dev/porting/porting-minichip-subsys-startup.md create mode 100644 en/device-dev/porting/porting-minichip-verification.md delete mode 100644 en/device-dev/porting/porting-minichip.md create mode 100644 en/device-dev/quick-start/figures/en-us_image_0000001275592884.png diff --git a/en/device-dev/Readme-EN.md b/en/device-dev/Readme-EN.md index 8c0087ff8a..389ab1daec 100644 --- a/en/device-dev/Readme-EN.md +++ b/en/device-dev/Readme-EN.md @@ -6,14 +6,13 @@ - [Glossary](../glossary.md) - [Release Notes](../release-notes/Readme.md) - Quick Start - - [Mini and Small Systems](quick-start/quickstart-ide-lite-overview.md) - - [Standard System](quick-start/quickstart-ide-standard-overview.md) + - [Getting Started](quick-start/Readme-EN.md) - Compatibility and Security - [Privacy and Security](security/Readme-EN.md) - Porting - Porting Guide - [Third-Party Library Porting Guide for Mini and Small Systems](porting/porting-thirdparty-overview.md) - - [Mini System SoC Porting Guide](porting/porting-minichip.md) + - [Mini System SoC Porting Guide](porting/porting-minichip-overview.md) - [Small System SoC Porting Guide](porting/porting-smallchip-prepare-needs.md) - [Standard System SoC Porting Guide](porting/standard-system-porting-guide.md) - Porting Cases diff --git a/en/device-dev/device-dev-guide.md b/en/device-dev/device-dev-guide.md index 1dc53366e9..de69f8c8f1 100644 --- a/en/device-dev/device-dev-guide.md +++ b/en/device-dev/device-dev-guide.md @@ -33,23 +33,22 @@ In addition, OpenHarmony provides a wide array of system components that can be | --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | About OpenHarmony| Getting familiar with OpenHarmony | - [About OpenHarmony](https://gitee.com/openharmony)
- [Glossary](../glossary.md)| | Development resources | Preparing for your development | - [Obtaining Source Code](get-code/sourcecode-acquire.md)
- [Obtaining Tools](get-code/gettools-acquire.md) | -| Getting started | Getting started with setup, build, burning, debugging, and running of OpenHarmony | - [Mini and Small System Overview](quick-start/quickstart-ide-lite-overview.md)| -| Basic capabilities | Using basic capabilities of OpenHarmony | - [Kernel for Mini System](kernel/kernel-mini-overview.md)
- [Kernel for Small System](kernel/kernel-small-overview.md)
- [HDF](driver/driver-hdf-overview.md)
- [Subsystems](subsystems/subsys-build-all.md)
- [Security Guidelines](security/security-guidelines-overall.md)
- [Privacy Protection](security/security-privacy-protection.md) | +| Getting started | Getting started with setup, build, burning, debugging, and running of OpenHarmony | - [Getting Started](quick-start/Readme-EN.md) | +| Basic capabilities | Using basic capabilities of OpenHarmony | - [Kernel for Mini System](kernel/kernel-mini-overview.md)
- [Kernel for Small System](kernel/kernel-small-overview.md)
- [HDF](driver/driver-hdf-overview.md)
- [Compilation and Building Guide](subsystems/subsys-build-all.md)
- [Security Guidelines](security/security-guidelines-overall.md)
- [Privacy Protection](security/security-privacy-protection.md)| | Advanced development | Developing smart devices based on system capabilities | - [WLAN-connected Products](guide/device-wlan-led-control.md)
- [Cameras with a Screen](guide/device-camera-control-overview.md) | -| Porting and adaptation | - Porting and adapting OpenHarmony to an SoC
- Porting and adapting OpenHarmony to a third-party library
- Third-party vendor porting cases
| - [Mini System SoC Porting Guide](porting/porting-minichip.md)
- [Small System SoC Porting Guide](porting/porting-smallchip-prepare-needs.md)
- [Third-Party Library Porting Guide for Mini and Small Systems](porting/porting-thirdparty-overview.md)
- [Mini-System Devices with Screens — Bestechnic SoC Porting Case](porting/porting-bes2600w-on-minisystem-display-demo.md)
- [Combo Solution – ASR Chip Porting Case](porting/porting-asr582x-combo-demo.md)
| +| Porting and adaptation | - Porting and adapting OpenHarmony to an SoC
- Porting and adapting OpenHarmony to a third-party library
- Third-party vendor porting cases
| - [Small System SoC Porting Guide](porting/porting-smallchip-prepare-needs.md)
- [Third-Party Library Porting Guide for Mini and Small Systems](porting/porting-thirdparty-overview.md)
- [Mini-System Devices with Screens — Bestechnic SoC Porting Case](porting/porting-bes2600w-on-minisystem-display-demo.md) | | Contributing components | Contributing components to OpenHarmony | - [HPM Part Overview](hpm-part/hpm-part-about.md)
- [HPM Part Development](hpm-part/hpm-part-development.md)
- [HPM Part Reference](hpm-part/hpm-part-reference.md) | -| Reference | Referring to development specifications | [FAQs](faqs/faqs-overview.md) | - +| Reference | Referring to development specifications | - [FAQs](faqs/faqs-overview.md) | **Table 2** Standard system development guidelines (reference memory ≥ 128 MiB) | Topic| Development Scenario| Related Documentation| | -------- | -------- | -------- | | About OpenHarmony| Getting familiar with OpenHarmony| - [About OpenHarmony](https://gitee.com/openharmony)
- [Glossary](../glossary.md)| -| Development resources| Preparing for your development| - [Obtaining Source Code](get-code/sourcecode-acquire.md)
- [Obtaining Tools](get-code/gettools-acquire.md)| -| Getting started| Getting started with setup, build, burning, debugging, and running of OpenHarmony| - [Standard System Overview](quick-start/quickstart-ide-standard-overview.md) | -| Basic capabilities| Using basic capabilities of OpenHarmony| - [Kernel Development](kernel/kernel-standard-overview.md)
- [HDF](driver/driver-hdf-overview.md)
- [Subsystems](subsystems/subsys-build-all.md)
- [Security Guidelines](security/security-guidelines-overall.md)
- [Privacy Protection](security/security-privacy-protection.md) | +| Development resources| Preparing for your development| - [Obtaining Source Code](get-code/sourcecode-acquire.md)
- [Obtaining Tools](get-code/gettools-acquire.md) | +| Getting started| Getting started with setup, build, burning, debugging, and running of OpenHarmony| - [Getting Started](quick-start/Readme-EN.md) | +| Basic capabilities| Using basic capabilities of OpenHarmony| - [Kernel Development](kernel/kernel-standard-overview.md)
- [HDF](driver/driver-hdf-overview.md)
- [Compilation and Building Guide](subsystems/subsys-build-all.md)
- [Security Guidelines](security/security-guidelines-overall.md)
- [Privacy Protection](security/security-privacy-protection.md) | | Advanced development| Developing smart devices based on system capabilities| - [Development Guidelines on Clock Apps](guide/device-clock-guide.md)
- [Development Example for Platform Drivers](guide/device-driver-demo.md)
- [Development Example for Peripheral Drivers](guide/device-outerdriver-demo.md) | -| Porting and adaptation| - Porting and adapting OpenHarmony to an SoC
- Rapidly porting the OpenHarmony Linux kernel| - [Standard System Porting Guide](porting/standard-system-porting-guide.md)
- [A Method for Rapidly Porting the OpenHarmony Linux Kernel](porting/porting-linux-kernel.md) | +| Porting and adaptation| - Porting and adapting OpenHarmony to an SoC
- Rapidly porting the OpenHarmony Linux kernel| - [Standard System Porting Guide](porting/standard-system-porting-guide.md)
- [A Method for Rapidly Porting the OpenHarmony Linux Kernel](porting/porting-linux-kernel.md) | | Contributing components| Contributing components to OpenHarmony| - [HPM Part Overview](hpm-part/hpm-part-about.md)
- [HPM Part Development](hpm-part/hpm-part-development.md)
- [HPM Part Reference](hpm-part/hpm-part-reference.md) | -| Reference| Referring to development specifications| [FAQs](faqs/faqs-overview.md)| +| Reference| Referring to development specifications | - [FAQs](faqs/faqs-overview.md) | diff --git a/en/device-dev/faqs/faqs-burning.md b/en/device-dev/faqs/faqs-burning.md index ffb73e7a78..09f3a076e1 100644 --- a/en/device-dev/faqs/faqs-burning.md +++ b/en/device-dev/faqs/faqs-burning.md @@ -88,7 +88,7 @@ > Hi3518E V300: **device\hisilicon\hispark_aries\sdk_liteos\uboot\out\boot\u-boot-hi3518ev300.bin** 2. Burn the U-Boot file by following the procedures for burning a U-Boot file over USB. - Select the U-Boot files of the corresponding development board for burning by referring to [Burning to Hi3516D V300](../quick-start/quickstart-ide-lite-steps-hi3516-burn.md). + Select the U-Boot files of the corresponding development board for burning by referring to [Burning an Image](../quick-start/quickstart-ide-3516-burn.md). 3. Log in to the serial port after the burning is complete. diff --git a/en/device-dev/guide/device-clock-guide.md b/en/device-dev/guide/device-clock-guide.md index 351336cb86..27b85335e4 100644 --- a/en/device-dev/guide/device-clock-guide.md +++ b/en/device-dev/guide/device-clock-guide.md @@ -13,7 +13,7 @@ The clock app displays the current time, as shown in the following figure. ## Preparations -Download and install DevEco Studio. For details, see the [HUAWEI DevEco Studio User Guide](../../application-dev/quick-start/deveco-studio-user-guide-for-openharmony.md). +Download and install DevEco Studio. For details, see the [DevEco Studio User Guide](../../application-dev/quick-start/deveco-studio-user-guide-for-openharmony.md). ## How to Develop @@ -251,7 +251,7 @@ After finishing writing the app code, you need to sign and package the app befor ## Running on the Real Device -Before you install the app and run it on the development board, install the DevEco Device Tool by following operations provided in [HUAWEI DevEco Device Tool User Guide](https://device.harmonyos.com/en/docs/ide/user-guides/service_introduction-0000001050166905). Burn OpenHarmony into the development board and run it. For details about how to build, burn, and run an image, see [Standard System Overview](../quick-start/quickstart-standard-overview.md). After the image is running normally and the system is started properly, perform the following steps to install or uninstall the app: +Before you install the app and run it on the development board, install the DevEco Device Tool by following operations provided in [DevEco Device Tool User Guide](https://device.harmonyos.com/en/docs/ide/user-guides/service_introduction-0000001050166905). Burn OpenHarmony into the development board and run it. For details about how to build, burn, and run an image, see [Getting Started with the Standard System with Hi3516 (IDE Mode)](../quick-start/quickstart-appendix-hi3516-ide.md). After the image is running normally and the system is started properly, perform the following steps to install or uninstall the app: 1. Obtain the HDC client from the following path: diff --git a/en/device-dev/guide/device-driver-demo.md b/en/device-dev/guide/device-driver-demo.md index 69d160ee94..777a8dba8e 100644 --- a/en/device-dev/guide/device-driver-demo.md +++ b/en/device-dev/guide/device-driver-demo.md @@ -16,7 +16,7 @@ In this example, an I2C driver is used. [Figure 1](#fig9596628607) shows the s ## Preparations -Follow the instructions in [Environment Setup for Standard System](../quick-start/quickstart-standard-overview.md). +Follow the instructions in [Getting Started with the Standard System with Hi3516 (IDE Mode)](../quick-start/quickstart-appendix-hi3516-ide.md). >![](../public_sys-resources/icon-notice.gif) **NOTICE:** >This development example applies to standard, small, and mini OpenHarmony systems. The following sections use the standard system as an example. You can refer to the specific guide for your system to set up the environment. @@ -430,8 +430,8 @@ Initialize the controller hardware, call core-layer APIs to add or delete device 2. Build source code and burn images to the development board. - - For details about the operations using the installation package, see [Building](../quick-start/quickstart-ide-standard-running-hi3516-build.md) and [Burning](../quick-start/quickstart-ide-standard-running-hi3516-burning.md). + - For details about the operations using the installation package, see [Building Source Code](../quick-start/quickstart-appendix-hi3516-pkg.md#building-source-code) and [Burning an Image](../quick-start/quickstart-appendix-hi3516-pkg.md#burning-an-image). - - For details about the operations in IDE mode, see [Building](../quick-start/quickstart-standard-running-hi3516-build.md) and [Burning](../quick-start/quickstart-standard-running-hi3516-burning.md). + - For details about the operations in IDE mode, see [Building Source Code](../quick-start/quickstart-appendix-hi3516-ide.md#building-source-code) and [Burning an Image](../quick-start/quickstart-appendix-hi3516-ide.md#burning-an-image). diff --git a/en/device-dev/guide/device-outerdriver-demo.md b/en/device-dev/guide/device-outerdriver-demo.md index fae7c72d1f..3fc094240b 100644 --- a/en/device-dev/guide/device-outerdriver-demo.md +++ b/en/device-dev/guide/device-outerdriver-demo.md @@ -24,7 +24,7 @@ For details about the input driver model, see [Touchscreen Overview](../driver/ ## Setting Up the Environment -Follow the instructions in [Environment Setup for Standard System](../quick-start/quickstart-standard-overview.md). +Follow the instructions in [Quick Start Overview](../quick-start/quickstart-overview.md). >![](../public_sys-resources/icon-notice.gif) **NOTICE:** >This development example applies to standard, small, and mini OpenHarmony systems. The following sections use the standard system as an example. You can refer to the specific guide for your system to set up the environment. @@ -315,7 +315,7 @@ The input driver model consists of three parts of drivers. To develop a brand-ne **touch\_gt911.o** is the content added in this example. -2. Build source code and burn images. For details, see the related sections in [Standard System Overview](../quick-start/quickstart-standard-overview.md). +2. Build source code and burn images. For details, see the related sections in [Quick Start Overview](../quick-start/quickstart-overview.md). ## Debugging and Verification diff --git a/en/device-dev/guide/device-wlan-led-control.md b/en/device-dev/guide/device-wlan-led-control.md index 8b306b62da..03613ab721 100644 --- a/en/device-dev/guide/device-wlan-led-control.md +++ b/en/device-dev/guide/device-wlan-led-control.md @@ -6,7 +6,7 @@ Based on the Hi3861 platform, the OpenHarmony WLAN module provides abundant peri ## Development -1. Complete the operations described in [Getting Started with Hi3861](../quick-start/quickstart-lite-overview.md). +1. Complete the operations related to the mini system described in [Quick Start Overview](../quick-start/quickstart-overview.md). LED control examples are stored in the file **applications/sample/wifi-iot/app/iothardware/led\_example.c**. @@ -97,7 +97,7 @@ Based on the Hi3861 platform, the OpenHarmony WLAN module provides abundant peri ## Verification -For details about the compilation and burning processes, see [Building](../quick-start/quickstart-lite-steps-hi3861-building.md) and [Burning](../quick-start/quickstart-lite-steps-hi3861-burn.md). +For details about the compilation and burning processes, see [Building Source Code](../quick-start/quickstart-ide-3861-build.md) and [Burning an Image](../quick-start/quickstart-ide-3861-burn.md). After the preceding two steps are complete, press the **RST** button to reset the module. If the LED blinks periodically as expected, the verification is passed. diff --git a/en/device-dev/kernel/kernel-mini-overview.md b/en/device-dev/kernel/kernel-mini-overview.md index 6d6da9bdbd..0a53889536 100644 --- a/en/device-dev/kernel/kernel-mini-overview.md +++ b/en/device-dev/kernel/kernel-mini-overview.md @@ -95,7 +95,7 @@ The OpenHarmony LiteOS-M kernel build system is a modular build system based on ### Setting Up the Environment -Before setting up the environment for a development board, you must set up the basic system environment for OpenHarmony first. The basic system environment includes the OpenHarmony build environment and development environment. For details, see [Setting Up Development Environment](../quick-start/quickstart-lite-env-setup.md). +Before setting up the environment for a development board, you must set up the basic system environment for OpenHarmony first. The basic system environment includes the OpenHarmony build environment and development environment. For details, see [Quick Start Overview](../quick-start/quickstart-overview.md). ### Obtaining the OpenHarmony Source Code @@ -133,9 +133,9 @@ The LiteOS-M kernel porting projects for specific development boards are provide How to contribute a chip based on Liteos-M kernel: -[ Board-Level Directory Specifications](../porting/porting-chip-board-overview.md) +[Mini System SoC Porting Guide](../porting/porting-minichip-overview.md) -[Mini System SoC Porting Guide](../porting/porting-minichip.md) +[Mini System SoC Porting Cases](../porting/porting-bes2600w-on-minisystem-display-demo.md) ## Repositories Involved diff --git a/en/device-dev/kernel/kernel-small-start-user.md b/en/device-dev/kernel/kernel-small-start-user.md index 64f0cf6dec..40f586e157 100644 --- a/en/device-dev/kernel/kernel-small-start-user.md +++ b/en/device-dev/kernel/kernel-small-start-user.md @@ -41,23 +41,6 @@ During system startup, **OsUserInitProcess** is called to start the **init** ## Running Programs in User Mode -Common compilation modes of user-mode programs include: - -1. [Compilation based on the framework](../quick-start/quickstart-lite-steps-hi3516-running.md) -2. Manual compilation - - Example: - - ``` - clang --target=arm-liteos --sysroot=sysroot -o helloworld helloworld.c - ``` - - Before running the **clang** command, install the LLVM compiler. For details, see [Installing LLVM](../quick-start/quickstart-lite-steps-hi3861-setting.md). - - **--target=arm-liteos**: specifies the compilation platform, which is arm-liteos. - - **--sysroot=$\{YOUR\_ROOT\_OUT\_PATH\}/sysroot**: specifies the directory in which you can search for the header file and the dependent standard libraries. - A user-mode program can be started in either of the following ways: diff --git a/en/device-dev/porting/Readme-EN.md b/en/device-dev/porting/Readme-EN.md index 086ee39c32..1ce8a7106f 100644 --- a/en/device-dev/porting/Readme-EN.md +++ b/en/device-dev/porting/Readme-EN.md @@ -1,4 +1,4 @@ -# Introduction +## Introduction OpenHarmony has organized a Special Interest Group (SIG) [SIG_DevBoard](https://gitee.com/openharmony/community/blob/master/sig/sig-devboard/sig_devboard.md) to provide support for third-party development boards. @@ -10,7 +10,7 @@ Before learning about how to port the code of a development board, take a look a | Small-system devices| Memory > 1 MB, with MMU| LiteOS-A and Linux| | Standard-system devices| Memory > 128 MB| Linux | -# Code Preparation +## Code Preparation OpenHarmony has created repositories for vendors in openharmony-sig. To participate in the repository development, you need to use the following method to initialize and download the code. @@ -20,24 +20,21 @@ repo init -u https://gitee.com/openharmony-sig/manifest.git -b master -m devboar The download steps for other resources are the same as those in the mainline version. -# Porting Procedure - -- [Mini System SoC Porting Guide](porting-minichip.md) - - Porting Preparations - - [Before You Start](porting-chip-prepare-knows.md) - - [Building Adaptation Process](porting-chip-prepare-process.md) - - Kernel Porting - - [Overview](porting-chip-kernel-overview.md) - - [Basic Kernel Adaptation](porting-chip-kernel-adjustment.md) - - [Kernel Porting Verification](porting-chip-kernel-verify.md) - - Board-Level OS Porting - - [Overview](porting-chip-board-overview.md) - - [Board-Level Driver Adaptation](porting-chip-board-driver.md) - - [Implementation of APIs at the HAL](porting-chip-board-hal.md) - - [System Modules](porting-chip-board-component.md) - - [lwIP Module Adaptation](porting-chip-board-lwip.md) - - [Third-party Module Adaptation](porting-chip-board-bundle.md) - - [XTS](porting-chip-board-xts.md) +## Porting Procedure + +- Mini System SoC Porting Guide + - [Overview](porting-minichip-overview.md) + - [Porting Preparation](porting-minichip-prepare.md) + - [Kernel Porting](porting-minichip-kernel.md) + - Subsystem Porting + - [Subsystem Porting Overview](porting-minichip-subsys-overview.md) + - [Porting the Startup Subsystem](porting-minichip-subsys-startup.md) + - [Porting the File Subsystem](porting-minichip-subsys-filesystem.md) + - [Porting the Security Subsystem](porting-minichip-subsys-security.md) + - [Porting the Communication Subsystem](porting-minichip-subsys-communication.md) + - [Porting the Driver Subsystem](porting-minichip-subsys-driver.md) + - [Configuring Other Subsystems](porting-minichip-subsys-others.md) + - [Porting Verification](porting-minichip-verification.md) - [FAQs](porting-chip-faqs.md) - Small System SoC Porting Guide - Porting Preparations diff --git a/en/device-dev/porting/figures/en-us_image_0000001378282213.png b/en/device-dev/porting/figures/en-us_image_0000001378282213.png new file mode 100644 index 0000000000000000000000000000000000000000..0118cd0e1c374008147e8bbfa13a53f86a66065f GIT binary patch literal 40570 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 literal 0 HcmV?d00001 diff --git a/en/device-dev/porting/figures/en-us_image_0000001378481233.png b/en/device-dev/porting/figures/en-us_image_0000001378481233.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7c63979fc2bca98c71478561be53df53033b51 GIT binary patch literal 53951 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 Dcb}fK literal 0 HcmV?d00001 diff --git a/en/device-dev/porting/porting-asr582x-combo-demo.md b/en/device-dev/porting/porting-asr582x-combo-demo.md index 787641e8b5..753fc405dd 100644 --- a/en/device-dev/porting/porting-asr582x-combo-demo.md +++ b/en/device-dev/porting/porting-asr582x-combo-demo.md @@ -473,8 +473,6 @@ The compilation option entry of the subsystem is in the `config.json` file of th The source code of the lwIP component is stored in `//third_party/lwip`. The kernel in OpenHarmony is customized in `//kernel/liteos_m/components/net/lwip-2.1`, including the redefinition of some interfaces and structures. -For details about the porting process, see [lwIP Module Adaptation](porting-chip-board-lwip.md). - In this example, the path for setting lwip in the `config.json` file is as follows: ``` diff --git a/en/device-dev/porting/porting-chip-board-bundle.md b/en/device-dev/porting/porting-chip-board-bundle.md deleted file mode 100644 index 9edf5d3f14..0000000000 --- a/en/device-dev/porting/porting-chip-board-bundle.md +++ /dev/null @@ -1,56 +0,0 @@ -# Third-party Module Adaptation - -To use third-party modules in the **third\_party** directory, you may need to adapt the modules. This section uses mbedTLS as an example to describe how to integrate the adaptation code with the OpenHarmony compilation framework. For the principles of mbedTLS and the specific logic of the adaptation code, see the adaptation guide on the mbedTLS official website. - -1. Write the adaptation layer code. - - Write the required adaptation layer code based on the mbedTLS adaptation guide. In this example, adaptation of the hardware random number is used for illustration, and the paths are relative to **third\_party/mbedtls**: - - 1. Copy the **include/mbedtls/config.h** file to the **ports** directory, and enable **MBEDTLS\_ENTROPY\_HARDWARE\_ALT** in the file. - 2. In the **ports** directory, create the **entropy\_poll\_alt.c** file under **include** and implement the hardware random number API in **entropy\_poll.h**. - 3. Add the path of the adapted **entropy\_poll\_alt.c** file to **mbedtls\_sources** in the **BUILD.gn** file. - 4. Add the line **MBEDTLS\_CONFIG\_FILE** to **lite\_library\("mbedtls\_static"\)** in the **BUILD.gn** file to specify the path of the new configuration file. - - ``` - lite_library("mbedtks_static") { - ... - defines += ["MBEDTLS_CONFIG_FILE=<../port/config.h>"] - ... - } - ``` - - You are advised to make the preceding modifications in a new **config.h** file or **_xxx_\_alt.c** file. Do not directly edit the code in the original file. Intrusive modifications may cause a large number of scattered conflicts during subsequent version updates, increasing the update maintenance costs. - -2. Create a patch. - - The preceding adaptation is hardware-specific. Therefore, when uploading code to the library, you cannot directly store the code in the **third\_party/mbedtls** directory. Instead, you need to integrate the preceding modifications into a patch and inject the patch into the code for a build. - - 1. Add the patch configuration file **device/<_company_\>/<_board_\>/patch.yml**. - 2. In the **device/<_company_\>/<_board_\>/patch.yml** file, add the information about the patch to apply. - - ``` - # Path of the patch to apply. This path is relative to the code root directory. - third_party/mbedtls: - # Directory in which the patch is stored. - - device///third_party/mbedtls/adapter.patch - third_party/wpa_supplicant: - # When there are multiple patches in a path, the patches are executed in sequence. - - device///third_party/wpa_supplicant/xxxxx.patch - - device///third_party/wpa_supplicant/yyyyy.patch - ... - ``` - - 3. Create a patch file as described in step [1](#li12446195633211) and save it to the corresponding directory. - -3. Start a build with the patch. - - Add **--patch** when triggering a build. The following is the command for executing a full build with a patch: - - ``` - hb build -f --patch - ``` - - >![](../public_sys-resources/icon-caution.gif) **CAUTION:** - >The information about the product to which the patch is most recently applied will be recorded. Next time the build is performed, the previous patch is rolled back \(that is, **\`patch -p1 -R < xxx\`** is executed\). If the patch fails to be rolled back or a patch fails to be added, the build process is terminated. In this case, resolve the patch conflict and try again. - - diff --git a/en/device-dev/porting/porting-chip-board-component.md b/en/device-dev/porting/porting-chip-board-component.md deleted file mode 100644 index 337bcea901..0000000000 --- a/en/device-dev/porting/porting-chip-board-component.md +++ /dev/null @@ -1,23 +0,0 @@ -# System Modules - -System modules, such as the system ability manager \(SAMGR\) and DFX subsystem, provide basic capabilities for upper-layer applications. During board-level system porting, you can directly select the system modules as required without any adaptation. - -## SAMGR - -**Introduction** - -This service-oriented framework enables you to develop services, features, and external APIs, and implement multi-service process sharing and service invocation for inter-process communication \(IPC\). - ->![](../public_sys-resources/icon-notice.gif) **NOTICE:** ->This module must be used during board-level system porting. Otherwise, other service modules cannot run properly. - -For details about how to use SAMGR, see [samgr\_lite](https://gitee.com/openharmony/systemabilitymgr_samgr_lite/blob/master/README.md). - -## DFX - -**Introduction** - -The design for X \(DFX\) subsystem mainly includes design for reliability \(DFR\) and design for testability \(DFT\), providing code maintenance and testing. - -For details about how to use the DFX subsystem, see [DFX](../subsystems/subsys-dfx-overview.md). - diff --git a/en/device-dev/porting/porting-chip-board-driver.md b/en/device-dev/porting/porting-chip-board-driver.md deleted file mode 100644 index 409f68fbcd..0000000000 --- a/en/device-dev/porting/porting-chip-board-driver.md +++ /dev/null @@ -1,49 +0,0 @@ -# Board-Level Driver Adaptation - -To implement board-level driver adaptation, perform the following steps: - -1. Develop the SDK based on the CMSIS/POSIX APIs provided by OpenHarmony. - - The board-level SDK can be adapted to OS interfaces via CMSIS and POSIX APIs. Currently, the LiteOS Cortex-M kernel is adapted to most CMSIS APIs \(including APIs used for basic kernel management, thread management, timer, event, mutex, semaphore, and queue\), which meets the requirements of porting. POSIX APIs provide basic capabilities for porting, and more POSIX APIs are to be implemented. If the SDK is implemented based on the CMSIS or POSIX APIs, it can directly adapt to the LiteOS Cortex-M kernel. - - If the SDK is developed based on other embedded OSs such as FreeRTOS, or has an abstraction layer for OS interfaces, it is recommended that the OS-dependent APIs be directly adapted to the CMSIS APIs. - - Here is an OS interface defined by a product for creating a queue: - - - ``` - bool osif_msg_queue_create(void **pp_handle, uint32_t msg_num, uint32_t msg_size) - ``` - - The CMSIS API used for creating a queue is as follows: - - - ``` - osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr); - ``` - - The following example shows how to adapt the OS interface to the CMSIS API: - - - ``` - #include "CMSIS_os2.h" - osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr); - bool osif_msg_queue_create(void **pp_handle, uint32_t msg_num, uint32_t msg_size) - { - (*pp_handle) = osMessageQueueNew (msg_num, msg_size, NULL); - if((*pp_handle) == NULL){ - return FALSE; - } - return TRUE; - } - ``` - -2. Compile the SDK independently or modify the SDK based on the OpenHarmony building framework and integrate the SDK code into the **device** directory of OpenHarmony as required. - - After completing the OS API adaptation, you can integrate the board-level driver to OpenHarmony by the following two methods: - - - Compile the SDK independently and link it to the OpenHarmony project in the binary format. - - Modify the SDK building framework based on OpenHarmony. Considering the long-term evolution and subsequent joint debugging, you are advised to compile the SDK based on the GN building framework and link it to the OpenHarmony project in the form of source code. - -3. Verify the basic functions of the SDK. - diff --git a/en/device-dev/porting/porting-chip-board-hal.md b/en/device-dev/porting/porting-chip-board-hal.md deleted file mode 100644 index d06c425d8c..0000000000 --- a/en/device-dev/porting/porting-chip-board-hal.md +++ /dev/null @@ -1,70 +0,0 @@ -# Implementation of APIs at the HAL - -The HAL mainly aims to decouple OpenHarmony from the SoC. The following modules describe the dependency of OpenHarmony on the SoC APIs. - -## Utils - -**Introduction** - -The Utils subsystem provides common basic components that can be used by other subsystems and upper-layer applications. These basic components are implemented based on the file system of the SoC. The SoC platform must implement file operations such as opening, closing, reading data from, and writing data to a file, as well as obtaining the file size. - -**Description for HAL APIs of the Utils subsystem** - -The SoC needs to implement related APIs. For details about the dependency of OpenHarmony on the SoC file system APIs, see [HAL header files of Utils](https://gitee.com/openharmony/utils_native_lite/tree/master/hals/file). - -## IoT Peripheral Subsystem - -**Introduction** - -The IoT peripheral subsystem provides dedicated peripheral operation interfaces for OpenHarmony, including FLASH, GPIO, I2C, PWM, UART, and WATCHDOG APIs. - -**Description for HAL APIs of the IoT peripheral subsystem** - -The SoC needs to implement related APIs. For details about the dependency of OpenHarmony on the chip peripheral APIs, see [HAL header files of IoT peripherals](https://gitee.com/openharmony/iothardware_peripheral/tree/master/interfaces/inner_api). - -## WLAN - -**Introduction** - -The WLAN service enables devices to access the WLAN in the following modes: - -- **Station \(STA\) mode**: allows your device to connect to the WLAN access point enabled on other devices and routers. - -- **Access point \(AP\) mode**: enables your device to function as a WLAN access point for other devices to connect to. - - -The WLAN service enables you to control the WLAN in the system, including enabling, disabling, scanning for, connecting to, and disconnecting from WLAN access points. - -In addition, it supports event listening. You can listen to the WLAN status and immediately detect the status change. - -**Description for HAL APIs of the WLAN subsystem** - -The code path and API definition are as follows: - -``` -foundation/communication/interfaces/kits/wifi_lite/wifiservice/ -├── station_info.h -├── wifi_device_config.h -├── wifi_device.h -├── wifi_error_code.h -├── wifi_event.h -├── wifi_hotspot_config.h -├── wifi_hotspot.h -├── wifi_linked_info.h -└── wifi_scan_info.h -``` - -The vendor needs to implement defined APIs in the **vendor/\*\*\*/\*\*\*/\*\*\*\_adapter** directory. The following example shows how to implement these APIs for the Hi3861 chip: - -``` -vendor/hisi/hi3861/hi3861_adapter/hals/communication/wifi_lite/wifiservice/ -├── BUILD.gn -└── source -├── wifi_device.c -├── wifi_device_util.c -├── wifi_device_util.h -└── wifi_hotspot.c -``` - -The SoC needs to implement related APIs. For details about the dependency of OpenHarmony on the chip peripheral APIs, see [header files of WLAN](https://gitee.com/openharmony/communication_wifi_lite/tree/master/interfaces/wifiservice). - diff --git a/en/device-dev/porting/porting-chip-board-lwip.md b/en/device-dev/porting/porting-chip-board-lwip.md deleted file mode 100644 index 30e8af94bb..0000000000 --- a/en/device-dev/porting/porting-chip-board-lwip.md +++ /dev/null @@ -1,64 +0,0 @@ -# lwIP Module Adaptation - -Lightweight IP (lwIP) is an open-source TCP/IP stack designed for embedded systems. LiteOS-M has adapted to lwIP and provides enhanced lwIP features. The lwIP code consists of the following: - -- lwIP source code in the **third_party/lwip** directory: Only a few intrusive modifications have been made for enhanced features. - -- Code for lwIP adaptation and enhancement in the **kernel/liteos_m/components/net/lwip-2.1** directory: The default lwIP configuration file is provided. - -If you want to use the lwIP module, perform the following steps to complete adaptation: - -1. Create a directory, for example, **lwip_adapter**, in the device directory to store its adaptation files. - -2. Create the **include** directory in the **lwip_adapter** directory to store the adaptation header files. - -3. Create the **lwip** directory in the **include** directory and then create the header file **lwipopts.h** in the **lwip** directory. The code is as follows. If the default configuration cannot meet service requirements, modify the configuration, for example, disable the DHCP function. - - ``` - #ifndef _LWIP_ADAPTER_LWIPOPTS_H_ - #define _LWIP_ADAPTER_LWIPOPTS_H_ - - #include_next "lwip/lwipopts.h" - - #undef LWIP_DHCP - #define LWIP_DHCP 0 // Disable the DHCP function. - - #endif /* _LWIP_ADAPTER_LWIPOPTS_H_ */ - ``` - -4. Copy **BUILD.gn** in the **kernel/liteos_m/components/net/lwip-2.1/porting** directory to the **lwip_adapter** directory and modify the file as follows: - - ``` - import("//kernel/liteos_m/liteos.gni") - import("$LITEOSTHIRDPARTY/lwip/lwip.gni") - import("$LITEOSTOPDIR/components/net/lwip-2.1/lwip_porting.gni") - - module_switch = defined(LOSCFG_NET_LWIP_SACK) - module_name = "lwip" - kernel_module(module_name) { - sources = LWIP_PORTING_FILES + LWIPNOAPPSFILES - [ "$LWIPDIR/api/sockets.c" ] - include_dirs = [ "//utils/native/lite/include" ] - } - - # Add include, the directory of the new adaptation header file. - config("public") { - include_dirs = [ "include" ] + LWIP_PORTING_INCLUDE_DIRS + LWIP_INCLUDE_DIRS - } - ``` - -5. In the device configuration file (for example, **config.json**), set the lwIP build path to the path of **BUILD.gn** in step 4. - - ``` - { - "subsystem": "kernel", - "components": [ - { "component": "liteos_m", "features":["ohos_kernel_liteos_m_lwip_path = \"//xxx/lwip_adapter\"" ] } - ] - }, - ``` - -6. In the kernel build configuration file of the device, for example, **kernel_config/debug.config**, enable lwIP build. - - ``` - LOSCFG_NET_LWIP=y - ``` diff --git a/en/device-dev/porting/porting-chip-board-overview.md b/en/device-dev/porting/porting-chip-board-overview.md deleted file mode 100644 index d2cb9a35d9..0000000000 --- a/en/device-dev/porting/porting-chip-board-overview.md +++ /dev/null @@ -1,54 +0,0 @@ -# Porting Overview - -## Porting Process - -After the minimum system is ported, you can port the board-level system by: - -1. Implementing the board-level driver adaptation -2. Completing the implementation at the HAL -3. Implementing the XTS -4. Verifying service functions - -**Figure 1** Process for board-level driver adaptation -![process-for-board-level-driver-adaptation](figures/process-for-board-level-driver-adaptation.png) - -## Board-Level Directory Specifications - -For details about board-level system building adaptation, see [Compilation and Building Subsystem](porting-chip-prepare-process.md). The board-related drivers, software development software kits \(SDKs\), directories, and HAL implementation are stored in the **device** directory. The directory structure and its description are as follows: - -``` -. -├── device --- Sample board -│ └── xxx --- -│ └── xxx --- . This directory contains the demo of the LiteOS Cortex-M kernel, which can run properly. -│ ├── BUILD.gn --- Building configuration file of the board -│ ├── board --- Specific implementation of the board (Optional. If a product-level demo is provided, implementation at the application layer is stored in this directory.) -│ ├── liteos_m --- LiteOS Cortex-M kernel to use based on the kernel_type in the BUILD.gn file -│ │ └── config.gni --- Building options -│ ├── libraries --- Board-level SDK -│ │ └── include --- SDK-provided header files that are exposed externally -│ │ └── ... --- binary or source files -│ ├── main.c --- main function entry (Product level configuration is used if the same definition exists at the product level.) -│ ├── target_config.h --- Board-level kernel configuration -│ ├── project --- Board-level project configuration file (Product-level configuration is used if the same definition exists at the product level.) -│ └── adapter --- HAL interfaces (Optional) -│ └── hals -│ ├── communication -│ │ └── wifi_lite -│ │ ├── ... -│ └── iot_hardware -│ ├── upgrade -│ ├── utils -│ └── wifiiot_lite -├── vendor --- End-to-end feature product sample of OpenHarmony -│ └── huawei --- Vendor name -│ └── wifiiot --- Feature product -│ ├── app -│ │ └── main.c --- main function entry of the product -│ ├── project --- Project configuration file -│ ├── BUILD.gn --- Project building entry -│ └── config.json --- Building configuration file of the product and components used for product configuration -└── out --- Output directory during the building - ├── ... --- .bin files generated during board/product building -``` - diff --git a/en/device-dev/porting/porting-chip-board-xts.md b/en/device-dev/porting/porting-chip-board-xts.md deleted file mode 100644 index 9b69d5d93c..0000000000 --- a/en/device-dev/porting/porting-chip-board-xts.md +++ /dev/null @@ -1,58 +0,0 @@ -# XTS - -## Introduction - -X Test Suite \(XTS\) is a set of OpenHarmony certification test suites. Currently, the application compatibility test suite \(ACTS\) is supported. The **test/xts** repository contains the **acts** directory and **tools** software package. - -- The **acts** directory stores the source code and configuration files of ACTS test cases. The ACTS helps device vendors detect the software incompatibility as early as possible and ensures that the software is compatible with OpenHarmony during the entire development process. -- The **tools** software package stores the test case development framework related to **acts**. - ->![](../public_sys-resources/icon-note.gif) **NOTE:** ->The startup of the XTS depends on the SAMGR module. - -The XTS adaptation consists of the following steps: - -1. Add the XTS subsystem to the building component. -2. Execute ACTS cases for the IoTLink module. - -### Adding the XTS Subsystem to the Building Component - -The following example shows how to add the XTS subsystem to the building component **hispark\_aries**: - -1. Add the definition of the XTS subsystem to the **vendor/hisilicon/hispark\_aries/config.json** file. - - ``` - { - "subsystem": "test", - "components": [ - { "component": "xts_acts", "features":[] }, - { "component": "xts_tools", "features":[] } - ] - }, - ``` - -2. Set the building type to the debug version so that the XTS subsystem can be built. - -### Executing ACTS Cases for the IoTLink Module - -The following example shows how to execute ACTS cases for the IoTLink module of **hispark\_aries**: - -1. Obtain the built image. - - Obtain the image from the **out/hispark\_pegasus/wifiiot\_hispark\_pegasus/** directory. - - >![](../public_sys-resources/icon-note.gif) **NOTE:** - >To check whether the ACTS is integrated into the current image, check whether the corresponding **.a** file is compiled. - -2. Burn the image into the development board. -3. Execute the test by performing the following steps. - - Use a serial port tool to log in to the development board and save information about the serial port. - - - Restart the device and view serial port logs. - -4. Analyze the test result. - - View the serial port logs, whose format is as follows: - - - The log for each test suite starts with **Start to run test suite:** and ends with **xx Tests xx Failures xx Ignored**. - - diff --git a/en/device-dev/porting/porting-chip-kernel-adjustment.md b/en/device-dev/porting/porting-chip-kernel-adjustment.md deleted file mode 100644 index 0fe4f81cc5..0000000000 --- a/en/device-dev/porting/porting-chip-kernel-adjustment.md +++ /dev/null @@ -1,86 +0,0 @@ -# Basic Kernel Adaptation - -The LiteOS Cortex-M kernel provides the system initialization process and customized configuration options required for system running. During kernel porting, you must pay attention to the functions related to hardware configuration in the initialization process and understand the kernel configuration options so that the minimum kernel that matches the board can be tailored. - -## Adaptation Process - -Basic adaptation consists of the following steps: - -1. Modify the code in the **startup.S** and corresponding link configuration files. -2. Initialize the serial port and register the handler function for the tick interrupt response in the **main.c** file - -**Figure 1** Startup process - - -![](figures/startup-process.png) - -In the **startup.S** file, you must ensure that the entry function \(for example, **reset\_vector**\) of the interrupt vector table is stored in the RAM start address specified by the link configuration files. The link configuration files of IAR, Keil, and GCC projects are **xxx.icf**, **xxx.sct**, and **xxx.ld**, respectively. The startup file provided by the vendor does not need to be modified if the **startup.S** file has initialized the system clock and returned to the **main** function. Otherwise, the preceding functions need to be implemented. - -In the **main.c** file, you need to register the UartInit function used for initializing the serial port and the handler function used for the system tick. - -- The UartInit function initializes the board serial port, and the function name can be defined based on the board. This function is optional. You can determine whether to call it based on whether the board supports the serial port. If the board supports the serial port, this function must enable TX and RX channels of the serial port and set the baud rate. -- You can call **HalTickStart** to set the **OsTickHandler** function for the tick interrupt response. - -For the chip whose interrupt vector table cannot be redirected, you need to disable the **LOSCFG\_PLATFORM\_HWI** macro, and add the **OsTickHandler** function for the tick interrupt response in the **startup.S** file. - -## Feature Configuration - -The **los\_config.h** file defines both complete configuration and default configuration of **liteos\_m**. All configuration items in this file can be customized for different boards as required. - -You can define configuration items in the **device/xxxx/target\_config.h** file of the corresponding board. For other undefined configuration items, default values in the **los\_config.h** file will be used. - -The following table shows some typical configuration items: - -**Table 1** Typical configuration items - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Item

-

Description

-

LOSCFG_BASE_CORE_SWTMR

-

Switch of the software timer. The values 1 and 0 indicate that the switch is turned on and turned off, respectively.

-

LOSCFG_BASE_CORE_SWTMR_ALIGN

-

Switch of the time alignment feature, which depends on the switch status of the software timer. The values 1 and 0 indicate that the switch is turned on and turned off, respectively.

-

LOSCFG_BASE_IPC_MUX

-

Switch of the mux feature. The values 1 and 0 indicate that the switch is turned on and turned off, respectively.

-

LOSCFG_BASE_IPC_QUEUE

-

Switch of the queue feature. The values 1 and 0 indicate that the switch is turned on and turned off, respectively.

-

LOSCFG_BASE_CORE_TSK_LIMIT

-

Maximum number of available tasks, excluding idle tasks. You can set this item based on your actual service requirements, or you can initially set it to a large value and adjust the value at a later time.

-

LOSCFG_BASE_IPC_SEM

-

Switch of the semaphore feature. The values 1 and 0 indicate that the switch is turned on and turned off, respectively.

-

LOSCFG_PLATFORM_EXC

-

Switch of the exception feature. The values 1 and 0 indicate that the switch is turned on and turned off, respectively.

-

LOSCFG_KERNEL_PRINTF

-

Switch of the print feature. The values 1 and 0 indicate that the switch is turned on and turned off, respectively.

-
- diff --git a/en/device-dev/porting/porting-chip-kernel-overview.md b/en/device-dev/porting/porting-chip-kernel-overview.md deleted file mode 100644 index 09385503b4..0000000000 --- a/en/device-dev/porting/porting-chip-kernel-overview.md +++ /dev/null @@ -1,59 +0,0 @@ -# Porting Overview - -## Porting Scenario - -The chip architecture adaptation process is optional. If the particular chip architecture is supported in the **liteos\_m/arch** directory, you can directly implement the board adaptation. Otherwise, chip architecture porting is required. - -## Directory Specifications - -The kernel used by module chips is LiteOS Cortex-M, which consists of four modules, namely kernel abstraction layer \(KAL\), components, kernel, and utils. - -- **KAL**: provides APIs exposed externally and depends on the components and kernel modules. -- **Components**: is pluggable and relies on the kernel module. - -- **Kernel**: stores hardware-related code in the **arch** directory and other code. The implementation of kernel function sets \(such as task and sem\), for example, task context switching and atomic operations, depends on the hardware-related code in the **arch** directory. -- **Utils**: functions as a basic code block where other modules rely. - -**Figure 1** Architecture of the LiteOS Cortex-M kernel - -![architecture-of-the-liteos-cortex-m-kernel.png](figures/architecture-of-the-liteos-cortex-m-kernel.png) - -The directory structure of the kernel is described as follows: - -``` -. -├── arch --- Code of the kernel instruction architecture layer -│ ├── arm --- Code of the ARM32 architecture -│ │ ├── cortex-m3 --- Code of the Cortex-M3 architecture -│ │ │ ├── iar --- Implementation of the IAR toolchain -│ │ │ ├── keil --- Implementation of the Keil toolchain -│ │ │ └── xxx --- Implementation of the particular toolchain -│ │ └── cortex-m4 --- Code of the Cortex-M4 architecture -│ │ ├── iar --- Implementation of the IAR toolchain -│ │ ├── keil --- Implementation of the Keil toolchain -│ │ └── xxx --- Implementation of the particular toolchain -│ ├── include --- Header files that declare the APIs required, kernel-independent -│ └── risc-v --- RISK_V architecture -│ └── gcc --- Implementation of the GCC toolchain -├── components --- Components available for porting and header files exposed externally -├── kal --- APIs exposed externally, including CMSIS APIs and part of POSIX APIs -├── kernel --- Code for defining the minimum kernel function set -│ ├── include --- Code for defining the minimum kernel function set -│ └── src --- Code for implementing the minimum kernel function set -└──utils --- Basic code -``` - -## Chip Architecture Adaptation - -As shown in the [Directory Specifications](#section18127744153119), the **arch/include** directory defines the functions that need to be implemented on the common chip architecture. The code related to the chip architecture contains assembly code, which varies based on building toolchains. Therefore, the code for adapting to different toolchains \(for example, IAR, Keil, GCC, etc.\) must be implemented in a specific chip architecture. - -The **arch/include** directory defines common files and functions. All functions in this directory need to be implemented to adapt to a newly added architecture. For details, refer to the following header files. - -``` -los_arch.h --- Defines the functions required for initializing the chip architecture. -los_atomic.h --- Defines the atomic operation functions required by the chip architecture. -los_context.h --- Defines the context functions required by the chip architecture. -los_interrupt.h --- Defines the interrupt and exception functions required by the chip architecture. -los_timer.h --- Defines the timer functions required by the chip architecture. -``` - diff --git a/en/device-dev/porting/porting-chip-kernel-verify.md b/en/device-dev/porting/porting-chip-kernel-verify.md deleted file mode 100644 index 389486e102..0000000000 --- a/en/device-dev/porting/porting-chip-kernel-verify.md +++ /dev/null @@ -1,59 +0,0 @@ -# Kernel Porting Verification - -Add the sample program file **main.c** to the **device** directory of the project and compile the file. After LOS\_KernelInit is complete, this sample program will create two tasks that loop the **LOS\_TaskDelay** function and print the log information cyclically. In this way, you can check whether system scheduling and the clock work properly. - -``` -VOID TaskSampleEntry2(VOID) // Entry function of task 2 -{ - while(1) { - LOS_TaskDelay(10000); - printf("taskSampleEntry2 running...\n"); - } -} - -VOID TaskSampleEntry1(VOID) // Entry function of task 1 -{ - while(1) { - LOS_TaskDelay(2000); - printf("taskSampleEntry1 running...\n"); - } -} - -UINT32 TaskSample(VOID) -{ - UINT32 uwRet; - UINT32 taskID1,taskID2; - TSK_INIT_PARAM_S stTask1={0}; - stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry1; - stTask1.uwStackSize = 0X1000; - stTask1.pcName = "taskSampleEntry1"; - stTask1.usTaskPrio = 6; // Set the priority of stTask1, which is different from that of stTask2. - uwRet = LOS_TaskCreate(&taskID1, &stTask1); - - stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry2; - stTask1.uwStackSize = 0X1000; - stTask1.pcName = "taskSampleEntry2"; - stTask1.usTaskPrio = 7; - uwRet = LOS_TaskCreate(&taskID2, &stTask1); - - return LOS_OK; -} - -LITE_OS_SEC_TEXT_INIT int main(void) -{ - UINT32 ret; - UartInit(); // Configure the hardware serial port and output the debug log over this serial port. The actual function name varies with the board. - printf("\n\rhello world!!\n\r"); - ret = LOS_KernelInit(); - TaskSample(); - if (ret == LOS_OK) { - LOS_Start(); // Start system scheduling, execute stTask1/stTask2 cyclically, and output task logs over the serial port. - } - while (1) { - __asm volatile("wfi"); - } -} -``` - -If the first task is executed properly, the core process of the minimum system is valid. Due to the XTS framework's dependency on the link scripts of Utils and Bootstrap as well as the building framework, testing the kernel by executing the XTS is not supported. You can test whether the minimum system is completely ported in [XTS](porting-chip-board-xts.md). - diff --git a/en/device-dev/porting/porting-chip-prepare-knows.md b/en/device-dev/porting/porting-chip-prepare-knows.md deleted file mode 100644 index 64a136cd48..0000000000 --- a/en/device-dev/porting/porting-chip-prepare-knows.md +++ /dev/null @@ -1,67 +0,0 @@ -# Before You Start - - -This document provides basic guidance for OpenHarmony developers and system on a chip (SoC) or module vendors to port OpenHarmony to typical chip architectures, such as the Cortex-M and RISC-V series. Currently, the Bluetooth service is not supported. Due to the complexity of the OpenHarmony project, this document is subject to update as the version and APIs change. - - -This guide is intended for readers who have experience in developing embedded systems. Therefore, it mainly describes operations and key points during platform porting instead of basic introduction to the OS. - - -## Porting Directory - -The implementation of the OpenHarmony project directories and functions relies on the OS itself. If no enhancement for a complex feature is involved, you only need to focus on the directories described in the following table. - - **Table 1** Key directories in the porting process - -| Directory| Description| -| -------- | -------- | -| /build/lite | OpenHarmony basic compilation and building framework.| -| /kernel/liteos_m | Basic kernel. The implementation related to the chip architecture is in the **arch** directory.| -| /device | Board-level implementation, which complies with the OpenHarmony specifications. For details about the directory structure and porting process, see [Overview](../porting/porting-chip-board-overview.md).| -| /vendor | Product-level implementation, which is contributed by product vendors. | - -The **device** directory is in the internal structure of **device/{Chip solution vendor}/{Development board}**. The following uses HiSilicon **hispark_taurus** as an example: - - -``` -device -└── hisilicon # Name of the chip solution vendor - ├── common # Common part of the chip solution development board - └── hispark_taurus # Name of the development board - ├── BUILD.gn # Entry to building the development board - ├── hals # OS hardware adaptation of the chip solution vendor - ├── linux # Linux version - │ └── config.gni # Configurations of the building toolchain and building options for the Linux version - └── liteos_a # LiteOS Cortex-A version - └── config.gni # Configurations of the building toolchain and building options for the LiteOS Cortex-A version -``` - - -The **vendor** directory is in the internal structure of **vendor/{Product solution vendor}/{Product name}**. The following uses the Wi-Fi IoT product as an example: - - - -``` -vendor # Product solution vendor -└── example # Name of the product solution vendor - └── wifiiot # Product name - ├── hals # OS adaptation of the product solution vendor - ├── BUILD.gn # Product building script - └── config.json # Product configuration file -``` - - -## Porting Process - -The **device** directory of OpenHarmony is the adaptation directory for the basic SoC. You can skip the porting process and directly develop system applications if complete SoC adaptation code is already available in the directory. If there is no corresponding SoC porting implementation in the directory, complete the porting process by following the instructions provided in this document. The following figure shows the process of porting OpenHarmony to a third-party SoC. - - **Figure 1** Key steps for SoC porting - - ![en-us_image_0000001200336823](figures/en-us_image_0000001200336823.png) - - -## Porting Specifications - -- The porting must comply with the basic principles described in [How to Contribute](../../contribute/how-to-contribute.md). - -- The code required for third-party SoC adaptation is stored in the **device**, **vendor**, and **arch** directories. Naming and usage of these directories must comply with specified naming and usage specifications. For details, see [Overview](../porting/porting-chip-kernel-overview.md) and [Board-Level Directory Specifications](../porting/porting-chip-board-overview.md#section6204129143013). diff --git a/en/device-dev/porting/porting-chip-prepare-process.md b/en/device-dev/porting/porting-chip-prepare-process.md deleted file mode 100644 index e65e733482..0000000000 --- a/en/device-dev/porting/porting-chip-prepare-process.md +++ /dev/null @@ -1,119 +0,0 @@ -# Building Adaptation Process - - -For details about compilation and building, see [Compilation and Building Guide](../subsystems/subsys-build-all.md). When adding third-party chips, perform the following steps to complete building adaptation: - - -## Building Adaptation Process - -You need to create a directory for the development board. For example, for the RTL8720 development board from SoC provider Realtek, the **device/realtek/rtl8720** directory must be created. To complete the building adaptation, perform the following steps: - -1. Configure the toolchain and building options. - - The **ohos-clang** toolchain is used by default. SoC providers can also customize the configuration based on their development boards. The building-related variables in the building configuration file of the development board are described as follows: - - - **kernel_type**: kernel used by the development board, for example, **"liteos_a"**, **"liteos_m"**, or **"linux"**. - - **kernel_version**: kernel version of the development board, for example, **"4.19"**. - - **board_cpu**: CPU of the development board, for example, **"cortex-a7"** or **"riscv32"**. - - **board_arch**: chipset architecture of the development board, for example, **"armv7-a"** or **"rv32imac"**. - - **board_toolchain**: name of the customized build toolchain used by the development board, for example, **"gcc-arm-none-eabi"**. If this field is not specified, **ohos-clang** will be used. - - **board_toolchain_prefix**: prefix of the build toolchain, for example, **"gcc-arm-none-eabi"**. - - **board_toolchain_type**: build toolchain type. Currently, only GCC (**"gcc"**) and clang (**"clang"**) are supported. - - **board_cflags**: build options of the .c file configured for the development board. - - **board_cxx_flags**: build options of the **.cpp** file configured for the development board. - - **board_ld_flags**: linking options configured for the development board. - The corresponding **config.gni** file will be loaded based on the development board selected by the product. The variables in this file are globally visible to system modules. - - The following is an example of the **device/realtek/rtl8720/liteos_m/config.gni** file for the RTL8720 development board: - - - ``` - # Kernel type, e.g. "linux", "liteos_a", "liteos_m". - kernel_type = "liteos_m" - - # Kernel version. - kernel_version = "3.0.0" - - # Board CPU type, e.g. "cortex-a7", "riscv32". - board_cpu = "real-m300" - - # Board arch, e.g. "armv7-a", "rv32imac". - board_arch = "" - - # Toolchain name used for system compiling. - # E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang, riscv32-unknown-elf. - # Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toochain. - board_toolchain = "gcc-arm-none-eabi" - - # The toolchain path installed, it's not mandatory if you have added toolchain path to your ~/.bashrc. - board_toolchain_path = - rebase_path("//prebuilts/gcc/linux-x86/arm/gcc-arm-none-eabi/bin", - root_build_dir) - - # Compiler prefix. - board_toolchain_prefix = "gcc-arm-none-eabi-" - - # Compiler type, "gcc" or "clang". - board_toolchain_type = "gcc" - - # Board related common compile flags. - board_cflags = [] - board_cxx_flags = [] - board_ld_flags = [] - ``` - -2. Write the build script of the development board. - - For a newly added development board, the **BUILD.gn** file that functions as the entry for building must be added to the board directory. The following is an example of the **device/realtek/rtl8720/BUILD.gn** file for the RTL8720 development board: - - - ``` - group("rtl8720") { - ... - } - ``` - -3. Build and debug the development board. - 1. Run the **hb set** command in any directory to set the source code path and the product to build. - - 2. Run the **hb build** command in the development board directory to start the build. - -4. Build and debug the product. - - Write the development board and module information to the product configuration file. Fields in the configuration file are as follows: - - - **product_name**: product name, which can be customized. It is recommended that the value be the same as the level-3 directory name under the **vendor** directory. - - **ohos_version**: OpenHarmony version number, which must be the same as the actual version number. - - **device_company**: name of the chip solution vendor. It is recommended that the value be the same as the level-2 directory name under the **device** directory. - - **board**: name of the development board. It is recommended that the value be the same as the level-3 directory name under the **device** directory. - - **kernel_type**: kernel type, which must match the kernel type supported by the development board. - - **kernel_version**: kernel version, which must match the kernel version supported by the development board. - - **subsystem**: subsystem selected for the product. For details about the supported subsystem, see the descriptions of the subsystems in the **build/lite/components** directory. - - **components**: subsystem-specific modules selected for the product. For details about the modules supported by the selected subsystem, see the **build/lite/components/*Specific subsystem*.json** file. - - **features**: module-specific features configured for the product. For details about the features supported by the selected module, see the **features** field of the module in **build/lite/components/*Specific subsystem*.json** file. - - The following is an example of the **vendor/my_company/wifiiot/config.json** file for the Wi-Fi IoT module on the RTL8720 development board: - - - ``` - { - "product_name": "wifiiot", # Product name - "ohos_version": "OpenHarmony 1.0", # OS version - "device_company": "realtek", # Name of the chipset solution vendor - "board": "rtl8720", # Name of the development board - "kernel_type": "liteos_m", # Kernel type - "kernel_version": "3.0.0", # Kernel version - "subsystems": [ - { - "subsystem": "kernel", # Subsystem - "components": [ - { "component": "liteos_m", "features":[] } # Module and its features - ] - }, - ... - { - More subsystems and modules - } - ] - } - ``` \ No newline at end of file diff --git a/en/device-dev/porting/porting-minichip-kernel.md b/en/device-dev/porting/porting-minichip-kernel.md new file mode 100644 index 0000000000..7d2e7ecb7b --- /dev/null +++ b/en/device-dev/porting/porting-minichip-kernel.md @@ -0,0 +1,265 @@ +# Kernel Porting + + +## Porting the Chip Architecture + +Chip architecture porting is the basis of kernel porting. It is required when the target chip architecture is not yet supported in OpenHarmony. You can check the supported architectures in the **liteos_m/arch** directory, as shown in Table 1. + + **Table 1** Architectures supported by OpenHarmony + +| Series| Model| +| -------- | -------- | +| Arm| arm9
cortex-m3
cortex-m4
cortex-m7
cortex-m33 | +| C-SKY| v2 | +| RISC-V| nuclei
riscv32 | +| Xtensa| lx6 | + + +If the target chip architecture is not yet supported in OpenHarmony, it must be adapted by the chip vendor. The **arch/include** directory contains the functions that need to be implemented for common chip architecture adaptation. Some chip architecture code is implemented by assembly, and assembly code varies with compilers. Therefore, a specific chip architecture also includes architecture code compiled by using different compilers (such as IAR, Keil, and GCC). + + + +``` +kernel/liteos_m/arch # The path varies according to the version. +├── arm # Arm series +│ ├── arm9 +│ ├── cortex-m3 +│ ├── cortex-m33 +│ │ ├── gcc # Architecture code compiled by the GCC compiler +│ │ └── iar # Architecture code compiled by the IAR compiler +│ ├── cortex-m4 +│ ├── cortex-m7 +├── csky # C-SKY series +├── include # Functions to be implemented for common chip architecture adaptation. +│ ├── los_arch.h # Definition of functions required for initializing the chip architecture. +│ ├── los_atomic.h # Definition of the atomic operation functions to be implemented by the chip architecture. +│ ├── los_context.h # Definition of the context-related functions to be implemented by the chip architecture. +│ ├── los_interrupt.h # Definition of the interrupt- and exception-related functions to be implemented by the chip architecture. +│ └── los_timer.h # Definition of the system clock–related functions to be implemented by the chip architecture. +├── risc-v # RISC-V series +│ ├── nuclei +│ └── riscv32 +└── xtensa # Xtensa series + └── lx6 +``` + + +## Porting the Chip SDK + +Add the chip SDK to the OpenHarmony compilation framework you have set up, so as to build the file with the SDK (which does not contain the system information), which can then be burnt so that interfaces in the SDK can be called in OpenHarmony. To add the chip SDK to the OpenHarmony compilation framework, perform the following steps: + +1. Place the chip SDK in a proper position in the **device** directory, and integrate the SDK build script and image packaging script into the compilation framework. + Reference build script: **device/MyDeviceCompany/MyBoard/BUILD.gn** + + + ``` + import("//build/lite/config/component/lite_component.gni") + + executable("OHOS_Image.elf") { # Generate an executable program. + libs = [ + "xxx/xxx/libxxx.a", # Method 1 for connecting to the vendor's closed-source static library + ] + asmflags = [ # Assembly compilation parameters + "", + ] + ldflags = [ + "-T./xxx/xxx/xxx.ld", # Link script file + "-Lxxx/xxx/", # Static library path of the vendor. + "-lxxx", # Method 2 for connecting to the vendor's closed-source static library + "-Wl,--whole-archive", + "-lmodule_xxx", + "-Wl,--no-whole-archive", + ] + deps = [ + "//build/lite:ohos", # Link the dependent OpenHarmony static library after the build process is complete. + ":sdk", # Link the dependent static library generated from the vendor source code after the build process is complete. + ] + } + + copy("prebuilt") { # Image generation tool. Generally, copy the image generation tool to the out directory. + sources = [ ] # Source file copied + outputs = [ ] # Target file copied + } + static_library("sdk") { + sources = [ ] # Vendor source code to compile into a static library. + include_dirs = [ ] # Path of the header file included in the vendor source code + } + build_ext_component("image") {# Invoke the shell command to generate an image file that can be burnt. + exec_path = rebase_path(root_out_dir) # Directory where Shell commands are executed + objcopy = "arm-none-eabi-objcopy" + objdump = "arm-none-eabi-objdump" + command = "$objcopy -O binary OHOS_Image.elf OHOS_Image.bin" + command += " && sh -c '$objdump -t OHOS_Image.elf | sort > OHOS_Image.sym.sorted'" + command += " && sh -c '$objdump -d OHOS_Image.elf > OHOS_Image.asm'" + deps = [ + ":prebuilt", # Delete this dependency if you do not need to prepare the image generation tool. + ":OHOS_Image.elf", # ELF file dependency + ] + } + group("MyBoard") { # Same as the current path + } + ``` + + **Figure 1** Dependency execution sequence of targets + ![en-us_image_0000001378481233](figures/en-us_image_0000001378481233.png) + +1. Customize the **target_config.h** file. + Create the kernel configuration file **target_config.h** in a proper location in **device/MyDeviceCompany/MyBoard** and modify the parameter settings based on the hardware resources of the chip. For details about the parameters, see Table 2. + + Reference file path: **device/hisilicon/hispark_pegasus/sdk_liteos/platform/os/Huawei_LiteOS/targets/hi3861v100/include/target_config.h** + + > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** + > 1. If the existing configuration items do not meet the requirements, modify the **kernel/liteos_m/kernel/include/los_config.h** file as needed, which contains the full configuration of the LiteOS_M kernel. + > + > 2. Configuration items in the **target_config.h** file will overwrite those in the **los_config.h** file. + + **Table 2** Main configuration items in the target_config.h file + + | Configuration Item| Description| Reference Value| + | -------- | -------- | -------- | + | OS_SYS_CLOCK | System clock| 40000000UL | + | LOSCFG_BASE_CORE_TICK_PER_SECOND | Clock cycle of the operating system ticks.| 100UL | + | LOSCFG_BASE_CORE_TICK_HW_TIME | External configuration item for timer tailoring.| YES | + | LOSCFG_PLATFORM_HWI | Whether to use the takeover on interruption mode.| YES | + | LOSCFG_BASE_CORE_TSK_LIMIT | Maximum number of supported tasks (excluding idle tasks).| 32 | + | LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE | Stack size of an idle task.| 0x180UL | + | LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE | Default size of the task stack. The task stack size is 8-byte aligned.| 0x1000UL | + | LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE | Minimum stack size required by a task.| ALIGN(0x180, 4) | + | LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT | Maximum execution duration of tasks with the same priority.| 2 | + | LOSCFG_BASE_IPC_SEM_LIMIT | Maximum number of semaphores.| 100 | + | LOSCFG_BASE_IPC_MUX_LIMIT | Maximum number of mutexes.| 64 | + | LOSCFG_BASE_IPC_QUEUE_LIMIT | Maximum number of message queues.| 64 | + | LOSCFG_BASE_CORE_SWTMR_LIMIT | Maximum number of supported software timers, not the number of available software timers.| 80 | + | LOSCFG_BASE_MEM_NODE_SIZE_CHECK | Whether to enable the memory node size check.| NO | + | LOSCFG_PLATFORM_EXC | Whether to enable configuration of the abnormal module.| YES | + | LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT | Whether to use the default interrupt of the OS.| NO | + +1. Change the kernel interrupt. + + Use either of the following: + + - Use the default interrupt of the vendor. + + Set the **LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT** macro in **target_config.h** to **NO** (**0**), and modify the xxx.s startup file as follows: + + - **PendSV_Handler**: interrupt entry point function provided by the vendor SDK. Replace it with the **HalPendSV** interface in OpenHarmony. + - **SysTick_Handler**: clock interrupt entry point function provided by the vendor SDK. Replace it with the **OsTickHandler** interface in OpenHarmony. + + - Implement redirection interrupt during system initialization. + + Set the **LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT** and **LOSCFG_PLATFORM_HWI** macros in **target_config.h** to **YES** (**1**). + + > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** + > + > The interrupt vector table **g_hwiForm** after redirection needs to be byte-aligned according to the requirements in the Arch manual. Generally, the interrupt vector table is 0x200 byte-aligned. + + +## Adding the Kernel Subsystem + +After adding the kernel subsystem, you can compile a project with the system. To add a kernel subsystem, perform the following steps: + +1. Add the kernel subsystem to the **vendor/MyVendorCompany/MyProduct/config.json** file. + + The sample code is as follows: + + ``` + { + "subsystem": "kernel", # Kernel subsystem to add + "components": [ + { + "component": "liteos_m", "features":[""] + } + ] + }, + ``` + +2. Enable or disable kernel features. + + The mini-system kernel provides the following features. This step describes how to view, enable, and disable these features. + + Features: switches for the file system, backtrace, and more + + Path: **kernel/liteos_m/BUILD.gn** + + + ``` + declare_args() { + enable_ohos_kernel_liteos_m_cppsupport = true # Enable CPP. + enable_ohos_kernel_liteos_m_cpup = true # Enable CPU usage. + enable_ohos_kernel_liteos_m_exchook = true # Enable exception handling. + enable_ohos_kernel_liteos_m_kal = true # Enable KAL interfaces. + enable_ohos_kernel_liteos_m_fs = true # Enable the file system. + enable_ohos_kernel_liteos_m_backtrace = true # Enable backtrace. + } + group("kernel") { + deps = [ + "components/bounds_checking_function:sec", + "kernel:kernel", + "utils:utils", + ] + if (enable_ohos_kernel_liteos_m_cppsupport == true) { + deps += [ "components/cppsupport:cppsupport" ] # If a kernel feature is set to true, the code corresponding to this feature is included in the build process. + } + ...... + if (enable_ohos_kernel_liteos_m_kal == true) { + deps += [ "kal:kal" ] + } + } + ``` + + Features: CMSIS and POSIX support + + Path: **kernel/liteos_m/kal/BUILD.gn** + + + ``` + declare_args() { + enable_ohos_kernel_liteos_m_cmsis = true # Enable CMSIS support. + enable_ohos_kernel_liteos_m_posix = true # Enable POSIX support. + } + static_library("kal") { + sources = [ "kal.c" ] + if (enable_ohos_kernel_liteos_m_cmsis == true) { + deps += [ "cmsis/" ] # If cmsis is set to true, the code in the cmsis directory is included in the build process. + } + if (enable_ohos_kernel_liteos_m_posix == true) { + deps += [ "posix/" ] # If posix is set to true, the code in the posix directory is included in the build process. + } + } + ``` + + Feature: FATFS support + + Path: **kernel/liteos_m/components/fs/BUILD.gn** + + + ``` + declare_args() { + enable_ohos_kernel_liteos_m_fatfs = true # Enable FATFS support. + } + group("fs") { + deps = [] + if (enable_ohos_kernel_liteos_m_fatfs == true) { + deps += [ "fatfs:fatfs" ] + } + } + ``` + + > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** + > + > A kernel feature, such as the FS and CPP support, can be enabled or disabled in the specific product module. + > + > Path: **vendor/MyVendorCompany/MyProduct/config.json** + > + > + > ``` + > "subsystem": "kernel", + > "components": [ + > { + > "component": "liteos_m", + > "features":["enable_ohos_kernel_liteos_m_fs = false", + > "enable_ohos_kernel_liteos_m_cppsupport = false"] + > } + > ] + > } + > ``` diff --git a/en/device-dev/porting/porting-minichip-overview.md b/en/device-dev/porting/porting-minichip-overview.md new file mode 100644 index 0000000000..77da2cbe37 --- /dev/null +++ b/en/device-dev/porting/porting-minichip-overview.md @@ -0,0 +1,47 @@ +# Overview + + +This document provides chip/module vendors with a complete walkthrough of OpenHarmony-based chip adaptation from an end-to-end perspective. It applies to typical chip architectures, such as the chip architectures in the Cortex-M and RISC-V series. + + +## Constraints + +This document applies to the adaptation of the mini system in OpenHarmony LTS 3.0.1 and earlier versions. + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> +> This document describes only the files and configuration items that you need to pay attention to during OpenHarmony porting and adaptation. Other files and configuration items are skipped. + + +## Adaptation Process + +The adaptation process is divided into four steps: porting preparation, kernel porting, subsystem porting, and porting verification. For details, see Table 1. + +**Table 1** Chip adaptation steps + +| Step| Description| +| -------- | -------- | +| Porting preparation| Download code from the OpenHarmony community on Gitee and set up the build environment. You can familiarize yourself with the OpenHarmony compilation and building framework along the way.| +| Kernel porting| Port the chip SDK to the OpenHarmony platform and determine whether adaptation is required based on the chip architecture support.| +| Subsystem porting| Port the startup, file, security, communication, and driver subsystems.| +| Porting verification| After the adaptation is complete, conduct the compatibility test provided by OpenHarmony and the chip SDK function test of your own.| + + + **Figure 1** Overall service process + + + ![en-us_image_0000001378282213](figures/en-us_image_0000001378282213.png) + + +## Basic Concepts + +**Table 2** Basic concepts + +| Term| Description| +| -------- | -------- | +| Subsystem| A subsystem, as a logical concept, consists of one or more components. OpenHarmony is designed with a layered architecture, which consists of the kernel layer, system service layer, framework layer, and application layer from the bottom up. System functions are built from components, subsystems, and then to the system. In a multi-device deployment, you can customize subsystems and components as required.| +| Component| A component is a reusable, configurable, and tailorable function unit. Each component has an independent directory, and can be built and tested independently and developed concurrently. | +| hb | hb is an OpenHarmony command line tool used to execute build commands.| +| HOBT | HOBT is short for HiLink SDK OHOS Basic Test. It is used to test the basic functions of the interfaces on which the HiLink SDK depends.| +| Kit Framework | Kit Framework is the basic framework of Kit. It contains the security components of OpenHarmony and cannot be tailored.| +| KV | A key-value pair (KV) is a format of data storage.| diff --git a/en/device-dev/porting/porting-minichip-prepare.md b/en/device-dev/porting/porting-minichip-prepare.md new file mode 100644 index 0000000000..1c073437d9 --- /dev/null +++ b/en/device-dev/porting/porting-minichip-prepare.md @@ -0,0 +1,219 @@ +# Porting Preparation + + +The OpenHarmony project must be built in the Linux environment. This topic describes how to set up the build environment, obtain the OpenHarmony source code, and create a vendor working directory to adapt the compilation framework of the vendor chip. + + +## Setting Up the Build Environment + +Before porting, set up the build environment as instructed in [Setting Up the Windows Environment](../quick-start/quickstart-ide-env--win.md). + + +## Obtaining Source Code + + +### Procedure + +Download and compile the source code by following instructions in [Obtaining Source Code](https://gitee.com/openharmony/docs/blob/master/en/device-dev/get-code/sourcecode-acquire.md). + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> +> This document applies only to OpenHarmony LTS 3.0.1 and earlier versions. Make sure you obtain the source code for one of these versions. + + +### Directory Structure + +Table 1 describes the main directories of the OpenHarmony source code. The **device** and **vendor** directories are the working areas of chip and device module vendors. For details, see [Setting Up the Compilation Framework](#setting-up-the-compilation-framework). + +**Table 1** Main directories of OpenHarmony source code + +| Directory| Description| +| -------- | -------- | +| build | Directory where the compilation framework is located.| +| kernel/liteos_m | Directory where the kernel is located. The **arch** directory describes the supported kernel architecture.| +| device | Directory for adaptation by the chip vendor, where the **config.gni** file describes the architecture, toolchain, and linking options used by the current chip.| +| vendor | Directory for adaptation by the device module vendor, where the **config.json** file describes the list of OpenHarmony subsystems to be integrated.| +| utils | Adaptation related to files and KVs.| + + +## Setting Up the Compilation Framework + +During porting, the vendor must create a working directory in the project based on your company name, chip model, and development board model, and add the created directory to the OpenHarmony compilation framework so that the working directory can participate in compilation. You can perform the following steps: + +1. Add the chip vendor. + + To adapt to OpenHarmony based on a chip, create a chip vendor directory in the **device** directory. The files in the directory describe the kernel type, compiler toolchain, linking options, and kernel configuration options. + + Directory format: device/{*Chip vendor*}/{*Chip development board*} + + Example: **device/MyDeviceCompany/MyBoard** + + ``` + device + ├── hisilicon # HiSilicon chip-related directory, which can be used as a reference during directory creation. + ├── MyDeviceCompany # Chip vendor + │ └── MyBoard # Chip model + │ ├── BUILD.gn + │ ├── liteos_m + │ │ └── config.gni # Chip toolchain and compilation linking options + │ └── target_config.h # Kernel configuration options + └── qemu # QEMU-related + ``` + + Build script: Add the files in **device/MyDeviceCompany/MyBoard** to the OpenHarmony compilation framework. + + Path: **device/MyDeviceCompany/MyBoard/BUILD.gn** + + + ``` + group("MyBoard") { # Add the BUILD.gn file for parsing. + print("MyDeviceCompany MyBoard is under developing.") + } + ``` + + Compilation configuration of the development board: This includes the kernel type, toolchain type, and compilation parameters. For details, see Table 2. + + Path: **device/MyDeviceCompany/MyBoard/liteos_m/config.gni** + + + ``` + # Kernel type, e.g. "linux", "liteos_a", "liteos_m". + kernel_type = "liteos_m" + + # Kernel version. + kernel_version = "" + + # Board CPU type, e.g. "cortex-a7", "riscv32". + board_cpu = "cortex-m4" + + # Board arch, e.g. "armv7-a", "rv32imac". + board_arch = "" + + # Toolchain name used for system compiling. + # E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang, riscv32-unknown-elf. + # Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toochain. + board_toolchain = "arm-none-eabi-gcc" + + # The toolchain path instatlled, it's not mandatory if you have added toolchian path to your ~/.bashrc. + board_toolchain_path = "" + + # Compiler prefix. + board_toolchain_prefix = "arm-none-eabi-" + + # Compiler type, "gcc" or "clang". + board_toolchain_type = "gcc" + + # Board related common compile flags. + board_cflags = [] + board_cxx_flags = board_cflags + board_ld_flags = [] + + # Board related headfiles search path. + board_include_dirs = [] + + # Board adapter dir for OHOS components. + board_adapter_dir ="" + ``` + + **Table 2** Main configuration items in config.gni + + | Configuration Item| Description| + | -------- | -------- | + | kernel_type | Kernel type of the development board, for example, **"liteos_a"**, **"liteos_m"**, or **"linux"**.| + | kernel_version | Kernel version of the development board.| + | board_cpu | CPU type of the development board, for example, **"cortex-m4"**, **"cortex-a7"**, or **"riscv32"**.| + | board_arch | Architecture instruction set of the development board, for example, **"armv7-a"**.| + | board_toolchain | Name of the customized compiler toolchain used by the development board, for example, **"gcc-arm-none-eabi"**. If this parameter is not specified, **ohos-clang** will be used by default.| + | board_toolchain_path | Path of the compiler toolchain. If this parameter is left empty, the toolchain in the environment variable is used.| + | board_toolchain_prefix | Prefix of the compiler toolchain, for example, **"arm-none-eabi-"**.| + | board_toolchain_type | Type of the compiler toolchain, which can be **gcc** or **clang**.| + | board_cflags | Build options of the .c file configured for the development board.| + | board_cxx_flags | Build options of the .cpp file configured for the development board.| + | board_ld_flags | Linking options configured for the development board.| + | board_include_dirs | List of system header files configured on the development board.| + | board_adapter_dir | Adaptation files of the development board.| + +2. Add the device module vendor. + + To develop a device module based on a chip with the OpenHarmony capability, create a module vendor directory under **vendor** and configure the OpenHarmony subsystem capabilities. + + Directory format: vendor/{Product module vendor}/{Product module name}. + + Example: **vendor/MyVendorCompany/MyProduct** + + ``` + vendor + ├── hisilicon # HiSilicon chip-related directory, which can be used as a reference during directory creation. + └── MyVendorCompany # Module vendor + └── MyProduct # Product + ├── BUILD.gn + └── config.json # Product subsystem list + ``` + + Build script: Add the files in **vendor/MyVendorCompany/MyProduct/BUILD.gn** to the OpenHarmony compilation framework. + + Path: **vendor/MyVendorCompany/MyProduct/BUILD.gn** + + + ``` + group("MyProduct") { + print("MyVendorCompany MyProduct is under developing.") + } + ``` + + Product configuration information: Add the product name, device vendor, kernel type, and subsystem list. For details, see Table 3. + + Path: **vendor/MyVendorCompany/MyProduct/config.json** + + + ``` + { + "product_name": "MyProduct", + "ohos_version": "OpenHarmony 1.0", + "device_company": "MyDeviceCompany", + "board": "MyBoard", + "kernel_type": "liteos_m", + "kernel_version": "", + "subsystems": [ + { + "subsystem": "startup", + "components": [ + { "component": "bootstrap", "features":[] }, + { "component": "syspara_lite", "features": + [ + "enable_ohos_startup_syspara_lite_use_thirdparty_mbedtls = false" + ] + } + ] + } + ], + "vendor_adapter_dir": "", + "third_party_dir": "", + "product_adapter_dir": "//vendor/MyVendorCompany/MyProduct/hals", + } + ``` + + **Table 3** Configuration items in the config.json file + + | Configuration Item| Description| + | -------- | -------- | + | product_name | Product name, which is displayed during **hb set**.| + | ohos_version | OpenHarmony version number, which must be the same as the actual version number.| + | device_company | Chip vendor name, which is the same as the level-2 directory name under **device**.| + | board | Name of the development board, which is the same as the level-3 directory name under **device**.| + | kernel_type | Kernel type, which must match the kernel type of the OpenHarmony system ported to the development board.| + | kernel_version | Kernel version number, which matches the value of **kernel_version** in **config.gni**.| + | subsystem | Subsystem, which must be one supported by the OS. For details about the subsystem definition, see the description file of each subsystem in **build/lite/components**.| + | components | Components of the subsystem. For details about the components supported by a specific subsystem, see the **build/lite/components/{*Subsystem*}.json** file.| + | features | Features of the component configured for the product. For details, see the **BUILD.gn** file corresponding to the subsystem source code directory.| + | vendor_adapter_dir | Directory used for adaptation to IoT peripherals and UtilsFile file read and write capabilities. Generally, the value points to a directory under **device**. For details, see Step 2 in [Porting the File Subsystem] (porting-minichip-subsys-filesystem.md#example).| + | third_party_dir | Third-party software directory of the chip vendor, such as **mbedtls** and **lwip**. If the third-party software provided by OpenHarmony is used, leave this parameter empty or refer to the configuration for **hispark_pegasus**.| + | product_adapter_dir | Directory used for adaptation to hal_token and system parameters. Generally, the value points to a directory under **vendor**. For details, see Step 1 in [Porting the Startup Subsystem] (porting-minichip-subsys-startup.md#example).| + + > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** + > + > The compilation and build system checks the validity of fields. + > + > - The values of **device_company**, **board**, **kernel_type**, and **kernel_version** must match those configured by the chip vendor. + > + > - The values of **subsystem** and **component** must match the component description under **build/lite/components**. diff --git a/en/device-dev/porting/porting-minichip-subsys-communication.md b/en/device-dev/porting/porting-minichip-subsys-communication.md new file mode 100644 index 0000000000..5a02d0944b --- /dev/null +++ b/en/device-dev/porting/porting-minichip-subsys-communication.md @@ -0,0 +1,133 @@ +# Porting the Communication Subsystem + + +The communication subsystem porting process involves Wi-Fi and Bluetooth adaptation. Vendors need to perform adaptation based on the chip conditions. + + +## Procedure + +To implement Wi-Fi adaptation, perform the following steps: + +Path: **foundation/communication/wifi_lite/BUILD.gn** + +``` +group("wifi") { + deps = [ "$ohos_board_adapter_dir/hals/communication/wifi_lite/wifiservice:wifiservice" ] +} +``` + +As shown above, the .c file of the vendor adaptation interfaces is stored in the **$ohos_board_adapter_dir/hals/communication/wifi_lite/wifiservice** directory, where the target in the **BUILD.gn** file is **wifiservice**. Table 1, Table 2, and Table 3 list the Wi-Fi interfaces that need to be adapted by vendors. Table 4 and Table 5 list the Bluetooth interfaces. + +**Table 1** wifi_device.h + +| API| Description| +| -------- | -------- | +| EnableWifi | Enables the Wi-Fi STA mode.| +| DisableWifi | Disables the Wi-Fi STA mode.| +| IsWifiActive | Check whether the Wi-Fi STA mode is enabled.| +| Scan | Scans for hotspots.| +| GetScanInfoList | Obtains the list of all found hotspots.| +| AddDeviceConfig | Adds the information about the hotspot to be connected.| +| GetDeviceConfigs | Obtains the information about the connected hotspot.| +| RemoveDevice | Deletes the information about a specified hotspot.| +| ConnectTo | Connects to a specified hotspot.| +| Disconnect | Severs the Wi-Fi connection. | +| GetLinkedInfo | Obtains hotspot connection information.| +| RegisterWifiEvent | Registers a callback for a specified Wi-Fi event.| +| UnRegisterWifiEvent | Deregisters the callback previously registered for a specified Wi-Fi event.| +| GetDeviceMacAddress | Obtains the device MAC address.| +| AdvanceScan | Starts Wi-Fi scanning based on specified parameters.| + +**Table 2** wifi_hotspot_config.h + +| API| Description| +| -------- | -------- | +| SetBand | Sets the frequency band of the hotspot.| +| GetBand |Obtains the frequency band of the hotspot.| + +**Table 3** wifi_hotspot.h + +| API| Description| +| -------- | -------- | +| EnableHotspot | Enables AP hotspot mode.| +| DisableHotspot | Disables AP hotspot mode.| +| SetHotspotConfig | Configures settings for a specified hotspot.| +| GetHotspotConfig | Obtains settings of a specified hotspot.| +| IsHotspotActive | Checks whether AP hotspot mode is enabled.| +| GetStationList | Obtains a list of STAs connected to the hotspot.| +| GetSignalLevel | Obtains the signal level of the specified received signal strength indicator (RSSI) and frequency band indicator.| +| DisassociateSta | Disconnects from the STA that matches the specified MAC address.| +| AddTxPowerInfo | Sends the hotspot power to the beacon.| + +**Table 4** ohos_bt_gatt.h + +| API| Description| +| -------- | -------- | +| InitBtStack | Initializes the Bluetooth protocol stack.| +| EnableBtStack | Enables the Bluetooth protocol stack.| +| DisableBtStack | Disables the Bluetooth protocol stack.| +| SetDeviceName | Sets the Bluetooth device name.| +| BleSetAdvData | Sets the data to advertise.| +| BleStartAdv | Starts advertising.| +| BleStartAdvEx | Transfers the constructed advertising data and parameters to enable Bluetooth advertising.| +| BleStopAdv | Stops sending advertising messages.| +| BleUpdateAdv | Updates the advertising parameters.| +| BleSetSecurityIoCap | Sets the Bluetooth I/O capability to NONE and pairing mode to justworks.| +| BleSetSecurityAuthReq | Sets whether Bluetooth pairing is required.| +| BleGattSecurityRsp | Responds to a secure connection request.| +| ReadBtMacAddr | Obtains the device MAC address.| +| BleSetScanParameters | Sets scan parameters.| +| BleStartScan | Starts scanning| +| BleStopScan | Stops scanning.| +| BleGattRegisterCallbacks | Registers a callback for GAP and GATT events.| + +**Table 5** ohos_bt_gatt_server.h + +| API| Description| +| -------- | -------- | +| BleGattsRegister | Registers with the GATT server using the specified application UUID.| +| BleGattsUnRegister | Deregisters from the GATT server.| +| BleGattsDisconnect | Disconnects the GATT server from the client.| +| BleGattsAddService | Adds a service.| +| BleGattsAddIncludedService | Adds an included service to a specified service.| +| BleGattsAddCharacteristic | Adds a feature to a specified service.| +| BleGattsAddDescriptor | Adds a descriptor to a specified feature.| +| BleGattsStartService | Start a service.| +| BleGattsStopService | Stops a service.| +| BleGattsDeleteService | Deletes a service.| +| BleGattsClearServices | Clears all services.| +| BleGattsSendResponse | Sends a response to the client that receives the read or write request.| +| BleGattsSendIndication | Sends Bluetooth data from the device to the application.| +| BleGattsSetEncryption | Sets the encryption type of the GATT connection.| +| BleGattsRegisterCallbacks | Registers a GATT server callback.| +| BleGattsStartServiceEx | Creates a GATT service based on the passed service list.| +| BleGattsStopServiceEx | Stops the GATT service based on the passed handle .| + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> +> The APIs may vary according to the version. Adapt the APIs according to the specific file of the current version. + + +## Example + +1. Add the communication subsystem to the **config.json** file. + + Path: **vendor/MyVendorCompany/MyProduct/config.json** + + The sample code is as follows: + + + ``` + { + "subsystem": "communication", + "components": [ + { "component": "wifi_lite", "features":[] } + ] + }, + ``` + +2. Add an adaptation file. + + In the **vendor/MyVendorCompany/MyProduct/config.json** file, set **ohos_board_adapter_dir** to **//vendor/MyVendorCompany/MyProduct/adapter**. + + In the **ohos_board_adapter_dir** directory, adapt the Wi-Fi and Bluetooth APIs based on the aforementioned header files. diff --git a/en/device-dev/porting/porting-minichip-subsys-driver.md b/en/device-dev/porting/porting-minichip-subsys-driver.md new file mode 100644 index 0000000000..2fee0b6494 --- /dev/null +++ b/en/device-dev/porting/porting-minichip-subsys-driver.md @@ -0,0 +1,116 @@ +# Porting the Driver Subsystem + + +The driver subsystem provides OpenHarmony-dedicated APIs for peripheral device operations, including FLASH, GPIO, I2C, PWM, UART, and WATCHDOG APIs. + + +OpenHarmony provides two driver adaptation modes: using the driver subsystem and using the HDF driver framework. Because the resources of the mini system are limited, the IoT subsystem mode is recommended. + + +## Procedure + +Vendors need to implement their functions based on the interface definitions provided by OpenHarmony. The header files defined by the interfaces of the IoT subsystem are as follows: + + +``` +base/iot_hardware/peripheral/ +├── BUILD.gn +└── interfaces + └── kits + ├── iot_errno.h + ├── iot_flash.h + ├── iot_gpio.h + ├── iot_i2c.h + ├── iot_pwm.h + ├── iot_uart.h + ├── iot_watchdog.h + ├── lowpower.h + └── reset.h +``` + +The content of the **base/iot_hardware/peripheral/BUILD.gn** file is as follows: + + +``` +import("//build/lite/config/subsystem/lite_subsystem.gni") +import("//build/lite/ndk/ndk.gni") + +lite_subsystem("iothardware") { + subsystem_components = [ + "$ohos_vendor_adapter_dir/hals/iot_hardware/wifiiot_lite:hal_iothardware", + ] +} +if (ohos_kernel_type == "liteos_m") { + ndk_lib("iothardware_ndk") { + deps = [ + "$ohos_vendor_adapter_dir/hals/iot_hardware/wifiiot_lite:hal_iothardware", # Vendor dependent adaptation. + ] + head_files = [ "//base/iot_hardware/peripheral/interfaces/kits" ] + } +} +``` + +As shown above, the directory for storing vendor adaptation interfaces is **$ohos_vendor_adapter_dir/hals/iot_hardware/wifiiot_lite**, where the target in the **BUILD.gn file** is **hal_iothardware**. + + +## Example + +1. Add the iot_hardware subsystem to the **config.json** file. + + Path: **vendor/MyVendorCompany/MyProduct/config.json** + + The sample code is as follows: + + + ``` + { + subsystem": "iot_hardware", + components": [ + { "component": "iot_controller", "features":[] } + ] + }, + ``` + +2. Add an adaptation file. + + In the **vendor/MyVendorCompany/MyProduct/config.json** file, set **vendor_adapter_dir** to **//device/MyDeviceCompany/MyBoard/adapter**. + + Perform adaptation in the **vendor_adapter_dir** directory. + + + ``` + hals/iot_hardware/wifiiot_lite + ├── BUILD.gn + ├── iot_flash.c + ├── iot_gpio.c + ├── iot_i2c.c + ├── iot_lowpower.c + ├── iot_pwm.c + ├── iot_reset.c + ├── iot_uart.c + └── iot_watchdog.c + ``` + + The content of **BUILD.gn** is as follows: + + + ``` + static_library("hal_iothardware") { # Target name + sources = [ # Source file adapted by the vendor + "iot_watchdog.c", + "iot_reset.c", + "iot_flash.c", + "iot_i2c.c", + "iot_gpio.c", + "iot_pwm.c", + "iot_uart.c" + ] + include_dirs = [ ] + } + ``` + + In the preceding example, **include_dirs** must contain two paths based on the site requirements: + + - Path to the header file of the IoT subsystem + + - Path to the SDK header file used by the IoT subsystem diff --git a/en/device-dev/porting/porting-minichip-subsys-filesystem.md b/en/device-dev/porting/porting-minichip-subsys-filesystem.md new file mode 100644 index 0000000000..76a130bbd1 --- /dev/null +++ b/en/device-dev/porting/porting-minichip-subsys-filesystem.md @@ -0,0 +1,122 @@ +# Porting the File Subsystem + + +The utils component can be used by service subsystems and upper-layer applications and depends on the chip file system. The chip platform needs to provide functions such as opening, closing, reading, writing, and obtaining the file size. + + +## Procedure + +The OpenHarmony file system needs to adapt to the following HAL APIs: + + **Table 1** Opening or closing a file + +| API| Description| +| -------- | -------- | +| HalFileOpen | Opens or creates a file.| +| HalFileClose | Closes a file:| + + **Table 2** File operations + +| API| Description| +| -------- | -------- | +| HalFileRead | Reads a file.| +| HalFileWrite | Writes data to a file.| +| HalFileDelete | Deletes a file.| +| HalFileStat | Obtains file attributes.| +| HalFileSeek | Searches for files.| + + For details about the implementation of vendor adaptation interfaces, see the definitions of the file interface and HAL adaptation interface in OpenHarmony. + +``` +//utils/native/lite/file +├── BUILD.gn +└── src + └── file_impl_hal + └── file.c # file interface +``` + + +``` +//utils/native/lite/hals +└── file +└── hal_file.h # HAL interface header file +``` + +The content of **BUILD.gn** is as follows: + + +``` +import("//build/lite/config/component/lite_component.gni") + +static_library("native_file") { + sources = [ + "src/file_impl_hal/file.c", + ] + include_dirs = [ + "//utils/native/lite/include", + "//utils/native/lite/hals/file", + ] + deps = ["$ohos_vendor_adapter_dir/hals/utils/file:hal_file_static"] # Vendor dependent adaptation. +} + +lite_component("file") { + features = [ + ":native_file", + ] +} +``` + +As shown in the preceding example, the directory for storing vendor adaptation interfaces is **$ohos_vendor_adapter_dir/hals/utils/file**, where the target in the **BUILD.gn** file is **hal_file_static**. + +Generally, vendors can use the following methods to adapt to HAL APIs: + +1. Directly read and write the flash memory to simulate file operations. + +2. Use the LittleFS or FatFs file system for adaptation. For the FatFs file system, you can refer to the **//thirdparty** directory of OpenHarmony. + +3. Use the existing file system of the vendor for adaptation. + + +## Example + +1. Add a file system to **config.json**. + + Path: **vendor/MyVendorCompany/MyProduct/config.json** + + The sample code is as follows: + + ``` + { + "subsystem": "utils", + "components": [ + { "component": "file", "features":[] } + ] + }, + ``` + +2. Add an adaptation file. + In the **vendor/MyVendorCompany/MyProduct/config.json** file, set **vendor_adapter_dir** as follows: + + "vendor_adapter_dir": "//device/MyDeviceCompany/MyBoard/adapter". + + Perform **UtilsFile** interface adaptation in this directory. + + + ``` + hals/utils/file + ├── BUILD.gn + └── src + └── hal_file.c + ``` + + The content of **BUILD.gn** is as follows: + + ``` + import("//build/lite/config/component/lite_component.gni") + static_library("hal_file_static") { # target name + sources = [ "src/hal_file.c" ] # Source file adapted by the vendor + include_dirs = [ + "//utils/native/lite/hals/file", + ] + } + ``` diff --git a/en/device-dev/porting/porting-minichip-subsys-others.md b/en/device-dev/porting/porting-minichip-subsys-others.md new file mode 100644 index 0000000000..37db1514e9 --- /dev/null +++ b/en/device-dev/porting/porting-minichip-subsys-others.md @@ -0,0 +1,23 @@ +# Configuring Other Subsystems + + +In addition to the preceding subsystems, there are some subsystems that are necessary but do not need to be ported, such as the distributed scheduler and DFX subsystems. + + +To add these subsystems, perform the following operations in the **vendor/MyVendorCompany/MyProduct/config.json** file: + +``` +{ + "subsystem": "distributed_schedule", + "components": [ + { "component": "system_ability_manager", "features":[] } # The component name varies according to the version. + ] +}, +{ + "subsystem": "hiviewdfx", + "components": [ + { "component": "hilog_lite", "features":[] }, + { "component": "hievent_lite", "features":[] } + ] +}, +``` diff --git a/en/device-dev/porting/porting-minichip-subsys-overview.md b/en/device-dev/porting/porting-minichip-subsys-overview.md new file mode 100644 index 0000000000..0ae060bc96 --- /dev/null +++ b/en/device-dev/porting/porting-minichip-subsys-overview.md @@ -0,0 +1,24 @@ +# Subsystem Porting Overview + + +System functions are developed by levels, from system to subsystem and then to component. Customize subsystems and components as required. This topic uses certain subsystems and components as examples. To use the capabilities of the OpenHarmony system, the corresponding subsystems need to be adapted. + + +Table 1 lists the common subsystems involved in OpenHarmony chip adaptation. Add or delete subsystems based on the specific chip you use. + + + **Table 1** OpenHarmony subsystems + +| Subsystem| Description| +| -------- | -------- | +| applications | Application demo. You can store the source code related to the application in this directory.| +| kernel | Kernel subsystem, which is responsible for common kernel functions such as task scheduling and memory management.| +| hiviewdfx | DFX subsystem, which provides log-related functions.| +| communication | Communication subsystem, which provides Wi-Fi and Bluetooth functions.| +| iothardware | IoT peripheral subsystem, which provides common peripheral interfaces, such as GPIO, I2C, and SPI.| +| startup | Startup subsystem, which is the first subsystem that runs after the kernel is started. It is responsible for the startup of key system processes and services after the kernel is started and before the application is started.| +| update | Update subsystem, which provides OTA update support for OpenHarmony devices.| +| utils | Utils subsystem, which provides some common enhanced APIs for development using C and C++.| +| distributed_schedule | Distributed scheduler subsystem, which manages cross-device components, provides the capabilities of accessing and controlling remote components, and supports application collaboration in distributed scenarios.| +| security | Security subsystem, which provides system, data, and application security capabilities to protect system and user data of OpenHarmony. It implements application integrity verification, application permission management, device authentication, OpenHarmony Universal KeyStore (HUKS) key management, and data transfer management.| +| test | Test subsystem. OpenHarmony provides a comprehensive auto-test framework for designing test cases. Detecting defects in the development process can improve code quality.| diff --git a/en/device-dev/porting/porting-minichip-subsys-security.md b/en/device-dev/porting/porting-minichip-subsys-security.md new file mode 100644 index 0000000000..223f53e025 --- /dev/null +++ b/en/device-dev/porting/porting-minichip-subsys-security.md @@ -0,0 +1,113 @@ +# Porting the Security Subsystem + + +The security subsystem provides functions such as network device connection, authentication, and authorization. It depends on mbedtls to implement hardware random numbers and network connection functions. + + +Because the chip hardware and the implementation for the hardware-based random number varies by vendor, the hardware-based random number interface needs to be adapted. + + +## Procedure + +OpenHarmony provides an open-source library of Mbed TLS, which is stored in **//third_party/mbedtls**. This library provides several random number generation modes, such as **mbedtls_platform_entropy_poll**, **mbedtls_hardclock_poll**, **mbedtls_havege_poll**, and **mbedtls_hardware_poll**. For the hardware-based random number, adapt **mbedtls_hardware_poll** based on your chip. + + +## Example + +1. Add a file system to the **config.json** file. + + Path: **vendor/MyVendorCompany/MyProduct/config.json** + + The sample code is as follows: + + ``` + { + "subsystem": "security", + "components": [ + { "component": "hichainsdk", "features":[] }, + { "component": "huks", "features":[]} + ] + }, + ``` + +2. Configure the macro to enable the code related to the hardware-based random number interface. + + According to the Mbed TLS compilation file, the macro is configured in the **MBEDTLS_CONFIG_FILE=\<../port/config/config_liteos_m.h>** file. + + Path: **third_party/mbedtls/BUILD.gn** + + + ``` + if (ohos_kernel_type == "liteos_m") { + defines += [ + "__unix__", + "MBEDTLS_CONFIG_FILE=<../port/config/config_liteos_m.h>", + ] + } + ``` + + According to the code, configure the **MBEDTLS_NO_PLATFORM_ENTROPY** and **MBEDTLS_ENTROPY_HARDWARE_ALT** macros to build the related code. + + Path: **third_party/mbedtls/library/entropy.c** + + + ``` + #if !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) + #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) + mbedtls_entropy_add_source( ctx, mbedtls_platform_entropy_poll, NULL, + MBEDTLS_ENTROPY_MIN_PLATFORM, + MBEDTLS_ENTROPY_SOURCE_STRONG ); + #endif + ...... + #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) + mbedtls_entropy_add_source( ctx, mbedtls_hardware_poll, NULL, + MBEDTLS_ENTROPY_MIN_HARDWARE, + MBEDTLS_ENTROPY_SOURCE_STRONG ); + #endif + ...... + #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */ + } + ``` + +3. Adapt the hardware-based random number interface. + + The API definition is as follows. + + Path: **third_party/mbedtls/include/mbedtls/entropy_poll.h** + + + ``` + int mbedtls_hardware_poll( void *data,unsigned char *output, size_t len, size_t *olen ); + ``` + + + **Table 1** Configuration items of the security subsystem + +| Configuration Item| Description| +| -------- | -------- | +| disable_huks_binary | Whether to compile the HUKS source code.
(1) **false** (default): The HUKS source code is not compiled.
(2) **true**: The HUKS source code is not compiled.| +| disable_authenticate | Whether tailoring is required for the HiChain authentication function.
(1) **true** (default): Tailoring is not required.
(2) **false**: Tailoring is required.| +| huks_use_lite_storage | Whether the lightweight storage solution is used. The lightweight storage solution can be used for devices that come with flash storage and do not have file systems.
(1) **true** (default): The lightweight storage solution is used.
(2) **false**: The lightweight storage solution is not used.| +| huks_use_hardware_root_key | Whether the hardware root key is used. If a device has the hardware root key capability, the hardware root key solution needs to be adapted based on the device capability. The RKC solution provided by HUKS is only for simulation implementation.
(1) **false** (default): The hardware root key is not used.
(2) **true**: The hardware root key is used. This requires adaptation.| +| huks_config_file | Whether to use the default HUKS configuration file **hks_config.h**.
(1) **""**(default): The default HUKS configuration file is used.
(2) Other files: You can select the features to be supported from the HUKS support capability set.| + + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> +> When adding a security subsystem, you can directly select the features of the security subsystem by configuring features. +> +> +> ``` +> { +> "subsystem": "security", +> "components": [ +> { "component": "hichainsdk", "features":[] }, +> { "component": "huks", "features": +> [ +> "disable_huks_binary = false", +> "disable_authenticate = false" +> ] +> } +> ] +> }, +> ``` diff --git a/en/device-dev/porting/porting-minichip-subsys-startup.md b/en/device-dev/porting/porting-minichip-subsys-startup.md new file mode 100644 index 0000000000..0f3258eb86 --- /dev/null +++ b/en/device-dev/porting/porting-minichip-subsys-startup.md @@ -0,0 +1,157 @@ +# Porting the Startup Subsystem + + +The startup subsystem is responsible for starting key system processes and services after the kernel is started and before applications are started. + + +## Procedure + +For the mini system, the startup entry identifiers of services and functions are provided. When SAMGR is started, the entry function identified by bootstrap is called and system services are started. + +After the adaptation is complete, call the **OHOS_SystemInit()** API to start the system. + +Path: **base/startup/bootstrap_lite/services/source/system_init.c** + + +``` +void OHOS_SystemInit(void) +{ + MODULE_INIT(bsp); // Execute the function in the .zinitcall.bspX.init section. + MODULE_INIT(device); // Execute the function in the .zinitcall.deviceX.init section. + MODULE_INIT(core); // Execute the function in the .zinitcall.coreX.init section. + SYS_INIT(service); // Execute the function in the .zinitcall.sys.serviceX.init section. + SYS_INIT(feature); // Execute the function in the .zinitcall.sys.featureX.init section. + MODULE_INIT(run); // Execute the function in the .zinitcall.runX.init section. + SAMGR_Bootstrap(); // Initialize the SAMGR service. +} +``` + + +## Example + +1. Add the startup subsystem to the **config.json** file. + + Path: **vendor/MyVendorCompany/MyProduct/config.json** + + The sample code is as follows: + + + ``` + { + subsystem": "startup", + components": [ + { "component": "bootstrap_lite", "features":[] }, + { "component": "syspara_lite", "features":[] } + ] + }, + ``` + + Some components (such as syspara_lite) in the startup subsystem depend on the modules in **$ohos_product_adapter_dir/utils**. In the preceding information, **ohos_product_adapter_dir** is the value of **product_adapter_dir** configured in the **config.json** file. Generally, **ohos_product_adapter_dir** is set to **vendor/MyVendorCompany/MyProduct/hals**. + +1. Add the **zinitcall** and **run** definitions. + + Add the following code to the **.text** section in the vendor **.ld** linking script: + + + ``` + __zinitcall_bsp_start = .; + KEEP (*(.zinitcall.bsp0.init)) + KEEP (*(.zinitcall.bsp1.init)) + KEEP (*(.zinitcall.bsp2.init)) + KEEP (*(.zinitcall.bsp3.init)) + KEEP (*(.zinitcall.bsp4.init)) + __zinitcall_bsp_end = .; + __zinitcall_device_start = .; + KEEP (*(.zinitcall.device0.init)) + KEEP (*(.zinitcall.device1.init)) + KEEP (*(.zinitcall.device2.init)) + KEEP (*(.zinitcall.device3.init)) + KEEP (*(.zinitcall.device4.init)) + __zinitcall_device_end = .; + __zinitcall_core_start = .; + KEEP (*(.zinitcall.core0.init)) + KEEP (*(.zinitcall.core1.init)) + KEEP (*(.zinitcall.core2.init)) + KEEP (*(.zinitcall.core3.init)) + KEEP (*(.zinitcall.core4.init)) + __zinitcall_core_end = .; + __zinitcall_sys_service_start = .; + KEEP (*(.zinitcall.sys.service0.init)) + KEEP (*(.zinitcall.sys.service1.init)) + KEEP (*(.zinitcall.sys.service2.init)) + KEEP (*(.zinitcall.sys.service3.init)) + KEEP (*(.zinitcall.sys.service4.init)) + __zinitcall_sys_service_end = .; + __zinitcall_sys_feature_start = .; + KEEP (*(.zinitcall.sys.feature0.init)) + KEEP (*(.zinitcall.sys.feature1.init)) + KEEP (*(.zinitcall.sys.feature2.init)) + KEEP (*(.zinitcall.sys.feature3.init)) + KEEP (*(.zinitcall.sys.feature4.init)) + __zinitcall_sys_feature_end = .; + __zinitcall_run_start = .; + KEEP (*(.zinitcall.run0.init)) + KEEP (*(.zinitcall.run1.init)) + KEEP (*(.zinitcall.run2.init)) + KEEP (*(.zinitcall.run3.init)) + KEEP (*(.zinitcall.run4.init)) + __zinitcall_run_end = .; + __zinitcall_app_service_start = .; // SAMGR executes the function in the .zinitcall.app.featureX.init section. + KEEP (*(.zinitcall.app.service0.init)) + KEEP (*(.zinitcall.app.service1.init)) + KEEP (*(.zinitcall.app.service2.init)) + KEEP (*(.zinitcall.app.service3.init)) + KEEP (*(.zinitcall.app.service4.init)) + __zinitcall_app_service_end = .; + __zinitcall_app_feature_start = .; // SAMGR executes the function in the .zinitcall.app.featureX.init section. + KEEP (*(.zinitcall.app.feature0.init)) + KEEP (*(.zinitcall.app.feature1.init)) + KEEP (*(.zinitcall.app.feature2.init)) + KEEP (*(.zinitcall.app.feature3.init)) + KEEP (*(.zinitcall.app.feature4.init)) + __zinitcall_app_feature_end = .; + __zinitcall_test_start = .; + KEEP (*(.zinitcall.test0.init)) + KEEP (*(.zinitcall.test1.init)) + KEEP (*(.zinitcall.test2.init)) + KEEP (*(.zinitcall.test3.init)) + KEEP (*(.zinitcall.test4.init)) + __zinitcall_test_end = .; + __zinitcall_exit_start = .; + KEEP (*(.zinitcall.exit0.init)) + KEEP (*(.zinitcall.exit1.init)) + KEEP (*(.zinitcall.exit2.init)) + KEEP (*(.zinitcall.exit3.init)) + KEEP (*(.zinitcall.exit4.init)) + __zinitcall_exit_end = .; + ``` + +1. The chip SDK creates a task. + + Set task parameters. After the system is started, start the task. The following is an example: + + + ``` + void mainTask(void) { + // Vendor-defined function + OHOS_SystemInit(); // Initialize the startup subsystem. + printf("MainTask running...\n"); + } + + void main(VOID) { + // Initialize the hardware and redirect the printf output to the debug serial port. + if (LOS_KernelInit() == 0) { // Initialize the kernel. + task_init_param.usTaskPrio = 10; // Task priority. + task_init_param.pcName = "mainTask"; // Task process name. + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)mainTask; // Task entry function. + task_init_param.uwStackSize = 8192; // Size of the task stack. + LOS_TaskCreate(&tid, &task_init_param); // Create a task. + LOS_Start(); // Start the task. + } + else { + printf("[BUG] LOS_KernelInit fail\n"); + } + printf("[BUG] reach to unexpected code\n"); + while (1); + } + ``` diff --git a/en/device-dev/porting/porting-minichip-verification.md b/en/device-dev/porting/porting-minichip-verification.md new file mode 100644 index 0000000000..4fb108c00d --- /dev/null +++ b/en/device-dev/porting/porting-minichip-verification.md @@ -0,0 +1,88 @@ +# Porting Verification + + +After the OpenHarmony chip is ported, conduct the OpenHarmony compatibility test and chip SDK function test to obtain certification. Detecting defects in the development process can improve code quality. + + +## Conducting the OpenHarmony Compatibility Test + +The OpenHarmony compatibility test is included in the X Test Suite (XTS), a set of OpenHarmony certification test suites. For details, see [DFX](https://gitee.com/openharmony/docs/blob/master/en/readme/dfx.md). + +1. Add the test subsystem and the xts_acts component. + Add the following code to the **vendor/xxx/xxx/config.json** file: + + + ``` + { + "subsystem": "test", + "components": [ + { "component": "xts_acts", "features":[] }, + { "component": "xts_tools", "features":[] } + ] + } + ``` + +2. Link the .a library generated by the XTS. + In the linking options, link the **libmodule_ActsXxxTest.a** library in the **out/MyBoard/MyProduct/libs** directory in the mode of **-lmodule_ActsXxxTest**. The sample code is as follows: + + + ``` + "-Wl,--whole-archive", + ...... + "-lhctest", + "-lbootstrap", + "-lbroadcast", + "-lmodule_ActsBootstrapTest", + "-lmodule_ActsCMSISTest", + "-lmodule_ActsDfxFuncTest", + "-lmodule_ActsParameterTest", + "-lmodule_ActsSamgrTest", + "-lmodule_ActsSecurityDataTest", + ...... + "-Wl,--no-whole-archive", + ``` + +3. Modify the code based on the test report. + Burn the files generated after compilation to the development board and use the serial port tool to view the XTS test report. If any test item fails, modify the code as needed. + + During fault locating, you can comment out unnecessary test items in the **test/xts/acts/build_lite/BUILD.gn** file. + + + ``` + if (ohos_kernel_type == "liteos_m") { + all_features += [ + "//test/xts/acts/communication_lite/lwip_hal:ActsLwipTest", + "//test/xts/acts/communication_lite/softbus_hal:ActsSoftBusTest", + "//test/xts/acts/communication_lite/wifiservice_hal:ActsWifiServiceTest", + "//test/xts/acts/utils_lite/file_hal:ActsUtilsFileTest", + "//test/xts/acts/startup_lite/syspara_hal:ActsParameterTest", + "//test/xts/acts/iot_hardware_lite/iot_controller_hal:ActsWifiIotTest", + "//test/xts/acts/kernel_lite/kernelcmsis_hal:ActsCMSISTest", + "//test/xts/acts/utils_lite/kv_store_hal:ActsKvStoreTest", + "//test/xts/acts/security_lite/datahuks_hal:ActsSecurityDataTest", + "//test/xts/acts/hiviewdfx_lite/hilog_hal:ActsDfxFuncTest", + "//test/xts/acts/distributed_schedule_lite/samgr_hal:ActsSamgrTest", + "//test/xts/acts/update_lite/updater_hal:ActsUpdaterFuncTest", + "//test/xts/acts/startup_lite/bootstrap_hal:ActsBootstrapTest", + ] + } + ``` + +> ![icon-caution.gif](public_sys-resources/icon-caution.gif) **CAUTION** +> 1. XTS automatically runs the test after **OHOS_SystemInit()** is called. +> +> 2. You must add code between "-Wl,--whole-archive" and "-Wl,--no-whole-archive". Otherwise, the link fails. +> +> During the XTS test, the following static libraries must be linked: +> +> +> ``` +> "-lhctest", +> "-lbootstrap", +> "-lbroadcast", +> ``` + + +## Conducting the Chip SDK Function Test + +Verify the chip SDK functions, such as Wi-Fi, Bluetooth, and OTA. diff --git a/en/device-dev/porting/porting-minichip.md b/en/device-dev/porting/porting-minichip.md deleted file mode 100644 index 1fd7c1fdfb..0000000000 --- a/en/device-dev/porting/porting-minichip.md +++ /dev/null @@ -1,11 +0,0 @@ -# Mini System SoC Porting Guide - -- **[Porting Preparations](porting-chip-prepare-knows.md)** - -- **[Kernel Porting](porting-chip-kernel-overview.md)** - -- **[Board-Level OS Porting](porting-chip-board-overview.md)** - -- **[FAQ](porting-chip-faqs.md)** - - diff --git a/en/device-dev/porting/porting-smallchip-kernel-linux.md b/en/device-dev/porting/porting-smallchip-kernel-linux.md index f05a8fa912..b5b3882de2 100644 --- a/en/device-dev/porting/porting-smallchip-kernel-linux.md +++ b/en/device-dev/porting/porting-smallchip-kernel-linux.md @@ -56,7 +56,7 @@ You can use the Bootloader provided by the chipset vendor or open-source U-Boot ## Verification -Debug the **init** process, start shell, and run a simple program in the user space to check whether the kernel porting is successful. Below is the OS image structure of the OpenHarmony [small system](../quick-start/quickstart-lite-overview.md) and the Linux user-space program startup process. +Debug the **init** process, start shell, and run a simple program in the user space to check whether the kernel porting is successful. Below is the OS image structure of the OpenHarmony small system and the Linux user-space program startup process. **Figure 1** OS image structure and user-space program startup process based on the Linux kernel diff --git a/en/device-dev/porting/porting-smallchip-prepare-building.md b/en/device-dev/porting/porting-smallchip-prepare-building.md index 47a363819d..a894946516 100644 --- a/en/device-dev/porting/porting-smallchip-prepare-building.md +++ b/en/device-dev/porting/porting-smallchip-prepare-building.md @@ -2,7 +2,7 @@ ## Compilation Environment Setup -Set up the basic environment by following instructions in [Setting Up the Hi3861 Development Board Environment](../quick-start/quickstart-lite-steps-hi3861-setting.md). Both the user space and LiteOS Cortex-A kernel space are compiled using the LLVM compiler. If you choose to port the Linux kernel, run the following command to install the gcc-arm-linux-gnueabi cross compiler for compiling the Linux kernel-space image: +Set up the basic environment by following instructions in [Quick Start Overview](../quick-start/quickstart-overview.md). Both the user space and LiteOS Cortex-A kernel space are compiled using the LLVM compiler. If you choose to port the Linux kernel, run the following command to install the gcc-arm-linux-gnueabi cross compiler for compiling the Linux kernel-space image: ``` diff --git a/en/device-dev/porting/porting-smallchip-prepare-needs.md b/en/device-dev/porting/porting-smallchip-prepare-needs.md index c9d1805216..15af9b2ae5 100644 --- a/en/device-dev/porting/porting-smallchip-prepare-needs.md +++ b/en/device-dev/porting/porting-smallchip-prepare-needs.md @@ -1,6 +1,6 @@ # Before You Start -This document provides guidance on how to port the Linux and LiteOS Cortex-A kernels on the OpenHarmony [small system](../quick-start/quickstart-lite-overview.md) to a development board. It is intended for developers with experience in developing embedded systems. Before following instructions in this document, it is recommended that you familiarize yourself with [OpenHarmony](../../OpenHarmony-Overview.md), including its technical architecture, directory structure, kernel subsystem, and driver subsystem. The following table lists the development boards that have been adapted to the small system. +This document provides guidance on how to port the Linux and LiteOS Cortex-A kernels on the OpenHarmony small system to a development board. It is intended for developers with experience in developing embedded systems. Before following instructions in this document, it is recommended that you familiarize yourself with [OpenHarmony](../../OpenHarmony-Overview.md), including its technical architecture, directory structure, kernel subsystem, and driver subsystem. The following table lists the development boards that have been adapted to the small system. **Table 1** Development boards compatible with the OpenHarmony small system diff --git a/en/device-dev/porting/porting-thirdparty-cmake.md b/en/device-dev/porting/porting-thirdparty-cmake.md index 49f125bb88..59402c5f34 100755 --- a/en/device-dev/porting/porting-thirdparty-cmake.md +++ b/en/device-dev/porting/porting-thirdparty-cmake.md @@ -5,7 +5,7 @@ The following shows how to port the double-conversion library. ## Source Code Acquisition -Acquire the source code of double-conversion from [https://github.com/google/double-conversion](https://github.com/google/double-conversion). The following table lists the directory structure. +Acquire the source code of double-conversion from [double-conversion](https://github.com/google/double-conversion). The following table lists the directory structure. **Table 1** Directory structure of the source code @@ -106,7 +106,7 @@ The following steps show how to configure and modify the toolchains for cross-co 1. Set up the OpenHarmony environment. - Using Hi3516D V300 as an example, compile the OpenHarmony image and burn it to the development board. For details, see [Developing the First Example Program Running on Hi3518](../quick-start/quickstart-lite-steps-hi3516-running.md). + Using Hi3516D V300 as an example, compile the OpenHarmony image and burn it to the development board. For details, see the content related to the small system in [Quick Start Overview](../quick-start/quickstart-overview.md). The following screen is displayed after a successful login to the OS. diff --git a/en/device-dev/quick-start/Readme-EN.md b/en/device-dev/quick-start/Readme-EN.md index 707972be22..9828bf4545 100644 --- a/en/device-dev/quick-start/Readme-EN.md +++ b/en/device-dev/quick-start/Readme-EN.md @@ -48,7 +48,7 @@ - [Configuring the Proxy](quickstart-pkg-common-proxy.md) - [Building Source Code Using the build.sh Script](quickstart-pkg-common-build.md) - [Fixing hb Installation Errors](quickstart-pkg-common-hberr.md) - - [Fixing Compilation and Building Error](quickstart-pkg-common-builderr.md) + - [Fixing Compilation and Building Errors](quickstart-pkg-common-builderr.md) - [Fixing Image Burning Errors](quickstart-pkg-common-burnerr.md) - Appendix - [Hi3516 Development Board](quickstart-appendix-hi3516.md) diff --git a/en/device-dev/quick-start/figures/en-us_image_0000001275592884.png b/en/device-dev/quick-start/figures/en-us_image_0000001275592884.png new file mode 100644 index 0000000000000000000000000000000000000000..2186d2a5328684c1a479d4fca6b9fa74884c6a7b GIT binary patch literal 302 zcmV+}0nz@6P)Nkl&PZ?tV2MNvSKr0d``P0)26JkO)9YpAMv z-8j!PG)==ej>z*IuInCx-z>`pM@8GVpp?S*eTbrnVHmLQ`=e*x-BD2#q-ly}SzuWf zwrx9}dNnUW&+|}K6}qm2VHgh^0Q{UmNs_=cO$0%JEX$tyCs3AU#BmIc ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** + > > Set the start address and length of the partition based on the size of the files to be burnt. Make sure the size of the partition is greater than that of the files to be burnt and the partition addresses of the files to be burnt do not overlap. ![3516-small-partitions](figures/3516-small-partitions.png) - + - **upload_protocol**: Select the burning protocol **hiburn-usb**. - **upload_port**: Select the serial port number obtained. - - ![3516-small-usb](figures/3516-small-usb.png) - + + ![3516-small-usb](figures/3516-small-usb.png) + 6. Choose **hi3516dv300** > **Upload** to transfer the files to be burnt from Ubuntu to Windows. ![en-us_image_0000001326234609](figures/en-us_image_0000001326234609.png) diff --git a/en/device-dev/quick-start/quickstart-pkg-common-builderr.md b/en/device-dev/quick-start/quickstart-pkg-common-builderr.md index 0dec9b52d3..dffadffd82 100644 --- a/en/device-dev/quick-start/quickstart-pkg-common-builderr.md +++ b/en/device-dev/quick-start/quickstart-pkg-common-builderr.md @@ -25,7 +25,7 @@ ## The message indicating Python cannot be found is displayed during the build process - **Symptom** - + The following information is displayed during the build process: @@ -76,7 +76,7 @@ ![faq-python3-not-found](figures/faq-python3-not-found.png) - **Possible Causes** - + Python 3 is not installed. - **Solution** diff --git a/en/device-dev/quick-start/quickstart-pkg-install_package.md b/en/device-dev/quick-start/quickstart-pkg-install_package.md index c93473396d..68f3ec95b3 100644 --- a/en/device-dev/quick-start/quickstart-pkg-install_package.md +++ b/en/device-dev/quick-start/quickstart-pkg-install_package.md @@ -18,9 +18,8 @@ On Ubuntu: > The preceding command is applicable to Ubuntu 18.04. For other Ubuntu versions, modify the preceding installation command based on the installation package name. The details are as follows: > > - Python 3.8 or a later version is required. This section uses Python 3.8 as an example. + > - Java 8 or later is required. This section uses Java 8 as an example. > -> - Java 8 or later is required. This section uses Java 8 as an example. - 2. Set Python 3.8 as the default Python version. Check the location of Python 3.8. diff --git a/en/device-dev/subsystems/subsys-build-gn-kconfig-visual-config-guide.md b/en/device-dev/subsystems/subsys-build-gn-kconfig-visual-config-guide.md index 96474b6eb2..f2450bd5b6 100644 --- a/en/device-dev/subsystems/subsys-build-gn-kconfig-visual-config-guide.md +++ b/en/device-dev/subsystems/subsys-build-gn-kconfig-visual-config-guide.md @@ -30,7 +30,7 @@ Kconfig visual configuration has the following advantages: 2. Set up the environment. - The Kconfiglib required for environment configuration has been embedded in the OpenHarmony hb tool. For details about how to install the hb tool, see "Installing hb" in [Setting Up Environments for the Mini and Small Systems](../quick-start/quickstart-lite-env-setup.md). + The Kconfiglib required for environment configuration has been embedded in the OpenHarmony hb tool. For details about how to install the hb tool, see [hb Installation](../quick-start/quickstart-pkg-install_tool.md#hb-installation). 3. Open the Kconfig configuration interface. diff --git a/en/device-dev/website.md b/en/device-dev/website.md index 9463578e64..e1be8f5605 100644 --- a/en/device-dev/website.md +++ b/en/device-dev/website.md @@ -1,588 +1,458 @@ # OpenHarmony Device Development Documentation -- [Device Development Guide](device-dev-guide.md) +- [Device Development Overview](device-dev-guide.md) - Getting Started - - Getting Started with Mini and Small Systems (IDE Mode, Recommended) - - - [Mini and Small System Overview](quick-start/quickstart-ide-lite-overview.md) - - - Environment Preparation - - - [Setting Up the Windows+Ubuntu Hybrid Build Environment](quick-start/quickstart-ide-lite-env-setup-win-ubuntu.md) - - - [Obtaining Source Code](quick-start/quickstart-ide-lite-sourcecode-acquire.md) - - - [Creating a Source Code Project](quick-start/quickstart-ide-lite-create-project.md) - - - Running a Hello World Program - - - Hi3861 Development Board - - - [Writing a Hello World Program](quick-start/quickstart-ide-lite-steps-hi3861-helloworld.md) - - - [Building](quick-start/quickstart-ide-lite-steps-hi3861-building.md) - - - [Burning](quick-start/quickstart-ide-lite-steps-hi3861-burn.md) - - - [Networking](quick-start/quickstart-ide-lite-steps-hi3861-netconfig.md) - - - [Debugging and Verification](quick-start/quickstart-ide-lite-steps-hi3861-debug.md) - - - [Running](quick-start/quickstart-ide-lite-steps-hi3861-running.md) - - - Hi3516 Development Board - - - [Writing a Hello World Program](quick-start/quickstart-ide-lite-steps-hi3516-helloworld.md) - - - [Building](quick-start/quickstart-ide-lite-steps-hi3516-building.md) - - - [Burning](quick-start/quickstart-ide-lite-steps-hi3516-burn.md) - - - [Running](quick-start/quickstart-ide-lite-steps-hi3516-running.md) - - - Appendix - - - [Introduction to the Hi3861 Development Board](quick-start/quickstart-ide-lite-introduction-hi3861.md) - - - [Introduction to the Hi3516 Development Board](quick-start/quickstart-ide-lite-introduction-hi3516.md) - - - [Overall Description of Compilation Form Factors](quick-start/quickstart-build.md) - - - Getting Started with Mini and Small Systems (Installation Package Mode) - - - [Mini and Small System Overview](quick-start/quickstart-lite-overview.md) - - - [Environment Preparation](quick-start/quickstart-lite-env-setup.md) - - - Running a Hello World Program - - - Hi3861 Development Board - - - [Setting Up the Hi3861 Development Board Environment](quick-start/quickstart-lite-steps-hi3861-setting.md) - - - [Writing a Hello World Program](quick-start/quickstart-lite-steps-hi3861-helloworld.md) - - - [Building](quick-start/quickstart-lite-steps-hi3861-building.md) - - - [Burning](quick-start/quickstart-lite-steps-hi3861-burn.md) - - - [Networking](quick-start/quickstart-lite-steps-hi3861-netconfig.md) - - - [Debugging and Verification](quick-start/quickstart-lite-steps-hi3861-debug.md) - - - [Running](quick-start/quickstart-lite-steps-hi3861-running.md) - - - Hi3516 Development Board - - - [Setting Up the Hi3516 Development Board Environment](quick-start/quickstart-lite-steps-hi3516-setting.md) - - - [Writing a Hello World Program](quick-start/quickstart-lite-steps-hi3516-helloworld.md) - - - [Building](quick-start/quickstart-lite-steps-hi3516-building.md) - - - [Burning](quick-start/quickstart-lite-steps-hi3516-burn.md) - - - [Running](quick-start/quickstart-lite-steps-hi3516-running.md) - - - FAQs - - - [Fixing hb Installation Issues](quick-start/quickstart-lite-faq-hb.md) - - - [Fixing Compilation Issues](quick-start/quickstart-lite-faq-compose.md) - - - [Fixing Burning Issues](quick-start/quickstart-lite-faq-burning.md) - - - Appendix - - - Introduction to Development Boards - - - [Introduction to the Hi3861 Development Board](quick-start/quickstart-lite-introduction-hi3861.md) - - - [Introduction to the Hi3516 Development Board](quick-start/quickstart-lite-introduction-hi3516.md) - - - [Reference](quick-start/quickstart-lite-reference.md) - - - [Burning Code by Using HiTool](quick-start/quickstart-lite-hitool.md) - - - [Overall Description of Compilation Form Factors](quick-start/quickstart-build.md) - - - Getting Started with Standard System (IDE Mode, Recommended) - - - [Standard System Overview](quick-start/quickstart-ide-standard-overview.md) - - - Environment Preparation - - - [Setting Up the Windows+Ubuntu Hybrid Build Environment](quick-start/quickstart-ide-standard-env-setup-win-ubuntu.md) - - - [Obtaining Source Code](quick-start/quickstart-ide-standard-sourcecode-acquire.md) - - - [Creating a Source Code Project](quick-start/quickstart-ide-standard-create-project.md) - - - Running a Hello World Program - - - Hi3516 Development Board - - - [Writing a Hello World Program](quick-start/quickstart-ide-standard-running-hi3516-create.md) - - - [Building](quick-start/quickstart-ide-standard-running-hi3516-build.md) - - - [Burning](quick-start/quickstart-ide-standard-running-hi3516-burning.md) - - - [Running](quick-start/quickstart-ide-standard-running-hi3516-running.md) - - - RK3568 Development Board - - - [Writing a Hello World Program](quick-start/quickstart-ide-standard-running-rk3568-create.md) - - - [Building](quick-start/quickstart-ide-standard-running-rk3568-build.md) - - - [Burning](quick-start/quickstart-ide-standard-running-rk3568-burning.md) - - - [Running](quick-start/quickstart-ide-standard-running-rk3568-running.md) - - - Appendix - - - [Introduction to the Hi3516 Development Board](quick-start/quickstart-ide-standard-board-introduction-hi3516.md) - - - [Introduction to the RK3568 Development Board](quick-start/quickstart-ide-standard-board-introduction-rk3568.md) - - - [Overall Description of Compilation Form Factors](quick-start/quickstart-build.md) - - - Getting Started with Standard System (Installation Package Mode) - - - [Standard System Overview](quick-start/quickstart-standard-overview.md) - - - [Setting Up Environments for Standard System](quick-start/quickstart-standard-env-setup.md) - - - Running a Hello World Program - - - Hi3516 Development Board - - - [Writing a Hello World Program](quick-start/quickstart-std-3516-create.md) - - - [Building](quick-start/quickstart-standard-running-hi3516-build.md) - - - [Burning](quick-start/quickstart-standard-running-hi3516-burning.md) - - - [Running](quick-start/quickstart-standard-running-hi3516-running.md) - - - RK3568 Development Board - - - [Writing a Hello World Program](quick-start/quickstart-standard-running-rk3568-create.md) - - - [Building](quick-start/quickstart-standard-running-rk3568-build.md) - - - [Burning](quick-start/quickstart-standard-running-rk3568-burning.md) - - - [Running](quick-start/quickstart-standard-running-rk3568-running.md) - - - FAQs - - - [Fixing hb Installation Issues](quick-start/quickstart-standard-faq-hb.md) - - - [Fixing Compilation Issues](quick-start/quickstart-standard-faq-compose.md) - - - [Fixing Burning Issues](quick-start/quickstart-standard-faq-burning.md) - - - Appendix - - - Introduction to Development Boards - - - [Introduction to the Hi3516 Development Board](quick-start/quickstart-standard-board-introduction-hi3516.md) - - - [Introduction to the RK3568 Development Board](quick-start/quickstart-standard-board-introduction-rk3568.md) - - - [Reference](quick-start/quickstart-standard-reference.md) - - - [Burning Code by Using HiTool](quick-start/quickstart-standard-hitool.md) - - - [Overall Description of Compilation Form Factors](quick-start/quickstart-build.md) + - [Quick Start Overview](quick-start/quickstart-overview.md) + - Getting Started in IDE Mode + - Setting Up the Development Environment + - [Setting Up the Windows Environment](quick-start/quickstart-ide-env--win.md) + - [Setting Up the Ubuntu Environment](quick-start/quickstart-ide-env-ubuntu.md) + - [Configuring the Environment for Remote Access](quick-start/quickstart-ide-env-remote.md) + - [Creating a Project and Obtaining Source Code](quick-start/quickstart-ide-import-project.md) + - Mini System (Based on the Hi3861 Development Board) + - [Writing a Hello World Program](quick-start/quickstart-ide-3861-helloworld.md) + - [Building Source Code](quick-start/quickstart-ide-3861-build.md) + - [Burning an Image](quick-start/quickstart-ide-3861-burn.md) + - [Running an Image](quick-start/quickstart-ide-3861-running.md) + - Small System (Based on the Hi3516 Development Board) + - [Writing a Hello World Program](quick-start/quickstart-ide-3516-helloworld.md) + - [Building Source Code](quick-start/quickstart-ide-3516-build.md) + - [Burning an Image](quick-start/quickstart-ide-3516-burn.md) + - [Running an Image](quick-start/quickstart-ide-3516-running.md) + - Standard System (Based on the RK3568 Development Board) + - [Writing a Hello World Program](quick-start/quickstart-ide-3568-helloworld.md) + - [Building Source Code](quick-start/quickstart-ide-3568-build.md) + - [Burning an Image](quick-start/quickstart-ide-3568-burn.md) + - [Running an Image](quick-start/quickstart-ide-3568-running.md) + - Getting Started in CLI Mode + - Setting Up the Development Environment + - [Setting Up the Development Environment](quick-start/quickstart-pkg-prepare.md) + - [Installing Libraries and Tools](quick-start/quickstart-pkg-install_package.md) + - [Obtaining Source Code](quick-start/quickstart-pkg-sourcecode.md) + - [Installing the Compilation Tools](quick-start/quickstart-pkg-install_tool.md) + - Mini System (Based on the Hi3861 Development Board) + - [Installing Tools Specially Required by the Hi3861 Development Board](quick-start/quickstart-pkg-3861-tool.md) + - [Writing a Hello World Program](quick-start/quickstart-pkg-3861-helloworld.md) + - [Building Source Code](quick-start/quickstart-pkg-3861-build.md) + - [Burning an Image](quick-start/quickstart-pkg-3861-burn.md) + - [Running an Image](quick-start/quickstart-pkg-3861-running.md) + - Small System (Based on the Hi3516 Development Board) + - [Writing a Hello World Program](quick-start/quickstart-pkg-3516-helloworld.md) + - [Building Source Code](quick-start/quickstart-pkg-3516-build.md) + - [Burning an Image](quick-start/quickstart-pkg-3516-burn.md) + - [Running an Image](quick-start/quickstart-pkg-3516-running.md) + - Standard System (Based on the RK3568 Development Board) + - [Writing a Hello World Program](quick-start/quickstart-pkg-3568-helloworld.md) + - [Building Source Code](quick-start/quickstart-pkg-3568-build.md) + - [Burning an Image](quick-start/quickstart-pkg-3568-burn.md) + - [Running an Image](quick-start/quickstart-pkg-3568-running.md) + - Miscellaneous + - [Configuring the Proxy](quick-start/quickstart-pkg-common-proxy.md) + - [Building Source Code Using the build.sh Script](quick-start/quickstart-pkg-common-build.md) + - [Fixing hb Installation Errors](quick-start/quickstart-pkg-common-hberr.md) + - [Fixing Compilation and Building Errors](quick-start/quickstart-pkg-common-builderr.md) + - [Fixing Image Burning Errors](quick-start/quickstart-pkg-common-burnerr.md) + - Appendix + - [Hi3516 Development Board](quick-start/quickstart-appendix-hi3516.md) + - [Hi3861 Development Board](quick-start/quickstart-appendix-hi3861.md) + - [RK3568 Development Board](quick-start/quickstart-appendix-rk3568.md) + - [Build Form Factors](quick-start/quickstart-appendix-compiledform.md) + - [Getting Started with the Standard System with Hi3516 (IDE Mode)](quick-start/quickstart-appendix-hi3516-ide.md) + - [Getting Started with the Standard System with Hi3516 (CLI Mode)](quick-start/quickstart-appendix-hi3516-pkg.md) + - [Obtaining Source Code](get-code/sourcecode-acquire.md) - Privacy and Security - [Privacy Protection](security/security-privacy-protection.md) - [Security Guidelines](security/security-guidelines-overall.md) - Porting + - Mini System SoC Porting Guide - - Porting Preparations - - [Before You Start](porting/porting-chip-prepare-knows.md) - - [Building Adaptation Process](porting/porting-chip-prepare-process.md) - - Kernel Porting - - [Overview](porting/porting-chip-kernel-overview.md) - - [Basic Kernel Adaptation](porting/porting-chip-kernel-adjustment.md) - - [Kernel Porting Verification](porting/porting-chip-kernel-verify.md) - - Board-Level OS Porting - - [Overview](porting/porting-chip-board-overview.md) - - [Board-Level Driver Adaptation](porting/porting-chip-board-driver.md) - - [Implementation of APIs at the HAL](porting/porting-chip-board-hal.md) - - [System Modules](porting/porting-chip-board-component.md) - - [lwIP Module Adaptation](porting/porting-chip-board-lwip.md) - - [Third-party Module Adaptation](porting/porting-chip-board-bundle.md) - - [XTS](porting/porting-chip-board-xts.md) - - [FAQs](porting/porting-chip-faqs.md) - - Small System SoC Porting Guide - - Porting Preparations + - [Overview](porting/porting-minichip-overview.md) + + - [Porting Preparation](porting/porting-minichip-prepare.md) + + - [Kernel Porting](porting/porting-minichip-kernel.md) - - [Before You Start](porting/porting-smallchip-prepare-needs.md) + - Subsystem Porting - - [Compilation and Building](porting/porting-smallchip-prepare-building.md) + - [Subsystem Porting Overview](porting/porting-minichip-subsys-overview.md) - - Kernel Porting + - [Porting the Startup Subsystem](porting/porting-minichip-subsys-startup.md) - - [LiteOS Cortex-A](porting/porting-smallchip-kernel-a.md) + - [Porting the File Subsystem](porting/porting-minichip-subsys-filesystem.md) - - [Linux Kernel](porting/porting-smallchip-kernel-linux.md) + - [Porting the Security Subsystem](porting/porting-minichip-subsys-security.md) - - Driver Porting + - [Porting the Communication Subsystem](porting/porting-minichip-subsys-communication.md) - - [Porting Overview](porting/porting-smallchip-driver-overview.md) + - [Porting the Driver Subsystem](porting/porting-minichip-subsys-driver.md) - - [Platform Driver Porting](porting/porting-smallchip-driver-plat.md) + - [Configuring Other Subsystems](porting/porting-minichip-subsys-others.md) - - [Device Driver Porting](porting/porting-smallchip-driver-oom.md) + - [Porting Verification](porting/porting-minichip-verification.md) + - [FAQs](porting/porting-chip-faqs.md) +- Small System SoC Porting Guide + + - Porting Preparation + + - [Before You Start](porting/porting-smallchip-prepare-needs.md) + + - [Compilation and Building](porting/porting-smallchip-prepare-building.md) + + - Kernel Porting + + - [LiteOS Cortex-A](porting/porting-smallchip-kernel-a.md) + + - [Linux Kernel](porting/porting-smallchip-kernel-linux.md) + + - Driver Porting + + - [Porting Overview](porting/porting-smallchip-driver-overview.md) + + - [Platform Driver Porting](porting/porting-smallchip-driver-plat.md) + + - [Device Driver Porting](porting/porting-smallchip-driver-oom.md) - Standard System SoC Porting Guide - [Standard System Porting Guide](porting/standard-system-porting-guide.md) - [A Method for Rapidly Porting the OpenHarmony Linux Kernel](porting/porting-linux-kernel.md) - - - Third-Party Library Porting Guide for Mini and Small Systems - - - [Overview](porting/porting-thirdparty-overview.md) - - - [Porting a Library Built Using CMake](porting/porting-thirdparty-cmake.md) - - - [Porting a Library Built Using Makefile](porting/porting-thirdparty-makefile.md) - - - Mini System SoC Porting Cases - - - [Mini-System Devices with Screens — Bestechnic SoC Porting Case](porting/porting-bes2600w-on-minisystem-display-demo.md) - - - [Combo Solution – ASR Chip Porting Case](porting/porting-asr582x-combo-demo.md) - - +- Third-Party Library Porting Guide for Mini and Small Systems + + - [Overview](porting/porting-thirdparty-overview.md) + - [Porting a Library Built Using CMake](porting/porting-thirdparty-cmake.md) + - [Porting a Library Built Using Makefile](porting/porting-thirdparty-makefile.md) +- Mini System SoC Porting Cases + - [Mini-System Devices with Screens — Bestechnic SoC Porting Case](porting/porting-bes2600w-on-minisystem-display-demo.md) + - [Combo Solution – ASR Chip Porting Case](porting/porting-asr582x-combo-demo.md) - Subsystem Development - - Kernel - - Kernel for Mini Systems - - [Kernel Overview](kernel/kernel-mini-overview.md) - - Basic Kernel - - [Interrupt Management](kernel/kernel-mini-basic-interrupt.md) - - [Task Management](kernel/kernel-mini-basic-task.md) - - [Memory Management](kernel/kernel-mini-basic-memory.md) - - Kernel Communication Mechanisms - - [Event](kernel/kernel-mini-basic-ipc-event.md) - - [Mutex](kernel/kernel-mini-basic-ipc-mutex.md) - - [Queue](kernel/kernel-mini-basic-ipc-queue.md) - - [Semaphore](kernel/kernel-mini-basic-ipc-sem.md) - - [Time Management](kernel/kernel-basic-mini-time.md) - - [Software Timer](kernel/kernel-mini-basic-soft.md) - - Extended Components - - [C++ Support](kernel/kernel-mini-extend-support.md) - - [CPUP](kernel/kernel-mini-extend-cpup.md) - - [Dynamic Loading](kernel/kernel-mini-extend-dynamic-loading.md) - - [File System](kernel/kernel-mini-extend-file.md) - - Kernel Debugging - - [Memory Debugging](kernel/kernel-mini-memory-debug.md) - - [Exception Debugging](kernel/kernel-mini-memory-exception.md) - - [Trace](kernel/kernel-mini-memory-trace.md) - - [LMS](kernel/kernel-mini-memory-lms.md) - - Appendix - - [Kernel Coding Specification](kernel/kernel-mini-appx-code.md) - - [Doubly Linked List](kernel/kernel-mini-appx-data-list.md) - - [Standard Libraries](kernel/kernel-mini-appx-lib.md) - - Kernel for Small Systems - - [Kernel Overview](kernel/kernel-small-overview.md) - - Kernel Startup - - [Startup in Kernel Space](kernel/kernel-small-start-kernel.md) - - [Startup in User Space](kernel/kernel-small-start-user.md) - - Basic Kernel - - [Interrupt and Exception Handling](kernel/kernel-small-basic-interrupt.md) - - Process Management - - [Process](kernel/kernel-small-basic-process-process.md) - - [Task](kernel/kernel-small-basic-process-thread.md) - - [Scheduler](kernel/kernel-small-basic-process-scheduler.md) - - Memory Management - - [Heap Memory Management](kernel/kernel-small-basic-memory-heap.md) - - [Physical Memory Management](kernel/kernel-small-basic-memory-physical.md) - - [Virtual Memory Management](kernel/kernel-small-basic-memory-virtual.md) - - [Virtual-to-Physical Mapping](kernel/kernel-small-basic-inner-reflect.md) - - Kernel Communication Mechanisms - - [Event](kernel/kernel-small-basic-trans-event.md) - - [Semaphore](kernel/kernel-small-basic-trans-semaphore.md) - - [Mutex](kernel/kernel-small-basic-trans-mutex.md) - - [Queue](kernel/kernel-small-basic-trans-queue.md) - - [RW Lock](kernel/kernel-small-basic-trans-rwlock.md) - - [Futex](kernel/kernel-small-basic-trans-user-mutex.md) - - [Signal](kernel/kernel-small-basic-trans-user-signal.md) - - [Time Management](kernel/kernel-small-basic-time.md) - - [Software Timer](kernel/kernel-small-basic-softtimer.md) - - [Atomic Operation](kernel/kernel-small-basic-atomic.md) - - Extension Components - - [System Call](kernel/kernel-small-bundles-system.md) - - [Dynamic Loading and Linking](kernel/kernel-small-bundles-linking.md) - - [Virtual Dynamic Shared Object](kernel/kernel-small-bundles-share.md) - - [LiteIPC](kernel/kernel-small-bundles-ipc.md) - - File Systems - - [Virtual File System](kernel/kernel-small-bundles-fs-virtual.md) - - [Supported File Systems](kernel/kernel-small-bundles-fs-support.md) - - [File System Adaptation](kernel/kernel-small-bundles-fs-new.md) - - Debugging and Tools - - Shell - - [Introduction to the Shell](kernel/kernel-small-debug-shell-overview.md) - - [Shell Command Development Guidelines](kernel/kernel-small-debug-shell-guide.md) - - [Shell Command Programming Example](kernel/kernel-small-debug-shell-build.md) - - Shell Command Reference - - System Commands - - [cpup](kernel/kernel-small-debug-shell-cmd-cpup.md) - - [date](kernel/kernel-small-debug-shell-cmd-date.md) - - [dmesg](kernel/kernel-small-debug-shell-cmd-dmesg.md) - - [exec](kernel/kernel-small-debug-shell-cmd-exec.md) - - [free](kernel/kernel-small-debug-shell-cmd-free.md) - - [help](kernel/kernel-small-debug-shell-cmd-help.md) - - [hwi](kernel/kernel-small-debug-shell-cmd-hwi.md) - - [kill](kernel/kernel-small-debug-shell-cmd-kill.md) - - [log](kernel/kernel-small-debug-shell-cmd-log.md) - - [memcheck](kernel/kernel-small-debug-shell-cmd-memcheck.md) - - [oom](kernel/kernel-small-debug-shell-cmd-oom.md) - - [pmm](kernel/kernel-small-debug-shell-cmd-pmm.md) - - [reset](kernel/kernel-small-debug-shell-cmd-reset.md) - - [sem](kernel/kernel-small-debug-shell-cmd-sem.md) - - [stack](kernel/kernel-small-debug-shell-cmd-stack.md) - - [su](kernel/kernel-small-debug-shell-cmd-su.md) - - [swtmr](kernel/kernel-small-debug-shell-cmd-swtmr.md) - - [systeminfo](kernel/kernel-small-debug-shell-cmd-sysinfo.md) - - [task](kernel/kernel-small-debug-shell-cmd-task.md) - - [uname](kernel/kernel-small-debug-shell-cmd-uname.md) - - [vmm](kernel/kernel-small-debug-shell-cmd-vmm.md) - - [watch](kernel/kernel-small-debug-shell-cmd-watch.md) - - [reboot](kernel/kernel-small-debug-shell-cmd-reboot.md) - - [top](kernel/kernel-small-debug-shell-cmd-top.md) - - File Commands - - [cat](kernel/kernel-small-debug-shell-file-cat.md) - - [cd](kernel/kernel-small-debug-shell-file-cd.md) - - [chgrp](kernel/kernel-small-debug-shell-file-chgrp.md) - - [chmod](kernel/kernel-small-debug-shell-file-chmod.md) - - [chown](kernel/kernel-small-debug-shell-file-chown.md) - - [cp](kernel/kernel-small-debug-shell-file-cp.md) - - [format](kernel/kernel-small-debug-shell-file-format.md) - - [ls](kernel/kernel-small-debug-shell-file-ls.md) - - [lsfd](kernel/kernel-small-debug-shell-file-lsfd.md) - - [mkdir](kernel/kernel-small-debug-shell-file-mkdir.md) - - [mount](kernel/kernel-small-debug-shell-file-mount.md) - - [partinfo](kernel/kernel-small-debug-shell-file-partinfo.md) - - [partition](kernel/kernel-small-debug-shell-file-partition.md) - - [pwd](kernel/kernel-small-debug-shell-file-pwd.md) - - [rm](kernel/kernel-small-debug-shell-file-rm.md) - - [rmdir](kernel/kernel-small-debug-shell-file-rmdir.md) - - [statfs](kernel/kernel-small-debug-shell-file-statfs.md) - - [sync](kernel/kernel-small-debug-shell-file-sync.md) - - [touch](kernel/kernel-small-debug-shell-file-touch.md) - - [writeproc](kernel/kernel-small-debug-shell-file-write.md) - - [umount](kernel/kernel-small-debug-shell-file-umount.md) - - [du](kernel/kernel-small-debug-shell-file-du.md) - - [mv](kernel/kernel-small-debug-shell-file-mv.md) - - Network Commands - - [arp](kernel/kernel-small-debug-shell-net-arp.md) - - [dhclient](kernel/kernel-small-debug-shell-net-dhclient.md) - - [ifconfig](kernel/kernel-small-debug-shell-net-ifconfig.md) - - [ipdebug](kernel/kernel-small-debug-shell-net-ipdebug.md) - - [netstat](kernel/kernel-small-debug-shell-net-netstat.md) - - [ntpdate](kernel/kernel-small-debug-shell-net-ntpdate.md) - - [ping](kernel/kernel-small-debug-shell-net-ping.md) - - [ping6](kernel/kernel-small-debug-shell-net-ping6.md) - - [telnet](kernel/kernel-small-debug-shell-net-telnet.md) - - [tftp](kernel/kernel-small-debug-shell-net-tftp.md) - - [Magic Key](kernel/kernel-small-debug-shell-magickey.md) - - [User-Space Exception Information](kernel/kernel-small-debug-shell-error.md) - - [Trace](kernel/kernel-small-debug-trace.md) - - [perf](kernel/kernel-mini-memory-perf.md) - - [LMS](kernel/kernel-small-memory-lms.md) - - [CPUP](kernel/kernel-small-debug-process-cpu.md) - - Memory Debugging - - [Memory Information Statistics](kernel/kernel-small-debug-memory-info.md) - - [Memory Leak Check](kernel/kernel-small-debug-memory-leak.md) - - [Memory Corruption Check](kernel/kernel-small-debug-memory-corrupt.md) - - [User-Mode Memory Debugging](kernel/kernel-small-debug-user.md) - - Other Kernel Debugging Methods - - [Dying Gasp](kernel/kernel-small-debug-trace-other-lastwords.md) - - [Common Fault Locating Methods](kernel/kernel-small-debug-trace-other-faqs.md) - - Appendix - - Basic Data Structure - - [Doubly Linked List](kernel/kernel-small-apx-dll.md) - - [Bitwise Operation](kernel/kernel-small-apx-bitwise.md) - - [Standard Library](kernel/kernel-small-apx-library.md) - - [Kernel Coding Specification](kernel/kernel-mini-appx-code.md) - - Kernel for Standard Systems - - [Linux Kernel Overview](kernel/kernel-standard-overview.md) - - [Applying Patches on OpenHarmony Development Boards](kernel/kernel-standard-patch.md) - - [Guidelines for Building the Linux Kernel](kernel/kernel-standard-build.md) - - Enhanced Kernel Features - - [Enhanced SWAP](kernel/kernel-standard-mm-eswap.md) - - Task Scheduling - - [Related Thread Group](kernel/kernel-standard-sched-rtg.md) - - [Lightweight CPU Isolation](kernel/kernel-standard-sched-cpuisolation.md) - - Driver - - HDF - - [HDF Overview](driver/driver-hdf-overview.md) - - [Driver Development](driver/driver-hdf-development.md) - - [Driver Service Management](driver/driver-hdf-servicemanage.md) - - [Driver Message Mechanism Management](driver/driver-hdf-message-management.md) - - [Driver Configuration Management](driver/driver-hdf-manage.md) - - [HDF Development Example](driver/driver-hdf-sample.md) - - Platform Driver Development - - [ADC](driver/driver-platform-adc-develop.md) - - [DAC](driver/driver-platform-dac-develop.md) - - [GPIO](driver/driver-platform-gpio-develop.md) - - [HDMI](driver/driver-platform-hdmi-develop.md) - - [I2C](driver/driver-platform-i2c-develop.md) - - [I3C](driver/driver-platform-i3c-develop.md) - - [MIPI CSI](driver/driver-platform-mipicsi-develop.md) - - [MIPI DSI](driver/driver-platform-mipidsi-develop.md) - - [MMC](driver/driver-platform-mmc-develop.md) - - [PIN](driver/driver-platform-pin-develop.md) - - [PWM](driver/driver-platform-pwm-develop.md) - - [Regulator](driver/driver-platform-regulator-develop.md) - - [RTC](driver/driver-platform-rtc-develop.md) - - [SDIO](driver/driver-platform-sdio-develop.md) - - [SPI](driver/driver-platform-spi-develop.md) - - [UART](driver/driver-platform-uart-develop.md) - - [WatchDog](driver/driver-platform-watchdog-develop.md) - - Platform Driver Usage - - [ADC](driver/driver-platform-adc-des.md) - - [DAC](driver/driver-platform-dac-des.md) - - [GPIO](driver/driver-platform-gpio-des.md) - - [HDMI](driver/driver-platform-hdmi-des.md) - - [I2C](driver/driver-platform-i2c-des.md) - - [I3C](driver/driver-platform-i3c-des.md) - - [MIPI CSI](driver/driver-platform-mipicsi-des.md) - - [MIPI DSI](driver/driver-platform-mipidsi-des.md) - - [PIN](driver/driver-platform-pin-des.md) - - [PWM](driver/driver-platform-pwm-des.md) - - [Regulator](driver/driver-platform-regulator-des.md) - - [RTC](driver/driver-platform-rtc-des.md) - - [SDIO](driver/driver-platform-sdio-des.md) - - [SPI](driver/driver-platform-spi-des.md) - - [UART](driver/driver-platform-uart-des.md) - - [WatchDog](driver/driver-platform-watchdog-des.md) - - Peripheral Driver Usage - - [Audio](driver/driver-peripherals-audio-des.md) - - [Camera](driver/driver-peripherals-camera-des.md) - - [Codec](driver/driver-peripherals-codec-des.md) - - [Facial Authentication](driver/driver-peripherals-face_auth-des.md) - - [Fingerprint Authentication](driver/driver-peripherals-fingerprint_auth-des.md) - - [LCD](driver/driver-peripherals-lcd-des.md) - - [Light](driver/driver-peripherals-light-des.md) - - [Motion](driver/driver-peripherals-motion-des.md) - - [PIN Authentication](driver/driver-peripherals-pinauth-des.md) - - [Sensor](driver/driver-peripherals-sensor-des.md) - - [Touchscreen](driver/driver-peripherals-touch-des.md) - - [USB](driver/driver-peripherals-usb-des.md) - - [User Authentication](driver/driver-peripherals-user-auth-des.md) - - [Vibrator](driver/driver-peripherals-vibrator-des.md) - - [WLAN](driver/driver-peripherals-external-des.md) - - Compilation and Building - - [Compilation and Building Guide](subsystems/subsys-build-all.md) - - [Build System Coding Specifications and Best Practices](subsystems/subsys-build-gn-coding-style-and-best-practice.md) - - [Building the Kconfig Visual Configuration](subsystems/subsys-build-gn-kconfig-visual-config-guide.md) - - References - - [Subsystem Configuration Rules](subsystems/subsys-build-subsystem.md - - [Product Configuration Rules](subsystems/subsys-build-product.md) - - [Subsystem Configuration Rules](subsystems/subsys-build-subsystem.md) - - [Component Configuration Rules](subsystems/subsys-build-component.md) - - [Module Configuration Rules](subsystems/subsys-build-module.md) - - [Chipset Solution Configuration Rules](subsystems/subsys-build-chip_solution.md) - - [Feature Configuration Rules](subsystems/subsys-build-feature.md) - - [System Capabilities Configuration Rules](subsystems/subsys-build-syscap.md) - - [deps and external_deps](subsystems/subsys-build-reference.md) + - Kernel + - [Kernel Overview](kernel/kernel-overview.md) + - Mini-System Kernel (LiteOS-M) + - [LiteOS-M Overview](kernel/kernel-mini-overview.md) + - Basic Kernel + - [Interrupt Management](kernel/kernel-mini-basic-interrupt.md) + - [Task Management](kernel/kernel-mini-basic-task.md) + - [Memory Management](kernel/kernel-mini-basic-memory.md) + - Kernel Communication Mechanisms + - [Event](kernel/kernel-mini-basic-ipc-event.md) + - [Mutex](kernel/kernel-mini-basic-ipc-mutex.md) + - [Queue](kernel/kernel-mini-basic-ipc-queue.md) + - [Semaphore](kernel/kernel-mini-basic-ipc-sem.md) + - [Time Management](kernel/kernel-basic-mini-time.md) + - [Software Timer](kernel/kernel-mini-basic-soft.md) + - [Doubly Linked List](kernel/kernel-mini-basic-list.md) + - Extended Components + - [C++ Support](kernel/kernel-mini-extend-support.md) + - [CPUP](kernel/kernel-mini-extend-cpup.md) + - [Dynamic Loading](kernel/kernel-mini-extend-dynamic-loading.md) + - [File System](kernel/kernel-mini-extend-file.md) + - Kernel Debugging + - [Memory Debugging](kernel/kernel-mini-memory-debug.md) + - [Exception Debugging](kernel/kernel-mini-memory-exception.md) + - [Trace](kernel/kernel-mini-memory-trace.md) + - [LMS](kernel/kernel-mini-memory-lms.md) + - Appendix + - [Kernel Coding Specification](kernel/kernel-mini-appx-code.md) + - [Standard Libraries](kernel/kernel-mini-appx-lib.md) + - Small-System Kernel (LiteOS-A) + - [LiteOS-A Overview](kernel/kernel-small-overview.md) + - Kernel Startup + - [Startup in Kernel Mode](kernel/kernel-small-start-kernel.md) + - [Startup in User Mode](kernel/kernel-small-start-user.md) + - Basic Kernel + - [Interrupt and Exception Handling](kernel/kernel-small-basic-interrupt.md) + - Process Management + - [Process](kernel/kernel-small-basic-process-process.md) + - [Task](kernel/kernel-small-basic-process-thread.md) + - [Scheduler](kernel/kernel-small-basic-process-scheduler.md) + - Memory Management + - [Heap Memory Management](kernel/kernel-small-basic-memory-heap.md) + - [Physical Memory Management](kernel/kernel-small-basic-memory-physical.md) + - [Virtual Memory Management](kernel/kernel-small-basic-memory-virtual.md) + - [Virtual-to-Physical Mapping](kernel/kernel-small-basic-inner-reflect.md) + - Kernel Communication Mechanisms + - [Event](kernel/kernel-small-basic-trans-event.md) + - [Semaphore](kernel/kernel-small-basic-trans-semaphore.md) + - [Mutex](kernel/kernel-small-basic-trans-mutex.md) + - [Queue](kernel/kernel-small-basic-trans-queue.md) + - [RW Lock](kernel/kernel-small-basic-trans-rwlock.md) + - [Futex](kernel/kernel-small-basic-trans-user-mutex.md) + - [Signal](kernel/kernel-small-basic-trans-user-signal.md) + - [Time Management](kernel/kernel-small-basic-time.md) + - [Software Timer](kernel/kernel-small-basic-softtimer.md) + - [Atomic Operation](kernel/kernel-small-basic-atomic.md) + - Extension Components + - [System Call](kernel/kernel-small-bundles-system.md) + - [Dynamic Loading and Linking](kernel/kernel-small-bundles-linking.md) + - [Virtual Dynamic Shared Object](kernel/kernel-small-bundles-share.md) + - [LiteIPC](kernel/kernel-small-bundles-ipc.md) + - File Systems + - [Virtual File System](kernel/kernel-small-bundles-fs-virtual.md) + - [Supported File Systems](kernel/kernel-small-bundles-fs-support.md) + - [File System Adaptation](kernel/kernel-small-bundles-fs-new.md) + - Debugging and Tools + - Shell + - [Introduction to the Shell](kernel/kernel-small-debug-shell-overview.md) + - [Shell Command Development Guidelines](kernel/kernel-small-debug-shell-guide.md) + - [Shell Command Programming Example](kernel/kernel-small-debug-shell-build.md) + - Shell Command Reference + - System Commands + - [cpup](kernel/kernel-small-debug-shell-cmd-cpup.md) + - [date](kernel/kernel-small-debug-shell-cmd-date.md) + - [dmesg](kernel/kernel-small-debug-shell-cmd-dmesg.md) + - [exec](kernel/kernel-small-debug-shell-cmd-exec.md) + - [free](kernel/kernel-small-debug-shell-cmd-free.md) + - [help](kernel/kernel-small-debug-shell-cmd-help.md) + - [hwi](kernel/kernel-small-debug-shell-cmd-hwi.md) + - [kill](kernel/kernel-small-debug-shell-cmd-kill.md) + - [log](kernel/kernel-small-debug-shell-cmd-log.md) + - [memcheck](kernel/kernel-small-debug-shell-cmd-memcheck.md) + - [oom](kernel/kernel-small-debug-shell-cmd-oom.md) + - [pmm](kernel/kernel-small-debug-shell-cmd-pmm.md) + - [reset](kernel/kernel-small-debug-shell-cmd-reset.md) + - [sem](kernel/kernel-small-debug-shell-cmd-sem.md) + - [stack](kernel/kernel-small-debug-shell-cmd-stack.md) + - [su](kernel/kernel-small-debug-shell-cmd-su.md) + - [swtmr](kernel/kernel-small-debug-shell-cmd-swtmr.md) + - [systeminfo](kernel/kernel-small-debug-shell-cmd-sysinfo.md) + - [task](kernel/kernel-small-debug-shell-cmd-task.md) + - [uname](kernel/kernel-small-debug-shell-cmd-uname.md) + - [vmm](kernel/kernel-small-debug-shell-cmd-vmm.md) + - [watch](kernel/kernel-small-debug-shell-cmd-watch.md) + - [reboot](kernel/kernel-small-debug-shell-cmd-reboot.md) + - [top](kernel/kernel-small-debug-shell-cmd-top.md) + - File Commands + - [cat](kernel/kernel-small-debug-shell-file-cat.md) + - [cd](kernel/kernel-small-debug-shell-file-cd.md) + - [chgrp](kernel/kernel-small-debug-shell-file-chgrp.md) + - [chmod](kernel/kernel-small-debug-shell-file-chmod.md) + - [chown](kernel/kernel-small-debug-shell-file-chown.md) + - [cp](kernel/kernel-small-debug-shell-file-cp.md) + - [format](kernel/kernel-small-debug-shell-file-format.md) + - [ls](kernel/kernel-small-debug-shell-file-ls.md) + - [lsfd](kernel/kernel-small-debug-shell-file-lsfd.md) + - [mkdir](kernel/kernel-small-debug-shell-file-mkdir.md) + - [mount](kernel/kernel-small-debug-shell-file-mount.md) + - [partinfo](kernel/kernel-small-debug-shell-file-partinfo.md) + - [partition](kernel/kernel-small-debug-shell-file-partition.md) + - [pwd](kernel/kernel-small-debug-shell-file-pwd.md) + - [rm](kernel/kernel-small-debug-shell-file-rm.md) + - [rmdir](kernel/kernel-small-debug-shell-file-rmdir.md) + - [statfs](kernel/kernel-small-debug-shell-file-statfs.md) + - [sync](kernel/kernel-small-debug-shell-file-sync.md) + - [touch](kernel/kernel-small-debug-shell-file-touch.md) + - [writeproc](kernel/kernel-small-debug-shell-file-write.md) + - [umount](kernel/kernel-small-debug-shell-file-umount.md) + - [du](kernel/kernel-small-debug-shell-file-du.md) + - [mv](kernel/kernel-small-debug-shell-file-mv.md) + - Network Commands + - [arp](kernel/kernel-small-debug-shell-net-arp.md) + - [dhclient](kernel/kernel-small-debug-shell-net-dhclient.md) + - [ifconfig](kernel/kernel-small-debug-shell-net-ifconfig.md) + - [ipdebug](kernel/kernel-small-debug-shell-net-ipdebug.md) + - [netstat](kernel/kernel-small-debug-shell-net-netstat.md) + - [ntpdate](kernel/kernel-small-debug-shell-net-ntpdate.md) + - [ping](kernel/kernel-small-debug-shell-net-ping.md) + - [ping6](kernel/kernel-small-debug-shell-net-ping6.md) + - [telnet](kernel/kernel-small-debug-shell-net-telnet.md) + - [tftp](kernel/kernel-small-debug-shell-net-tftp.md) + - [Magic Key](kernel/kernel-small-debug-shell-magickey.md) + - [User-Mode Exception Information](kernel/kernel-small-debug-shell-error.md) + - [Trace](kernel/kernel-small-debug-trace.md) + - [perf](kernel/kernel-mini-memory-perf.md) + - [LMS](kernel/kernel-small-memory-lms.md) + - [Process Debugging](kernel/kernel-small-debug-process-cpu.md) + - Kernel-Mode Memory Debugging + - [Memory Information Statistics](kernel/kernel-small-debug-memory-info.md) + - [Memory Leak Check](kernel/kernel-small-debug-memory-leak.md) + - [Memory Corruption Check](kernel/kernel-small-debug-memory-corrupt.md) + - [User-Mode Memory Debugging](kernel/kernel-small-debug-user.md) + - Other Kernel Debugging Methods + - [Dying Gasp](kernel/kernel-small-debug-trace-other-lastwords.md) + - [Common Fault Locating Methods](kernel/kernel-small-debug-trace-other-faqs.md) + - Appendix + - Basic Data Structure + - [Doubly Linked List](kernel/kernel-small-apx-dll.md) + - [Bitwise Operation](kernel/kernel-small-apx-bitwise.md) + - [Standard Library](kernel/kernel-small-apx-library.md) + - [Kernel Coding Specification](kernel/kernel-mini-appx-code.md) + - Standard-System Kernel (Linux) + - [Linux Kernel Overview](kernel/kernel-standard-overview.md) + - [Applying Patches on Development Boards](kernel/kernel-standard-patch.md) + - [Compiling and Building the Linux Kernel](kernel/kernel-standard-build.md) + - Enhanced Kernel Features + - [Enhanced SWAP](kernel/kernel-standard-mm-eswap.md) + - [New IP Kernel Protocol Stack](kernel/kernel-standard-newip.md) + - Task Scheduling + - [Related Thread Group](kernel/kernel-standard-sched-rtg.md) + - [Lightweight CPU Isolation](kernel/kernel-standard-sched-cpuisolation.md) + - Drivers + - [Driver Overview](driver/driver-overview-foundation.md) + - HDF + - [HDF Overview](driver/driver-hdf-overview.md) + - [Driver Development](driver/driver-hdf-development.md) + - [Driver Service Management](driver/driver-hdf-servicemanage.md) + - [Driver Message Mechanism Management](driver/driver-hdf-message-management.md) + - [Driver Configuration Management](driver/driver-hdf-manage.md) + - [HDF Development Example](driver/driver-hdf-sample.md) + - Platform Driver Development + - [ADC](driver/driver-platform-adc-develop.md) + - [DAC](driver/driver-platform-dac-develop.md) + - [GPIO](driver/driver-platform-gpio-develop.md) + - [HDMI](driver/driver-platform-hdmi-develop.md) + - [I2C](driver/driver-platform-i2c-develop.md) + - [I3C](driver/driver-platform-i3c-develop.md) + - [MIPI CSI](driver/driver-platform-mipicsi-develop.md) + - [MIPI DSI](driver/driver-platform-mipidsi-develop.md) + - [MMC](driver/driver-platform-mmc-develop.md) + - [PIN](driver/driver-platform-pin-develop.md) + - [PWM](driver/driver-platform-pwm-develop.md) + - [Regulator](driver/driver-platform-regulator-develop.md) + - [RTC](driver/driver-platform-rtc-develop.md) + - [SDIO](driver/driver-platform-sdio-develop.md) + - [SPI](driver/driver-platform-spi-develop.md) + - [UART](driver/driver-platform-uart-develop.md) + - [Watchdog](driver/driver-platform-watchdog-develop.md) + - Platform Driver Usage + - [ADC](driver/driver-platform-adc-des.md) + - [DAC](driver/driver-platform-dac-des.md) + - [GPIO](driver/driver-platform-gpio-des.md) + - [HDMI](driver/driver-platform-hdmi-des.md) + - [I2C](driver/driver-platform-i2c-des.md) + - [I3C](driver/driver-platform-i3c-des.md) + - [MIPI CSI](driver/driver-platform-mipicsi-des.md) + - [MIPI DSI](driver/driver-platform-mipidsi-des.md) + - [PIN](driver/driver-platform-pin-des.md) + - [PWM](driver/driver-platform-pwm-des.md) + - [Regulator](driver/driver-platform-regulator-des.md) + - [RTC](driver/driver-platform-rtc-des.md) + - [SDIO](driver/driver-platform-sdio-des.md) + - [SPI](driver/driver-platform-spi-des.md) + - [UART](driver/driver-platform-uart-des.md) + - [WatchDog](driver/driver-platform-watchdog-des.md) + - Peripheral Driver Usage + - [Audio](driver/driver-peripherals-audio-des.md) + - [Camera](driver/driver-peripherals-camera-des.md) + - [Codec](driver/driver-peripherals-codec-des.md) + - [Facial Authentication](driver/driver-peripherals-face_auth-des.md) + - [Fingerprint Authentication](driver/driver-peripherals-fingerprint_auth-des.md) + - [LCD](driver/driver-peripherals-lcd-des.md) + - [Light](driver/driver-peripherals-light-des.md) + - [Motion](driver/driver-peripherals-motion-des.md) + - [PIN Authentication](driver/driver-peripherals-pinauth-des.md) + - [Sensor](driver/driver-peripherals-sensor-des.md) + - [Touchscreen](driver/driver-peripherals-touch-des.md) + - [USB](driver/driver-peripherals-usb-des.md) + - [User Authentication](driver/driver-peripherals-user-auth-des.md) + - [Vibrator](driver/driver-peripherals-vibrator-des.md) + - [WLAN](driver/driver-peripherals-external-des.md) + - Compilation and Building + - [Compilation and Building Guide](subsystems/subsys-build-all.md) + - [Build System Coding Specifications and Best Practices](subsystems/subsys-build-gn-coding-style-and-best-practice.md) + - [Building the Kconfig Visual Configuration](subsystems/subsys-build-gn-kconfig-visual-config-guide.md) + - Related Operations + - [Building a Subsystem](subsystems/subsys-build-subsystem.md) + - [Building a Product](subsystems/subsys-build-product.md) + - [Building a Component](subsystems/subsys-build-component.md) + - [Building a Module](subsystems/subsys-build-module.md) + - [Building a Chipset Solution](subsystems/subsys-build-chip_solution.md) + - [Configuring Features](subsystems/subsys-build-feature.md) + - [Configuring System Capabilities](subsystems/subsys-build-syscap.md) + - [Setting deps and external_deps](subsystems/subsys-build-reference.md) - [Information Collected by the Open Source Software Notice](subsystems/subsys-build-reference.md) - - [Parameters for Accelerating Local Build](subsystems/subsys-build-reference.md) + - [Configuring Parameters for Accelerating Local Build](subsystems/subsys-build-reference.md) - [Viewing Ninja Build Information](subsystems/subsys-build-reference.md) - [HAP Build Guide](subsystems/subsys-build-gn-hap-compilation-guide.md) - [FAQs](subsystems/subsys-build-FAQ.md) - - [Distributed Remote Startup](subsystems/subsys-remote-start.md) - - Graphics - - [Graphics Overview](subsystems/subsys-graphics-overview.md) - - [Container Component Development](subsystems/subsys-graphics-container-guide.md) - - [Development of Layout Container Components](subsystems/subsys-graphics-layout-guide.md) - - [Common Component Development](subsystems/subsys-graphics-common-guide.md) - - [Animator Development](subsystems/subsys-graphics-animation-guide.md) - - Multimedia - - Camera - - [Camera Overview](subsystems/subsys-multimedia-camera-overview.md) - - [Photographing Development ](subsystems/subsys-multimedia-camera-photo-guide.md) - - [Video Recording Development ](subsystems/subsys-multimedia-camera-record-guide.md) - - [Previewing Development ](subsystems/subsys-multimedia-camera-preview-guide.md) - - Audio and Video - - [Audio/Video Overview](subsystems/subsys-multimedia-video-overview.md) - - [Audio/Video Playback Development](subsystems/subsys-multimedia-video-play-guide.md) - - [Audio/Video Recording Development](subsystems/subsys-multimedia-video-record-guide.md) - - Utils - - [Utils Overview](subsystems/subsys-utils-overview.md) - - [Utils Development](subsystems/subsys-utils-guide.md) - - [Utils FAQ](subsystems/subsys-utils-faqs.md) - - [AI Framework Development](subsystems/subsys-ai-aiframework-devguide.md) - - Data Management - - RDB - - [RDB Overview](subsystems/subsys-data-relational-database-overview.md) - - [RDB Development](subsystems/subsys-data-relational-database-guide.md) - - Lightweight Data Store - - [Lightweight Data Store Overview](subsystems/subsys-data-storage-overview.md) - - [Lightweight Data Store Development](subsystems/subsys-data-storage-guide.md) - - Sensor - - [Sensor Overview](subsystems/subsys-sensor-overview.md) - - [Sensor Usage Guidelines](subsystems/subsys-sensor-guide.md) - - [Sensor Usage Example](subsystems/subsys-sensor-demo.md) - - USB - - [USB Overview](subsystems/subsys-usbservice-overview.md) - - [USB Usage Guidelines](subsystems/subsys-usbservice-guide.md) - - [USB Usage Example](subsystems/subsys-usbservice-demo.md) - - Application Framework - - [Application Framework Overview](subsystems/subsys-application-framework-overview.md) - - [Setting Up a Development Environment](subsystems/subsys-application-framework-envbuild.md) - - [Development Guidelines](subsystems/subsys-application-framework-guide.md) - - [Development Example](subsystems/subsys-application-framework-demo.md) - - [OTA Update](subsystems/subsys-ota-guide.md) - - Telephony - - [Telephony Overview](subsystems/subsys-tel-overview.md) - - [Telephony Development](subsystems/subsys-tel-guide.md) - - Security - - [Security Overview](subsystems/subsys-security-overview.md) - - [Development on Application Signature Verification](subsystems/subsys-security-sigverify.md) - - [Development on Application Permission Management](subsystems/subsys-security-rightmanagement.md) - - [Development on IPC Authentication](subsystems/subsys-security-communicationverify.md) - - [Development on Device Security Level Management](subsystems/subsys-security-devicesecuritylevel.md) - - [Development on HUKS](subsystems/subsys-security-huks-guide.md) - - Startup - - [Startup](subsystems/subsys-boot-overview.md) - - init Module - - [init Configuration File](subsystems/subsys-boot-init-cfg.md) - - [Job Management](subsystems/subsys-boot-init-jobs.md) - - [Service Management](subsystems/subsys-boot-init-service.md) - - [Parameter Management](subsystems/subsys-boot-init-sysparam.md) - - [Sandbox Management](subsystems/subsys-boot-init-sandbox.md) - - [Plug-in Management](subsystems/subsys-boot-init-plugin.md) - - [appspawn Module](subsystems/subsys-boot-appspawn.md) - - [bootstrap Module](subsystems/subsys-boot-bootstrap.md) - - [FAQs](subsystems/subsys-boot-faqs.md) - - [Reference](subsystems/subsys-boot-ref.md) -- DFX - - [DFX](subsystems/subsys-dfx-overview.md) - - [HiLog Development](subsystems/subsys-dfx-hilog-rich.md) - - [HiLog\_Lite Development](subsystems/subsys-dfx-hilog-lite.md) - - [HiTraceChain Development](subsystems/subsys-dfx-hitracechain.md) - - [HiCollie Development](subsystems/subsys-dfx-hicollie.md) - - HiSysEvent Development - - [HiSysEvent Logging Configuration](subsystems/subsys-dfx-hisysevent-logging-config.md) - - [HiSysEvent Logging](subsystems/subsys-dfx-hisysevent-logging.md) - - [HiSysEvent Listening](subsystems/subsys-dfx-hisysevent-listening.md) - - [HiSysEvent Query](subsystems/subsys-dfx-hisysevent-query.md) - - [HiSysEvent Tool Usage](subsystems/subsys-dfx-hisysevent-tool.md) - - [HiDumper Development](subsystems/subsys-dfx-hidumper.md) - - [HiChecker Development](subsystems/subsys-dfx-hichecker.md) - - [FaultLogger Development](subsystems/subsys-dfx-faultlogger.md) - - [Hiview Development](subsystems/subsys-dfx-hiview.md) + - [Distributed Remote Startup](subsystems/subsys-remote-start.md) + - Graphics + - [Graphics Overview](subsystems/subsys-graphics-overview.md) + - [Container Component Development](subsystems/subsys-graphics-container-guide.md) + - [Development of Layout Container Components](subsystems/subsys-graphics-layout-guide.md) + - [Common Component Development](subsystems/subsys-graphics-common-guide.md) + - [Animator Development](subsystems/subsys-graphics-animation-guide.md) + - Multimedia + - Camera + - [Camera Overview](subsystems/subsys-multimedia-camera-overview.md) + - [Photographing Development](subsystems/subsys-multimedia-camera-photo-guide.md) + - [Video Recording Development](subsystems/subsys-multimedia-camera-record-guide.md) + - [Previewing Development](subsystems/subsys-multimedia-camera-preview-guide.md) + - Audio/Video + - [Audio/Video Overview](subsystems/subsys-multimedia-video-overview.md) + - [Audio/Video Playback Development](subsystems/subsys-multimedia-video-play-guide.md) + - [Audio/Video Recording Development](subsystems/subsys-multimedia-video-record-guide.md) + - Utils + - [Utils Overview](subsystems/subsys-utils-overview.md) + - [Utils Development](subsystems/subsys-utils-guide.md) + - [Utils FAQ](subsystems/subsys-utils-faqs.md) + - [AI Framework Development](subsystems/subsys-ai-aiframework-devguide.md) + - Data Management + - RDB + - [RDB Overview](subsystems/subsys-data-relational-database-overview.md) + - [RDB Development](subsystems/subsys-data-relational-database-guide.md) + - Lightweight Data Store + - [Lightweight Data Store Overview](subsystems/subsys-data-storage-overview.md) + - [Lightweight Data Store Development](subsystems/subsys-data-storage-guide.md) + - Sensor + - [Sensor Overview](subsystems/subsys-sensor-overview.md) + - [Sensor Usage Guidelines](subsystems/subsys-sensor-guide.md) + - [Sensor Usage Example](subsystems/subsys-sensor-demo.md) + - USB + - [USB Overview](subsystems/subsys-usbservice-overview.md) + - [USB Usage Guidelines](subsystems/subsys-usbservice-guide.md) + - [USB Usage Example](subsystems/subsys-usbservice-demo.md) + - Application Framework + - [Overview](subsystems/subsys-application-framework-overview.md) + - [Setting Up a Development Environment](subsystems/subsys-application-framework-envbuild.md) + - [Development Guidelines](subsystems/subsys-application-framework-guide.md) + - [Development Example](subsystems/subsys-application-framework-demo.md) + - [OTA Update](subsystems/subsys-ota-guide.md) + - Telephony + - [Telephony Overview](subsystems/subsys-tel-overview.md) + - [Telephony Development](subsystems/subsys-tel-guide.md) + - Security + - [Overview](subsystems/subsys-security-overview.md) + - [Development on Application Signature Verification](subsystems/subsys-security-sigverify.md) + - [Development on Application Permission Management](subsystems/subsys-security-rightmanagement.md) + - [Development on IPC Authentication](subsystems/subsys-security-communicationverify.md) + - [Development on Device Security Level Management](subsystems/subsys-security-devicesecuritylevel.md) + - [Development on HUKS](subsystems/subsys-security-huks-guide.md) + - [Application Privilege Configuration Guide](subsystems/subsys-app-privilege-config-guide.md) + - [Preset Application Configuration Guide](subsystems/subsys-preinstall-app-config-guide.md) + - Startup + - [Startup](subsystems/subsys-boot-overview.md) + - init Module + - [init Configuration File](subsystems/subsys-boot-init-cfg.md) + - [Job Management](subsystems/subsys-boot-init-jobs.md) + - [Service Management](subsystems/subsys-boot-init-service.md) + - [Parameter Management](subsystems/subsys-boot-init-sysparam.md) + - [Sandbox Management](subsystems/subsys-boot-init-sandbox.md) + - [Plug-in Management](subsystems/subsys-boot-init-plugin.md) + - [appspawn Module](subsystems/subsys-boot-appspawn.md) + - [bootstrap Module](subsystems/subsys-boot-bootstrap.md) + - [FAQs](subsystems/subsys-boot-faqs.md) + - [Reference](subsystems/subsys-boot-ref.md) + - DFX + - [DFX Overview](subsystems/subsys-dfx-overview.md) + - [HiLog Development](subsystems/subsys-dfx-hilog-rich.md) + - [HiLog\_Lite Development](subsystems/subsys-dfx-hilog-lite.md) + - [HiTraceChain Development](subsystems/subsys-dfx-hitracechain.md) + - [HiCollie Development](subsystems/subsys-dfx-hicollie.md) + - HiSysEvent Development + - [HiSysEvent Overview](subsystems/subsys-dfx-hisysevent-overview.md) + - [HiSysEvent Logging Configuration](subsystems/subsys-dfx-hisysevent-logging-config.md) + - [HiSysEvent Logging](subsystems/subsys-dfx-hisysevent-logging.md) + - [HiSysEvent Listening](subsystems/subsys-dfx-hisysevent-listening.md) + - [HiSysEvent Query](subsystems/subsys-dfx-hisysevent-query.md) + - [HiSysEvent Tool Usage](subsystems/subsys-dfx-hisysevent-tool.md) + - [HiDumper Development](subsystems/subsys-dfx-hidumper.md) + - [HiChecker Development](subsystems/subsys-dfx-hichecker.md) + - [FaultLogger Development](subsystems/subsys-dfx-faultlogger.md) + - [Hiview Development](subsystems/subsys-dfx-hiview.md) - Featured Topics - HPM Part @@ -622,17 +492,18 @@ - Debugging - - [Test Case Development](subsystems/subsys-testguide-test.md) - - Debugging Tools + - R&D Tools - [bytrace](subsystems/subsys-toolchain-bytrace-guide.md) - [hdc\_std](subsystems/subsys-toolchain-hdc-guide.md) - [hiperf](subsystems/subsys-toolchain-hiperf.md) -- [XTS Certification](subsystems/subsys-xts-guide.md) - Tools + + - [Tool Overview](get-code/gettools-overview.md) - [Docker Environment](get-code/gettools-acquire.md) - [IDE](get-code/gettools-ide.md) - Hands-On Tutorials - - [Codelabs](https://gitee.com/openharmony/codelabs/blob/master/README.md) + + - [Codelabs](https://gitee.com/openharmony/codelabs/blob/master/README.md) - References - FAQs - [FAQs Overview](faqs/faqs-overview.md) @@ -642,8 +513,6 @@ - [Kernel](faqs/faqs-kernel.md) - [Porting](faqs/faqs-porting.md) - [Startup](faqs/faqs-startup.md) - - [System Applications](faqs/faqs-system-applications.md) - - - - + - [System Applications](faqs/faqs-system-applications.md) + + -- GitLab