# AURIX MCP Server

> **让 AI 直接操作 AURIX MCU** — 将 DFlash 读写、PFlash 烧写、寄存器调试、构建分析封装为 MCP 工具，供 Claude / GPT / Qoder 等 LLM 通过自然语言调用。

---

## 它能做什么

| 能力 | 说明 |
|------|------|
| **DFlash 操作** | 擦除、写入、读取、Read-Modify-Write、备份恢复、UCB 操作 |
| **PFlash 烧写** | 调用 AURIXFlasher.exe 烧写 PFlash（HEX / ELF） |
| **硬件调试** | 读写寄存器（SVD 驱动）、内存 dump/poke/search/compare |
| **构建分析** | 执行编译、解析 MAP/LST/ELF 符号表、地址反查 |
| **设备管理** | 列出目标、查看状态寄存器、获取内存布局 |

**典型对话**：
```
你: 帮我把 firmware.hex 烧到 PFlash，烧完不要启动
AI: → wiggle_pflash(hex_file="firmware.hex", start="off")
AI: 烧写完成，设备已暂停。需要我复位启动吗？
```

---

## 目录结构

```
wiggle_MCP/
├── aurix_mcp_server.py   # MCP Server 主程序 (25 个工具)
├── build_analysis.py      # 构建产物分析模块
├── mcp_config.json        # 配置文件 (需按实际路径修改)
├── requirements.txt       # Python 依赖
├── start_mcp.bat          # Windows 一键启动
├── start_mcp.sh           # Linux/macOS 启动
├── wiggle/
│   ├── wiggle.exe         # DFlash 调试工具 (已包含)
│   ├── DeviceConfigs/     # 芯片配置 JSON (21 款 TC2x/TC3x)
│   └── RegisterDefs/      # SVD 寄存器定义 JSON
└── docs/
    ├── mcp_config_guide.md                # 配置文件详细说明
    ├── wiggle-Command-Reference.xlsx       # wiggle 命令参考
    ├── MCP-Command-Reference.xlsx          # MCP 工具参考
    └── AURIXFlasher-Command-Reference.xlsx # PFlash 命令参考
```

---

## 快速开始

### 1. 安装依赖

```bash
pip install -r requirements.txt
```

依赖：`mcp[cli]>=1.0.0`（MCP 框架）+ `pyelftools>=0.31`（ELF 解析）

### 2. 修改配置

编辑 `mcp_config.json`，填入实际路径：

```json
{
    "wiggle_exe": null,
    "aurix_flasher_exe": null,
    "server": "localhost",
    "target": null,
    "device": null,
    "timeout": 120
}
```

| 字段 | 说明 |
|------|------|
| `wiggle_exe` | wiggle.exe 路径。**分发版已自带**（`wiggle/wiggle.exe`），留 `null` 自动搜索 |
| `aurix_flasher_exe` | AURIXFlasher.exe 路径。**Infineon 闭源工具，需自行安装**；留 `null` 自动搜索默认安装路径 |
| `server` | TAS Debug Server 地址，本机填 `localhost`，远程填 IP |
| `target` | 目标设备标识，`null` = 自动检测 |
| `device` | 设备类型覆盖（如 `"TC33x"`），`null` = 自动检测 |
| `timeout` | 命令超时秒数，默认 120 |

> 如需 **构建分析** 功能，还需配置 `build` 和 `project` 段，详见 [配置指南](docs/mcp_config_guide.md)。

### 3. 前置条件

- **TAS Server** 已启动（Infineon 调试器后台进程，监听 TCP:2000）
- **miniWiggler** 已连接（USB → PC，DAP/JTAG → AURIX 目标板）
- **Python 3.10+**

### 4. 启动

**方式 A：一键启动**
```bash
start_mcp.bat              # stdio 模式（供 AI 客户端直连）
start_mcp.bat --sse        # SSE 模式（HTTP 服务，端口 8000）
```

