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