diff --git a/en/application-dev/js-reference/video.md b/en/application-dev/js-reference/video.md new file mode 100644 index 0000000000000000000000000000000000000000..67bfc186ea451def920545953a0192ea5a2eb0a5 --- /dev/null +++ b/en/application-dev/js-reference/video.md @@ -0,0 +1,210 @@ +# video + +- [Child Components](#zh-cn_topic_0000001058670744_section9288143101012) +- [Attributes](#zh-cn_topic_0000001058670744_section2907183951110) +- [Events](#zh-cn_topic_0000001058670744_section3892191911214) +- [Methods](#zh-cn_topic_0000001058670744_section45171131134215) +- [Example](#zh-cn_topic_0000001058670746_section16867208402) + +The <video> component provides a video player. + +## Child Components + +Not supported. + +## Attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Default Value

+

Mandatory

+

Description

+

src

+

string

+

-

+

No

+

Path of the video to play.

+

muted

+

boolean

+

false

+

No

+

Whether the video is muted.

+

autoplay

+

boolean

+

false

+

No

+

Whether the video is automatically played.

+

controls

+

boolean

+

true

+

No

+

Whether to display the video playback control bar. The value **false** means not to display the control bar, and **true** means that the display of the control bar is controlled by the system. The default value is **true**.

+
+ +## Events + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Parameter

+

Description

+

start

+

-

+

Triggered when video playback starts.

+

pause

+

-

+

Triggered when video playback is paused.

+

finish

+

-

+

Triggered when video playback is finished.

+

error

+

-

+

Triggered when video playback fails.

+

seeking

+

{ currenttime: value(s) }

+

Time reported when the seek bar is being manipulated, in seconds.

+

seeked

+

{ currenttime: value(s) }

+

Time reported when the seek operation completes, in seconds.

+

timeupdate

+

{ currenttime: value(s) }

+

Current video playback time (in seconds) reported when the playback progress changes. This time is reported every 250 ms.

+
+ +## Methods + + + + + + + + + + + + + + + + + + + + +

Name

+

Parameter

+

Description

+

start

+

-

+

Starts video playback.

+

pause

+

-

+

Pauses video playback.

+

setCurrentTime

+

{ currenttime: value(s) }

+

Sets the seek position of the video.