**方式 B：命令行启动**
```bash
python aurix_mcp_server.py --config mcp_config.json
python aurix_mcp_server.py --config mcp_config.json --transport sse --port 8001
```

### 5. 在 AI 客户端中注册

#### Claude Desktop (`claude_desktop_config.json`)

```json
{
  "mcpServers": {
    "aurix": {
      "command": "python",
      "args": ["D:\\wiggle_MCP\\aurix_mcp_server.py", "--config", "D:\\wiggle_MCP\\mcp_config.json"]
    }
  }
}
```

#### Cursor / VS Code

```json
{
  "mcp": {
    "servers": {
      "aurix": {
        "command": "python",
        "args": ["D:\\wiggle_MCP\\aurix_mcp_server.py", "--config", "D:\\wiggle_MCP\\mcp_config.json"]
      }
    }
  }
}
```

#### Qoder

```json
{
  "mcpServers": {
    "aurix": {
      "command": "python",
      "args": ["D:\\wiggle_MCP\\aurix_mcp_server.py", "--config", "D:\\wiggle_MCP\\mcp_config.json"]
    }
  }
}
```

---

## 工具一览

共 **25 个 MCP 工具**，分为 6 组：

### 设备信息（3 个）

| 工具 | 说明 |
|------|------|
| `wiggle_list` | 列出已连接的 TAS 目标设备 |
| `wiggle_status` | 读取 Flash 状态寄存器，SVD 字段解码（D0BUSY / P0BUSY 等） |
| `wiggle_info` | 设备型号、JTAG ID、内存布局、DFlash/UCB 参数、SVD 寄存器摘要 |

### DFlash 操作（6 个）

| 工具 | 说明 |
|------|------|
| `wiggle_erase` | 擦除 DFlash 扇区（全片或指定地址+扇区数） |
| `wiggle_write` | 从 HEX/BIN 文件写入 DFlash（自动擦除→写入→校验） |
| `wiggle_read` | 读取 DFlash 内容，可保存为文件或返回 hex dump |
| `wiggle_rewrite` | Read-Modify-Write：按任意地址写入，自动处理扇区对齐 |
| `wiggle_restore` | 从备份文件恢复 DFlash（擦除→写入→校验） |
| `wiggle_ucb` | UCB 用户配置块操作（read / write / erase），仅 TC3x |

### PFlash 烧写（1 个）

| 工具 | 说明 |
|------|------|
| `wiggle_pflash` | 调用 AURIXFlasher.exe 烧写 PFlash（需自行安装 Infineon 工具） |

### 硬件调试（5 个）

| 工具 | 说明 |
|------|------|
| `wiggle_reg` | 按 SVD 名称或地址读写寄存器（如 `DMU.HF.STATUS`） |
| `wiggle_dump` | 内存 hex dump（PFlash / DFlash / SRAM），可保存文件 |
| `wiggle_poke` | 写入值到内存地址，回读验证 |
| `wiggle_search` | 搜索内存中的字节模式（如 `DEADBEEF`） |
| `wiggle_compare` | 本地文件与 Flash 内容逐字节对比 |

### 寄存器元数据（3 个）

| 工具 | 说明 |
|------|------|
| `reg_peripherals` | 列出芯片所有外设及寄存器数量（无需硬件连接） |
| `reg_fields` | 查看寄存器完整位域定义（每个 bit 的含义、枚举值） |
| `reg_search` | 按关键字搜索寄存器名（如 `STATUS`、`WDT`） |

### 控制 + 构建分析（7 个）

| 工具 | 说明 |
|------|------|
| `wiggle_reset` | 复位 MCU（可选复位后暂停） |
| `build_project` | 执行编译命令，自动检测 Windows/Linux 命令分隔符 |
| `reload_parsers` | 强制重新加载 MAP/LST/ELF/MDF 解析缓存 |
| `parse_symbols` | 解析 MAP/LST 文件的符号地址映射和内存用量 |
| `parse_elf` | 解析 ELF 文件的符号表、段信息、DWARF 调试信息 |
| `lookup_symbol` | 按名称跨 MAP/ELF 查找符号（地址、大小、类型、源码位置） |
| `lookup_address` | 按地址反查最近符号（名称、偏移、段、源码文件） |

