Files
Power-off-analysis/ec_i2c_identify.sh
2026-04-04 15:32:51 +08:00

78 lines
4.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ec_i2c_identify.sh - 读取 EC I2C 设备寄存器,尝试识别芯片型号
# 用法: 先跑 ec_i2c_scan.sh 得到 (port, addr),把结果填到下面 DEVICES或直接运行用默认列表
# 需要: ECTOOL 指向 ectool-cecsudo 运行
#
# 常见芯片 ID / 地址 参考(供推断用):
# - 0x2c 总线、读出含 0x77/0x79 等: Nuvoton Super I/O 或 I2C 型多功能芯片;
# index/data 访问时「reg 0x00」可能实为当前 index 指向的数据。可能型号: NCT5532D, NCT5577D,
# NCT38xx (TCPC+IO),具体以 datasheet 的 Chip ID 寄存器为准。
# - reg 0x80 = 0x5A 0x5E: 部分 PMIC/电源管理或传感器厂商的 Device ID 寄存器值,
# 具体型号需查该厂商手册0x5A5E 未在公开常见表中统一对应单一型号。
# - reg 0x80 = 0x54 0x49: TI INA3221/INA219 (电流/功率监测)。
# - 0x20 且 0x00 起有数据+大段 0xff: 常见 EEPROM (24c02 等)。
# - 0x38 读得 0x30 0x30(ASCII): 常见 GPIO/IO 扩展 (如 PCA9555) 或显示相关。
# - 0x3c/0x3d 全 0: 常见 SSD1306 等 OLED未初始化时读回 0。
set -e
ECTOOL="${ECTOOL:-/home/jack/bin/ectool-cec}"
# 格式: "port:addr port:addr ..."(来自 ec_i2c_scan.sh 结果)
DEVICES="${*:-1:0x40 3:0x2c 3:0x38 3:0x39 3:0x3d 3:0x3f 3:0x42 5:0x20}"
echo "使用 ECTOOL=$ECTOOL"
echo "设备列表: $DEVICES"
echo "---"
for entry in $DEVICES; do
port="${entry%%:*}"
addr="${entry##*:}"
[ -z "$port" ] || [ -z "$addr" ] && continue
echo "=== EC port $port addr $addr ==="
# 读 reg 0x00 起 8 字节
out_00=$("$ECTOOL" i2cxfer "$port" "$addr" 8 0x00 2>/dev/null) || out_00=""
if [ -n "$out_00" ]; then
echo " reg 0x00 +8: $out_00"
else
echo " reg 0x00 +8: (读失败)"
fi
# 读 reg 0x80 起 2 字节INA3221 = 0x5449
out_80=$("$ECTOOL" i2cxfer "$port" "$addr" 2 0x80 2>/dev/null) || out_80=""
if [ -n "$out_80" ]; then
echo " reg 0x80 +2: $out_80"
hex=$(echo "$out_80" | tr -d ' 0x\r\n' | tr 'A-F' 'a-f')
case "$hex" in
5449|4954) echo " -> INA3221/INA219 (TI 电流/功率)" ;;
esac
fi
out_fe=$("$ECTOOL" i2cxfer "$port" "$addr" 2 0xfe 2>/dev/null) || out_fe=""
out_ff=$("$ECTOOL" i2cxfer "$port" "$addr" 2 0xff 2>/dev/null) || out_ff=""
out_0f=$("$ECTOOL" i2cxfer "$port" "$addr" 2 0x0f 2>/dev/null) || out_0f=""
[ -n "$out_fe" ] && echo " reg 0xFE +2: $out_fe"
[ -n "$out_ff" ] && echo " reg 0xFF +2: $out_ff"
[ -n "$out_0f" ] && echo " reg 0x0F +2: $out_0f"
# 根据读出模式推断设备类型
hint=""
case "$addr" in
0x20) echo "$out_00" | grep -q '0xff 0xff' && hint="推断: 可能 EEPROM (24cxx)0x00 后见 0xff 多为空区" ;;
0x2c) hint="推断: 可能 Nuvoton Super I/O / I2C 多功能芯片 (如 NCT5532D/NCT5577D/NCT38xx);首字节 0x77 等可为 Chip IDindex/data 访问时直接读 reg 未必对应真实寄存器" ;;
0x38) echo "$out_80" | grep -q '0x30 0x30' && hint="推断: 0x80 读得 0x30 0x30(ASCII 00),可能 GPIO/IO 扩展或显示" ;;
0x3d) [ -z "$out_00" ] || echo "$out_00" | grep -q '00 00 00' && hint="推断: 全 0 可能 SSD1306/显示 或 未初始化" ;;
0x3f) echo "$out_80" | grep -q '0x5a 0x5e' && hint="推断: 0x80=0x5A5E 为某厂商 Device ID常见于 PMIC/电源管理或传感器;具体型号需查该厂商 datasheet" ;;
0x40|0x42) echo "$out_80" | grep -q '0x54 0x49' && hint="推断: INA3221 (TI)" || hint="推断: 电流/功率类芯片,非标准 0x5449 或 未使能" ;;
esac
[ -n "$hint" ] && echo " $hint"
echo ""
done
echo "--- 参考(常见芯片 ID/可能型号)---"
echo " 0x80=0x5449 -> TI INA3221/INA219 | 0x80=0x5A5E -> 某 PMIC/传感器厂商 ID型号查 datasheet"
echo " 0x2c 总线、首字节 0x77 等 -> Nuvoton NCT55xx/NCT5577D/NCT38xx 等 Super I/O 或 I2C 多功能"
echo " 0x20 有数据+0xff -> EEPROM(24cxx) | 0x38 读得 0x30 0x30 -> GPIO/IO 扩展 | 0x3d 全 0 -> 可能 SSD1306"