78 lines
4.0 KiB
Bash
Executable File
78 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
||
# ec_i2c_identify.sh - 读取 EC I2C 设备寄存器,尝试识别芯片型号
|
||
# 用法: 先跑 ec_i2c_scan.sh 得到 (port, addr),把结果填到下面 DEVICES,或直接运行(用默认列表)
|
||
# 需要: ECTOOL 指向 ectool-cec,sudo 运行
|
||
#
|
||
# 常见芯片 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 ID;index/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"
|