---

## 工具详细参数

### wiggle_list

列出已连接的目标设备。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `server` | str | `""` | TAS Server IP（覆盖配置） |
| `target` | str | `""` | 目标标识符 |

### wiggle_status

读取 Flash 状态寄存器，带 SVD 字段解码。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

### wiggle_info

获取设备信息、内存布局、SVD 寄存器摘要。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

### wiggle_erase

擦除 DFlash 扇区。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `erase_all` | bool | `true` | 擦除整个 DFlash |
| `address` | str | `""` | 起始地址（hex），`erase_all=false` 时必填 |
| `sectors` | int | `0` | 擦除扇区数（0=1 个扇区） |
| `verify` | bool | `false` | 擦除后回读校验 |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

```
wiggle_erase(erase_all=True, verify=True)
wiggle_erase(erase_all=False, address="0xAF000000", sectors=4)
```

### wiggle_write

从 HEX/BIN 文件写入 DFlash。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `file_path` | str | **(必填)** | HEX 或 BIN 文件路径 |
| `verify` | bool | `true` | 写入后回读校验 |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

> 仅支持 DFlash。PFlash 请使用 `wiggle_pflash`。

### wiggle_rewrite

Read-Modify-Write：在任意地址写入数据，自动处理扇区对齐（读取→合并→擦除→写回）。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `file_path` | str | `""` | HEX 或 BIN 文件路径 |
| `address` | str | `""` | 起始地址（hex），BIN 和 data 模式必填 |
| `data` | str | `""` | hex 数据字符串（如 `DEADBEEF`），与 file_path 互斥 |
| `backup` | bool | `false` | 写入前备份受影响扇区 |
| `backup_path` | str | `""` | 备份文件路径（空 = 自动生成） |
| `verify` | bool | `true` | 写入后回读校验 |
| `reset_mcu` | bool | `false` | 写入后复位 MCU |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

```
wiggle_rewrite(address="0xAF000100", data="DEADBEEF01020304")
wiggle_rewrite(file_path="patch.bin", address="0xAF000000", backup=True)
```

### wiggle_restore

从备份文件恢复 DFlash（擦除→写入→校验），用于还原之前备份的数据。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `file_path` | str | **(必填)** | 备份文件路径（`.bin` 或 `.hex`） |
| `no_verify` | bool | `false` | 跳过恢复后校验 |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

### wiggle_ucb

UCB（User Configuration Block）操作。**仅 TC3x 支持，TC2x 不可用。**
> ⚠️ UCB write/erase 是高风险操作，可能导致设备锁定。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `action` | str | **(必填)** | 操作类型：`"read"` / `"write"` / `"erase"` |
| `address` | str | `""` | 起始地址（hex，空 = UCB 基址） |
| `length` | str | `""` | 读取长度（hex，仅 read） |
| `sectors` | int | `1` | 擦除扇区数（仅 erase） |
| `file_path` | str | `""` | 输入文件（仅 write，`.hex` / `.bin`） |
| `verify` | bool | `false` | 操作后校验 |
| `output_file` | str | `""` | 输出文件（仅 read） |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

```
wiggle_ucb(action="read", output_file="ucb_backup.hex")
wiggle_ucb(action="write", file_path="ucb_new.hex", verify=True)
wiggle_ucb(action="erase", sectors=1)
```

### wiggle_read

读取 DFlash 内容。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `address` | str | **(必填)** | 起始地址（hex） |
| `length` | str | **(必填)** | 读取长度（hex） |
| `output_file` | str | `""` | 保存路径（`.hex` / `.bin`），空 = 返回数据 |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

### wiggle_pflash

