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