+
+ +## Example + +``` + +
+ +
+``` + +``` +/* xxx.js */ +export default { + data: { + event:'', + seekingtime:'', + timeupdatetime:'', + seekedtime:'', + isStart: true, + }, + startCallback:function(){this.event = 'Video playback starts.';}, + pauseCallback:function(){this.event = 'Video playback is paused.';}, + finishCallback:function(){this.event = 'Video playback is finished.';}, + errorCallback:function(){this.event = 'Video playback fails.';}, + seekingCallback:function(e){ this.seekingtime = e.currenttime; }, + timeupdateCallback:function(e){ this.timeupdatetime = e.currenttime;}, + change_start_pause: function() { + if(this.isStart) { + this.$element('videoId').pause(); + this.isStart = false; + } else { + this.$element('videoId').start(); + this.isStart = true; + } + } +} +``` diff --git a/en/device-dev/porting/figure/hdf_wifi.png b/en/device-dev/porting/figure/hdf_wifi.png index 4a0441de4621bd558383ba1323d21c793bcf192a..9a4ca253cc8fc1e564d4e5e61705aa66ea5199ae 100644 Binary files a/en/device-dev/porting/figure/hdf_wifi.png and b/en/device-dev/porting/figure/hdf_wifi.png differ diff --git a/en/device-dev/porting/standard-system-porting-guide.md b/en/device-dev/porting/standard-system-porting-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..dc1b62f8b01096517c4b44c83ba89b86921599cb --- /dev/null +++ b/en/device-dev/porting/standard-system-porting-guide.md @@ -0,0 +1,377 @@ +# Standard System Porting Guide + + + + + +- [Defining a Development Board](#Defining-a-Development-Board) + - [1. Defining an SoC](#1-Defining-an-SoC) + - [2. Defining a Product](#2-Defining-a-Product) + - [3. Verifying the Porting](#3-Verifying-the-Porting) +- [Porting the Kernel](#Porting-the-Kernel) + - [1. Adding a Kernel-built Subsystem to the SoC](#1-Adding-a-Kernel-built-Subsystem-to-the-SoC) + - [2. Building the Kernel](#2-Building-the-Kernel) + - [3. Verifying the Porting](#3-Verifying-the-Porting-1) +- [Porting the HDF Driver](#Porting-the-HDF-Driver) + - [1. LCD](#1-lcd) + - [2. Touchscreen](#2-Touchscreen) + - [3. WLAN](#3-wlan) + + + +This document describes the general process for porting a development board, rather than the porting process specific to a System on Chip (SoC). In the future, the community will provide more development board porting examples for your reference. + +## Defining a Development Board + +This document uses the process of porting a development board named **MyProduct** as an example. This development board is provided by **MyProductVendor** and uses the SoC **MySOC** produced by **MySoCVendor**. + +### 1. Defining an SoC + +Create a JSON file named after the SoC name in the **//productdefine/common/device** directory and specify the CPU architecture. + +For example, to port **MySOC**, which uses a 32-bit ARM kernel, configure the file as follows: + +`//productdefine/common/device/MySOC.json` +```json +{ + "target_os": "ohos", + "target_cpu": "arm" +} +``` +Currently, **target_cpu** can be set to **arm** only. In the future, you can set the value depending on the CPU architecture, such as **arm64**, **riscv**, or **x86**. + +### 2. Defining a Product + +Create a JSON file named after the product name in the **//productdefine/common/products** directory. This file is used to describe the SoC used by the product and the required subsystems. +Configure the file as follows: +`//productdefine/common/products/MyProduct.json` +```json +{ + "product_name": "MyProduct", + "product_company" : "MyProductVendor", + "product_device": "MySOC", + "version": "2.0", + "type": "standard", + "parts":{ + "ace:ace_engine_standard":{}, + "ace:napi":{}, + ... + "xts:phone_tests":{} + } +} + +``` +The main configurations are as follows: + +1. **product_device**: SoC used by the product. +2. **type**: system level. In this example, set it to **standard**. +3. **parts**: subsystems to enable. A subsystem can be treated as an independently built functional block. + +You can find available subsystems in **//build/subsystem_config.json**. You can also customize subsystems. + +You are advised to copy the configuration file of Hi3516D V300 and delete the **hisilicon_products** subsystem, which is used to compile the kernel for Hi3516D V300. + +### 3. Verifying the Porting + +Run the following command to start the build of your product: + +`./build.sh --product-name MyProduct ` + +After the build is complete, you can view the built OpenHarmony image file in the following directory: + +`//out/ohos-arm-release/packages/phone/images` + +## Porting the Kernel + +Now, you need to port the Linux kernel to enable it to run successfully. + +### 1. Adding a Kernel-built Subsystem to the SoC + +Add the following subsystem configuration to the **//build/subsystem_config.json** file: + +```json + "MySOCVendor_products": { + "project": "hmf/MySOCVendor_products", + "path": "device/MySOCVendor/MySOC/build", + "name": "MySOCVendor_products", + "dir": "device/MySOCVendor" + }, +``` + +Then, open the configuration file **//productdefine/common/products/MyProduct.json**, which is used to define the product, and add the new subsystem to the product. + +### 2. Building the Kernel + +The path for building the subsystem is defined when you define the subsystem in the previous step. The path is **//device/MySOCVendor/MySOC/build**. Now, you need to create a build script in this path to instruct the build system to build the kernel. + +Currently, the OpenHarmony source code provides the Linux kernel 4.19, which is archived in **//kernel/linux-4.19**. You are advised to use this kernel. However, if the SoC vendor does not provide the kernel of this version, use that provided by the vendor. +You are advised to use patches to modify or extend the SoC kernel. + +The recommended directory structure is as follows: +``` +├── build +│   ├── kernel +│   │ ├── linux +│   │ ├──standard_patch_for_4_19.patch +│   ├── BUILD.gn +│   ├── ohos.build +``` +The **BUILD.gn** file is the only entry for building the subsystem. + +The expected build result is as follows: + +| File| Description| +|------|------| +|$root_build_dir/packages/phone/images/uImage| Kernel image| +|$root_build_dir/packages/phone/images/uboot | Bootloader image| + +### 3. Verifying the Porting + +Now start build, and check whether the kernel image is generated as expected. + +## Porting the HDF Driver + +### 1. LCD +This section describes how to port a Liquid Crystal Display (LCD) driver. The hardware driver framework (HDF) designs a driver model for the LCD. To support an LCD, you must compile a driver, generate a model instance in the driver, and register the instance. + +The LCD drivers are stored in the **//drivers/framework/model/display/driver/panel** directory. + +- Create a panel driver. + +In the **Init** method of the driver, call **RegisterPanel** to register the model instance. +```C +int32_t XXXInit(struct HdfDeviceObject *object) +{ + struct PanelData *panel = CreateYourPanel(); + + // Register the model instance. + if (RegisterPanel(panel) != HDF_SUCCESS) { + HDF_LOGE("%s: RegisterPanel failed", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_xxxxDevEntry = { + .moduleVersion = 1, + .moduleName = "LCD_XXXX", + .Init = XXXInit, +}; + +HDF_INIT(g_xxxxDevEntry); +``` + +- Configure and load the panel driver. +All device information about the product is defined in the **//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs** file. Modify the file by adding configurations for the device named **device_lcd** to the host named **display**. +Note: The value of **moduleName** must be the same as that in the panel driver. + +```hcs +root { + ... + display :: host { + device_lcd :: device { + deviceN :: deviceNode { + policy = 0; + priority = 100; + preload = 2; + moduleName = "LCD_XXXX"; + } + } + } +} +``` + +For details about driver development, see [LCD](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/LCD.md). + +### 2. Touchscreen +This section describes how to port a touchscreen driver. The touchscreen driver is stored in the **//drivers/framework/model/input/driver/touchscreen** directory. To port a touchscreen driver, register a **ChipDevice** model instance. + +- Create a touchscreen driver. + +Create the **touch_ic_name.c** file in the directory. Replace **ic_name** with the name of your chip. The file template is as follows: + +```C +#include "hdf_touch.h" + +static int32_t HdfXXXXChipInit(struct HdfDeviceObject *device) +{ + ChipDevice *tpImpl = CreateXXXXTpImpl(); + if(RegisterChipDevice(tpImpl) != HDF_SUCCESS) { + ReleaseXXXXTpImpl(tpImpl); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_touchXXXXChipEntry = { + .moduleVersion = 1, + .moduleName = "HDF_TOUCH_XXXX", + .Init = HdfXXXXChipInit, +}; + +HDF_INIT(g_touchXXXXChipEntry); +``` + +Implement the following interfaces in **ChipDevice**: +| Interface| Description| +|------|------| +|int32_t (*Init)(ChipDevice *device)| Initializes a touchscreen.| +|int32_t (*Detect)(ChipDevice *device)| Detects a touchscreen.| +|int32_t (*Suspend)(ChipDevice *device)| Suspends a touchscreen.| +|int32_t (*Resume)(ChipDevice *device)| Resumes a touchscreen.| +|int32_t (*DataHandle)(ChipDevice *device)| Reads data from a touchscreen and writes the touch point data to **device > driver > frameData**.| +|int32_t (*UpdateFirmware)(ChipDevice *device)| Upgrades the firmware.| + +- Configure the product and load the driver. + +All device information about the product is defined in the **//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs** file. Modify the file by adding configurations for the device named **device_touch_chip** to the host named **input**. +Note: The value of **moduleName** must be the same as that in the touchscreen driver. + +```hcs + deviceN :: deviceNode { + policy = 0; + priority = 130; + preload = 0; + permission = 0660; + moduleName = "HDF_TOUCH_XXXX"; + deviceMatchAttr = "touch_XXXX_configs"; + } +``` + +For details about driver development, see [TOUCHSCREEN](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/TOUCHSCREEN.md). + + +### 3. WLAN + +The WLAN driver is divided into two parts. One of the parts manages WLAN devices, and the other part manages WLAN traffic. **HDF WLAN** provides abstraction for the two parts. Currently, only the WLAN with the SDIO interface is supported. + +WLAN structure + +To support a chip, implement a **ChipDriver** for it. The major task is to implement the following interfaces provided by **HDF_WLAN_CORE** and **NetDevice**. + +| Interface| Header File| Description| +|------|------|------| +| HdfChipDriverFactory| `//drivers/framework/include/wifi/hdf_wlan_chipdriver_manager.h`| Factory of the **ChipDriver**, which is used to support multiple WLAN interfaces of a chip.| +| HdfChipDriver | `//drivers/framework/include/wifi/wifi_module.h`| Manages a specific WLAN interface. Each WLAN interface corresponds to an **HdfChipDriver**.| +|NetDeviceInterFace| `//drivers/framework/include/wifi/net_device.h`| Communicates with the protocol stack, such as sending data and setting the status of network interfaces.| + +To port a WLAN driver, perform the following steps: + +1. Create an HDF driver. + +You are advised to place the code file in the **//device/MySoCVendor/peripheral/wifi/chip_name/** directory. +The file template is as follows: + +```C +static int32_t HdfWlanHisiChipDriverInit(struct HdfDeviceObject *device) { + static struct HdfChipDriverFactory factory = CreateChipDriverFactory(); + struct HdfChipDriverManager *driverMgr = HdfWlanGetChipDriverMgr(); + if (driverMgr->RegChipDriver(&factory) != HDF_SUCCESS) { + HDF_LOGE("%s fail: driverMgr is NULL!", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_hdfXXXChipEntry = { + .moduleVersion = 1, + .Init = HdfWlanXXXChipDriverInit, + .Release = HdfWlanXXXChipRelease, + .moduleName = "HDF_WIFI_CHIP_XXX" +}; + +HDF_INIT(g_hdfXXXChipEntry); +``` + +Create an **HdfChipDriverFactory** in the **CreateChipDriverFactory**. The interfaces are as follows: +| Interface| Description| +|------|------| +|const char *driverName| Indicates the driver name.| +|int32_t (*InitChip)(struct HdfWlanDevice *device)| Initializes a chip.| +|int32_t (*DeinitChip)(struct HdfWlanDevice *device)| Deinitializes a chip.| +|void (*ReleaseFactory)(struct HdfChipDriverFactory *factory)| Releases the **HdfChipDriverFactory** object.| +|struct HdfChipDriver *(*Build)(struct HdfWlanDevice *device, uint8_t ifIndex)|Creates an **HdfChipDriver**. In the input parameters, **device** indicates the device information, and **ifIndex** indicates the sequence number of this interface in the chip.| +|void (*Release)(struct HdfChipDriver *chipDriver)| Releases the **HdfChipDriver**. +|uint8_t (*GetMaxIFCount)(struct HdfChipDriverFactory *factory)| Obtains the maximum number of interfaces supported by the current chip.| + +Implement the following interfaces in the **HdfChipDriver**. + +|Interface| Description| +|------|------| +|int32_t (*init)(struct HdfChipDriver *chipDriver, NetDevice *netDev)| Initializes the current network interface. The **NetDeviceInterFace** needs to be provided for the **netDev**.| +|int32_t (*deinit)(struct HdfChipDriver *chipDriver, NetDevice *netDev)| Deinitializes the current network interface.| +|struct HdfMac80211BaseOps *ops| Provides the WLAN basic capability interface set.| +|struct HdfMac80211STAOps *staOps| Provides the interface set required for supporting the standalone (STA) mode.| +|struct HdfMac80211APOps *apOps| Provides the interface set required for supporting the access point (AP) mode.| + + + +2. Compile the configuration file to describe the devices supported by the driver. + +Create the chip configuration file **//vendor/MyProductVendor/MyProduct/config/wifi/wlan_chip_chip_name.hcs** in the product configuration directory. +Replace **MyProductVendor**, **MyProduct**, and **chip_name** in the path with the actual names. +The sample code is as follows: +```hcs +root { + wlan_config { + chip_name :& chipList { + chip_name :: chipInst { + match_attr = "hdf_wlan_chips_chip_name"; /* Configure the matching attribute, which is used to provide the configuration root of the driver.*/ + driverName = "driverName"; /* The value must be the same as that of driverName in HdfChipDriverFactory.*/ + sdio { + vendorId = 0x0296; + deviceId = [0x5347]; + } + } + } + } +} +``` + +3. Edit the configuration file and load the driver. + +All device information about the product is defined in the **//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs** file. Modify the file by adding configurations for the device named **device_wlan_chips** to the host named **network**. +Note: The value of **moduleName** must be the same as that in the touchscreen driver. +The sample code is as follows: + +```hcs + deviceN :: deviceNode { + policy = 0; + preload = 2; + moduleName = "HDF_WLAN_CHIPS"; + deviceMatchAttr = "hdf_wlan_chips_chip_name"; + serviceName = "driverName"; + } +``` + +4. Build the driver. + +- Create a kernel configuration menu. +Create a **Kconfig** file in the **//device/MySoCVendor/peripheral** directory. The file template is as follows: +``` +config DRIVERS_WLAN_XXX + bool "Enable XXX WLAN Host driver" + default n + depends on DRIVERS_HDF_WIFI + help + Answer Y to enable XXX Host driver. Support chip xxx +``` + +Add the following sample code to the end of the **//drivers/adapter/khdf/linux/model/network/wifi/Kconfig** file to add the configuration menu to the kernel: +``` +source "../../../../../device/MySoCVendor/peripheral/Kconfig" +``` + +- Create a build script. + +Add the following configuration to the end of the **//drivers/adapter/khdf/linux/model/network/wifi/Makefile** file: + +``` +HDF_DEVICE_ROOT := $(HDF_DIR_PREFIX)/../device +obj-$(CONFIG_DRIVERS_WLAN_XXX) += $(HDF_DEVICE_ROOT)/MySoCVendor/peripheral/build/standard/ +``` + +When **DRIVERS_WLAN_XXX** is enabled in the kernel, **makefile** in **//device/MySoCVendor/peripheral/build/standard/** is called. + + +For more details, see [WLAN Development](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/WLAN.md). diff --git a/zh-cn/contribute/FAQ.md b/zh-cn/contribute/FAQ.md index a6bf4efc848804b734901d919de63d96caf7227a..3ed24b895ea578cfd1b07816b5e30bb6a2d93ee2 100755 --- a/zh-cn/contribute/FAQ.md +++ b/zh-cn/contribute/FAQ.md @@ -2,7 +2,7 @@ [多个代码仓存在编译依赖时如何同时发起构建](#section169732563435) -[ `Sign-off-by`相关操作](#section-sign-off) +[ `Signed-off-by`相关操作](#section-signed-off) [DCO校验异常处理](#section-dco) @@ -21,7 +21,7 @@ OS\(操作系统\)开发时,经常会遇到多个代码仓的修改具有编 3. 触发构建\(详见触发构建的操作帮助\)后,构建中心会识别关联了同一Issue的PR,同时下载构建,并在代码审核通过后,同时进行合并入代码库。 -## `Sign-off-by`相关操作 +## `Signed-off-by`相关操作 ### 如何在Commit中添加signoff记录 @@ -61,7 +61,7 @@ OS\(操作系统\)开发时,经常会遇到多个代码仓的修改具有编 2. Commits 中未包含 Signed-off-by信息,例如提示: ``` - 当前检测到如下commit未包含Sign-off-by信息: + 当前检测到如下commit未包含Signed-off-by信息: •123123 @@ -70,7 +70,7 @@ OS\(操作系统\)开发时,经常会遇到多个代码仓的修改具有编 **解决办法**: - 参考`Sign-off-by`相关操作,添加Sign-off-by信息。 + 参考`Signed-off-by`相关操作,添加Signed-off-by信息。格式为:Signed-off-by: user.name 在PR的评论框输入`check dco`后,单击”评论”,系统将再次进行DCO校验。