ESP32-P4-Function-EV-Board 在 Linux/WSL 下编译 NuttX usbconsole 示例

📅 2026/7/15 3:29:23
ESP32-P4-Function-EV-Board 在 Linux/WSL 下编译 NuttX usbconsole 示例
文章目录前言目录规划获取 NuttX 源码安装 RISC-V 工具链准备 Python 和 esptool配置 PATH处理 kconfig-tweak配置 usbconsole编译 NuttXWSL2 下连接 ESP32-P4 USB 设备Windows 安装 usbipd-winWSL 中确认设备烧录打开 NuttX 控制台常见问题1. make 找不到2. 误用了旧 RISC-V 工具链3. /dev/ttyS4 权限被拒绝4. /dev/ttyACM0 不存在总结前言本文记录在 Linux/WSL 环境下为ESP32-P4-Function-EV-Board搭建 Apache NuttX 编译环境并构建、烧录usbconsole示例的完整过程。usbconsole配置会使用 ESP32-P4 的 USB Serial/JTAG 外设作为 NuttX 控制台。对于 ESP32-P4-Function-EV-Board v1.5.2开发板连接到 PC 后通常表现为 USB Serial/JTAG 设备烧录和串口控制台都可以通过同一个 USB 口完成。本文使用的环境系统Ubuntu on WSL2开发板ESP32-P4-Function-EV-BoardNuttX 配置esp32p4-function-ev-board:usbconsole工具链xPackriscv-none-elf-gcc 14.2.0烧录工具esptool 5.3.1目录规划创建一个工作目录mkdir-p~/esp32p4-nuttxcd~/esp32p4-nuttxNuttX 推荐源码目录结构是nuttx和apps并列esp32p4-nuttx/ ├── apps ├── nuttx └── toolchains获取 NuttX 源码cd~/esp32p4-nuttxgitclone--depth1https://github.com/apache/nuttx.git nuttxgitclone--depth1https://github.com/apache/nuttx-apps.git apps确认 ESP32-P4-Function-EV-Board 的usbconsole配置存在cd~/esp32p4-nuttx/nuttxlsboards/risc-v/esp32p4/esp32p4-function-ev-board/configs/usbconsole安装 RISC-V 工具链ESP32-P4 是 RISC-V 架构。这里使用 NuttX 文档推荐的 xPack RISC-V GCCcd~/esp32p4-nuttxmkdir-ptoolchains/downloads toolchains/riscv-none-elf-gcccurl-L\-otoolchains/downloads/xpack-riscv-none-elf-gcc-14.2.0-3-linux-x64.tar.gz\https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-3/xpack-riscv-none-elf-gcc-14.2.0-3-linux-x64.tar.gztar-Ctoolchains/riscv-none-elf-gcc\--strip-components1\-xzftoolchains/downloads/xpack-riscv-none-elf-gcc-14.2.0-3-linux-x64.tar.gz验证工具链~/esp32p4-nuttx/toolchains/riscv-none-elf-gcc/bin/riscv-none-elf-gcc--version正常输出类似riscv-none-elf-gcc (xPack GNU RISC-V Embedded GCC x86_64) 14.2.0准备 Python 和 esptoolNuttX 生成 ESP32-P4 镜像时需要esptool.pypython3-mpipinstall--user--upgradepip setuptools wheel python3-mpipinstall--useresptool验证~/.local/bin/esptool.py version如果系统环境使用了 SOCKS 代理但 Python 没有安装 SOCKS 支持可能会遇到Missing dependencies for SOCKS support这种情况下可以临时清除代理变量后安装env-uhttp_proxy-uhttps_proxy-uHTTP_PROXY-uHTTPS_PROXY-uALL_PROXY-uall_proxy\python3-mpipinstall--useresptool配置 PATH为了避免误用系统里较旧的riscv64-unknown-elf-*工具链建议显式设置 PATHexportPATH$HOME/esp32p4-nuttx/local-bin:$HOME/.local/bin:$HOME/esp32p4-nuttx/toolchains/riscv-none-elf-gcc/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin确认工具链路径whichriscv-none-elf-gcc riscv-none-elf-ld riscv-none-elf-gcc--version输出路径应该指向/home/user/esp32p4-nuttx/toolchains/riscv-none-elf-gcc/bin/...如果链接时出现下面的错误通常就是工具链 PATH 错了riscv64-unknown-elf-ld: Invalid or unknown z ISA extension: zifencei修正 PATH 后可以清理并重新编译makecleanmake-j$(nproc)处理 kconfig-tweak部分 Linux 环境没有安装kconfig-frontends执行configure.sh时可能报错kconfig-tweak: command not found如果系统可以安装依赖可以安装 kconfig 工具。若是在普通 WSL 用户环境中也可以准备一个本地kconfig-tweak兼容脚本放到~/esp32p4-nuttx/local-bin/kconfig-tweak然后保证local-bin在 PATH 前面。这个脚本只需要支持 NuttX 配置流程中用到的--file、--enable、--disable、--undefine等基础操作即可。配置 usbconsole进入 NuttX 源码目录cd~/esp32p4-nuttx/nuttx选择 ESP32-P4-Function-EV-Board 的usbconsole配置./tools/configure.sh esp32p4-function-ev-board:usbconsole补全默认配置makeolddefconfig可以检查关键配置项grep-ECONFIG_ARCH_BOARD|CONFIG_ESPRESSIF_USBSERIAL|CONFIG_SYSTEM_NSH|CONFIG_EXAMPLES_HELLO.config关键项应包含CONFIG_ARCH_BOARDesp32p4-function-ev-board CONFIG_ESPRESSIF_USBSERIALy CONFIG_SYSTEM_NSHy CONFIG_EXAMPLES_HELLOy编译 NuttX执行make-j$(nproc)第一次编译会自动拉取 Espressif HALCloning Espressif HAL for 3rd Party Platforms编译成功后会生成nuttx nuttx.hex nuttx.bin nuttx.map可以查看产物ls-lhnuttx nuttx.bin nuttx.hex nuttx.map示例输出-rwxr-xr-x 1 test test 378K nuttx -rw-r--r-- 1 test test 221K nuttx.bin -rw-r--r-- 1 test test 390K nuttx.hex -rw-r--r-- 1 test test 1.4M nuttx.mapWSL2 下连接 ESP32-P4 USB 设备如果是在原生 Linux 下开发板通常会直接出现为/dev/ttyACM0。如果是在 WSL2 下Windows 中看到的是COM4直接使用/dev/ttyS4可能会遇到Could not configure port: (5, Input/output error)这种情况下推荐使用usbipd-win将 USB 设备直通到 WSL。Windows 安装 usbipd-win在 Windows PowerShell 中执行winget install--interactive--exact dorssel.usbipd-win安装后重新打开 PowerShell。查看 USB 设备usbipd listESP32-P4 设备类似BUSID VID:PID DEVICE 2-1 303a:1001 USB 串行设备 (COM4), USB JTAG/serial debug unit使用管理员 PowerShell 绑定并挂载到 WSLusbipd bind--busid 2-1 usbipd attach--wsl--busid 2-1WSL 中确认设备回到 WSLlsusb应能看到303a:1001 Espressif USB JTAG/serial debug unit加载 CDC ACM 驱动sudomodprobe cdc_acm检查串口节点ls-l/dev/ttyACM*如果出现/dev/ttyACM0但权限不足可以临时修改权限sudochmod666/dev/ttyACM0烧录进入 NuttX 目录cd~/esp32p4-nuttx/nuttx烧录makeflashESPTOOL_PORT/dev/ttyACM0ESPTOOL_BINDIR./成功日志类似Connected to ESP32-P4 on /dev/ttyACM0: Chip type: ESP32-P4 (revision v3.2) Features: Dual Core LP Core, 400MHz USB mode: USB-Serial/JTAG Stub flasher running. Changing baud rate to 921600... Changed. Configuring flash size... Wrote 225352 bytes (...) at 0x00002000 ... Hash of data verified. Hard resetting via RTS pin...看到Hash of data verified就说明固件已经成功写入。打开 NuttX 控制台烧录后可以通过同一个/dev/ttyACM0访问 NuttX 控制台python3-mserial.tools.miniterm /dev/ttyACM0115200或者使用picocompicocom-b115200/dev/ttyACM0进入控制台后可以运行nsh help nsh hellohello示例来自CONFIG_EXAMPLES_HELLOy。常见问题1. make 找不到如果设置 PATH 时误换行可能导致系统路径丢失make: command not found恢复 PATHexportPATH$HOME/esp32p4-nuttx/local-bin:$HOME/.local/bin:$HOME/esp32p4-nuttx/toolchains/riscv-none-elf-gcc/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin2. 误用了旧 RISC-V 工具链错误表现riscv64-unknown-elf-ld: Invalid or unknown z ISA extension: zifencei检查whichriscv-none-elf-gcc riscv-none-elf-ld确保指向 xPack 工具链目录。3. /dev/ttyS4 权限被拒绝错误Permission denied: /dev/ttyS4可以加入串口组sudousermod-aGdialout$USER然后在 Windows PowerShell 中执行wsl--shutdown重新打开 WSL 后生效。不过对于 WSL2更推荐使用usbipd-win让设备在 WSL 内显示为/dev/ttyACM0。4. /dev/ttyACM0 不存在确认 USB 是否 attach 到 WSLlsusbdmesg|tail-80加载驱动sudomodprobe cdc_acm如果仍然没有/dev/ttyACM0可以在 Windows 侧确认usbipd list设备状态应为 attached。总结整个流程可以概括为克隆nuttx和nuttx-apps。安装 xPackriscv-none-elf-gcc。安装esptool。配置esp32p4-function-ev-board:usbconsole。执行make -j$(nproc)生成nuttx.bin。WSL2 下用usbipd-win将 ESP32-P4 USB Serial/JTAG 设备挂载到 WSL。使用/dev/ttyACM0执行make flash。最终烧录成功后usbconsole就可以通过 USB Serial/JTAG 口进入 NuttX NSH 控制台。