为单片机移植实时操作系统NuttX(Unix-like)

操作系统实时性最小资源需求功能丰富度适用场景
NuttX 强(微秒级) 6KB Flash+2KB RAM 高(POSIX + 网络 + 文件系统) 资源受限且需复杂功能的设备(如 ESP32、STM32)
FreeRTOS 强(微秒级) 2KB Flash+1KB RAM 中(无 POSIX / 网络,需额外集成) 极简场景(如纯控制类设备)
RT-Thread 强(微秒级) 4KB Flash+2KB RAM 高(国产,生态适配国内芯片) 国内嵌入式设备(如 STM32、GD32)
嵌入式 Linux(如 Buildroot) 弱(毫秒级) 4MB Flash+8MB RAM 极高(全 POSIX + 丰富软件) 资源充足的设备(如 Raspberry Pi、工业网关)

 

偶然发现的一个操作系统,很小巧,使用体验跟Linux差不多,还兼容POSIX,可以很方便地将Linux的程序移植到它上面。

小米在它的基础上实现了vela系统,但我看不出什么太大的差别,不过小米的中文文档可以参考下,毕竟小米招安了原作者。

官网文档:NuttX Documentation — NuttX latest documentation

小米vela文档:openvela 开源项目

在线体验:Demo

中文介绍:NuttX实时操作系统介绍(最详细)-CSDN博客

 

移植

安装依赖:sudo apt install kconfig-frontends

 

ESP32-C3 / C6:

#克隆esp官方工具
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh        #安装
. ./export.sh     #导出环境变量(注意前面有个'.',相当于source ./export.sh)

# 克隆NuttX的内核以及APP源码
git clone https://github.com/apache/nuttx
git clone https://github.com/apache/nuttx-apps.git

# 目录应该是这样的
esp-idf/
├─ nuttx/     # NuttX 内核源码
└─ nuttx-apps/   # NuttX 应用源码(含 nsh 等组件)

# 配置一个开发板:
cd nuttx/tools
# 先查看esp32c3这款芯片支持哪些开发板
./configure.sh -L | grep esp32c3
esp32c3-generic:spi
esp32c3-generic:i2schar
esp32c3-generic:nimble
esp32c3-generic:timers
esp32c3-generic:rmt
...

# 这里我选通用的开发板来配置:
./configure.sh esp32c3-generic:nsh  # 后面的nsh表示配置的这个镜像默认运行nsh终端,也可以其他的,例如:spi表示spi测试

# 编译
# 注:esp-idf提供的riscv编译器前缀是riscv32-esp-elf-,而nutty的默认编译器前缀是riscv64-unknown-elf-,需要改下,否则会找不到编译器
cd nuttx
make menuconfig CROSSDEV=riscv32-esp-elf-
make -j8 CROSSDEV=riscv32-esp-elf-

# 编译完成后会在nuttx根目录生成一个nuttx.bin,即镜像文件

# 烧录:
esptool --chip esp32c3 --port COM5 write_flash -z 0x0 nuttx.bin

# 重启并运行,注意:nutty的控制台是在esp32c3的硬件UART引脚(RX:20,TX:21),而不是USB口模拟的串口

注:C6 跟 C3 差不多,就是把上面的 c3 关键字换成 c6,这里就不多说了

 

ESP32-S3:

# 流程跟上面的ESP32-C3差不多,相同的就省略
# 配置文件,这里选通过开发板
./configure.sh esp32s3-devkit:nsh

# 编译
# 不用加CROSSDEV=xxx,s3的xtensa-esp32s3-elf-前缀能正常识别
make -j8

# 烧录
esptool --chip esp32s3 --port COM9 write_flash -z 0x0 nuttx.bin

# 重启并运行,同样终端输出是在UART串口而不是USB模拟的那个

 

RP2040:

# 拉取RP2040的官方SDK
git clone --recursive https://github.com/raspberrypi/pico-sdk.git
# 更新子项目(如果上面有加--recursive就不用)
git submodule update --init --recursive # 将SDK设置到环境变量,后面会依赖到 export PICO_SDK_PATH=/workspaces/pico-sdk # 克隆 picotool 源码,这是用来生成uf2文件的工具 git clone https://github.com/raspberrypi/picotool.git cd picotool # 编译安装(需 CMake 和 GCC) mkdir build && cd build cmake .. make -j8 sudo make install # 安装到系统路径(默认 /usr/local/bin) # 验证安装(输出版本信息即成功) picotool --version # 安装跨平台编译工具gcc,可以直接安装sudo apt install gcc-arm-none-eabi,但版本不同可能会导致下面的编译失败 # 进入 /opt 目录(工具链通常安装在这里) cd /opt # 下载 202212 月的 12.2 版本(64 位 Linux) sudo wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi.tar.xz # 解压 sudo tar -xf arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi.tar.xz # 添加新工具链到环境变量 echo 'export PATH=/opt/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/bin:$PATH' >> ~/.bashrc source ~/.bashrc # 验证版本(应输出 12.2.1) arm-none-eabi-gcc --version # 配置 cd nuttx/tools ./configure.sh raspberrypi-pico:nsh # 编译 cd nuttx make -j8 # 编译完成后会在nuttx目录生成 'nuttx.uf2' # 拷贝到树莓派运行 # 终端输出到树莓派的UART0(TX:GP0,RX:GP1)

 可惜目前树莓派模拟器没办法正确运行,否则就方便多了:

> rp2040js@1.1.1 start
> tsx demo/emulator-run.ts --image ./nuttx.uf2

Loading uf2 image ./nuttx.uf2
RP2040 GDB Server ready! Listening on port 3333
18:15:46.90  [XOSC_BASE] Unimplemented peripheral write to 0x0: 0xaa0
18:15:46.90  [XOSC_BASE] Unimplemented peripheral write to 0xc: 0x2f
18:15:46.91  [XOSC_BASE] Unimplemented peripheral read from 0x0
18:15:46.91  [XOSC_BASE] Unimplemented peripheral write to 0x0: 0x-1
18:15:46.91  [XOSC_BASE] Unimplemented peripheral read from 0x4
18:15:46.91  [PLL_SYS_BASE] Unimplemented peripheral write to 0x4: 0xffffffff
18:15:46.91  [PLL_SYS_BASE] Unimplemented peripheral write to 0x8: 0x0
18:15:46.91  [PLL_SYS_BASE] Unimplemented peripheral write to 0x0: 0x1
18:15:46.92  [PLL_SYS_BASE] Unimplemented peripheral write to 0x8: 0x7d
18:15:46.92  [PLL_SYS_BASE] Unimplemented peripheral read from 0x4
18:15:46.92  [PLL_SYS_BASE] Unimplemented peripheral write to 0x4: 0x-22
18:15:46.92  [PLL_SYS_BASE] Unimplemented peripheral read from 0x0
18:15:46.92  [PLL_SYS_BASE] Unimplemented peripheral write to 0xc: 0x62000
18:15:46.92  [PLL_SYS_BASE] Unimplemented peripheral read from 0x4
18:15:46.92  [PLL_SYS_BASE] Unimplemented peripheral write to 0x4: 0x-9
18:15:46.92  [PLL_USB_BASE] Unimplemented peripheral write to 0x4: 0xffffffff
18:15:46.92  [PLL_USB_BASE] Unimplemented peripheral write to 0x8: 0x0
18:15:46.92  [PLL_USB_BASE] Unimplemented peripheral write to 0x0: 0x1
18:15:46.93  [PLL_USB_BASE] Unimplemented peripheral write to 0x8: 0x28
18:15:46.93  [PLL_USB_BASE] Unimplemented peripheral read from 0x4
18:15:46.93  [PLL_USB_BASE] Unimplemented peripheral write to 0x4: 0x-22
18:15:46.93  [PLL_USB_BASE] Unimplemented peripheral read from 0x0
18:15:46.93  [PLL_USB_BASE] Unimplemented peripheral write to 0xc: 0x52000
18:15:46.93  [PLL_USB_BASE] Unimplemented peripheral read from 0x4
18:15:46.93  [PLL_USB_BASE] Unimplemented peripheral write to 0x4: 0x-9
18:15:46.95  [UART0] Unimplemented peripheral write to 0x34: 0x0
18:15:46.101 [UART0] Unimplemented peripheral write to 0x48: 0x0
18:15:46.101 [UART0] Unimplemented peripheral write to 0x4: 0xf
18:15:46.102 [UART0] Unimplemented peripheral write to 0x34: 0x0

