usb_burning_tool 是如何“看见”Amlogic 板子的?一文讲透底层识别机制
你有没有过这样的经历:
手握一根 Micro-USB 线,把一块还没跑系统的 Amlogic 开发板连上电脑,打开usb_burning_tool,几秒后——“设备已连接”四个大字赫然跳出?
那一刻,仿佛有种魔法在发生。没有操作系统、没有驱动加载、甚至连 bootloader 都没启动,这工具是怎么“认出”这块板子的?它真的能穿越硬件的沉默,直接和芯片对话?
今天我们就来揭开这个看似“黑箱”的过程。不玩虚的,从电平触发到 USB 枚举,从 BootROM 到私有协议握手,带你一步步看清楚:usb_burning_tool 到底是如何识别 Amlogic 目标板的。
为什么普通 U盘能被识别,而烧录模式也能?
我们先从一个熟悉场景说起。
当你插入一个 U盘,Windows 会自动弹窗:“要打开文件夹查看内容吗?” 这背后是标准的USB 枚举流程:主机读取设备描述符,发现它是大容量存储类(Mass Storage Class),于是加载对应驱动。
但我们的目标板此时根本不是 U盘,也没有任何系统运行。那它是怎么被识别的?
答案是:它伪装成了一个特殊的“烧录用 USB 设备”——而这套“变装术”,是由芯片出厂就写死的BootROM控制的。
关键角色登场:BootROM,一切的起点
所有 Amlogic SoC(如 S905X、A311D、S905Y4)内部都藏着一段不可修改的代码,叫做BootROM(也叫 MaskROM)。它不像 bootloader 可以更新,它是物理刻在芯片里的,上电即执行。
它的任务很明确:
1. 初始化最基本的时钟与内存控制器;
2. 检查有哪些可能的启动源(SD卡?eMMC?SPI NAND?USB?);
3. 如果满足特定条件,就进入USB 烧录模式。
那么问题来了:什么条件能让它选择 USB?
如何让板子“听话”进入烧录模式?
常见方式有三种:
| 触发方式 | 实现方法 |
|---|---|
| GPIO 引脚拉低 | 将RECOVERY或BOOT_MODE引脚接地(比如用镊子短接测试点) |
| 无有效引导程序 | eMMC 中没有合法的 uboot,自动跳入恢复模式 |
| 按键组合 | 上电时长按“电源 + 音量下”等组合键 |
一旦命中任一条件,BootROM 就不再尝试从 Flash 启动,转而初始化USB PHY 模块,并把自己的身份广播出去:“我是一个等待烧录的 Amlogic 芯片,请用专用工具来找我。”
这时候,它就不再是“未知设备”,而是变成了一个带有固定身份标签的 USB 设备。
它是谁?VID 和 PID 的硬编码匹配
现在设备已经上线了,但你的电脑并不会自动知道它是谁。这时就需要一把“钥匙”去开门——这就是Vendor ID (VID)和Product ID (PID)。
Amlogic 在 USB-IF 组织注册了自己的厂商 ID:
- VID = 0x1b8e(Amlogic 公司唯一标识)
而在烧录模式下,不同芯片或阶段使用的 PID 也有所不同:
- PID = 0xc003:最常见于 S905 系列芯片的 MaskRom 模式
- PID = 0xd007:部分新芯片(如 A311D)使用的新标识
此外,设备类型被设置为:
- Class = 0xFF:表示这是一个厂商自定义类设备(Vendor-Specific),操作系统不会自动处理,需要用户态工具介入。
这就相当于给设备贴了个独一无二的标签:
“我是 Amlogic 家的孩子,我现在在等烧录,别拿普通U盘驱动来试我。”
usb_burning_tool 怎么找到它的?轮询 + 匹配
既然设备已经上线,并且亮出了自己的身份(VID/PID),接下来就是上位机工具的工作了。
usb_burning_tool在后台做的事情其实并不复杂:它持续监听 USB 总线上的插拔事件,并不断扫描当前连接的所有 USB 设备,查找是否有一个设备符合以下条件:
if (device.idVendor == 0x1b8e && device.idProduct == 0xc003)如果匹配成功,界面立刻显示“设备已连接”。
这个过程就像机场安检人员拿着名单逐个核对旅客护照:
- 不是你?走开。
- 是你?留下谈话。
为了提高容错性,工具还支持热插拔重试。哪怕第一次接触不良没识别上,只要重新插一次,它还能继续找。
而且更厉害的是,它可以同时识别多个 Amlogic 设备——这对产线批量刷机来说太重要了。
找到了还不算完:还得“对暗号”
你以为 VID/PID 匹配完就可以开始烧录了?Too young.
光长得像还不够,得确认你是“真·Amlogic 芯片”,而不是某个冒牌货或者旧版本异常设备。于是,下一步就是协议握手。
握手流程:一场芯片级的身份验证
典型的握手步骤如下:
- 发送 CMD_GET_INFO
- 请求芯片型号、DRAM 大小、支持的烧录模式等基本信息。 - 接收响应数据包
- 若返回合理值(比如 DRAM=2GB, Chip=S905X3),说明设备状态正常。 - 发送 CMD_READ_CHIP_ID
- 获取唯一芯片序列号,用于日志追踪和防呆设计。 - 协商传输参数
- 确定最大数据包长度、超时时间、是否启用校验等。
这些命令属于 Amlogic 自研的USB Burning Protocol,采用批量传输(Bulk Transfer)方式进行通信。
命令结构长什么样?
一般是一个带头部的结构体:
struct burning_cmd { uint32_t cmd_id; // 命令类型,如 0x0001 表示 GET_INFO uint32_t length; // 数据负载长度 uint8_t data[]; // 可选数据 };例如,当 host 发送cmd_id = 0x0001,target 收到后解析命令,填充相关信息,再通过 IN 端点回传给 host。
只有顺利完成这一轮“对答如流”,工具才会真正认为:“OK,这是个合法的目标板,可以开始烧录了。”
底层通信靠什么?批量传输 + 自定义类接口
整个通信基于 USB 的批量传输(Bulk Transfer)模式,有两个关键端点:
- Bulk OUT Endpoint:host → target,用来下发命令和固件数据
- Bulk IN Endpoint:target → host,用于返回状态、读取结果
为什么不走控制传输?因为控制传输只适合小数据量配置,而我们要传的是几十甚至上百 MB 的镜像文件。
至于设备类为何设为0xFF(Vendor-Specific),是因为这种烧录功能压根不在 USB 标准设备类里。操作系统看到这类设备,通常只会提示“未知设备”,不会自动加载驱动。
但在 Windows 上,为了让工具能直接访问设备,往往需要用Zadig 工具将原始驱动替换为 WinUSB 或 libusbK,这样才能绕过系统限制,实现用户态直接通信。
Linux 下则更简单,libusb 直接可用,无需额外驱动。
实战演示:用 libusb 模拟识别逻辑
虽然usb_burning_tool是闭源软件,但我们完全可以自己写一段代码,模拟它的核心识别逻辑。
下面是一个基于 libusb 的简化版设备查找程序:
#include <libusb.h> #include <stdio.h> #define AMLOGIC_VID 0x1b8e #define MASKROM_PID 0xc003 int find_amlogic_device() { libusb_context *ctx = NULL; libusb_device_handle *handle = NULL; ssize_t cnt; libusb_device **devs; libusb_init(&ctx); cnt = libusb_get_device_list(ctx, &devs); printf("Scanning %ld connected USB devices...\n", cnt); for (int i = 0; i < cnt; i++) { struct libusb_device_descriptor desc; libusb_device *dev = devs[i]; libusb_get_device_descriptor(dev, &desc); if (desc.idVendor == AMLOGIC_VID && desc.idProduct == MASKROM_PID) { printf("✅ Found Amlogic MaskRom device: " "VID=0x%04x, PID=0x%04x\n", desc.idVendor, desc.idProduct); handle = libusb_open_device_with_vid_pid(ctx, AMLOGIC_VID, MASKROM_PID); if (handle) { printf("💡 Device opened successfully. Ready for commands.\n"); libusb_close(handle); libusb_free_device_list(devs, 1); return 0; } } } printf("❌ No Amlogic target device found.\n"); libusb_free_device_list(devs, 1); return -1; }这段代码干了三件事:
1. 初始化 libusb 上下文;
2. 遍历所有 USB 设备;
3. 查找 VID=0x1b8e 且 PID=0xc003 的设备。
如果你在开发定制化烧录工具,这就是最基础的第一步。
当然,真实工具还会做更多事:比如发送CMD_READ_CHIP_ID来区分芯片型号,动态选择烧录策略;或者加入 CRC 校验、断点续传等功能。
工程实践中常见的“坑”与对策
理论很美好,现实常翻车。以下是开发者常遇到的问题及应对方案:
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 工具无法识别设备 | USB 线质量差,仅供电不通数据 | 更换为全功能数据线 |
| 显示“设备已连接”但无法烧录 | Windows 未安装 WinUSB 驱动 | 使用 Zadig 替换驱动 |
| 烧录中途断开 | 板子供电不足(尤其是接多块时) | 使用带外接电源的 USB Hub |
| 多块板子同时连接冲突 | 工具无法区分具体哪一块 | 改为逐个操作,或结合序列号绑定 |
| 新芯片不被识别 | PID 不在工具白名单中(如 0xd007) | 升级最新版工具或手动添加支持 |
还有一些设计建议值得参考:
- PCB 上预留烧录测试点:把
RECOVERY引脚引出来,方便短接到地; - USB 接口信号完整性要好:避免使用过长走线或劣质连接器;
- 电源设计留余量:烧录时电流可达 500mA 以上,确保稳压模块扛得住;
- 量产环境自动化:调用
usb_burning_tool的命令行版本,配合脚本实现一键刷机。
结语:这不是魔法,是精密的软硬协同工程
回到最初的问题:
usb_burning_tool 是如何识别 Amlogic 目标板的?
答案可以总结为一句话:
通过 BootROM 主动暴露一个具有固定 VID/PID 的自定义 USB 设备,再由上位机工具通过轮询匹配+协议握手完成精准识别与通信建立。
这背后没有魔法,只有层层嵌套的工程设计:
- 芯片级:BootROM 提供可信入口;
- 协议层:USB 枚举 + 私有命令集保障安全交互;
- 应用层:工具实现自动化检测与容错机制;
- 工程侧:软硬协同优化稳定性和效率。
理解这套机制,不仅能帮你快速排查烧录失败问题,也为后续开发自动化产线系统、构建自有烧录平台打下坚实基础。
下次当你再次看到“设备已连接”时,希望你知道——那不仅是四个字,而是一场跨越软硬边界的精密对话,刚刚悄然完成。
如果你正在做智能终端研发、产线部署或定制化烧录方案,欢迎留言交流实战经验。