调用 AURIXFlasher.exe 烧写 PFlash。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `hex_file` | str | **(必填)** | Intel HEX 或 ELF 文件路径 |
| `verify` | bool | `true` | 烧写后校验 |
| `erase` | str | `""` | 擦除模式：`"all"` = 全片擦除，`"used"` = 仅已用扇区 |
| `ucb` | bool | `false` | 启用 UCB 编程 |
| `connect` | str | `""` | 连接模式：`"0"` = 热连接，`"1"` = 复位并暂停 |
| `start` | str | `""` | 烧写后行为：`"on"` = 复位运行，`"off"` = 保持暂停 |
| `device_id` | str | `""` | 多目标时的 DAP ID（如 `"0"`, `"1"`） |

```
wiggle_pflash(hex_file="firmware.hex")
wiggle_pflash(hex_file="app.elf", erase="all", connect="0", start="off")
```

### wiggle_reg

按 SVD 名称或地址读写寄存器。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `name_or_addr` | str | **(必填)** | 寄存器名（如 `DMU.HF.STATUS`）或地址（如 `0xF8040010`） |
| `value` | str | `""` | 写入值（空 = 读取） |
| `list_peripheral` | str | `""` | 列出外设寄存器（设置时忽略 `name_or_addr`） |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

```
wiggle_reg("DMU.HF.STATUS")                           # 读取
wiggle_reg("DMU.HF.CONTROL", value="0x1")             # 写入
wiggle_reg("", list_peripheral="DMU")                 # 列出 DMU 寄存器
```

### reg_peripherals

列出芯片所有外设及其寄存器数量。从 SVD 派生的 RegisterDefs 读取，**无需硬件连接**。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `device` | str | `""` | 设备类型（空 = 从配置或硬件自动检测） |

```
reg_peripherals()                        → 61 peripherals, 4251 registers
reg_peripherals(device="TC37x")          → 指定芯片
```

### reg_fields

查看寄存器的完整位域定义，包括每个 bit 的名称、范围、访问类型、描述和枚举值。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `name` | str | **(必填)** | 寄存器名，`PERIPHERAL.REGISTER` 格式（如 `DMU.HF.STATUS`） |
| `device` | str | `""` | 设备类型（空 = 自动检测） |

```
reg_fields("DMU.HF.STATUS")              → bit[0]=D0BUSY, bit[1]=P0BUSY ...
reg_fields("CLC")                        → 若唯一则直接匹配
```

### reg_search

按关键字搜索寄存器名（大小写不敏感），同时匹配寄存器描述。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `keyword` | str | **(必填)** | 搜索关键字（如 `STATUS`、`WDT`、`TIMER`） |
| `device` | str | `""` | 设备类型（空 = 自动检测） |
| `max_results` | int | `50` | 最大返回条数 |

```
reg_search("WDT")                        → SCU.WDTCPU0CON0, WDTSCON0 ...
reg_search("FLASH", device="TC37x")      → DMU.HF.STATUS, HF_CONTROL ...
```

### wiggle_dump

读取内存并返回 hex dump（PFlash / DFlash / SRAM）。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `address` | str | **(必填)** | 起始地址（hex） |
| `length` | str | **(必填)** | 长度（hex） |
| `output_file` | str | `""` | 保存路径（`.bin` / `.hex`） |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

### wiggle_poke

写入值到内存地址，回读验证。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `address` | str | **(必填)** | 目标地址（hex） |
| `value` | str | **(必填)** | 写入值（hex） |
| `width` | int | `32` | 位宽：8 / 16 / 32 / 64 |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

### wiggle_search

搜索内存中的字节模式。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `address` | str | **(必填)** | 搜索起始地址 |
| `length` | str | **(必填)** | 搜索范围 |
| `pattern` | str | **(必填)** | hex 字节模式（如 `DEADBEEF`） |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

### wiggle_compare

本地文件与 Flash/内存内容对比。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `file_path` | str | **(必填)** | 本地文件路径（`.hex` / `.bin`） |
| `address` | str | **(必填)** | 比较起始地址 |
| `length` | str | `""` | 比较长度（空 = 文件全长） |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |
| `device` | str | `""` | 设备类型覆盖 |