NuttShell (NSH) NuttX-12.11.0-RC0
nsh> echo 'hello'
没反应了...

 

image

 

 

模拟运行

ESP32-S3:

官方文档:Espressif ESP32-S3 — NuttX latest documentation

参考:单片机模拟器 - JeasonBoy - 博客园 

RP2040:

可以用 rp2040js 模拟进入系统,但在终端里无法输入任何内容

 

 

一些常用的操作

注1:每次 menuconfig 修改完配置,要 make clean 一下,否则很可能编译出来的程序有问题。如果切换了模板,就要重新 make distclean ,但是有时候distclean会报错,手动删除.config开头的文件。

注2:注释着的 CONFIG_XXX is not set 表示该选项被禁用,相当于 CONFIG_XXX=n,不能随便删,也不能改成 CONFIG_XXX=n 然后注释(相当于删了),删了的话生成的配置不会有这个选项,可能编译会出错

 

1.WIFI(ESP系列专属)

NSH里运行

nsh> ifup wlan0
nsh> wapi psk wlan0 mypasswd 3
nsh> wapi essid wlan0 myssid 1
nsh> renew wlan0(renew就是dhcp自动获取ip,如果有在CONFIG里配置好SSID跟密码,前面的步骤可以直接省略)

nsh> ifconfig
wlan0 Link encap:Ethernet HWaddr e4:b3:23:f8:c1:f4 at RUNNING mtu 1500
inet addr:192.168.31.56 DRaddr:192.168.31.1 Mask:255.255.255.0

nsh> ping www.baidu.com
PING 183.240.99.58 56 bytes of data
56 bytes from 183.240.99.58: icmp_seq=0 time=280.0 ms
56 bytes from 183.240.99.58: icmp_seq=1 time=40.0 ms

# 开启热点(需要在配置里修改WIFI模式为SoftAP)
nsh> ifup wlan1(此时可以搜到'Nuttx'这个热点,但连不上,因为没法分配IP)
nsh> dhcpd_start

 

2.超频(RP2040 / RP23XX 专属)

打开:nuttx/arch/arm/src/rp2040/rp2040_clock.c

找到 clocks_init 函数,里面 rp2040_pll_init(RP2040_PLL_SYS_BASE, 1, 1500 * MHZ, 6, 2); 这一句便是CPU默认频率(125MHZ)设置函数,改为以下想要的:

目标频率(MHz)VCO 频率(MHz)post_div1post_div2计算公式验证(MHz)rp2040_pll_init 参数
125 1500 6 2 1500 / (6×2) = 125 rp2040_pll_init(RP2040_PLL_SYS_BASE, 1, 1500*MHZ, 6, 2)
200 1200 3 2 1200 / (3×2) = 200 rp2040_pll_init(RP2040_PLL_SYS_BASE, 1, 1200*MHZ, 3, 2)
250 1500 3 2 1500 / (3×2) = 250 rp2040_pll_init(RP2040_PLL_SYS_BASE, 1, 1500*MHZ, 3, 2)
300 1200 2 2 1200 / (2×2) = 300 rp2040_pll_init(RP2040_PLL_SYS_BASE, 1, 1200*MHZ, 2, 2)

打开:nuttx/boards/arm/rp2040/raspberrypi-pico/include/board.h(具体看你用了哪个板子,这里以默认的 raspberrypi-pico 为例)

找到以下这几项,改为想要的频率,注:这几个宏定义只是做一个引用,实际上生效的关键函数是上面的 rp2040_pll_init

#define BOARD_PLL_SYS_FREQ      (125 * MHZ)
#define BOARD_SYS_FREQ          (125 * MHZ)
#define BOARD_PERI_FREQ         (125 * MHZ)

注:目前最高只能超频到300MHZ,再高的话机器无法启动

测试,加入CoreMark应用,跑个分测下有没有生效:

image

300MHZ下的跑分是 358 左右,125MHZ时是 149 左右,提升2.4倍,证明修改频率生效了(作为对比,240MHZ的ESP32S3跑分是464)

image

注:.config 里的 CONFIG_ARCH_CPUINFO_FREQ_KHZ=0 这个只是起一个显示作用,执行 cat /proc/cpuinfo 时显示这个数据作为CPU频率,它跟实际的CPU频率没半毛钱关系

 

3.驱动SSD1306屏幕

RP2040可以直接驱动,板级支持代码里里已经有SSD1306,而ESP32系列没有,需要参考RP2040的,然后小小修改下:

拷贝 nuttx/boards/arm/rp2040/common/src/rp2040_ssd1306.c 到 nuttx/boards/xtensa or risc-v/esp32xx/esp32xx-xx/src/ 下,并重命名为 esp32xx_ssd1306.c

# ESP32-S3
将里面的 #include "rp2040_i2c.h" 需改为 #include "esp32s3_i2c.h"
将里面的 i2c = rp2040_i2cbus_initialize(busno); 修改为 i2c = esp32s3_i2cbus_initialize(busno);
在 nuttx/boards/xtensa/esp32s3/esp32s3-devkit/src/Make.defs 里添加
ifeq ($(CONFIG_LCD_SSD1306),y)
    CSRCS += esp32s3_ssd1306.c
endif

# ESP32-C3 / C6
将里面的 #include "rp2040_i2c.h" 需改为 #include "espressif/esp_i2c.h"
将里面的 i2c = rp2040_i2cbus_initialize(busno); 修改为 i2c = esp_i2cbus_initialize(busno);
在 nuttx/boards/risc-v/esp32c3/esp32c3-generic/src/Make.defs 里添加
ifeq ($(CONFIG_LCD_SSD1306),y)
    CSRCS += esp32c3_ssd1306.c
endif

注1:S3能正常加载出 /dev/fb0,C3/C6不知道为何没成功,可能是lcd驱动没起来

注2:亿百特的 EoRa-HUB-400TB 开发板上的 ssd1306 屏幕,有多出一个 reset 引脚连在 gpio21 上,这个复位引脚必须设置为高电平,ssd1306 才能初始化成功,简单处理可以直接用导向将它跟 3v3 连接

