nextpnr 烧录器连接被拒绝:Connection refused / No device found 速查
更新时间:2026-10-23。FAQ 速查页,面向用开源链路(Yosys + nextpnr + iceprog/openFPGALoader/ecpprog)烧 iCE40 / ECP5 板子的同学。nextpnr 已经把
.bit比特流跑出来了,最后一步往板子里灌,烧录器却报找不到设备、连接被拒绝——这类错跟 RTL、约束、布局布线全无关,病灶在 USB 链路本身:枚举、权限、驱动抢占、跳帽档位、进程占用、虚拟机透传,六根轴顺一遍基本必中。注意与「权限篇」的分工:本篇是根本没枚举到或驱动/链路层面拒绝,如果lsusb能看到板子但工具打开时报LIBUSB_ERROR_ACCESS/Permission denied,那是设备节点权限问题,请转 nextpnr 权限被拒速查。
本文要回答的问题
Can't find iCE FTDI USB device与usb_claim_interface failed分别对应哪一层的问题?lsusb看不到板子和看得到但打不开,排查路线差在哪?- ftdi_sio 内核模块抢占了 FTDI 芯片怎么抢回来?
- WSL2 / 虚拟机里为什么天然看不到 USB 设备,怎么透传?
- 上次 openFPGALoader 没退干净占着设备,怎么确认与清理?
一、报错原文与典型现象
烧录阶段的报错集中在三个工具上,措辞不同但语义收敛(工程路径以 /proj/demo 占位):
$ iceprog /proj/demo/build/top.bin
init..
Can't find iCE FTDI USB device (vendor_id 0x0403, device_id 0x6010 or 0x6014).
ABORT.$ openFPGALoader -b ice40_generic /proj/demo/build/top.bin
No device found
Error: Failed to open device with vid:pid 0x0403:0x6010$ ecpprog /proj/demo/build/top.bit
init..
Can't find iCE FTDI USB device (vendor_id 0x0403, device_id 0x6010 or 0x6014).
ABORT.
$ openFPGALoader -b ulx3s /proj/demo/build/top.bit
usb_claim_interface failed: LIBUSB_ERROR_BUSY
Error: unable to open device: another process is using it读报错的关键是分清两档:「Can't find / No device found」是枚举层就输了——系统里根本没有这个 USB 设备对工具可见;「claim_interface failed / BUSY」是设备在,但被别的驱动或进程占着。两档走完全不同的排查分支,混着修会来回空转。
二、病因处置速查表
| 报错现象 / 场景 | 可能原因 | 快速验证 | 处置 |
|---|---|---|---|
| lsusb 完全看不到板子 | USB 线是充电线(只有供电没有数据线) | 换一根确认有数据的线再 lsusb | 换数据线,烧录线必带 D+/D- |
| lsusb 看不到,板子灯都不亮 | 板子没上电 / 跳帽不在 JTAG 档 | 看电源灯;查板子手册跳帽表 | 上电,跳帽拨到 JTAG/FLASH 位 |
| lsusb 看到 0403:6010 但工具找不到 | ftdi_sio 内核模块抢占 FTDI 通道 | lsmod | grep ftdi_sio 有输出 | sudo rmmod ftdi_sio,或写 udev 规则拉黑 |
| 报 claim_interface failed / BUSY | 上一进程(openFPGALoader/串口工具)占着设备 | sudo lsof /dev/bus/usb/001/005 | kill 占用进程后重烧 |
| Linux 真机一切正常,WSL2 里找不到 | WSL2 默认不透传 USB 设备 | WSL 里 lsusb 为空或缺板子 | Windows 侧 usbipd bind + usbipd attach --wsl |
| 虚拟机(VMware/VirtualBox)里找不到 | USB 控制器没接管设备 | 虚拟机 USB 设备列表无板子 | 虚拟机设置里把 FTDI 设备连进 guest |
| lsusb 能看到但工具报 ACCESS 类权限错 | 缺 udev 规则,普通用户摸不到节点 | ls -l /dev/bus/usb/... 权限位 | 转权限篇配 udev 规则(非本篇范畴) |
| 偶发找不到,重插就好 | USB 口供电不稳 / 线材接触不良 | 换口换线对比 | 换后置口、短数据线,HUB 换供电口 |
三、排查决策图
下面这张图是标准排查路线,颜色按角色区分:红是报错入口与命中的根因,蓝是排查动作,绿是通过分支,橙是修复动作,紫是防复发沉淀。
读这张图抓住一个分水岭:先跑 lsusb。枚举不到(左支)是物理与透传层的事——线、供电、跳帽、虚拟机,工具一行都轮不到出场;枚举到了(右支)才轮到驱动抢占与进程占用。报 BUSY 的可以直接跳到占用分支,不用走 lsusb 那道门。
四、逐条排查展开
第一步永远是 lsusb。 iCE40 / ECP5 开发板走 FTDI 芯片,VID:PID 最常见 0403:6010(iCE40-HX8K、iCEBreaker)与 0403:6014(部分 iCE40-UP5K 板)。烧录前跑:
lsusb | grep -i 0403
# 期望输出类似:
# Bus 001 Device 005: ID 0403:6010 Future Technology Devices International, Ltd FT2232C/D/H Dual UART/FIFO IC有这行,说明板子在 USB 总线上枚举成功,继续右支;没有这行,工具怎么调参数都白搭,直接进左支物理排查。
左支:充电线是头号嫌疑。 市面上大量 micro-USB / USB-C 线只接了 VBUS 与 GND 两根供电线,D+/D- 根本不通——板子插上电源灯亮、能跑旧固件,但主机端完全枚举不到。验证方法最笨也最快:换一根「传过数据」的线(比如给手机刷过机的线)。其次看板子本身:电源灯不亮是没上电;很多板子(如 iCEBreaker、ULX3S)有跳帽或拨码开关选「从 SPI FLASH 启动 / JTAG 直烧」档位,档位不对时 FTDI 通道不挂载,同样枚举不到——翻板子手册核对跳帽位。
虚拟机与 WSL2 是天然黑盒。 VMware/VirtualBox 的 USB 设备默认连宿主机,要在虚拟机设置里把 FTDI 设备「连接(断开与主机的连接)」进 guest。WSL2 更彻底:内核里根本没有 USB 主机控制器直通,必须在 Windows 侧装 usbipd-win,然后:
usbipd list
usbipd bind --busid <板子的busid>
usbipd attach --wsl --busid <板子的busid>attach 成功后 WSL 里 lsusb 才能看到板子。拔掉或 Windows 重启后要重新 attach,这是 WSL 用户「昨天还能烧今天就不行」的固定剧本。
右支:ftdi_sio 抢占是 Linux 桌面专属坑。 FT2232 这类双通道芯片插上后,内核的 ftdi_sio 模块会默认把它认领成两个串口(/dev/ttyUSB0/1),把接口占住;iceprog/openFPGALoader 用 libusb 直接认领时就会被拒或干脆跳过。确认与处置:
lsmod | grep ftdi_sio
sudo rmmod ftdi_sio # 抢回来,立即生效注意 rmmod 是临时手段,重启或重插会回来。要长期解决,写一条 udev 规则让内核别碰这个 VID:PID(或对工具放行),与权限篇的规则放同一文件即可。
进程占用:BUSY 报错的唯一来源。 上一次 openFPGALoader 异常退出(Ctrl-C 时机不巧、板子中途掉电)可能没释放接口;或者你开着串口终端连着 FTDI 的另一通道。定位占用者:
lsusb # 先确认板子的 Bus/Device 号,比如 001/005
sudo lsof /dev/bus/usb/001/005
ps aux | grep -E "openFPGALoader|iceprog|minicom|screen"kill 掉占用进程重烧即可。养好「烧录前不开串口终端、Ctrl-C 后等一下再拔板」的习惯,能躲开大半 BUSY。
最小复现一锤定音。 物理层修完后用探测命令闭环,不要直接拿真比特流试:
openFPGALoader --detect
# 期望列出 JTAG 链上的器件,如:
# idcode 0x21111043 lattice iCE40HX8K能列出器件型号,说明枚举、驱动、占用三关全过,烧真比特流就是顺理成章的事。再修不好就轮到权限问题——那已经是另一篇的领地了。
五、规范做法与预防
- 烧录线专用化:挑一根确认有数据线的短线贴上标签专供 FPGA,不跟充电线混放。
- 跳帽拍照存档:板子第一次跑通时把跳帽/拨码档位拍下来,换板换环境先对照照片。
- udev 规则装机即配:FTDI 规则(含 ftdi_sio 拉黑或权限放行)写进装机清单,比每次报错再查省事。
- WSL 透传脚本化:把
usbipd bind+attach写成 PowerShell 脚本放启动项,别每次手工敲。 - 烧录与串口分时段:调试期开串口看打印,烧录前关掉终端程序,避免通道互抢。
- 先 detect 再烧:脚本里
openFPGALoader --detect通过才执行真烧录,失败直接给出本页链接。
这一篇在知识体系里的位置
本篇是 FPGA 工具排错速查簇的一员,定位「nextpnr 出比特流之后烧不进去」:枚举层与驱动层的连接问题看本篇;lsusb 可见但报 Permission denied 的设备节点权限问题看 nextpnr 权限被拒速查;上游综合阶段同语义的「找不到工具/服务」报错看 Yosys 连接被拒绝速查;工具版本对不上导致 chipdb 报错的看 nextpnr 版本不匹配速查。lsusb、lsmod、lsof 三件排查套在各家工具间完全通用。
一句话总结
nextpnr 烧录器连接被拒绝先跑 lsusb 分档:枚举不到是物理层——换带数据的 USB 线、确认板子上电与 JTAG 跳帽档位、虚拟机/WSL2 把 FTDI 设备透传进来(usbipd attach);枚举到了但工具找不到或报 BUSY 是占用层——rmmod ftdi_sio 抢回被内核串口驱动占走的通道,lsof /dev/bus/usb/... 清掉残留占用进程;修完一律 openFPGALoader --detect 闭环复验,可见设备节点权限类报错(EACCES)转权限篇处理。烧录线专用化、udev 规则装机即配、透传脚本化,这类报错即可基本绝迹。