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