1e41f4b71Sopenharmony_ci# uevent事件定制开发指导 
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci## 概述 
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci### 简介 
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ciOpenHarmony默认电池管理系统可以接收uevent事件,系统根据事件,对设备进行相应的动作,产品定制开发者可根据产品设计规格来定制。定制时采用修改配置文件的方式,实现根据配置文件有选择的接收uevent事件,并且设备触发相应的动作。
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci## 开发指导
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci### 搭建环境 
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci设备要求:
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci标准系统开发板,如DAYU200/Hi3516DV300开源套件。
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci环境要求:
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ciLinux调测环境,相关要求和配置可参考《[快速入门](../quick-start/quickstart-overview.md)》
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci### 开发步骤 
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci本文以RK3568开发板为例,介绍uevent事件的定制方法。
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci1. 修改[HDI层电池服务配置文件夹中的battery_config.json](https://gitee.com/openharmony/drivers_peripheral/tree/master/battery/interfaces/hdi_service/profile)与[service层电池服务配置文件夹中的battery_config.json](https://gitee.com/openharmony/powermgr_battery_manager/tree/master/services/native/profile)定制后的uevent事件配置如下:
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci    ```json
28e41f4b71Sopenharmony_ci    {
29e41f4b71Sopenharmony_ci        "uevent": {
30e41f4b71Sopenharmony_ci            "SUBSYSTEM=hw_power": {
31e41f4b71Sopenharmony_ci                "BATTERY_UNDER_VOLTAGE=1": "shutdown",
32e41f4b71Sopenharmony_ci                "BATTERY_UNDER_CURRENT=2": "reboot",
33e41f4b71Sopenharmony_ci                "BATTERY_UNDER_VOLTAGE=3": "sendcommonevent"
34e41f4b71Sopenharmony_ci            }
35e41f4b71Sopenharmony_ci        }
36e41f4b71Sopenharmony_ci    }
37e41f4b71Sopenharmony_ci    ``` 
38e41f4b71Sopenharmony_ci
39e41f4b71Sopenharmony_ci    **表1** uevent事件所属子系统说明
40e41f4b71Sopenharmony_ci
41e41f4b71Sopenharmony_ci    | 所属子系统 | 描述 |
42e41f4b71Sopenharmony_ci    | -------- | -------- |
43e41f4b71Sopenharmony_ci    | SUBSYSTEM=hw_power | 所属子系统为hw_power|
44e41f4b71Sopenharmony_ci
45e41f4b71Sopenharmony_ci    **表2** uevent事件说明
46e41f4b71Sopenharmony_ci
47e41f4b71Sopenharmony_ci    | uevent事件 | 描述 |
48e41f4b71Sopenharmony_ci    | -------- | -------- |
49e41f4b71Sopenharmony_ci    | BATTERY_UNDER_VOLTAGE=1 | uevent事件(支持正则表达式) 电池电压小于1 |
50e41f4b71Sopenharmony_ci    | BATTERY_UNDER_CURRENT=2 | uevent事件(支持正则表达式) 电池电流小于2 |
51e41f4b71Sopenharmony_ci    | BATTERY_UNDER_VOLTAGE=3 | uevent事件(支持正则表达式) 电池电压小于3|
52e41f4b71Sopenharmony_ci
53e41f4b71Sopenharmony_ci    **表3** 动作配置说明
54e41f4b71Sopenharmony_ci
55e41f4b71Sopenharmony_ci    | 动作 | 类型 | 描述 |
56e41f4b71Sopenharmony_ci    | -------- | -------- | -------- |
57e41f4b71Sopenharmony_ci    | shutdown | string | 关机 |
58e41f4b71Sopenharmony_ci    | reboot | string | 重启 |
59e41f4b71Sopenharmony_ci    | sendcommonevent | string | 发送广播 |
60e41f4b71Sopenharmony_ci
61e41f4b71Sopenharmony_ci2. 参考《[快速入门](../quick-start/quickstart-overview.md)》编译定制版本,编译命令如下:
62e41f4b71Sopenharmony_ci
63e41f4b71Sopenharmony_ci    ```shell
64e41f4b71Sopenharmony_ci    ./build.sh --product-name rk3568 --ccache
65e41f4b71Sopenharmony_ci    ```
66e41f4b71Sopenharmony_ci
67e41f4b71Sopenharmony_ci3. 将定制版本烧录到DAYU200开发板中。
68e41f4b71Sopenharmony_ci
69e41f4b71Sopenharmony_ci### 调测验证 
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ci1. 更改[uevent接收代码](https://gitee.com/openharmony/drivers_peripheral/blob/master/battery/interfaces/hdi_service/src/battery_thread.cpp),强制接收配置文件中的uevent事件BATTERY_UNDER_VOLTAGE=1:
72e41f4b71Sopenharmony_ci   ```c++
73e41f4b71Sopenharmony_ci    void BatteryThread::UeventCallback(void* service)
74e41f4b71Sopenharmony_ci    {
75e41f4b71Sopenharmony_ci        char msg[UEVENT_MSG_LEN + UEVENT_RESERVED_SIZE] = { 0 };
76e41f4b71Sopenharmony_ci
77e41f4b71Sopenharmony_ci        ssize_t len = recv(ueventFd_, msg, UEVENT_MSG_LEN, 0);
78e41f4b71Sopenharmony_ci        if (len < 0 || len >= UEVENT_MSG_LEN) {
79e41f4b71Sopenharmony_ci            BATTERY_HILOGI(COMP_HDI, "recv return msg is invalid, len: %{public}zd", len);
80e41f4b71Sopenharmony_ci            return;
81e41f4b71Sopenharmony_ci        }
82e41f4b71Sopenharmony_ci
83e41f4b71Sopenharmony_ci        // msg separator
84e41f4b71Sopenharmony_ci        msg[len] = '\0';
85e41f4b71Sopenharmony_ci        msg[len + 1] = '\0';
86e41f4b71Sopenharmony_ci
87e41f4b71Sopenharmony_ci        std::string powerUevent;
88e41f4b71Sopenharmony_ci        if (!MatchPowerUevent(msg, powerUevent)) {
89e41f4b71Sopenharmony_ci            return;
90e41f4b71Sopenharmony_ci        }
91e41f4b71Sopenharmony_ci        powerUevent = "BATTERY_UNDER_VOLTAGE=1";
92e41f4b71Sopenharmony_ci        BATTERY_HILOGI(FEATURE_BATT_INFO, "PowerUevent msg:%{public}s",
93e41f4b71Sopenharmony_ci        powerUevent.c_str());
94e41f4b71Sopenharmony_ci        UpdateBatteryInfo(service, powerUevent);
95e41f4b71Sopenharmony_ci    }
96e41f4b71Sopenharmony_ci    ```
97e41f4b71Sopenharmony_ci2. 参考《[快速入门](../quick-start/quickstart-overview.md)》编译定制版本,编译命令如下:
98e41f4b71Sopenharmony_ci
99e41f4b71Sopenharmony_ci    ```shell
100e41f4b71Sopenharmony_ci    ./build.sh --product-name rk3568 --ccache
101e41f4b71Sopenharmony_ci    ```
102e41f4b71Sopenharmony_ci
103e41f4b71Sopenharmony_ci3. 将定制版本烧录到DAYU200开发板中。
104e41f4b71Sopenharmony_ci4. 设备启动后接收到uevent时关机。
105e41f4b71Sopenharmony_ci    
106e41f4b71Sopenharmony_ci## 参考 
107e41f4b71Sopenharmony_ci开发过程中可参考的配置文件路径:[uevent事件配置源码路径](https://gitee.com/openharmony/powermgr_battery_manager/tree/master/services/native/profile/) 
108e41f4b71Sopenharmony_ci
109e41f4b71Sopenharmony_ci默认配置:
110e41f4b71Sopenharmony_ci
111e41f4b71Sopenharmony_ci```json
112e41f4b71Sopenharmony_ci{
113e41f4b71Sopenharmony_ci    "uevent": {
114e41f4b71Sopenharmony_ci        "SUBSYSTEM=hw_power": {
115e41f4b71Sopenharmony_ci            "BATTERY_UNDER_VOLTAGE=1": "shutdown",
116e41f4b71Sopenharmony_ci            "BATTERY_UNDER_VOLTAGE=2": "reboot",
117e41f4b71Sopenharmony_ci            "BATTERY_UNDER_VOLTAGE=3": "sendcommonevent"
118e41f4b71Sopenharmony_ci        }
119e41f4b71Sopenharmony_ci    }
120e41f4b71Sopenharmony_ci}
121e41f4b71Sopenharmony_ci``` 
122e41f4b71Sopenharmony_ci
123e41f4b71Sopenharmony_ci打包路径:/system/etc/battery
124