From bfa955f10ce6abee90f9f807ce2cb72e6656f5ac Mon Sep 17 00:00:00 2001 From: annie_wangli Date: Mon, 14 Mar 2022 16:39:07 +0800 Subject: [PATCH] update docs Signed-off-by: annie_wangli --- .../driver/driver-peripherals-light-des.md | 426 ++++++++++++++++++ .../driver/figures/light_driver_model.png | Bin 0 -> 9493 bytes .../driver/figures/light_working.png | Bin 0 -> 33408 bytes 3 files changed, 426 insertions(+) create mode 100644 en/device-dev/driver/driver-peripherals-light-des.md create mode 100644 en/device-dev/driver/figures/light_driver_model.png create mode 100644 en/device-dev/driver/figures/light_working.png diff --git a/en/device-dev/driver/driver-peripherals-light-des.md b/en/device-dev/driver/driver-peripherals-light-des.md new file mode 100644 index 00000000000..d6974409f6c --- /dev/null +++ b/en/device-dev/driver/driver-peripherals-light-des.md @@ -0,0 +1,426 @@ +# Light + + +## Overview + +### Light + +The light driver model provides APIs for the upper-layer light hardware service layer to control lights, including obtaining the light type, setting the lighting mode and blinking effect, and turning on or off a light. This model implements functionalities such as cross-OS migration and differentiated configurations based on the Hardware Driver Foundation (HDF) to achieve the goal of "one-time development and multi-system deployment" of the light driver. [Figure 1](#lightmodel) shows the light driver model. + +**Figure 1** Light driver model + +![Light driver model](figures/light_driver_model.png) + +### Working Principles + +[Figure 2](#lightworking) shows how the light driver works. + +**Figure 2** How light driver works + +![How light driver works](figures/light_working.png) + +The following uses the Hi3516D V300 development board powered by the standard system as an example to describe how the light driver works. + +1. The light driver reads the light device management configuration from **Light Host** in the **device_info.hcs** file. +2. The light driver reads the light data configuration from the **light_config.hcs** file. +3. The light driver parses information about the light device management configuration and associates with the corresponding device driver. +4. The client delivers the Light Stub control to the server. +5. The server invokes the Light Stub control. +6. The light abstract driver interface is started. + +## Development Guidelines + +### When to Use + +Light control is widely used in daily life. For example, a light is blinking when a mobile phone receives a short message or has low battery level, and a light changes its colors based on the device charging status. These actions are implemented by calling the APIs provided by the light driver model. + +### Available APIs + +[Table 1](#light_driver_apis) describes the APIs provided by the light driver model. + +**Table 1** APIs of the light driver model + +| API | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| int32_t (*GetLightInfo)(struct LightInfo **lightInfo, uint32_t *count) | Obtains information about all lights in the system. **lightInfo** indicates the pointer to the basic light information. **count** indicates the pointer to the number of lights.| +| int32_t (*TurnOnLight)(uint32_t type, struct LightEffect *effect) | Turns on available lights in the list based on the specified light type. **type** indicates the light type, and **effect** indicates the pointer to the effect.| +| int32_t (*TurnOffLight)(uint32_t type) | Turns off available lights in the light list based on the specified light type. | + +### How to Develop +1. Based on the HDF and the driver entry, complete the light abstract driver development (using the **Bind**, **Init**, **Release**, and **Dispatch** functions), resource configuration, and HCS parsing. Configure the light driver device information. +3. Parse the device attribute information and registers, and register them with the light device management module. +3. Call related APIs to obtain the light type, turn on and off lights, and create and delete the timer based on the blinking mode. + +### Development Example + +This example shows how to load and start the light driver based on the HDF driver model. For details about the working principles, see [HDF Driver Development Guide](driver-hdf-development.md). In this example, the communication interface mode of the light driver is GPIO. + +1. Initialize the light driver. + + - Call **HDF_INIT** to register the driver entry with the HDF. Generally, the HDF calls the **Bind** function and then the **Init** function to load the driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. + The light driver model uses HDF configuration source (HCS). For details about HCS fields, see [Configuration Management](https://gitee.com/openharmony/docs/blob/master/en/device-dev/driver/driver-hdf-manage.md). + The light driver entry is defined as follows: + + ```c + /* Register the light entry data structure object. */ + struct HdfDriverEntry g_lightDriverEntry = { + .moduleVersion = 1, // Light module version. + .moduleName = "HDF_LIGHT", // Light module name, which must be the same as the value of moduleName in the device_info.hcs file. + .Bind = BindLightDriver, // BInd the light driver. + .Init = InitLightDriver, // Initialize the light driver. + .Release = ReleaseLightDriver, // Release the light resources. + }; + // Call HDF_INIT to register the driver entry with the HDF. The HDF calls the Bind function and then the Init function to load a driver. If Init fails to be called, the HDF calls Release to release driver resources and exit. */ + HDF_INIT(g_lightDriverEntry); + ``` + + - Develop the light abstract driver. Specifically, implement the **Bind**, **Init**, **Release**, and **Dispatch** functions. + + ```c + /* Dispatch the light driver. */ + static int32_t DispatchLight(struct HdfDeviceIoClient *client, + int32_t cmd, struct HdfSBuf *data, struct HdfSBuf *reply) + { + ..... + if (cmd == LIGHT_IO_CMD_GET_INFO_LIST) { + CHECK_LIGHT_NULL_PTR_RETURN_VALUE(reply, HDF_ERR_INVALID_PARAM); + return GetAllLightInfo(data, reply); + } + + CHECK_LIGHT_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + (void)OsalMutexLock(&drvData->mutex); + if (!HdfSbufReadInt32(data, &lightType)) { + HDF_LOGE("%s: sbuf read lightType failed", __func__); + (void)OsalMutexUnlock(&drvData->mutex); + return HDF_ERR_INVALID_PARAM; + } + ..... + ret = DispatchCmdHandle(lightType, data, reply); + (void)OsalMutexUnlock(&drvData->mutex); + return ret; + } + + /* Bind the external service provided by the light driver to the HDF. */ + int32_t BindLightDriver(struct HdfDeviceObject *device) + { + struct LightDriverData *drvData = NULL; + + CHECK_LIGHT_NULL_PTR_RETURN_VALUE(device, HDF_FAILURE); + /* Allocate resources for private interfaces. */ + drvData = (struct LightDriverData *)OsalMemCalloc(sizeof(*drvData)); + CHECK_LIGHT_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_MALLOC_FAIL); + /* Functions to be dispatched. */ + drvData->ioService.Dispatch = DispatchLight; + drvData->device = device; + device->service = &drvData->ioService; + g_lightDrvData = drvData; + return HDF_SUCCESS; + } + + /* Initialize the light driver. */ + int32_t InitLightDriver(struct HdfDeviceObject *device) + { + ..... + /* Initialize the workqueue. */ + if (HdfWorkQueueInit(&drvData->workQueue, LIGHT_WORK_QUEUE_NAME) != HDF_SUCCESS) { + HDF_LOGE("%s: init workQueue fail!", __func__); + return HDF_FAILURE; + } + /* Initialize work items. */ + if (HdfWorkInit(&drvData->work, LightWorkEntry, (void*)drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: init workQueue fail!", __func__); + return HDF_FAILURE; + } + /* Parse the HCS. */ + if (GetLightConfigData(device->property) != HDF_SUCCESS) { + HDF_LOGE("%s: get light config fail!", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; + } + + /* Release the resources allocated for driver initialization. */ + void ReleaseLightDriver(struct HdfDeviceObject *device) + { + ..... + /* Release the allocated resources. */ + for (i = LIGHT_TYPE_NONE; i < LIGHT_TYPE_BUTT; ++i) { + + if (drvData->info[i] != NULL) { + OsalMemFree(drvData->info[i]); + drvData->info[i] = NULL; + } + } + /* Destroy workqueue resources. */ + HdfWorkDestroy(&drvData->work); + HdfWorkQueueDestroy(&drvData->workQueue); + (void)OsalMutexDestroy(&drvData->mutex); + (void)OsalMemFree(drvData); + g_lightDrvData = NULL; + } + + ``` + + - The light device management module dispatches light device APIs in the system. During the system startup process, the HDF loads the device management driver from the HCS of the light host. + + ```hcs + /* Light device HCS */ + device_light :: device { + device0 :: deviceNode { + policy = 2; // Driver service dispatch policy (0: no service is provided; 1: services are dispatched to the kernel mode; 2: services are dispatched to both the kernel mode and user mode) + priority = 100; // Light driver startup priority. The value ranges from 0 to 200. A larger value indicates a lower priority. The value 100 is recommended. If the priorities are the same, the device loading sequence cannot be ensured. + preload = 0; // Field for specifying whether to load the driver. The value 0 means to load the driver, and 2 means the opposite. + permission = 0664; // Permission for the driver to create a device node. + moduleName = "HDF_LIGHT"; // Light driver name. The value of this field must be the same as that of moduleName in the HdfDriverEntry structure. + serviceName = "hdf_light"; // Service name of the driver, which must be unique. + deviceMatchAttr = "hdf_light_driver"; // Keyword for matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. + } + } + ``` + +2. Allocate resources and parse the HCS. + + - Parse the HCS. + + ```c + /* Allocate resources and parse the HCS. */ + static int32_t ParseLightInfo(const struct DeviceResourceNode *node) + { + ..... + /* Obtain the number of supported light types from the HCS. */ + drvData->lightNum = parser->GetElemNum(light, "lightType"); + .... + for (i = 0; i < drvData->lightNum; ++i) { + /* Obtains the light type information. */ + ret = parser->GetUint32ArrayElem(light, "lightType", i, &temp, 0); + CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "lightType"); + } + + for (i = 0; i < drvData->lightNum; ++i) { + ..... + /* Types are used as subscripts to create space. */ + drvData->info[temp] = (struct LightDeviceInfo *)OsalMemCalloc(sizeof(struct LightDeviceInfo)); + ..... + /* Fill in the light device information. */ + ret = parser->GetUint32(light, "busRNum", &drvData->info[temp]->busRNum, 0); + CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "busRNum"); + ret = parser->GetUint32(light, "busGNum", &drvData->info[temp]->busGNum, 0); + CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "busGNum"); + ret = parser->GetUint32(light, "busBNum", &drvData->info[temp]->busBNum, 0); + CHECK_LIGHT_PARSER_RESULT_RETURN_VALUE(ret, "busBNum"); + ..... + return HDF_SUCCESS; + + } + ``` + + - The light effect model uses the HCS. For details about HCS fields, see [Configuration Management](https://gitee.com/openharmony/docs/blob/master/en/device-dev/driver/driver-hdf-manage.md). + + ```hcs + /* Light data configuration template (light_config.hcs) */ + root { + lightConfig { + boardConfig { + match_attr = "hdf_light_driver"; + lightAttr { + light01 { + lightType = [1, 2]; // Light type + busRNum = 31; // GPIO pin in red + busGNum = 30; // GPIO pin in green + busBNum = 29; // GPIO pin in blue + lightBrightness = 0X80000000;// Red: bits 16-31, Green: bits 8-15, Blue : bits 0-7 + onTime = 50; // Light on time in a blinking period, in ms + offTime = 50; // Light off time in a blinking period, in ms + } + } + } + } + } + ``` + +3. Perform light control operations. + + ```c + /* Call GetAllLightInfo to obtain the light type. Call Enable to enable the blinking mode. + Call Disable to stop blinking. */ + static int32_t GetAllLightInfo(struct HdfSBuf *data, struct HdfSBuf *reply) + { + ..... + /* Obtain the number of light types. */ + if (!HdfSbufWriteUint32(reply, drvData->lightNum)) { + HDF_LOGE("%s: write sbuf failed", __func__); + return HDF_FAILURE; + } + for (i = 0; i < LIGHT_TYPE_BUTT; ++i) { + if (drvData->info[i] == NULL) { + continue; + } + lightInfo.lightType = i; + lightInfo.reserved = NULL; + /* Fill the light device information into the reply. */ + if (!HdfSbufWriteBuffer(reply, &lightInfo, sizeof(lightInfo))) { + HDF_LOGE("%s: write sbuf failed", __func__); + return HDF_FAILURE; + } + } + + return HDF_SUCCESS; + } + + /* Enable lights based on the specified light type and input parameters. */ + static int32_t Enable(uint32_t lightType, struct HdfSBuf *data, struct HdfSBuf *reply) + { + ..... + /* Set the light color based on the brightness value passed in. Red: bits 16–31, Green: bits 8–15, Blue: bits 0–7 */ + if ((drvData->info[lightType]->lightBrightness & LIGHT_MAKE_R_BIT) != 0) { + drvData->info[lightType]->busNum = drvData->info[lightType]->busRNum; + } else if ((drvData->info[lightType]->lightBrightness & LIGHT_MAKE_G_BIT) != 0) { + drvData->info[lightType]->busNum = drvData->info[lightType]->busGNum; + } else if ((drvData->info[lightType]->lightBrightness & LIGHT_MAKE_B_BIT) != 0) { + drvData->info[lightType]->busNum = drvData->info[lightType]->busBNum; + } + /* The light is steady on. */ + if (buf->flashEffect.flashMode == LIGHT_FLASH_NONE) { + + if (GpioWrite(drvData->info[lightType]->busNum, GPIO_VAL_HIGH) != HDF_SUCCESS) { + return HDF_FAILURE; + } + } + /* The light is blinking. */ + if (buf->flashEffect.flashMode == LIGHT_FLASH_TIMED) { + drvData->info[lightType]->lightState = LIGHT_STATE_START; + /* If the specified blinking duration is less than the minimum time period supported by the system, the time configured by the system (in HCS) is used. */ + drvData->info[lightType]->onTime = buf->flashEffect.onTime < drvData->info[lightType]->onTime ? + drvData->info[lightType]->onTime : buf->flashEffect.onTime; + drvData->info[lightType]->offTime = buf->flashEffect.offTime < drvData->info[lightType]->offTime ? + drvData->info[lightType]->offTime : buf->flashEffect.offTime; + /* Create a timer. */ + if (OsalTimerCreate(&drvData->timer, drvData->info[lightType]->onTime, + LightTimerEntry, (uintptr_t)lightType) != HDF_SUCCESS) { + HDF_LOGE("%s: create light timer fail!", __func__); + return HDF_FAILURE; + } + /* Start the periodic timer. */ + if (OsalTimerStartLoop(&drvData->timer) != HDF_SUCCESS) { + HDF_LOGE("%s: start light timer fail!", __func__); + return HDF_FAILURE; + } + } + return HDF_SUCCESS; + } + + /* Turn off lights based on the specified light type. */ + static int32_t Disable(uint32_t lightType, struct HdfSBuf *data, struct HdfSBuf *reply) + { + /* Delete the timer. */ + if (drvData->timer.realTimer != NULL) { + + if (OsalTimerDelete(&drvData->timer) != HDF_SUCCESS) { + HDF_LOGE("%s: delete haptic timer fail!", __func__); + } + } + /* Power off the corresponding GPIO. */ + if (GpioWrite(drvData->info[lightType]->busRNum, GPIO_VAL_LOW) != HDF_SUCCESS){ + HDF_LOGE("%s: gpio write failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; + } + ``` + +### Verification + +After the driver is developed, develop auto-test cases in the light unit test to verify the basic functionalities of the driver. Use the developer self-test platform as the test environment. + +```c++ +/* Initialize the light interface instance before executing the test case. */ +void HdfLightTest::SetUpTestCase() +{ + g_lightDev = NewLightInterfaceInstance(); + if (g_lightDev == nullptr) { + printf("test light get Module instance failed\n\r"); + } + int32_t ret = g_lightDev->GetLightInfo(&g_lightInfo, &g_count); + if (ret == -1) { + printf("get light informations failed\n\r"); + } +} + +/* After the test case is executed, release the resources used by the test case. */ +void HdfLightTest::TearDownTestCase() +{ + if(g_lightDev != nullptr){ + FreeLightInterfaceInstance(); + g_lightDev = nullptr; + } +} + +/* Obtain the light type. */ +HWTEST_F(HdfLightTest, GetLightList001, TestSize.Level1) +{ + struct LightInfo *info = nullptr; + + if (g_lightInfo == nullptr) { + EXPECT_NE(nullptr, g_lightInfo); + return; + } + + printf("get light list num[%d]\n\r", g_count); + info = g_lightInfo; + + for (int i = 0; i < g_count; ++i) { + printf("get lightId[%d]\n\r", info->lightType); + EXPECT_GE(info->lightType, g_minLightType); + EXPECT_LE(info->lightType, g_maxLightType); + info++; + } +} + +/* Verify the steady on state of the light. */ +HWTEST_F(HdfLightTest, EnableLight001, TestSize.Level1) +{ + int32_t i; + int32_t ret; + struct LightEffect effect; + effect->lightBrightness = 0x80000000; + effect->flashEffect.flashMode = LIGHT_FLASH_NONE; + effect->flashEffect.onTime = 0; + effect->flashEffect.offTime = 0; + + for (i = 0; i < g_count; ++i) { + + ret = g_lightDev->TurnOnLight(g_lightInfo[i]->lightType, effect); + EXPECT_EQ(0, ret); + + OsalSleep(LIGHT_WAIT_TIME); + + ret = g_lightDev->TurnOffLight(type); + EXPECT_EQ(0, ret); + } +} + +/* Verify the blinking mode of the light. */ +HWTEST_F(HdfLightTest, EnableLight002, TestSize.Level1) +{ + int32_t i; + int32_t ret; + struct LightEffect effect; + effect->lightBrightness = 0x80000000; + effect->flashEffect.flashMode = LIGHT_FLASH_TIMED; + effect->flashEffect.onTime = g_onTime; + effect->flashEffect.offTime = g_offTime; + + for (i = 0; i < g_count; ++i) { + + ret = g_lightDev->TurnOnLight(g_lightInfo[i]->lightType, effect); + EXPECT_EQ(0, ret); + + OsalSleep(LIGHT_WAIT_TIME); + + ret = g_lightDev->TurnOffLight(type); + EXPECT_EQ(0, ret); + } +} +``` diff --git a/en/device-dev/driver/figures/light_driver_model.png b/en/device-dev/driver/figures/light_driver_model.png new file mode 100644 index 0000000000000000000000000000000000000000..eafbab6d62a5020008faf1ac56c64d4bdefa05c7 GIT binary patch literal 9493 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%0A+$R6=4rhmJp|HRi8kgnx?cXXrLR}@} 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 literal 0 HcmV?d00001 -- Gitee