注3:ESP的大部分i2c配置文件,都把 CONFIG_I2C_TRACE 和 CONFIG_DEBUG_I2C 之类的 I2C 调试默认给打开,导致运行的时候非常多错误日志,一开始以为是BUG,卡这里很久。

 

4.sqlite

编译时可能报错:

在编译RP2040时报错:
提示:nuttx-apps/database/sqlite/build/sqlite3.c 的 7146 行:
unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int)
与 180497 处的声明不一致
unsigned int (*xCallback)(void*,const char*,u32,u32,u32)
将 180497 行的3个 u32 参数改为 unsigned int:
unsigned int (*xCallback)(void*,const char*,unsigned int,unsigned int,unsigned int)
如果提示找不到 nuttx-apps/database/sqlite/sqlite/configure,是由于 sqlite3 的源码没解压成功
Makefile里是这样写的:
sqlite.zip:
ifeq ($(wildcard sqlite/.git),)
    $(Q) curl -L https://codeload.github.com/sqlite/sqlite/zip/refs/tags/vesion-${CONFIG_LIB_SQLITE_VERSION} -o sqlite.zip
    $(Q) unzip -q -o sqlite.zip
    $(Q) mv sqlite-vesion-* sqlite
    $(call DELFILE, sqlite.zip)
endif
手动执行下这些操作即可

 

5.终端,串口相关的概念

/dev/console:终端,一个抽象的概念,具备输入输出功能,系统的启动信息、日志输入到这里,NSH 默认绑定到 console,你输入的命令和输出的结果都通过它交互。它常与一个物理的串口设备映射(如 ttyS0 )

/dev/ttyS0:UART(通用异步收发传输器)串口设备,是最常见的串行通信接口,ttyS0 通常对应系统的第一个串口(优先级最高),ttyS1 是第二个串口,以此类推

/dev/ttyACM0:USB ACM(Abstract Control Model)设备,通常是通过 USB 连接的虚拟串口设备

 

6.网络相关

我这里是 PC 的 WIFI 网络共享给网口,网口通过网线跟装有 W5500 的 RP2040 连接

W5500 跟 RP2040 的连接方式:

image

PC 共享网络设置:

主网络WIFI:image  W5500网口:image

设置 ip 的方式(如果是网线连接PC,要先设置好网络共享):

1.配置里写死
CONFIG_NETINIT_DHCPC=n        # 关闭 dhcp 自动获取地址
CONFIG_NETINIT_IPADDR=0xC0A88902  # ip:192.168.137.2  
CONFIG_NETINIT_DRIPADDR=0xC0A88901 # route:192.168.137.1
CONFIG_NETINIT_NETMASK=0xffffff00  # netmask:255.255.255.0
运行后就会自动跟网络连接上

2.运行时手动设置静态 ip
ifconfig eth0 192.168.137.2 netmask 255.255.255.0 gateway 192.168.137.1

3.通过 dhcp 自动获取 ip
CONFIG_NETINIT_DHCPC=y
CONFIG_SYSTEM_DHCPC_RENEW=y
然后运行时
renew eth0
一些网络工具:
# 域名解析工具
CONFIG_NET_LOOPBACK=y
nslookup www.baidu.com
# 查看网关192.168.137.1的MAC地址
arp -a 192.168.137.1  

 

7.ADB

ESP32S3 的默认 adb 配置有 etc 文件系统,它在 /etc/init.d/rcS 里让 adbh 守护进程开机启动
echo "rcS file is called!"
adbd &
PC 上直接 adb shell 就可以进入 nsh

PC 接收设备文件:
adb pull /data/local/tmp/test.txt D:\backup\

PC发送文件到设备,需要设备有可读写的文件系统支持,否则会接收失败
CONFIG_ESP32S3_SPIFLASH=y
CONFIG_ESP32S3_SPIFLASH_SMARTFS=y
第一次使用该文件系统需要先格式化下
mksmartfs /dev/smart0
然后就可以正常发送了:
adb push .\test.txt /data/

注:目前仅 ESP32S3 测试成功,RP2040 能编译,但运行 adbd 守护进程失败,连上电脑能识别到 ADB 设备,但一直处于离线状态。而 ESP32C3 编译失败。

 

 

6.UART交互,AT交互,这对于 AT 调制解调器很有用,例如,建立 pppd 连接(请参阅相关的 pppd 示例)

7.FASTBOOT

8.MCUBOOT

9.usbmsc

10.ADB

11.分区表:txtable

12.Toywasm :ToyWasm WebAssembly 解释器 |apache/nuttx-应用程序 |深度维基 --- ToyWasm WebAssembly Interpreter | apache/nuttx-apps | DeepWiki

13.esp32c3:sta_softap

14.变成AT

 

配置模板

RP2040:

# license
# 版权相关,建议全部打开,否则有些开源模块无法打开
CONFIG_ALLOW_BSD_COMPONENTS=y
CONFIG_ALLOW_GPL_COMPONENTS=y
CONFIG_ALLOW_MIT_COMPONENTS=y
CONFIG_ALLOW_ECLIPSE_COMPONENTS=y
CONFIG_ALLOW_ICS_COMPONENTS=y

# experimental
# 开启实验性功能
CONFIG_EXPERIMENTAL=y

# debug
CONFIG_SYSLOG_COLOR_OUTPUT=y        # 彩色日志输出
CONFIG_RAMLOG=y
CONFIG_RAMLOG_SYSLOG=y              # dmesg
# CONFIG_SYSLOG_CDCACM=y              # 日志输出到 usb_cdc_console
# CONFIG_SYSLOG_DEVPATH=/dev/ttyS0    # 日志输出到串口1

# CONFIG_LIBC_LONG_LONG is not set
# CONFIG_STANDARD_SERIAL is not set

# base
CONFIG_ARCH="arm"
CONFIG_ARCH_BOARD="raspberrypi-pico"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
CONFIG_ARCH_CHIP="rp2040"
CONFIG_ARCH_CHIP_RP2040=y
CONFIG_ARCH_RAMVECTORS=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_BOARD_LOOPSPERMSEC=10450
CONFIG_BUILTIN=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_RAM_SIZE=270336
CONFIG_RAM_START=0x20000000
CONFIG_READLINE_CMD_HISTORY=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=9
CONFIG_START_MONTH=2
CONFIG_START_YEAR=2021
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_OSTEST=y
CONFIG_SYSLOG_CONSOLE=y

# init
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INIT_STACKSIZE=4096

# nsh
CONFIG_SYSTEM_NSH=y
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
# CONFIG_NSH_DISABLE_DATE is not set
# CONFIG_NSH_DISABLE_LOSMART is not set
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_READLINE=y
CONFIG_NSH_SYMTAB=y
CONFIG_NSH_SYMTAB_ARRAYNAME="g_symtab"
CONFIG_NSH_SYMTAB_COUNTNAME="g_nsymbols"
# nsh_run_apps
# 支持在 NSH 中运行文件系统中的应用程序
CONFIG_NSH_FILE_APPS=y
# nsh_romfs (need etcfs)
# 启用后,NSH 会在登录时从 romfs 中加载初始化脚本 .nshrc 并运行
# CONFIG_NSH_ROMFS=y
# 设置 NSH 初始的 PATH 环境变量(命令搜索路径)
CONFIG_PATH_INITIAL="/bin"
CONFIG_LINE_MAX=128