### wiggle_reset

复位 MCU。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `halt` | bool | `false` | `true` = 复位后暂停，`false` = 复位并运行 |
| `server` | str | `""` | TAS Server IP |
| `target` | str | `""` | 目标标识符 |

### build_project

执行编译命令，返回错误/警告/产物信息。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `clean` | bool | `false` | `true` = 先 clean 再 build |

> 需在 `mcp_config.json` 的 `build.command` / `build.work_dir` 中配置编译命令。

### reload_parsers

强制重新加载所有解析器（MAP / LST / ELF / MDF）。外部编译或文件变更后使用。

### parse_symbols

解析 MAP/LST 文件的符号地址映射。自动识别 TASKING (.map) 或 GCC (.lst)。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `summary` | bool | `true` | 返回内存用量概览（仅 TASKING） |
| `search` | str | `""` | 按名称过滤符号（大小写不敏感） |
| `max_results` | int | `100` | 最大返回条数 |

### parse_elf

解析 ELF 文件的符号表、段信息。兼容 TASKING 和 GCC ELF。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `functions` | bool | `false` | 仅显示函数符号 |
| `variables` | bool | `false` | 仅显示变量符号 |
| `sections` | bool | `true` | 返回段信息 |
| `search` | str | `""` | 按名称过滤 |
| `max_results` | int | `100` | 最大返回条数 |

### lookup_symbol

按名称跨 MAP/ELF 查找符号，返回地址、大小、类型、源码位置。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `name` | str | **(必填)** | 符号名称 |
| `source` | str | `"all"` | 搜索源：`"map"` / `"elf"` / `"all"` |

### lookup_address

按地址反查最近符号，返回名称、偏移、段、源码文件。

| 参数 | 类型 | 默认 | 说明 |
|------|------|------|------|
| `address` | str | **(必填)** | 地址（hex，如 `0x800019de`） |
| `source` | str | `"all"` | 搜索源：`"map"` / `"elf"` / `"all"` |

---

## 返回格式

所有工具返回 JSON 字符串：

**成功**：
```json
{
  "status": "ok",
  "command": "erase",
  "address": 2936012800,
  "sectors": 4,
  "total_bytes": 16384
}
```

**错误**：
```json
{
  "status": "error",
  "code": 5,
  "message": "Address 0xAF000000 out of range"
}
```

| code | 含义 |
|------|------|
| -1 | 可执行文件未找到 |
| -2 | 命令超时 |
| -3 | 运行时异常 |
| >0 | wiggle 退出码（非 0） |

---

## 典型工作流

### DFlash 擦写验证

```
wiggle_info()                                          → 确认设备型号和 DFlash 布局
wiggle_erase(erase_all=True, verify=True)              → 全片擦除 + 校验
wiggle_write(file_path="config.hex", verify=True)      → 写入配置数据
wiggle_compare(file_path="config.hex", address="0xAF000000")  → 逐字节验证
```

### PFlash 固件烧写

```
wiggle_pflash(hex_file="firmware.hex", verify=True, start="off")  → 烧写并暂停
wiggle_reset(halt=False)                                          → 复位启动
```

### 寄存器调试

```
wiggle_reg("", list_peripheral="DMU")       → 列出 DMU 外设所有寄存器
wiggle_reg("DMU.HF.STATUS")                 → 读取 Flash 状态
wiggle_reg("DMU.HF.CONTROL", value="0x1")   → 写入控制寄存器
```

### 内存排查

```
wiggle_dump(address="0xAF000000", length="0x100")                         → hex dump
wiggle_search(address="0xAF000000", length="0x20000", pattern="DEADBEEF") → 搜索模式
wiggle_poke(address="0x70000000", value="0x12345678")                     → 写 SRAM 验证
```

### DFlash 备份与恢复

