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