第8阶段:完善电池和充电

目标

可以检测到BMS驱动,检测到电池状态。

硬件分析

Y927 充电硬件用 PM8916 内置 LBC(线性充电器),不存在外部 SMB358/SMB1360 芯片——原厂 DTB 里有 smb_int_pin: smb1360_int_gpio = <gpio62> 这种引脚标签,但没有实际的 smb 设备节点,是参考设计残留。原厂另有一条 vivo,charger-monitor compatible 是 vivo 私有充电策略,主线不复刻。

DTS 改动分析

电池侧用主线 simple-battery + &pm8916_bms + &pm8916_charger 的标准三件套。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/ {
/*
* Y927 原厂电池:4.35V / 2260 mAh
* 数据来源:原厂 DTB `qcom,b76-atl-4v35-2260mah-data` 节点。
* OCV 表为 25°C 下的电压→容量映射,主线 simple-battery 的标准做法。
*/
battery: battery {
compatible = "simple-battery";
voltage-min-design-microvolt = <3400000>;
voltage-max-design-microvolt = <4350000>;
energy-full-design-microwatt-hours = <8588000>;
charge-full-design-microamp-hours = <2260000>;
ocv-capacity-celsius = <25>;
ocv-capacity-table-0 = <
4342000 100 4288000 95 4234000 90 4189000 85
4148000 80 4111000 75 4075000 70 4041000 65
4008000 60 3977000 55 3949000 50 3922000 45
3895000 40 3866000 35 3835000 30 3803000 25
3774000 20 3744000 15 3711000 10 3674000 5
3634000 0
>;
};
};

&pm8916_bms {
status = "okay";
monitored-battery = <&battery>;
power-supplies = <&pm8916_charger>;
};

&pm8916_charger {
status = "okay";
monitored-battery = <&battery>;
qcom,fast-charge-safe-current = <900000>; /* 0.9 A 安全限流 */
qcom,fast-charge-safe-voltage = <4200000>; /* PM8916 LBC 浮充上限 4.2V */
};

内核配置

1
2
3
4
cd ~/y927/linux
./scripts/config --enable CONFIG_BATTERY_PM8916_BMS_VM
./scripts/config --enable CONFIG_CHARGER_PM8916_LBC
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig

编译 Linux 内核

1
2
cd ~/y927/linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image.gz dtbs

构建 boot.img 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cd ~/y927/linux
PHASE_ID=8
INITRAMFS_PHASE_ID=7

# 拼接内核 + DTB
cat arch/arm64/boot/Image.gz \
arch/arm64/boot/dts/qcom/msm8916-vivo-y927.dtb \
> vmlinuz-dtb

~/y927/lk2nd/lk2nd/scripts/mkbootimg \
--kernel vmlinuz-dtb \
--ramdisk $HOME/y927/initramfs/initramfs-phase-$INITRAMFS_PHASE_ID.cpio.gz \
--cmdline "console=tty0 console=ttyMSM0,115200 panic=1 initcall_blacklist=simpledrm_platform_driver_init" \
--base 0x80000000 \
--kernel_offset 0x00008000 \
--ramdisk_offset 0x01000000 \
--second_offset 0x00f00000 \
--tags_offset 0x00000100 \
--pagesize 2048 \
--header_version 0 \
--output boot-phase-$PHASE_ID.img

刷入 boot.img 文件

1
2
3
PHASE_ID=8
fastboot flash boot boot-phase-$PHASE_ID.img
fastboot reboot

测试

1
sudo picocom -b 115200 /dev/ttyACM0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
busybox ls /sys/class/power_supply/
# pm8916-bms-vm pm8916-lbc-chgr

busybox cat /sys/class/power_supply/pm8916-bms-vm/voltage_now
# 4227200

busybox cat /sys/class/power_supply/pm8916-bms-vm/capacity
# 100

busybox cat /sys/class/power_supply/pm8916-bms-vm/health
# Good

busybox cat /sys/class/power_supply/pm8916-bms-vm/status
# Discharging

busybox cat /sys/class/power_supply/pm8916-bms-vm/charge_full_design
# 2260000

busybox cat /sys/class/power_supply/pm8916-bms-vm/voltage_max_design
# 4350000

busybox cat /sys/class/power_supply/pm8916-lbc-chgr/online
# 0