相关芯片
| 功能 | IC型号 | 特点 |
|---|---|---|
| 充电管理 | SLM6300 | |
| 电量计 | CW2015CHBD | |
| 电源管理 | EA3036CQBR |
电源开关检测按钮:62 ,SOC_GPIO_BELL/GPIO0_A3
电源按键管理
内核配置
只开启中断触发就好
CONFIG_KEYBOARD_GPIO=y #中断触发
CONFIG_KEYBOARD_GPIO_POLLED=y #轮询触发
设备树加上这个按钮
gpio-keys {
compatible = "gpio-keys"; // 绑定内核 drivers/input/keyboard/gpio_keys.c
pinctrl-names = "default"; // 使用 default 状态的 pinmux 配置
pinctrl-0 = <&soc_gpio_bell>; // 引用下面的 pinmux 定义
bell-key {
label = "SOC_GPIO_BELL"; // 名字,debug 时能看到
linux,code = <KEY_POWER>; // 按键码 116,上报给 input 子系统
gpios = <&gpio0 RK_PA3 GPIO_ACTIVE_LOW>; // GPIO0_A3,低电平触发
debounce-interval = <10>; // 10ms 消抖
wakeup-source; // 休眠时这个键能唤醒 SoC
};
};
&pinctrl {
bell { // 分组名,方便管理
soc_gpio_bell: soc-gpio-bell { // 标签 + 节点名
rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};
电源保持
当内核启动时需要拉高power-hold引脚来给soc持续供电,拉低这个引脚关机
| 名称 | 引脚号 | 复用关系 |
|---|---|---|
| power_hold | 60 | PWM3_IR_M0/GPIO0_A2_D |
由于power-hold引脚和usb供电引脚一起。
-
方式1:
插上电usb供电,能保持供电开机。
-
方式2:
电池供电,如果usb配置了host模式(主机模式对外供电),就能保持一直供电开机。
-
方式3:
手动拉高保持power_hold引脚。保持一直供电开机。
/* POW_HOLD: 内核启动后拉高 GPIO0_A2 持续供电 */ gpio-poweroff { compatible = "regulator-fixed"; regulator-name = "gpio-poweroff"; regulator-always-on; regulator-boot-on; enable-active-high; gpio = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>; pinctrl-names = "default"; pinctrl-0 = <&power_hold>; }; &pinctrl { power_hold: power-hold { rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_output_high>; }; };
充电管理
引脚关系:查看
-
内核驱动地址
/kernel/drivers/power/supply/gpio-charger.c -
内核配置
CONFIG_CHARGER_GPIO=y -
设备树配置
charger: charger { compatible = "gpio-charger"; charger-type = "mains"; gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_LOW>; pinctrl-names = "default"; pinctrl-0 = <&charger_pins>; }; &pinctrl { charger { charger_pins: charger-pins { rockchip,pins = <3 RK_PB6 RK_FUNC_GPIO &pcfg_pull_up>; }; }; }; -
命令行测试
# 无报错 dmesg | grep cw2015 # 充电器状态 cat /sys/class/power_supply/charger/online
电量管理
引脚关系:查看
- 内核已经有这个驱动了:
/root/sdk/rv1106/sysdrv/source/kernel/drivers/power/supply/cw2015_battery.c
- 内核开启配置
CONFIG_BATTERY_CW2015=y
- 直接在设备树增加配置
&i2c0 {
status = "okay";
cw2015@62 {
compatible = "cellwise,cw2015";
reg = <0x62>;
/*
* 电池 profile(64 字节)由 CellWise 给出。
* 以下是一个典型 3.7V Li-Po / 18650 的参考值,
* 实测后需根据你们实际电芯校准。
*/
cellwise,battery-profile = /bits/ 8 <
0x17 0x67 0x80 0x73 0x6E 0x6C 0x6B 0x63
0x77 0x51 0x5C 0x58 0x50 0x4C 0x48 0x36
0x15 0x0C 0x0C 0x19 0x5B 0x7D 0x6F 0x69
0x69 0x5B 0x0C 0x29 0x20 0x40 0x52 0x59
0x57 0x56 0x54 0x4F 0x3B 0x1F 0x7F 0x17
0x06 0x1A 0x30 0x5A 0x85 0x93 0x96 0x2D
0x48 0x77 0x9C 0xB3 0x80 0x52 0x94 0xCB
0x2F 0x00 0x64 0xA5 0xB5 0x11 0xF0 0x11
>;
power-supplies = <&charger>;//与充电管理对应
cellwise,monitor-interval-ms = <5000>;
};
};
-
电量管理充电检测日志
/kernel/drivers/power/supply/cw2015_battery.c第350行注释掉就不会报日志
ret = power_supply_am_i_supplied(cw_bat->rk_bat);
if (ret < 0) {
// dev_warn(cw_bat->dev, "Failed to get supply state: %d\n", ret);
}
- 命令行测试
# 电量百分比
cat /sys/class/power_supply/cw2015-battery/capacity
# 当前电压(微伏,除以 1000000 得伏特)
cat /sys/class/power_supply/cw2015-battery/voltage_now
# 充放电状态
cat /sys/class/power_supply/cw2015-battery/status