# boardctl
CONFIG_BOARDCTL_RESET=y
CONFIG_BOARDCTL_USBDEVCTRL=y

# flash_size
# 将 pico 默认的 2MB 修改为 8MB
# 同时也要将 raspberrypi-pico-flash.ld 里的 flash (rx) : ORIGIN = 0x10000000, LENGTH = 2048K 修改为 8192K
CONFIG_RP2040_FLASH_LENGTH=8388608

# console
# 串口终端跟USB终端只能启用一个
# uart0_serial_console
# CONFIG_UART0_SERIAL_CONSOLE=y
# usb_cdc_console (need usb)
CONFIG_CDCACM=y
CONFIG_CDCACM_CONSOLE=y
CONFIG_NSH_USBCONSOLE=y

# usb
CONFIG_USBDEV=y
CONFIG_USBDEV_BUSPOWERED=y
# usb 复合设备
# CONFIG_USBDEV_COMPOSITE=n

# uart0
# CONFIG_RP2040_UART0_TX_GPIO=0
# CONFIG_RP2040_UART0_RX_GPIO=1

# i2c
# CONFIG_RP2040_I2C=y
# CONFIG_RP2040_I2C_DRIVER=y
# CONFIG_SYSTEM_I2CTOOL=y
# CONFIG_I2CTOOL_MAXBUS=1
# i2c0
# CONFIG_RP2040_I2C0=y
# CONFIG_RP2040_I2C0_SDA_GPIO=4
# CONFIG_RP2040_I2C0_SCL_GPIO=5

# spi
CONFIG_RP2040_SPI=y
# CONFIG_SYSTEM_SPITOOL=y
# CONFIG_SPITOOL_MAXBUS=1
# spi_sdcard
# CONFIG_RP2040_SPISD=y                   # 可选:启用 RP2040 SPI SD 卡支持
# spi_cmddata
# CONFIG_SPI_CMDDATA=y                    # 可选:启用 SPI 命令/数据切换支持(用于 LCD 驱动等设备)
# spi_callback
# CONFIG_SPI_CALLBACK=n                   # 可选:SPI 回调功能配置(用于 SPI 传输的异步通知)
# spi_channel
# LCD所连接的SPI通道,这里是spi1
# 注:一般屏幕会在rp2040_stxxx.c里引用这个宏 #define LCD_SPI_PORTNO CONFIG_RP2040_LCD_SPI_CH,用于初始化spi总线
# rp2040_st7735.c 写死了用spi1,不用这个配置
# CONFIG_RP2040_LCD_SPI_CH=1
# spi0
CONFIG_RP2040_SPI0=y
CONFIG_RP2040_SPI0_RX_GPIO=16
CONFIG_RP2040_SPI0_CS_GPIO=17
CONFIG_RP2040_SPI0_SCK_GPIO=18
CONFIG_RP2040_SPI0_TX_GPIO=19
# spi1
# CONFIG_RP2040_SPI1=y
# CONFIG_RP2040_SPI1_CS_GPIO=13
# CONFIG_RP2040_SPI1_RX_GPIO=12
# CONFIG_RP2040_SPI1_SCK_GPIO=14
# CONFIG_RP2040_SPI1_TX_GPIO=15

# mmcsd (need spi0, spi_sdcard, spi_callback)
# CONFIG_MMCSD=y
# sd卡挂载在spi0
# CONFIG_NSH_MMCSDSPIPORTNO=0
# CONFIG_MMCSD_HAVE_CARDDETECT is not set
# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set

# lcd (need ldc_driver)
# 目前还不知道怎么同时存在2个lcd_driver分别映射到fb0, fb1,所以只能同时开一个
# CONFIG_LCD=y
# CONFIG_LCD_DEV=y
# CONFIG_LCD_FRAMEBUFFER=y
# CONFIG_LCD_PORTRAIT=n                 # 竖屏模式
# CONFIG_LCD_LANDSCAPE=y                # 横屏模式

# lcd_driver ssd1306 (need lcd, i2c0)
# CONFIG_LCD_MAXCONTRAST=255            # 对比度
# CONFIG_LCD_SH1106_OLED_132=y
# CONFIG_LCD_SSD1306_I2C=y

# lcd_driver max7219 (need lcd, spi1, spi_cmddata)
# 测试未通过,它属于lcd分类下,但好像跟其他lcd_driver不一样?也无法被fb跟nx使用
# CONFIG_LCD_MAX7219=y
# CONFIG_MAX7219_NHORIZONTALBLKS=3
# CONFIG_MAX7219_NVERTICALBLKS=1
# CONFIG_MAX7219_INTENSITY=10

# lcd_driver st7735 (need lcd, spi1, spi_cmddata)
# DC, RST, BL 引脚配置,比较混乱,写死的,不同板子放的位置还不一样
# 可以在具体板子的板极支持文件夹里搜 SPI_CMDDATA,这个是SPI发送命令的函数,每个板子里都会定义具体实现,可通过它找到 DC 引脚的配置
# rp2040:写死在 nuttx/boards/arm/rp2040/common/src/rp2040_st7735.c 里的 LCD_XX
# stm32f103mini:写死在 nuttx/boards/arm/stm32/stm32f103-minimum/src/stm32f103_minimum.h 里的 STM32_LCD_XX
# CONFIG_LCD_ST7735=y
# CONFIG_LCD_ST7735_SPIMODE=3
# CONFIG_LCD_ST7735_FREQUENCY=40000000      # 40MHz
# 0.96 80x160
# CONFIG_LCD_ST7735_XRES=80
# CONFIG_LCD_ST7735_YRES=160
# CONFIG_LCD_ST7735_XOFFSET=26
# CONFIG_LCD_ST7735_YOFFSET=1
# CONFIG_LCD_ST7735_BGR=y
# CONFIG_LCD_ST7735_INVCOLOR=y
# 1.77 128x160
# CONFIG_LCD_ST7735_XRES=128
# CONFIG_LCD_ST7735_YRES=160
# CONFIG_LCD_ST7735_XOFFSET=2
# CONFIG_LCD_ST7735_YOFFSET=1
# CONFIG_LCD_ST7735_BGR=n
# CONFIG_LCD_ST7735_INVCOLOR=y
# 2.8 240x320(st7789,兼容st7735驱动)
# ONFIG_LCD_ST7735_XRES=240
# CONFIG_LCD_ST7735_YRES=320
# CONFIG_LCD_ST7735_XOFFSET=0
# CONFIG_LCD_ST7735_YOFFSET=0
# CONFIG_LCD_ST7735_BGR=n
# CONFIG_LCD_ST7735_INVCOLOR=y
# 2.8 240x320(ili9341,兼容st7735驱动,X是翻转的,但默认的st7735配置里没有镜像翻转的选项)
# CONFIG_LCD_ST7735_XRES=240
# CONFIG_LCD_ST7735_YRES=320
# CONFIG_LCD_ST7735_XOFFSET=0
# CONFIG_LCD_ST7735_YOFFSET=0
# CONFIG_LCD_ST7735_BGR=y
# CONFIG_LCD_ST7735_INVCOLOR=n

