一键导入
upy-gen-driver
从 PDF 数据手册或 Arduino/C++ 代码生成 MicroPython 驱动。当 upypi 和 GitHub 均无驱动时使用。流程:提取→生成调试版→硬件验证循环→脱调试→规范化。触发:upy-analyze 搜不到驱动时调用,或用户直接 /upy-gen-driver。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
从 PDF 数据手册或 Arduino/C++ 代码生成 MicroPython 驱动。当 upypi 和 GitHub 均无驱动时使用。流程:提取→生成调试版→硬件验证循环→脱调试→规范化。触发:upy-analyze 搜不到驱动时调用,或用户直接 /upy-gen-driver。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Analyze MicroPythonOS App ideas directly or when invoked by mpos-plan-app. Use to turn natural-language MPOS App requests into requirements, default app identity, manifest draft, Activity/Service plan, MPOS/LVGL API plan, dependency risk, test/deploy plan, mandatory MicroPythonOS resource links, and a JSON handoff before code generation.
Deploy or preview a MicroPythonOS app on desktop, web, device copy, MPK install, or installer/flash guidance paths. Use when Codex needs to launch a confirmed app for manual preview, copy it to a board with mpremote, validate an MPK on-device, or route firmware install and erase to install.micropythonos.com. Does not own app generation, static lint, packaging, or default smoke testing.
MicroPythonOS 基础开发知识库。提供代码架构、App/MPK 约束、LVGL 编程约定、MPY API reference、官方 docs 专题 reference、AGENTS 本地强约束。mpos-plan-app / mpos-analyze-app / mpos-prepare-deps / mpos-gen-app / mpos-test-app / mpos-package-app / mpos-deploy-app / mpos-publish-app 均依赖此 skill。
Generate, update, and repeatedly repair MicroPythonOS App code after requirements are confirmed. Use after mpos-analyze-app and optionally mpos-prepare-deps to create or modify an internal_filesystem/apps package directory with root MANIFEST.JSON, root icon_64x64.png, assets/*.py entrypoints/dependencies, dependency adapters, and validation results. Always defaults to a two-phase flow: first produce a generation plan and ask for confirmation, then write files only after explicit user confirmation. Supports repeated calls for user feature changes and test-failure repair loops. Does not analyze vague requirements, prepare external dependencies, package MPK files, deploy devices, flash firmware, publish to upystore, or rebuild lvgl_micropython.
Package and validate a single MicroPythonOS App as an MPK release artifact. Use when Codex needs to create a .mpk, validate an MPOS App manifest/icon/package structure, emit one app_index_entry.json fragment, run optional temporary install validation, or prepare AppStore/upystore publishing artifacts without uploading.
Orchestrate a MicroPythonOS App workflow across analyze, dependency preparation, generation, testing, packaging, deployment, and upystore publishing. Use when Codex needs to start from a natural-language app request, continue or resume an interrupted MPOS app task, decide the next mpos-* skill, maintain per-app plan_state.json and activity_log.jsonl under tmp/mpos-plan-app, handle user requirement changes with invalidation confirmation, or run the default path through mpos-publish-app. Does not implement code, download dependencies, test, package, deploy, flash, or upload directly.
| name | upy-gen-driver |
| description | 从 PDF 数据手册或 Arduino/C++ 代码生成 MicroPython 驱动。当 upypi 和 GitHub 均无驱动时使用。流程:提取→生成调试版→硬件验证循环→脱调试→规范化。触发:upy-analyze 搜不到驱动时调用,或用户直接 /upy-gen-driver。 |
从非 MicroPython 来源(PDF 数据手册、Arduino/C++ 代码、芯片型号)生成规范化的 MicroPython 驱动。独立 skill,可被 upy-analyze、upy-autofix 或用户直接调用。
核心流程:提取 → 生成调试版 → 硬件验证 → 脱调试 → 规范化。
执行顺序硬性约束:Step 3 完成前,禁止执行 Step 4;Step 3 完成前,禁止执行 Step 5。每一步进入前检查前置条件。
mpremote 可用(硬件验证阶段需要)pymupdf(PDF 提取)根据用户提供的材料判断走哪条路径:
├─ PDF 数据手册(.pdf) → Step 1A
├─ Arduino/C++ 代码(.ino/.cpp) → Step 1B
├─ GitHub Arduino 仓库 URL → git clone → Step 1B
└─ 仅芯片型号 → WebSearch datasheet → 下载 PDF → Step 1A
python G:/MicroPython_Skills/upy-gen-driver/scripts/extract_pdf.py \
--input {datasheet.pdf} \
--output {chip}_text.json
输出 JSON 结构:
{
"source": "datasheet.pdf",
"pages": [
{"num": 1, "text": "页面完整文本..."},
{"num": 2, "text": "页面完整文本..."}
]
}
脚本只做纯文本提取(pymupdf),不做任何理解。保留页码便于引用。
LLM 阅读提取的文本,理解并显式输出以下清单(写入 {chip}_understanding.json):
_gain → GAIN bit, _vref → VREF bit, _mode → CM bit),每个 setter 的独立边界(谁管什么,互不越界)python G:/MicroPython_Skills/upy-gen-driver/scripts/convert_arduino.py \
--input {source.ino} \
--output {chip}_mapping.json
输出 JSON 结构:
{
"source": "source.ino",
"includes": ["Wire.h", "SPI.h"],
"global_vars": [{"name": "sensor_addr", "value": "0x44"}],
"functions": [
{"name": "readSensor", "return_type": "float", "params": [], "line": 42}
],
"api_mapping": [
{"arduino": "Wire.beginTransmission(0x44)", "mpy": "i2c.writeto(0x44, buf)", "line": 45}
],
"has_setup_loop": true,
"logic_summary": "setup() 中初始化 Wire,loop() 中每 2 秒读取一次传感器数据并通过 Serial 打印"
}
脚本做 API 映射表查询 + 代码结构提取,不翻译代码。
LLM 同时读取:
翻译原则:
loop() 中的轮询 → MPY 中用 callback 或 timer 替代delay() → MPY 中用 time.sleep_ms() 或异步方式Serial.print() → MPY 中用 print() 或 logging输出文件:firmware/drivers/{chip}_driver/{chip}_debug.py
生成前,先根据 {chip}_understanding.json 确定以下分支,再套用对应模板:
通信协议?
├─ I2C → 自检含 i2c.scan() + 地址验证
├─ SPI → 自检含 CS 引脚切换 + 回读测试
└─ UART → 自检含 AT 指令往返验证
芯片识别?
├─ 有 ID 寄存器 → 读取并比对期望值
└─ 无 ID 寄存器 → 用寄存器读写回验证替代(写入已知值→读回→断言)
数据就绪?
├─ 状态寄存器轮询 → while not (read_status() & MASK): sleep_ms(N), 加 timeout 上限
├─ 硬件引脚中断 → 等待 pin.value() == 0, 加 timeout 上限
└─ 固定延时 → time.sleep_ms(conversion_time + margin)
数据完整性?
├─ 有 CRC/校验 → 读数据后验证完整性,校验失败 raise RuntimeError
└─ 无 CRC/校验 → 跳过
调试版必须包含以下自检步骤(按芯片实际情况取舍,不适用则跳过):
# === 文件头:芯片信息 + 数据来源 ===
print("=" * 50)
print("Driver: {chip} ({protocol}: {detail})")
print("Source: {datasheet.pdf Page X / Arduino code}")
print("=" * 50)
# === [连接验证] 按协议选择 ===
# I2C: 扫描总线
print("[INIT] I2C scan...")
i2c_devices = i2c.scan()
print(" Found: %s" % [hex(a) for a in i2c_devices])
if 0xXX not in i2c_devices:
print(" [FAIL] Device 0x%02X not found!" % 0xXX)
print(" [HINT] Check wiring / power / pull-up resistors")
# SPI: 读已知寄存器(如 WHO_AM_I 或配置寄存器默认值)
# UART: 发送 AT 并检查响应
# === [初始化] 复位 + 默认值验证 ===
print("[INIT] Reset device...")
reset() # 或发送 RESET 命令 / 拉低 RESET 引脚
time.sleep_ms(N) # datasheet 规定的复位后等待时间
# 读取默认配置寄存器,验证与 datasheet 默认值一致
# === [身份识别] 有 ID 寄存器则验证,无则跳过 ===
# 有 ID 寄存器时:
print("[INIT] Read ID register (0x%02X)..." % ID_REG)
val = read_reg(ID_REG)
print(" Value: 0x%02X (expected: 0x%02X)" % (val, EXPECTED_ID))
if val != EXPECTED_ID:
print(" [FAIL] ID mismatch! Got 0x%02X, expected 0x%02X" % (val, EXPECTED_ID))
print(" [HINT] Check protocol config / wiring / datasheet Page X")
# 无 ID 寄存器时:用寄存器读写回替代
print("[INIT] Communication sanity check (write → read-back)...")
test_patterns = [0x00, 0x55, 0xAA] # 选可安全写入的寄存器
for pat in test_patterns:
write_reg(CONFIG_REG, pat)
rb = read_reg(CONFIG_REG)
if rb != pat:
print(" [FAIL] Wrote 0x%02X, read-back 0x%02X" % (pat, rb))
else:
print(" [OK] Write 0x%02X → read-back 0x%02X" % (pat, rb))
# === [初始化序列] 逐步写入寄存器,逐项 read-back ===
print("[INIT] Configuration sequence...")
init_seq = [(REG_A, VAL_A, "说明A"), (REG_B, VAL_B, "说明B"), ...]
for reg, val, desc in init_seq:
write_reg(reg, val)
rb = read_reg(reg)
if rb != val:
print(" [FAIL] %s: reg 0x%02X wrote 0x%02X, read-back 0x%02X" % (desc, reg, val, rb))
# 只写寄存器:标注 "write-only, skipping read-back"
else:
print(" [OK] %s (reg 0x%02X = 0x%02X)" % (desc, reg, val))
# === [功能验证] 读取一次数据 / 发送一次指令 ===
print("[TEST] Functional test...")
try:
data = read_sensor()
print(" Reading: %s" % str(data))
except Exception as e:
print(" [FAIL] %s" % e)
import sys
sys.print_exception(e)
# === 最终判定 ===
print("=" * 50)
print("SELF_TEST_PASS") # 或 print("SELF_TEST_FAIL: <原因>")
关键要求:
__init__ 必须将芯片置于已知状态(调用 reset 或读取当前配置确认)__init__ 顶部参数校验:检查 bus 类型(I2C/SPI/UART)、address 范围(0x00-0x7F for I2C)、参数合法性,失败立即 raise TypeError / ValueError_gain/_vref 等实例变量追踪当前值,且每个 setter 只修改自己负责的状态,禁止跨 setter 污染while True 轮询。用 ticks_ms()/ticks_diff() 或 for _ in range(max_iterations) 限界。超时后 raise RuntimeError 并附排查提示try/except OSError,转为 RuntimeError 并附描述性消息(设备地址/寄存器/期望操作)buf = bytearray(N),避免 MicroPython heap 碎片循环上限:10 轮。
此步骤不可跳过。若当前环境无 MicroPython 设备,必须暂停并询问用户,禁止直接进入 Step 4。
mpremote devs
| 输出 | 行动 |
|---|---|
| 有 COM 口列表 | 记录 COM 口,进入 3A |
| 无输出(无设备) | 暂停,输出 [HALT] No MicroPython device detected. Please connect device and tell me the COM port, or type "skip" to skip hardware verification. 禁止在用户确认前继续执行。 |
若用户明确输入 "skip" 跳过硬件验证,则直接跳到 Step 4,并在最终输出中标注"⚠️ 未经硬件验证"。
mpremote connect {COM} resume run firmware/drivers/{chip}_driver/{chip}_debug.py
使用 resume run 而非 fs cp —— 通过 REPL 送入执行,不写 flash,秒级反馈。
| 输出 | 判断 | 行动 |
|---|---|---|
SELF_TEST_PASS | 全部自检通过 | 退出循环,进入 Step 4 |
ID/known-value mismatch | 芯片识别失败或通信异常 | 查 datasheet 确认 ID 寄存器地址/期望值;若芯片无 ID 寄存器,检查寄存器读写回测试是否使用了只写寄存器 |
read-back mismatch | 时序问题或寄存器为只写 | 加延时 / 查 datasheet 确认该寄存器读写权限 |
| AT 响应格式不符 | 指令/波特率/解析有误 | 调整指令格式 / 尝试不同波特率 |
| 初始化卡住 | 某步超时或就绪位未置位 | 加 timeout / 改用 polling 替代固定延时 / 检查数据就绪方式是否正确 |
| 设备崩溃无响应 | 代码导致 crash | mpremote connect {COM} soft-reset → 下一轮 |
| 总线扫描为空 / 设备无应答 | 硬件连接问题或协议配置错误 | 输出排查指引(接线/供电/上拉/CS 引脚/波特率),暂停循环 |
前置条件(必须全部满足,否则禁止执行 Step 4):
| # | 条件 | 验证方式 |
|---|---|---|
| 1 | Step 3 硬件验证循环已执行 | 最近一次 mpremote resume run 有输出 |
| 2 | 最后一次运行输出 SELF_TEST_PASS | 输出中出现 SELF_TEST_PASS |
| 3 | 调试版文件存在 | firmware/drivers/{chip}_driver/{chip}_debug.py 存在 |
若任一条件不满足 → 回到 Step 3 完成硬件验证,不得跳过。
硬件验证通过后:
[INIT] [1/5]...、[TX]/[RX] 等)_self_test() 私有方法(默认不调用)scan() 公共方法;SPI: 读取已知寄存器;UART: AT 探测)__init__ → 公共方法 → 私有方法 → deinit()__init__ 必须将芯片置于已知状态(调用硬件复位 / 发送 RESET 命令 / 读取并确认默认寄存器值)_gain、_vref 等实例变量追踪当前值。每个 setter 只修改自己负责的追踪变量,禁止跨 setter 污染。例如 set_gain() 不得修改 _vref;set_vref(VREF_EXTERNAL) 需提示用户自行设置 _vref 或提供参数传入外部参考电压值deinit() 方法:若芯片 datasheet 支持低功耗/休眠/待机模式,实现 deinit() 发送 POWERDOWN/STANDBY 命令,释放资源__del__:可添加 __del__ 在 GC 时自动调用 deinit(),用于低功耗场景输出:firmware/drivers/{chip}_driver/{chip}.py
Skill("upy-norm-driver")
传入 {chip}.py,执行全部 38 条 P0 规则检查与修复。
完成后输出规范化驱动。驱动就绪。
upy-analyze (upypi + GitHub 无结果)
↓
upy-gen-driver (本 skill)
├── scripts/extract_pdf.py ← PDF 文本提取
├── scripts/convert_arduino.py ← Arduino API 映射
├── mpremote resume run ← 硬件验证(mpremote-device-interaction)
└── Skill("upy-norm-driver") ← 规范化
↓
输出: firmware/drivers/{chip}_driver/{chip}.py
↓
可供 upy-generate (Phase 4) 使用
upy-analyze:搜不到驱动时调用本 skillupy-autofix:诊断为缺驱动时调用本 skillupy-norm-driver:规范化生成的驱动upy-generate:使用生成好的驱动继续主流程SELF_TEST_PASS 之前执行 Step 4/5。若当前环境无设备,必须暂停等待用户确认;不得以"当前无设备"为由跳过 Step 3。Step 4 有前置条件检查点,每次进入 Step 4 前必须自检。mpremote resume run:不改动 flash,快速迭代(Datasheet Page X, Table Y)ticks_diff() 或 for _ in range(N)),超时后 raise RuntimeError 附排查提示set_gain() 不得修改 _vref,set_vref() 不得修改 _gain。每个 setter 的边界在 {chip}_understanding.json 中显式定义