TianShanOS 使用 JSON 配置文件定义板级硬件配置,实现"配置驱动"的设计理念。
每个板级配置目录包含三个文件:
boards/<board_name>/
├── board.json # 板级特性
├── pins.json # 引脚映射
└── services.json # 服务配置
定义板级硬件特性和能力。
{
"name": "rm01_esp32s3",
"description": "RoboMaster 01 Carrier Board with ESP32S3",
"chip": "esp32s3",
"features": {
"ethernet": true,
"wifi": true,
"bluetooth": true,
"usb_otg": true,
"sd_card": true,
"psram": true,
"led_touch": true,
"led_board": true,
"led_matrix": false,
"fan_count": 4,
"usb_mux_count": 2,
"power_monitor": true
},
"memory": {
"flash_size": "16MB",
"psram_size": "8MB"
},
"network": {
"ethernet_chip": "W5500",
"ethernet_spi_host": 2
}
}| 字段 | 类型 | 说明 |
|---|---|---|
| name | string | 板级唯一标识符 |
| description | string | 人类可读描述 |
| chip | string | 目标芯片 (esp32s3, esp32p4) |
| features | object | 硬件特性开关 |
| memory | object | 内存配置 |
| network | object | 网络配置 |
定义所有引脚的功能映射。
{
"pins": {
"LED_TOUCH": {
"gpio": 45,
"function": "led_data",
"description": "Touch LED WS2812 data"
},
"LED_BOARD": {
"gpio": 42,
"function": "led_data",
"description": "Board LED WS2812 data"
},
"FAN_1_PWM": {
"gpio": 4,
"function": "pwm_output",
"description": "Fan 1 PWM control"
},
"FAN_1_TACH": {
"gpio": 5,
"function": "gpio_input",
"description": "Fan 1 tachometer"
},
"ETH_MOSI": {
"gpio": 11,
"function": "spi_mosi",
"spi_host": 2
},
"ETH_MISO": {
"gpio": 13,
"function": "spi_miso",
"spi_host": 2
},
"ETH_SCLK": {
"gpio": 12,
"function": "spi_sclk",
"spi_host": 2
},
"ETH_CS": {
"gpio": 10,
"function": "spi_cs"
},
"ETH_INT": {
"gpio": 14,
"function": "gpio_input",
"interrupt": true
},
"ETH_RST": {
"gpio": 9,
"function": "gpio_output"
},
"AGX_POWER_EN": {
"gpio": 1,
"function": "gpio_output",
"description": "AGX power enable"
},
"AGX_RESET": {
"gpio": 2,
"function": "gpio_output",
"description": "AGX reset"
},
"AGX_POWER_GOOD": {
"gpio": 3,
"function": "gpio_input",
"description": "AGX power good"
},
"USB_MUX_1_SEL": {
"gpio": 39,
"function": "gpio_output"
},
"USB_MUX_1_OE": {
"gpio": 40,
"function": "gpio_output"
},
"SD_CMD": {
"gpio": 35,
"function": "sdmmc_cmd"
},
"SD_CLK": {
"gpio": 36,
"function": "sdmmc_clk"
},
"SD_D0": {
"gpio": 37,
"function": "sdmmc_d0"
},
"I2C_SDA": {
"gpio": 8,
"function": "i2c_sda",
"i2c_port": 0
},
"I2C_SCL": {
"gpio": 18,
"function": "i2c_scl",
"i2c_port": 0
}
}
}| 功能 | 说明 |
|---|---|
| gpio_input | GPIO 输入 |
| gpio_output | GPIO 输出 |
| led_data | WS2812 LED 数据线 |
| pwm_output | PWM 输出 |
| spi_mosi | SPI MOSI |
| spi_miso | SPI MISO |
| spi_sclk | SPI 时钟 |
| spi_cs | SPI 片选 |
| i2c_sda | I2C 数据 |
| i2c_scl | I2C 时钟 |
| uart_tx | UART 发送 |
| uart_rx | UART 接收 |
| adc_input | ADC 输入 |
| sdmmc_cmd | SD 命令 |
| sdmmc_clk | SD 时钟 |
| sdmmc_d0-d3 | SD 数据线 |
定义系统服务及其配置。
{
"services": {
"led_touch": {
"enabled": true,
"auto_start": true,
"priority": 5,
"depends": ["hal"],
"config": {
"led_count": 1,
"brightness": 80,
"default_effect": "rainbow"
}
},
"led_board": {
"enabled": true,
"auto_start": true,
"priority": 5,
"depends": ["hal"],
"config": {
"led_count": 28,
"brightness": 60
}
},
"fan_control": {
"enabled": true,
"auto_start": true,
"priority": 3,
"depends": ["hal"],
"config": {
"update_interval_ms": 1000,
"default_mode": "auto"
}
},
"ethernet": {
"enabled": true,
"auto_start": true,
"priority": 2,
"depends": ["hal"],
"config": {
"dhcp": true,
"hostname": "tianshanOS"
}
},
"wifi_ap": {
"enabled": true,
"auto_start": false,
"priority": 2,
"depends": ["hal"],
"config": {
"ssid": "TianShanOS",
"password": "tianshan123",
"channel": 1,
"max_connections": 4
}
},
"webui": {
"enabled": true,
"auto_start": true,
"priority": 6,
"depends": ["ethernet", "storage"],
"config": {
"port": 80,
"auth_required": true
}
},
"console": {
"enabled": true,
"auto_start": true,
"priority": 1,
"config": {
"uart_num": 0,
"baud_rate": 115200
}
},
"storage": {
"enabled": true,
"auto_start": true,
"priority": 1,
"config": {
"spiffs_mount": "/data",
"sd_mount": "/sd"
}
},
"agx_control": {
"enabled": true,
"auto_start": true,
"priority": 4,
"depends": ["hal"],
"config": {
"power_on_delay_ms": 100,
"shutdown_timeout_ms": 30000
}
}
}
}| 字段 | 类型 | 说明 |
|---|---|---|
| enabled | bool | 是否启用此服务 |
| auto_start | bool | 是否自动启动 |
| priority | int | 启动优先级 (1-8) |
| depends | array | 依赖的其他服务 |
| config | object | 服务特定配置 |
- 创建目录:
mkdir boards/my_board- 复制模板:
cp boards/rm01_esp32s3/*.json boards/my_board/-
修改配置以匹配硬件
-
在
sdkconfig.defaults中指定板级:
CONFIG_TS_BOARD_NAME="my_board"
引脚配置可以在运行时通过 NVS 覆盖:
// 代码中设置覆盖
ts_pin_set_override("LED_TOUCH", 48);
// 通过命令行
config set pin.LED_TOUCH 48覆盖优先级:NVS > pins.json > 编译时默认值
使用以下命令验证配置:
# 检查 JSON 语法
python3 -m json.tool boards/my_board/board.json
# 运行配置验证脚本
python3 scripts/validate_board.py boards/my_board- 引脚冲突检测: 确保同一 GPIO 不被多个功能使用
- 保留引脚: 避免使用 strapping pins (GPIO 0, 3, 45, 46)
- 文档化: 为每个引脚添加描述
- 版本控制: 将配置文件纳入版本控制
- 测试: 在实际硬件上验证配置