# lcd_driver st7789 (need lcd, spi1, spi_cmddata, spi_channel)
# CONFIG_LCD_ST7789=y
# CONFIG_LCD_ST7789_SPIMODE=3
# CONFIG_LCD_ST7789_FREQUENCY=40000000
# st7789的RST引脚是配置的,DC引脚用的是SPI1_RX,BL引脚是写死在 rp2040_st7789.c 里的 LCD_BL
# CONFIG_LCD_ST7789_RST_GPIO=10
# 2.8 240x320 st7789
# CONFIG_LCD_ST7789_XRES=240
# CONFIG_LCD_ST7789_YRES=320
# CONFIG_LCD_ST7789_XOFFSET=0
# CONFIG_LCD_ST7789_YOFFSET=0
# CONFIG_LCD_ST7789_MIRRORX=n
# CONFIG_LCD_ST7789_MIRRORY=n
# CONFIG_LCD_ST7789_INVCOLOR=y
# CONFIG_LCD_ST7789_BGR=n
# 2.8 240x320 ili9341(兼容st7789驱动)
# CONFIG_LCD_ST7789_XRES=240
# CONFIG_LCD_ST7789_YRES=320
# CONFIG_LCD_ST7789_XOFFSET=0
# CONFIG_LCD_ST7789_YOFFSET=0
# CONFIG_LCD_ST7789_MIRRORX=y
# CONFIG_LCD_ST7789_MIRRORY=n
# CONFIG_LCD_ST7789_INVCOLOR=n
# CONFIG_LCD_ST7789_BGR=y

# lcd_driver ili9341 (need lcd, spi1, spi_cmddata)
# 暂时测试未成功,rp2040没找到哪里有c文件来实现它的内容,也不知道引脚怎么配置
# CONFIG_LCD_ILI9341=y
# CONFIG_LCD_ILI9341_NINTERFACES=1
# CONFIG_LCD_ILI9341_IFACE0=y
# CONFIG_LCD_ILI9341_IFACE0_WIDTH=240
# CONFIG_LCD_ILI9341_IFACE0_HEIGHT=320
# CONFIG_LCD_ILI9341_IFACE0_LANDSCAPE=y

# fb (need lcd)
# CONFIG_DRIVERS_VIDEO=y
# CONFIG_VIDEO_FB=y
# CONFIG_EXAMPLES_FB=y

# fbcon (need fb, pipes, posix_spawn)
# 暂时不能生效,运行程序后卡死,CPU状态灯闪烁
# CONFIG_EXAMPLES_FBCON=y

# nx (need lcd)
# CONFIG_NX=y
# CONFIG_NXFONTS_PACKEDMSFIRST=y
# CONFIG_NXFONT_SANS20X26=y
# CONFIG_NX_BLOCKING=y
# CONFIG_NX_DISABLE_1BPP=y        # 如果是单色屏,要开启 1BPP 支持
# CONFIG_NX_DISABLE_16BPP=n       # 如果是彩屏,要开启 16BPP 支持(LCD的默认色深是16BPP)
# CONFIG_NX_PACKEDMSFIRST is not set
# NX 服务器需要 POSIX 消息队列中单个消息的最大字节数至少为 64
# CONFIG_MQ_MAXMSGSIZE=64

# nx examples (need nx)
# BPP根据屏幕色深选择,单色屏选1BPP,彩屏选16BPP
# CONFIG_EXAMPLES_NX=y
# CONFIG_EXAMPLES_NX_BPP=16
# CONFIG_EXAMPLES_NXDEMO=y
# CONFIG_EXAMPLES_NXDEMO_BPP=16
# CONFIG_EXAMPLES_NXHELLO=y
# CONFIG_EXAMPLES_NXHELLO_BPP=16
# CONFIG_EXAMPLES_NXLINES=y
# CONFIG_EXAMPLES_NXLINES_BPP=16
# 跟 EXAMPLES_NX 会冲突不能同时启用
# CONFIG_EXAMPLES_NXTEXT=y
# CONFIG_EXAMPLES_NXTEXT_BPP=16
# CONFIG_EXAMPLES_NXIMAGE=y
# CONFIG_EXAMPLES_NXIMAGE_BPP=16

# pipes & fifo
# CONFIG_PIPES=y                  # 管道是一种经典的进程间通信(IPC)机制,主要用于在两个进程(或线程)之间传递数据流

# task
# CONFIG_TLS_TASK_NELEM=4

# libuv (need pipes, task)
# CONFIG_LIBUV=y

# elf
# CONFIG_ELF=y

# posix_spawn
# NuttX 中启用 POSIX 标准的进程执行函数 的配置选项。启用后,系统会支持 execl()、execv()、execle()、execvp() 等 exec 系列函数
# 这些函数用于在当前进程中加载并执行新的程序(替换当前进程的代码、数据和堆栈)
# CONFIG_LIBC_EXECFUNCS=y

# envpath
# CONFIG_LIBC_ENVPATH=y

# posix_timers
# CONFIG_DISABLE_POSIX_TIMERS=n

# pthread_mutex_types
# CONFIG_PTHREAD_MUTEX_TYPES=y    # 启用多种类型的 POSIX 线程互斥锁(pthread mutex),包括普通互斥锁、递归互斥锁和错误检测互斥锁,以满足不同的同步需求

# symlink
# 启用伪文件系统(如 /proc)的软链接(符号链接)支持
# CONFIG_PSEUDOFS_SOFTLINKS=y

# syspopen (need pipes)
# CONFIG_SYSTEM_POPEN=y           # 进程间通信:启用系统级的 popen() 和 pclose() 函数,需要在程序中执行外部命令并进行数据交互(如获取命令输出、向命令输入数据)

# syssystem
# CONFIG_SYSTEM_SYSTEM=y          # 启用 system() 函数 的配置项,该函数是标准 C 库中的系统调用接口,核心作用是在程序中执行外部命令

# dlfcn
# CONFIG_LIBC_DLFCN=y             # 启用标准 C 库中的动态加载接口(dlfcn.h),包括 dlopen()、dlsym()、dlclose() 等函数,用于动态加载和卸载共享库

# ws2812
# CONFIG_WS2812=y
# CONFIG_RP2040_BOARD_HAS_WS2812=y
# CONFIG_RP2040_WS2812_GPIO_PIN=17
# ws2812的灯珠数量(16x16)
# CONFIG_WS2812_LED_COUNT=256
# CONFIG_EXAMPLES_WS2812=y

# python
# 暂时编译未通过,说缺少网络相关的posix接口
# CONFIG_INTERPRETER_CPYTHON=y
# CONFIG_LIB_ZLIB=y
# CONFIG_EXPERIMENTAL=y

# quickjs (need syspopen, dlfcn)
# CONFIG_INTERPRETERS_QUICKJS=y
# CONFIG_INTERPRETERS_QUICKJS_BIGNUM=y
# CONFIG_INTERPRETERS_QUICKJS_NONE=n          # 无交互环境,只能通过 qjs test.js 来执行脚本
# CONFIG_INTERPRETERS_QUICKJS_MINI=n          # 简单交互环境,通过 nsh> qjs -e "console.log(2 + 3)" 来执行脚本
# CONFIG_INTERPRETERS_QUICKJS_FULL=y          # (need symlink) 完整交互,nsh> qjs 进入,需要的内存比较大

