#!/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"