```
wiggle_rewrite(address="0xAF000100", data="01020304", backup=True)  → RMW 写入 + 自动备份
wiggle_read(address="0xAF000000", length="0x1000", output_file="backup.bin")  → 手动备份
wiggle_restore(file_path="backup.bin")                               → 从备份恢复
```

### UCB 配置管理（TC3x）

```
wiggle_ucb(action="read", output_file="ucb_orig.hex")   → 备份 UCB
wiggle_ucb(action="write", file_path="ucb_new.hex", verify=True)  → 写入新 UCB
wiggle_ucb(action="erase")                                → 擦除 UCB
```

### 寄存器探索

```
reg_peripherals()                                  → 列出 61 个外设
reg_search("STATUS")                               → 搜索所有 STATUS 寄存器
reg_fields("DMU.HF.STATUS")                        → 查看 Flash 状态寄存器位域定义
wiggle_reg("DMU.HF.STATUS")                        → 读取实际值
```

### 构建 + 符号分析

```
build_project()                                       → 编译项目
parse_symbols(search="main")                          → 查找 main 函数地址
lookup_address(address="0x800019de")                  → 地址反查符号
parse_elf(functions=True, search="init")              → 搜索 ELF 中的初始化函数
```

---

## 支持的芯片

| 家族 | 型号 |
|------|------|
| **TC2x** | TC21x, TC22x, TC23x, TC26x, TC27x, TC29x |
| **TC3x** | TC33x, TC35x, TC36x, TC37x, TC38x, TC39x, TC3Ex |

> **不支持 TC4x**（DFlash 基址和擦除命令序列不同）。

芯片型号通过 `wiggle/DeviceConfigs/*.json` 运行时加载，新增芯片只需添加 JSON 文件，无需重新编译。

---

## 构建分析配置

如需使用 `build_project` / `parse_symbols` / `parse_elf` / `lookup_*` 工具，需在 `mcp_config.json` 中配置：

### TASKING 示例

```json
{
    "build": {
        "command": "C:\\TASKING\\TriCore\\vx-toolset\\bin\\cctc.exe -t makefile.mak all",
        "work_dir": "D:\\workspace\\MyProject\\TriCore Debug (TASKING)",
        "timeout": 300
    },
    "project": {
        "elf_file": "D:\\workspace\\MyProject\\TriCore Debug (TASKING)\\project.elf",
        "map_file": "D:\\workspace\\MyProject\\TriCore Debug (TASKING)\\project.map",
        "mdf_file": "D:\\workspace\\MyProject\\TriCore Debug (TASKING)\\project.mdf",
        "toolchain": "tasking"
    }
}
```

### GCC 示例

```json
{
    "build": {
        "command": "make -j4 all",
        "work_dir": "D:\\workspace\\MyProject\\build",
        "timeout": 300
    },
    "project": {
        "elf_file": "D:\\workspace\\MyProject\\build\\project.elf",
        "lst_file": "D:\\workspace\\MyProject\\build\\project.lst",
        "toolchain": "gcc"
    }
}
```

> 完整配置说明请参考 [docs/mcp_config_guide.md](docs/mcp_config_guide.md)。

---

## 常见问题

**Q: AURIXFlasher.exe 找不到？**
A: 这是 Infineon 闭源商业工具，不随本包分发。请从 [Infineon 官网](https://www.infineon.com/cms/en/tools/landing/aurix-tools/aurix-flasher-software-tool/) 下载安装，然后在 `mcp_config.json` 中配置 `aurix_flasher_exe` 路径。如果不需要 PFlash 烧写，可忽略此项。

**Q: wiggle 命令超时？**
A: 大容量 DFlash 全擦可能需要较长时间，在 `mcp_config.json` 中调大 `timeout`（如 300）。

**Q: 如何连接远程 TAS Server？**
A: 将 `server` 字段改为远程机器 IP，确保目标机器上 TAS Server 正在运行且 TCP:2000 端口可达。

**Q: 多目标设备如何选择？**
A: 先用 `wiggle_list()` 查看所有已连接目标，然后在后续调用中通过 `target` 参数指定。