# duktape
# 另一个js引擎,没quickjs小巧,性能也不如它,但是编译起来简单,没啥依赖
# CONFIG_INTERPRETERS_DUKTAPE=y

# bas
# BASIC 解释器
# CONFIG_INTERPRETERS_BAS=y

# minibasic
# 另一个 BASIC 解释器
# CONFIG_INTERPRETERS_MINIBASIC=y
# CONFIG_INTERPRETER_MINIBASIC_TESTSCRIPT=y

# lua
# CONFIG_INTERPRETERS_LUA=y
# 可选模块
# CONFIG_LUA_CJSON_MODULE=y
# CONFIG_LUA_LFS_MODULE=y                     # (need symlink)

# sqlite (need fs, passwd, symlink, syspopen, syssystem, dlfcn, pthread_mutex_types)
# 当前能编译成功,但没在pico上看到 sqlite3 这个命令,不知道是不是文件系统没起来的原因(sim:sqlite里是正常的)
# CONFIG_LIB_SQLITE=y
# CONFIG_UTILS_SQLITE=y

# fs
# CONFIG_FS_LARGEFILE=y                       # 启用大文件支持(文件大小超过4GB)
# CONFIG_FS_LOCK_BUCKET_SIZE=4
# disable_mountpoint
# CONFIG_DISABLE_MOUNTPOINT=n                 # 启用文件系统挂载点支持

# procfs
# 启用 /proc 虚拟文件系统,用于提供系统和进程信息的接口
CONFIG_FS_PROCFS=y
CONFIG_FS_PROCFS_REGISTER=y

# rp2040_falsh_smartfs
# 将主 Flash 的剩余空间当作 smartfs 文件系统,大小受 CONFIG_RP2040_FLASH_LENGTH 影响
# 该文件系统的初始化写在 arch/arm/src/rp2040/rp2040_flash_initialize.S
# 注:每次重新烧录都会重新初始化一次该文件系统,导致之前的文件丢失,暂时不知道怎么解决
CONFIG_RP2040_FLASH_FILE_SYSTEM=y
CONFIG_SMARTFS_ALIGNED_ACCESS=y

# fatfs (need mmcsd)
# 会自动挂载在 /mnt/sd0
# CONFIG_FS_FAT=y                             # 启用 FAT 文件系统支持
# CONFIG_FAT_LFN=y                            # 启用长文件名支持
# CONFIG_FAT_LCNAMES=y                        # 启用 NT 风格的大小写文件名支持

# nfs
# 网络文件系统(未测试)
# CONFIG_NFS=y
# CONFIG_NFS_STATISTICS=y

# tmpfs
# 临时文件系统,需要手动挂载才能出现
# mount -t tmpfs tmpfs /tmp
# CONFIG_FS_TMPFS=y

# binfs (need posix_spawn, nsh_run_apps)
# 二进制文件系统,将编译时指定的二进制数据(如固件、资源文件等)以文件系统的形式挂载到系统中,方便应用程序访问
# mount -t binfs none /bin
# CONFIG_FS_BINFS=y

# romfs
# 只读文件系统
# CONFIG_FS_ROMFS=y

# etcfs (need romfs, disable_mountpoint=n)
# 1. 在 nuttx/boards/arm/rp2040/raspberrypi-pico/src 下放置 etc 目录,里面放 init.d、passwd、group 等文件
# 注:common 下面也有个 etc:boards/arm/rp2040/common/board/etc,估计如果上面不自己建一个,就用 common 下面的默认的
# 2. 配置 src/Make.defs,添加 RCSRCS 和 RCRAWS
# ifeq ($(CONFIG_ETC_ROMFS),y)
#   RCSRCS = etc/init.d/rc.sysinit etc/init.d/rcS etc/.nshrc
#   RCRAWS = etc/group etc/passwd
# endif
# 登录后,会自动执行 rc.sysinit 和 rcS 脚本
# CONFIG_ETC_ROMFS=y
# CONFIG_ETC_ROMFSMOUNTPT="/etc"

# CONFIG_FS_TMPFS_LITTLEFS=y
# spiffs
# CONFIG_IDLETHREAD_STACKSIZE=4096
# CONFIG_INIT_ENTRYPOINT="fstest_main"
# CONFIG_LIBC_RAND_ORDER=3
# CONFIG_MTD=y
# CONFIG_RAMMTD=y
# CONFIG_RAMMTD_FLASHSIM=y
# CONFIG_FS_SPIFFS=y
# CONFIG_SPIFFS_CHECK_ONMOUNT=y
# CONFIG_TESTING_FSTEST=y
# CONFIG_TESTING_FSTEST_MOUNTPT="/mnt/spiffs"
# CONFIG_TESTING_FSTEST_NLOOPS=10

# passwd
# CONFIG_FSUTILS_PASSWD=y
# CONFIG_FSUTILS_PASSWD_READONLY=y

# zmodem (need posix_timers)
# 可以编译,用 SecureCRT 接收文件终端有输出,但会打印乱码,接收到的文件大小为0,不知道是usb cdc的问题还是其他问题
# CONFIG_SYSTEM_ZMODEM=y
# CONFIG_SYSTEM_ZMODEM_DEVNAME="/dev/ttyACM0"         # usb cdc 终端
# CONFIG_SYSTEM_ZMODEM_MOUNTPOINT="/mnt/sd0"          # 接收的文件存放位置,或用tmpfs:"=/tmp"

# vi
# vi 文本编辑器
# CONFIG_SYSTEM_VI=y

# w5500 (need net)
CONFIG_NET_W5500=y

# net (need workqueue)
CONFIG_NET=y
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_BROADCAST=y
CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_LOOPBACK=y               # 域名解析工具:nslookup www.baidu.com
CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP_WRITE_BUFFERS=y
CONFIG_NET_ETH_PKTSIZE=1516
# dns 8.8.8.8
CONFIG_NETDB_DNSCLIENT=y
CONFIG_NETDB_DNSSERVER_IPv4ADDR=0x08080808
# net_init_config (ip:192.168.137.2,route:192.168.137.1,netmask:255.255.255.0)
CONFIG_NETINIT_DHCPC=n
CONFIG_NETINIT_IPADDR=0xC0A88902
CONFIG_NETINIT_DRIPADDR=0xC0A88901
CONFIG_NETINIT_NETMASK=0xffffff00
CONFIG_NETINIT_MACADDR_1=0xdeadcafe
CONFIG_NETINIT_NOMAC=y
CONFIG_NETINIT_THREAD=y
# net_tools
CONFIG_NETUTILS_DHCPC=y
CONFIG_NETUTILS_IPERF=y
CONFIG_NETUTILS_WEBCLIENT=y         # Web 客户端,可以通过 wget 下载文件?但好像下载失败,还没研究出怎么用
CONFIG_NETUTILS_WEBSERVER=y         # Web 服务器
CONFIG_NETUTILS_TELNETD=y           # Telnet 服务器,类似 ssh 的远程连接,PC上:telnet 192.168.137.2
CONFIG_NETUTILS_PPPD=y              # PPPD 客户端 / 服务端 (AI说两者都可以,通过运行时配置来修改角色,没测试过)
# net_dev
CONFIG_NETDEV_WORK_THREAD=y
# net_system_tool
CONFIG_SYSTEM_PING=y
CONFIG_SYSTEM_DHCPC_RENEW=y         # dhcp 自动获取 ip:renew eth0
# net_example
CONFIG_EXAMPLES_PPPD=y
CONFIG_EXAMPLES_WEBSERVER=y         # Web 服务器测试
CONFIG_EXAMPLES_WEBSERVER_DHCPC=y

# workqueue
# 工作队列
CONFIG_SCHED_LPWORK=y

# rndis (need usb, net)
# 测试未通过,插上后有显示 rndis 设备,但是有黄色感叹号,无法被 win 正常识别,而在 linux 系统则初始化失败:rndis_host 1-2.1:1.0: RNDIS init failed, -110
# CONFIG_RNDIS=y

# cdc_ecm (need usb, net)
# 测试失败,跟 RNDIS 同样的配置,但电脑无法识别到 USB 设备
# CONFIG_NET_CDCECM=y

# adb (need usb, libuv, posix_spawn)
# 连接后能识别出 adb 设备,但一直处于离线状态,在 nsh 里运行 adbd,报 adb_hal_run (77): uv_loop exit 0 的错,可能跟 libuv 或 posix_spawn 有关?
# CONFIG_USBADB=y
# CONFIG_SYSTEM_ADBD=y

ESP32S3:

# CONFIG_ARCH_LEDS is not set
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_ARCH="xtensa"
CONFIG_ARCH_BOARD="esp32s3-devkit"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_ESP32S3_DEVKIT=y
CONFIG_ARCH_CHIP="esp32s3"
CONFIG_ARCH_CHIP_ESP32S3=y
CONFIG_ARCH_CHIP_ESP32S3WROOM1N4=y
CONFIG_ARCH_INTERRUPTSTACK=2048
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_XTENSA=y
CONFIG_BOARD_LOOPSPERMSEC=16717
CONFIG_BUILTIN=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_ESP32S3_UART0=y
CONFIG_FS_PROCFS=y
CONFIG_HAVE_CXX=y
CONFIG_HAVE_CXXINITIALIZE=y
CONFIG_IDLETHREAD_STACKSIZE=3072
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INIT_STACKSIZE=3072
CONFIG_INTELHEX_BINARY=y
CONFIG_LINE_MAX=64
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_READLINE=y
CONFIG_PREALLOC_TIMERS=4
CONFIG_RAM_SIZE=114688
CONFIG_RAM_START=0x20000000
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=6
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2011
CONFIG_SYSLOG_BUFFER=y
CONFIG_SYSTEM_NSH=y
CONFIG_UART0_SERIAL_CONSOLE=y

# uart
# uart0
CONFIG_ESP32S3_UART0=y
CONFIG_ESP32S3_UART0_TXPIN=43
CONFIG_ESP32S3_UART0_RXPIN=44
# uart1
CONFIG_ESP32S3_UART1=y
CONFIG_ESP32S3_UART1_TXPIN=7
CONFIG_ESP32S3_UART1_RXPIN=6

# i2c
# CONFIG_I2C_RESET=y
# CONFIG_SYSTEM_I2CTOOL=y
# CONFIG_I2CTOOL_MAXBUS=1
# CONFIG_I2CTOOL_DEFFREQ=400000
# 不要打开调试
# CONFIG_DEBUG_I2C=y
# CONFIG_DEBUG_I2C_ERROR=y
# CONFIG_DEBUG_I2C_INFO=y
# CONFIG_DEBUG_I2C_WARN=y
# CONFIG_I2C_TRACE=y
# i2c0
# CONFIG_ESP32S3_I2C0=y
# CONFIG_ESP32S3_I2C0_SCLPIN=17
# CONFIG_ESP32S3_I2C0_SDAPIN=18

# lcd (need ldc_driver)
# CONFIG_LCD=y
# CONFIG_LCD_DEV=y
# CONFIG_LCD_FRAMEBUFFER=y
# CONFIG_LCD_PORTRAIT=n                 # 竖屏模式
# CONFIG_LCD_LANDSCAPE=y                # 横屏模式

# lcd_driver ssd1306 (need lcd, i2c)
# CONFIG_LCD_MAXCONTRAST=255
# CONFIG_LCD_SH1106_OLED_132=y
# CONFIG_LCD_SSD1306_I2C=y
# CONFIG_SSD1306_I2CFREQ=400000

# fb (need lcd)
# CONFIG_DRIVERS_VIDEO=y
# CONFIG_VIDEO_FB=y
# CONFIG_EXAMPLES_FB=y

# gpio
# 引脚数量配置在 board.h 里,引脚序号配置在 esp32s3_gpio.c 里
# nsh> echo 0 > /dev/gpio0
# nsh> echo 1 > /dev/gpio0
# CONFIG_DEV_GPIO=y
# CONFIG_ESP32S3_GPIO_IRQ=y
# CONFIG_EXAMPLES_GPIO=y

# nx (need lcd)
# CONFIG_NX=y
# CONFIG_NXFONTS_PACKEDMSFIRST=y
# CONFIG_NXFONT_SANS20X26=y
# CONFIG_NX_BLOCKING=y
# CONFIG_NX_DISABLE_1BPP=n        # 如果是单色屏,要开启 1BPP 支持
# CONFIG_NX_DISABLE_16BPP=n       # 如果是彩屏,要开启 16BPP 支持(LCD的默认色深是16BPP)
# CONFIG_NX_PACKEDMSFIRST is not set
# NX 服务器需要 POSIX 消息队列中单个消息的最大字节数至少为 64
# CONFIG_MQ_MAXMSGSIZE=64

# nx examples (need nx)
# BPP根据屏幕色深选择,单色屏选1BPP,彩屏选16BPP
# CONFIG_EXAMPLES_NXDEMO=y
# CONFIG_EXAMPLES_NXDEMO_BPP=1

# ymodem / zmodem
# 只能用 SecureCRT
# sb 有效,接收的文件保存在电脑的Download
# rb 无效,未响应
# sz 无效,未响应
# rz 无效,在终端打印乱码,接收到的文件大小为0
# CONFIG_SYSTEM_YMODEM=y
# CONFIG_SYSTEM_ZMODEM=y
# CONFIG_SYSTEM_ZMODEM_DEVNAME="/dev/ttyS0"
# CONFIG_SYSTEM_ZMODEM_MOUNTPOINT="/tmp"

# chat
# AT交互,还未验证成功
CONFIG_EXAMPLES_CHAT=y
CONFIG_EXAMPLES_CHAT_TTY_DEVNODE="/dev/ttyS1"

ESP32C3:

# license
# 版权相关,建议全部打开,否则有些开源模块无法打开
CONFIG_ALLOW_BSD_COMPONENTS=y
CONFIG_ALLOW_GPL_COMPONENTS=y
CONFIG_ALLOW_MIT_COMPONENTS=y
CONFIG_ALLOW_ECLIPSE_COMPONENTS=y
CONFIG_ALLOW_ICS_COMPONENTS=y

# experimental
# 开启实验性功能
CONFIG_EXPERIMENTAL=y

# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_ARCH="risc-v"
CONFIG_ARCH_BOARD="esp32c3-generic"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_ESP32C3_GENERIC=y
CONFIG_ARCH_CHIP="esp32c3"
CONFIG_ARCH_CHIP_ESP32C3_GENERIC=y
CONFIG_ARCH_INTERRUPTSTACK=1536
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_BOARDCTL_RESET=y
CONFIG_BOARD_LOOPSPERMSEC=15000
CONFIG_BUILTIN=y
CONFIG_IDLETHREAD_STACKSIZE=2048
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_READLINE=y
CONFIG_NSH_STRERROR=y
CONFIG_PREALLOC_TIMERS=0
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_BACKTRACE=y
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=29
CONFIG_START_MONTH=11
CONFIG_START_YEAR=2019
CONFIG_SYSTEM_DUMPSTACK=y
CONFIG_SYSTEM_NSH=y
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_OSTEST=y

# console
# 串口终端跟USB终端只能启用一个
# uart0_serial_console (need uart0)
# CONFIG_UART0_SERIAL_CONSOLE=y
# usb_serial_console
CONFIG_ESPRESSIF_USBSERIAL=y

# uart0
# CONFIG_ESPRESSIF_UART0=y

# wifi (need fs, net_tools, protocols, security)
CONFIG_ESPRESSIF_WIFI=y                 # 启用乐鑫芯片的 Wi-Fi 驱动(如 ESP32 的 Wi-Fi 功能),支持连接无线网络、数据收发等基础 Wi-Fi 操作
CONFIG_ESPRESSIF_WIFI_STATION_SOFTAP=y  # Station + SoftAP(SoftAP 需要开启 dhcp 服务,才能给客户端分配 IP 地址)
CONFIG_ESPRESSIF_WIFI_SOFTAP_DEFAULT_SSID="NuttX"
CONFIG_ESPRESSIF_WIFI_SOFTAP_DEFAULT_PASSWORD="11111111"
CONFIG_NETINIT_WAPI_SSID="Jeason"
CONFIG_NETINIT_WAPI_PASSPHRASE="11111111"
CONFIG_ARCH_INTERRUPTSTACK=2048
CONFIG_DRIVERS_IEEE80211=y              # 启用 IEEE 802.11 无线局域网(Wi-Fi)驱动框架,支持符合 802.11 标准的无线网卡或芯片(如 ESP32 的 Wi-Fi 模块)
CONFIG_DRIVERS_WIRELESS=y               # 启用无线设备通用驱动支持,是各类无线通信(如 Wi-Fi、蓝牙)驱动的总开关,需与具体无线技术驱动(如 CONFIG_ESPRESSIF_WIFI)配合使用
CONFIG_EXAMPLES_RANDOM=y
CONFIG_INIT_STACKSIZE=8192
CONFIG_IOB_BUFSIZE=128
CONFIG_IOB_NBUFFERS=160
CONFIG_IOB_THROTTLE=24
CONFIG_PTHREAD_MUTEX_TYPES=y
CONFIG_SCHED_LPWORK=y
CONFIG_SIG_DEFAULT=y
CONFIG_TLS_TASK_NELEM=4

# net_tools
# 网络设备管理与工具配置
CONFIG_NETDEV_LATEINIT=y                # 启用网络设备的延迟初始化功能,允许网络设备驱动在系统启动后稍后阶段进行初始化,有助于解决某些设备的初始化顺序问题
CONFIG_NETDEV_PHY_IOCTL=y               # 启用对网络物理层设备(PHY)的 IO 控制接口支持,允许通过 ioctl 系统调用配置和控制 PHY 设备的参数(如速率、双工模式等)
CONFIG_NETDEV_WIRELESS_IOCTL=y          # 启用对无线网络设备的 IO 控制接口支持,允许通过 ioctl 系统调用配置和控制无线设备的参数(如 SSID、加密方式等)
CONFIG_NETDEV_WORK_THREAD=y             # 启用网络设备的工作线程支持,允许网络设备驱动在独立线程中处理数据收发和事件,提高网络性能和响应速度
CONFIG_NETUTILS_CJSON=y
CONFIG_NETUTILS_IPERF=y                 # 启用 iperf 网络性能测试工具,iperf 用于测量网络带宽和性能,支持 TCP 和 UDP 测试模式
CONFIG_SYSTEM_DHCPC_RENEW=y
CONFIG_SYSTEM_PING=y
CONFIG_NETUTILS_DHCPD=y
CONFIG_EXAMPLES_DHCPD=y

# protocols
# 网络协议配置
CONFIG_NETDB_DNSCLIENT=y                # 启用 DNS 客户端功能,支持通过域名(如 www.example.com)解析 IP 地址,依赖网络协议栈实现域名查询。
CONFIG_NET_BROADCAST=y                  # 启用网络广播支持,允许通过广播地址发送数据包,实现局域网内的设备发现和通信
CONFIG_NET_ETH_PKTSIZE=1514
CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_TCP=y
CONFIG_NET_TCP_DELAYED_ACK=y
CONFIG_NET_TCP_WRITE_BUFFERS=y
CONFIG_NET_UDP=y

# security
# 安全协议与软件许可配置
CONFIG_ALLOW_BSD_COMPONENTS=y           # 允许在系统中使用 BSD 许可的组件(如部分网络协议实现、驱动等)。BSD 许可相对宽松,允许闭源使用,此配置用于兼容这类第三方组件
CONFIG_WIRELESS=y                       # 总开关:启用无线通信功能,是所有无线相关配置(如 Wi-Fi、WAPI)的基础
CONFIG_WIRELESS_WAPI=y                  # 启用 WAPI(无线局域网鉴别和保密基础结构),这是中国自主的 Wi-Fi 安全协议,用于替代 WPA/WPA2 的加密和认证机制
CONFIG_WIRELESS_WAPI_CMDTOOL=y          # 启用 WAPI 命令行工具支持,允许通过命令行界面配置和管理 WAPI 相关参数(如密钥、认证方式等)
CONFIG_WIRELESS_WAPI_INITCONF=y         # 启用 WAPI 初始化配置,系统启动时会加载预设的 WAPI 配置参数,确保无线连接的安全性和稳定性

# fs
CONFIG_FS_PROCFS=y                      # 启用 procfs 文件系统支持,procfs 是一个虚拟文件系统,提供对内核和进程信息的访问接口,常用于调试和监控系统状态
CONFIG_ESPRESSIF_SPIFLASH=y             # 启用乐鑫(Espressif)芯片的 SPI Flash 驱动(如 ESP32/ESP8266 内置的 SPI Flash),支持对 Flash 进行读写操作
CONFIG_ESPRESSIF_SPIFLASH_SPIFFS=y      # 在乐鑫 SPI Flash 上启用 SPIFFS 文件系统。SPIFFS 是专为 SPI Flash 设计的轻量级文件系统,适合存储小文件(如配置文件、网页资源)
CONFIG_ESPRESSIF_SPIFLASH_FS_MOUNT_PT="/data"

# rndis
# 编译失败
# CONFIG_RNDIS=y
# CONFIG_NET_LL_GUARDSIZE=62
# CONFIG_NETINIT_NOMAC=y

 

posted @ 2025-10-01 01:21  JeasonBoy  阅读(247)  评论(0)    收藏  举报