chore: migrate project into clean repository

This commit is contained in:
yuuux
2026-08-13 16:50:52 +08:00
commit d1d25a09e7
27405 changed files with 9422808 additions and 0 deletions

View File

@@ -0,0 +1,248 @@
# 自定义板型开发指南
本文档提供创建自定义板型的完整指南,包括文件结构、接口规范、开发步骤和文件模板。
## 概述
创建自定义板型需要准备以下文件:
```
my_board/
├── CMakeLists.txt # 板型构建脚本(必需)
├── board.h # 板级接口声明(必需)
├── board.c # 板级初始化实现(必需)
├── pinmux.h # 引脚配置声明(必需)
├── pinmux.c # 引脚配置实现(必需)
└── Kconfig # 板型配置选项(必需)
```
## 开发步骤
### Step 1: 创建板型目录
```bash
# 创建板型目录
mkdir -p /path/to/my_boards/my_board
cd /path/to/my_boards/my_board
```
### Step 2: 创建 CMakeLists.txt
复制以下内容到 `CMakeLists.txt`
```cmake
# ARCS BOARD SUPPORT
#
# Copyright (c) 2025, LISTENAI
# SPDX-License-Identifier: Apache-2.0
# 创建板型库
listenai_library_named(module_boards)
# 添加源文件
listenai_library_sources(
pinmux.c
board.c
)
# 添加头文件路径
listenai_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
```
### Step 3: 创建 board.h 和 board.c
**方法一:复制 SDK 内置板型作为起点**
```bash
cp $ARCS_SDK_BASE/boards/arcs_evb/board.h .
cp $ARCS_SDK_BASE/boards/arcs_evb/board.c .
```
然后修改文件中的注释和 `board_get_name()` 返回值为您的板型名称。
**方法二:使用下方的文件模板手动创建**
参考本文档后面的"文件模板"章节。
### Step 4: 使用 Pinmux 工具生成引脚配置
**重要pinmux.h 和 pinmux.c 必须使用工具生成,不应手动编辑。**
#### 工具信息
- **工具地址**https://tool.listenai.com/ls-pinmux-tool/
- **功能**:根据芯片型号和外设配置,自动生成引脚复用代码
#### 使用步骤
1. 访问 Pinmux 配置工具
2. 选择目标芯片型号
3. 配置项目中使用的外设(如 UART0、SPI0、I2C0 等)
4. 为每个外设配置引脚映射
5. 生成代码
6. 将生成的 `pinmux.h``pinmux.c` 保存到板型目录
#### 设备驱动集成
生成的 pinmux 函数会被对应的设备驱动自动调用:
- `lisa_uart0_pinmux()` - 由 lisa_uart 驱动的 uart0 设备初始化时调用
- `lisa_spi0_pinmux()` - 由 lisa_spi 驱动的 spi0 设备初始化时调用
- 其他外设依此类推
**注意事项:**
- 不要手动编辑生成的文件
- 如需修改引脚配置,应在工具中修改后重新生成
### Step 5: 创建 Kconfig 文件(必需)
创建 `Kconfig` 文件,必须包含以下两个配置项:
```bash
# Board Configuration
#
# Copyright (c) 2025, LISTENAI
# SPDX-License-Identifier: Apache-2.0
config BOARD_NAME
string
default "my_board"
prompt "Board Name"
help
Board Name
config BOARD_MY_BOARD
bool
default y
help
Board is my_board
```
**重要提示:**
1.`my_board` 替换为您的实际板型名称
2. 第二个配置项名称格式为 `BOARD_<板型名称大写>`
3. 例如板型名为 `arcs_evb`,则配置项为 `BOARD_arcs_evb`
**Kconfig 说明:**
- **必需配置项 1**`BOARD_NAME` - 板型名称string 类型)
- **必需配置项 2**`BOARD_<BOARD_NAME_UPPER>` - 板型标识bool 类型,默认 y
- 构建系统会自动加载此文件并设置环境变量 `BOARD_KCONFIG_PATH`
- 外部板型和 SDK 内置板型享有相同的配置能力
### Step 6: 编译验证
```bash
cd $ARCS_SDK_BASE
./build.sh -S samples/helloworld \
-DBOARD=my_board \
-DBOARD_SEARCH_PATH=/path/to/my_boards
```
**重要提示:** 外部板型文件已通过编译变量指定构建路径,无需在工程中额外添加构建。
### Step 7: 检查构建日志
确认看到板型加载信息:
```
-- Target board: my_board
-- Board found (custom): my_board from /path/to/my_boards
-- Board loaded successfully: /path/to/my_boards/my_board
```
## 接口规范
### board.h / board.c - 标准接口
板型必须实现以下标准接口:
- `const char* board_get_name(void)` - 返回板型名称字符串
### pinmux.h / pinmux.c - 引脚复用配置
**重要说明:这两个文件由 Pinmux 配置工具生成,不应手动编辑。**
详见 Step 4 的说明。
## 文件模板
### board.h 模板
可参考boards/arcs_evb/board.h
```c
// ARCS BOARD SUPPORT
//
// Copyright (c) 2025, LISTENAI
// SPDX-License-Identifier: Apache-2.0
#ifndef _BOARD_MY_BOARD_H_
#define _BOARD_MY_BOARD_H_
/**
* @brief Get the board name
*
* @return const char* Board name string
*/
const char* board_get_name(void);
#endif // _BOARD_MY_BOARD_H_
```
### board.c 模板
可参考boards/arcs_evb/board.c
```c
// ARCS BOARD SUPPORT
//
// Copyright (c) 2025, LISTENAI
// SPDX-License-Identifier: Apache-2.0
#include "board.h"
const char* board_get_name(void)
{
return "my_board";
}
```
### Kconfig 模板
可参考boards/arcs_evb/Kconfig
```kconfig
# Board Configuration
#
# Copyright (c) 2025, LISTENAI
# SPDX-License-Identifier: Apache-2.0
config BOARD_NAME
string
default "my_board"
prompt "Board Name"
help
Board Name
config BOARD_MY_BOARD
bool
default y
help
Board is my_board
```
**注意:** 请将模板中的 `my_board``MY_BOARD` 替换为您的实际板型名称。
## 常见问题
### Q: 是否可以不创建 Kconfig 文件?
不可以。Kconfig 文件是必需的,必须包含 `BOARD_NAME``BOARD_<名称大写>` 两个配置项。
### Q: 可以手动编辑 pinmux.c 吗?
不建议。pinmux.h 和 pinmux.c 应该由 Pinmux 配置工具生成。如果需要修改引脚配置,应在工具中重新配置并生成新文件。
### Q: board.c 中还需要实现其他函数吗?
当前只需要实现 `board_get_name()` 函数。未来如果有更多板级初始化需求,可能会增加其他接口。

View File

@@ -0,0 +1,198 @@
# 板型使用指南
本文档说明如何在项目中使用板型支持系统。
## 板型支持系统简介
板型支持系统负责管理不同硬件板卡的配置和初始化。系统采用模块化设计将引脚复用pinmux配置与板级初始化逻辑分离便于维护和扩展。
### 主要特性
- **模块化设计**板级代码board.c/h与引脚配置pinmux.c/h分离
- **外部板型支持**:支持在 SDK 外部添加自定义板型,无需修改 SDK 源码
- **两级搜索机制**:优先搜索自定义路径,然后搜索 SDK 内置板型
- **简单易用**:通过 `build.sh` 命令行参数即可切换板型
- **配置管理**:通过 Kconfig 管理板型配置选项
## 快速开始
### 使用 SDK 内置板型
必须使用 `-DBOARD` 参数指定板型:
```bash
cd arcs-sdk
# 使用 arcs_mini 板型
./build.sh -S samples/helloworld -DBOARD=arcs_mini
# 使用 arcs_evb 板型
./build.sh -S samples/helloworld -DBOARD=arcs_evb
```
### 查看可用的 SDK 内置板型
```bash
ls boards/
```
查看各板型的详细说明,请参考对应板型目录下的 README.md 文件。
## 使用外部自定义板型
### 基本用法
使用 `-DBOARD``-DBOARD_SEARCH_PATH` 参数:
```bash
./build.sh -S samples/helloworld \
-DBOARD=my_custom_board \
-DBOARD_SEARCH_PATH=/path/to/my_boards
```
**说明:**
- `BOARD_SEARCH_PATH` **必须使用绝对路径**,例如 `/home/user/my_boards``~/my_boards`,避免相对路径带来的解析问题
- 例如:如果自定义板型目录为 `/path/to/my_boards/AAA_EVB`,则:
- `-DBOARD=AAA_EVB`
- `-DBOARD_SEARCH_PATH=/path/to/my_boards`
- **外部板型文件无需自行添加构建**
### 创建外部自定义板型
关于如何创建自定义板型的详细指南,请参考 [BOARD_TEMPLATE.md](BOARD_TEMPLATE.md)。
该指南包含:
- 完整的文件结构说明
- 接口规范和实现要求
- 详细的开发步骤
- 文件模板和示例
## 板型搜索机制
构建系统按以下优先级搜索板型:
1. **板型名称**(必需)
- 必须通过 `-DBOARD=<board_name>` 参数指定
- 不指定将导致构建失败
2. **外部自定义路径**(如果指定了 `BOARD_SEARCH_PATH`
- 搜索路径:`${BOARD_SEARCH_PATH}/${BOARD}/`
- **使用绝对路径**(如 `/home/user/boards``~/boards`),避免相对路径在不同构建环境下的解析差异
3. **SDK 内置路径**(备用)
- 搜索路径:`${ARCS_SDK_BASE}/boards/${BOARD}/`
4. **验证要求**
- 板型目录必须存在
- 板型目录下必须包含 `CMakeLists.txt` 文件
如果搜索失败,构建系统会给出详细的错误提示,说明搜索路径和解决方案。
## 板型文件结构
每个板型目录必须包含以下文件:
```
board_name/
├── CMakeLists.txt # 板型构建脚本(必需)
├── board.h # 板级接口声明(必需)
├── board.c # 板级初始化实现(必需)
├── pinmux.h # 引脚配置声明(必需)
├── pinmux.c # 引脚配置实现(必需)
├── Kconfig # 板型配置选项(必需)
└── README.md # 板型说明文档(推荐)
```
详细的文件说明和模板请参考 [BOARD_TEMPLATE.md](BOARD_TEMPLATE.md)。
## 故障排查
### BOARD 未指定
**错误信息:**
```
BOARD is not specified!
```
**解决方案:**
必须使用 `-DBOARD` 参数指定板型:
```bash
./build.sh -S samples/helloworld -DBOARD=arcs_mini
```
### 板型未找到
**错误信息:**
```
Board 'xxx' not found!
```
**解决方案:**
1. 检查板型名称拼写是否正确
2. 确认板型目录存在:
- SDK 内置板型:`ls boards/xxx`
- 自定义板型:`ls ${BOARD_SEARCH_PATH}/xxx`
3. 如使用自定义板型,检查 `BOARD_SEARCH_PATH` 路径是否正确
### 板型目标重复定义
**错误信息:**
```
add_library cannot create target "module_boards" because another target
with the same name already exists. The existing target is a static library
created in source directory
```
**原因:**
使用外部自定义板型时SDK已通过${BOARD_SEARCH_PATH}/${BOARD}将板型目录添加到构建系统中,无需外部构建额外添加,否则会出现重复定义目标的错误。
**解决方案:**
外部工程CMakeLists.txt中无需添加板型目录。
### 编译错误
**常见原因:**
1. 板型代码未实现必需的接口函数
2. 头文件路径配置错误
3. Kconfig 文件缺失或配置不正确
**解决方案:**
1. 确保实现了 `board_get_name()` 函数
2. 检查 CMakeLists.txt 中的头文件路径配置
3. 确保 Kconfig 文件包含必需的配置项
## 常见问题
### Q: 如何在不同板型之间快速切换?
只需修改 `build.sh``-DBOARD` 参数:
```bash
# 切换到 arcs_mini
./build.sh -S samples/helloworld -DBOARD=arcs_mini
# 切换到 arcs_evb
./build.sh -S samples/helloworld -DBOARD=arcs_evb
```
### Q: 可以为不同的项目使用不同的板型吗?
可以。每个项目的构建命令可以指定不同的板型:
```bash
# 项目 A 使用 arcs_mini
./build.sh -S samples/project_a -DBOARD=arcs_mini
# 项目 B 使用 arcs_evb
./build.sh -S samples/project_b -DBOARD=arcs_evb
```
### Q: 自定义板型是否会被覆盖?
不会。自定义板型存储在 SDK 外部SDK 更新不会影响自定义板型。
### Q: 如何创建新的板型?
请参考 [BOARD_TEMPLATE.md](BOARD_TEMPLATE.md),其中包含完整的开发指南和步骤说明。

View File

@@ -0,0 +1,99 @@
# ARCS BOARD SUPPORT
#
# Copyright (c) 2025, LISTENAI
# SPDX-License-Identifier: Apache-2.0
# 1. 动态获取可用板型列表
function(get_available_boards output_var)
set(boards_list "")
file(GLOB board_dirs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*")
foreach(item ${board_dirs})
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${item}")
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${item}/CMakeLists.txt")
list(APPEND boards_list "${item}")
endif()
endif()
endforeach()
set(${output_var} ${boards_list} PARENT_SCOPE)
endfunction()
# 2. 获取板型名称
if(NOT DEFINED BOARD)
# 动态生成板型列表
get_available_boards(AVAILABLE_BOARDS)
set(BOARD_LIST_STR "")
foreach(board ${AVAILABLE_BOARDS})
string(APPEND BOARD_LIST_STR " - ${board}\n")
endforeach()
message(FATAL_ERROR
"BOARD is not specified!\n"
"Please specify a board using -DBOARD=<board_name>\n"
"Available SDK boards:\n"
"${BOARD_LIST_STR}\n"
"Example usage:\n"
" ./build.sh -S samples/helloworld -DBOARD=arcs_evb\n"
" ./build.sh -S samples/helloworld -DBOARD=my_board -DBOARD_SEARCH_PATH=/path/to/boards")
endif()
message(STATUS "Target board: ${BOARD}")
# 3. 板型搜索(两级优先级)
set(BOARD_DIR "")
# 优先级1: 自定义板型路径 (如果 BOARD_SEARCH_PATH 已定义)
if(DEFINED BOARD_SEARCH_PATH)
if(EXISTS "${BOARD_SEARCH_PATH}/${BOARD}")
set(BOARD_DIR "${BOARD_SEARCH_PATH}/${BOARD}")
message(STATUS "Board found (custom): ${BOARD} from ${BOARD_SEARCH_PATH}")
else()
message(WARNING "BOARD_SEARCH_PATH specified but board '${BOARD}' not found in ${BOARD_SEARCH_PATH}")
endif()
endif()
# 优先级2: SDK 内置板型
if(NOT BOARD_DIR)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${BOARD}")
set(BOARD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${BOARD}")
message(STATUS "Board found (SDK): ${BOARD}")
endif()
endif()
# 4. 验证板型目录存在
if(NOT BOARD_DIR)
# 动态生成板型列表
get_available_boards(AVAILABLE_BOARDS)
set(BOARD_LIST_STR "")
foreach(board ${AVAILABLE_BOARDS})
string(APPEND BOARD_LIST_STR " - ${board}\n")
endforeach()
message(FATAL_ERROR
"Board '${BOARD}' not found!\n"
"Searched in:\n"
" - ${BOARD_SEARCH_PATH}/${BOARD} (if BOARD_SEARCH_PATH defined)\n"
" - ${CMAKE_CURRENT_SOURCE_DIR}/${BOARD}\n"
"Please check:\n"
" 1. BOARD variable is set correctly (-DBOARD=xxx)\n"
" 2. Board directory exists\n"
" 3. BOARD_SEARCH_PATH is correct (if using custom board)\n"
"Available SDK boards:\n"
"${BOARD_LIST_STR}\n"
"Example usage:\n"
" ./build.sh -S samples/helloworld -DBOARD=arcs_evb\n"
" ./build.sh -S samples/helloworld -DBOARD=my_board -DBOARD_SEARCH_PATH=/path/to/boards")
endif()
# 5. 检查板型 CMakeLists.txt 存在
if(NOT EXISTS "${BOARD_DIR}/CMakeLists.txt")
message(FATAL_ERROR
"Board directory found but missing CMakeLists.txt: ${BOARD_DIR}\n"
"Each board must contain a CMakeLists.txt file.\n"
"Please refer to boards/BOARD_TEMPLATE.md for board structure requirements.")
endif()
# 6. 加载板型
# 使用第二个参数指定二进制目录,避免外部板型路径冲突
add_subdirectory(${BOARD_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${BOARD})
message(STATUS "Board loaded successfully: ${BOARD_DIR}")

6
arcs-sdk/boards/Kconfig Normal file
View File

@@ -0,0 +1,6 @@
# ARCS BOARD CONFIGURATION
#
# Copyright (c) 2025, LISTENAI
# SPDX-License-Identifier: Apache-2.0
osource "$BOARD_KCONFIG_PATH"

View File

@@ -0,0 +1,17 @@
# ARCS BOARD SUPPORT
#
# Copyright (c) 2025, LISTENAI
# SPDX-License-Identifier: Apache-2.0
# 创建板型库
listenai_library_named(module_boards)
# 添加源文件
listenai_library_sources(
pinmux.c
board.c
)
# 添加头文件路径
listenai_include_directories(${CMAKE_CURRENT_SOURCE_DIR})

View File

@@ -0,0 +1,18 @@
# Board Configuration
#
# Copyright (c) 2025, LISTENAI
# SPDX-License-Identifier: Apache-2.0
config BOARD_NAME
string
default "arcs_evb"
prompt "Board Name"
help
Board Name
config BOARD_ARCS_EVB
bool
default y
help
Board is arcs_evb

View File

@@ -0,0 +1,165 @@
# ARCS EVB 评估板
## 板型概述
ARCS EVB 是一款功能丰富的评估板,集成了多种外设接口,适用于完整的产品原型开发和功能评估。
**板型标识:** `arcs_evb`
## 板型外观
![ARCS EVB 评估板](../../assets/arcs_evb_board.png)
*ARCS EVB 评估板外观图(标注序号说明见下表)*
## 硬件接口说明
下表详细说明了开发板上的各个接口和组件:
| 序号 | 接口/组件 | 说明 |
|------|----------|------|
| 1 | USB接口 | TypeC 接口,提供供电和充电功能 |
| 2 | 烧录接口 | TypeC 接口,提供日志输出和固件烧录功能。注意:需要先烧录 boot 固件 |
| 3 | 开关 | 控制整个开发板的主电源开关 |
| 4 | 统一为I/O接口 | 引出 30 个 IO 口以及多组电源 |
| 5 | 扬声器接口 | 用于连接开发板默认附带的扬声器,用户也可以替换或外接其他扬声器 |
| 6 | 麦克风 | 用于连接开发板默认配套的驻极体麦克风,方便用户更换或外引麦克风。 |
| 7 | 硬回采开关 | 该开关支持单麦克风硬回采、双麦克风软回采 |
| 8 | I/O电源指示灯 | 可编程控制的 LED 灯,使用 B09 引脚 |
| 9 | 电源LED | 指示开发板的供电状态,供电正常时 LED 点亮 |
| 10 | ADC按键 | ADC 按键,通过 GPADC 检测电压来确认其值 |
| 11 | RST按键 | Reset 按键,短按该按键会对开发板执行复位操作 |
| 12 | BOOT按键 | 长按该按键上电会进入芯片烧录模式 |
| 13 | TF卡槽 | 用于插入 TF 存储卡 |
| 14 | 屏幕连接器 | 用于连接开发板默认附带的显示屏。说明LCD 适配板一侧用于固定 LCD另一侧兼容不同的 QSPI 或 SPI LCD 屏幕。不同屏幕需要对应不同的适配板 |
| 15 | 摄像头DVP接口 | 摄像头 FPC 连接器,用于连接开发板默认附带的摄像头 |
## 硬件特性
### 主要参数
- **芯片平台**:基于 ARCS 架构
- **板型尺寸**:标准评估板尺寸
- **适用场景**:产品原型开发、功能评估、方案验证
### 外设支持
#### 串口通信UART
| 串口 | 引脚 | 功能 | 功能码 | 说明 |
|------|------|------|--------|------|
| UART0 | PAD_A[3] | CP_LOG_TX | 2 | 主串口 TXCP 日志输出) |
| UART0 | PAD_A[2] | CP_LOG_RX | 2 | 主串口 RXCP 日志输出) |
| UART1 | PAD_A[21] | AP_LOG_TX | 3 | 辅助串口 TXAP 日志输出) |
#### I2C 总线
| 总线 | 引脚 | 功能 | 功能码 | 说明 |
|------|------|------|--------|------|
| I2C0 | PAD_A[22] | SCL | 8 | 主 I2C 时钟线 |
| I2C0 | PAD_A[23] | SDA | 8 | 主 I2C 数据线 |
#### SPI 总线
| 总线 | 引脚 | 功能 | 功能码 | 说明 |
|------|------|------|--------|------|
| SPI1 | PAD_B[5] | CLK | 6 | 主 SPI 时钟线 |
| SPI1 | PAD_B[3] | MISO | 6 | 主 SPI 主入从出 |
| SPI1 | PAD_B[1] | MOSI | 6 | 主 SPI 主出从入 |
#### GPIO通用输入/输出)
| 引脚组 | 引脚 | 功能名称 | 功能码 | 说明 |
|--------|------|----------|--------|------|
| GPIO_A | PAD_A[1] | LCD_RST | 1 | LCD 复位控制 |
| GPIO_A | PAD_A[24] | TP_INT | 0 | 触摸屏中断输入 |
| GPIO_A | PAD_A[25] | TP_RST | 0 | 触摸屏复位控制 |
| GPIO_A | PAD_A[27] | PA_EN | 0 | 功放使能控制 |
| GPIO_B | PAD_B[0] | LCD_CD | 0 | LCD 命令/数据选择 |
| GPIO_B | PAD_B[7] | CAMERA_PWDN | 0 | 摄像头电源控制 |
| GPIO_B | PAD_B[8] | LCD_TE | 0 | LCD 撕裂效应信号 |
| GPIO_B | PAD_B[9] | LED | 0 | LED 指示灯控制 |
#### PWM脉宽调制
| 功能名称 | 引脚 | 功能码 | 说明 |
|----------|------|--------|------|
| LCD_PWM | PAD_A[0] | 12 | LCD 背光亮度调节 |
#### SDIO
| 接口 | 引脚范围 | 引脚数量 | 功能码 | 说明 |
|------|----------|----------|--------|------|
| SDIO | PAD_A[4-9] | 6 | 15 | SD 卡/eMMC 接口(数据/控制线) |
#### DVP数字视频接口
| 接口 | 引脚范围 | 引脚数量 | 功能码 | 说明 |
|------|----------|----------|--------|------|
| DVP | PAD_A[10-20, 26] | 12 | 16 | 摄像头接口(数据线) |
#### ADC模数转换
| 功能 | 通道引脚 | 功能码 | 说明 |
|------|----------|--------|------|
| ADC | PAD_B[6] | 3 | 模拟信号采集AON 域) |
### 引脚功能说明
下表为 LS26 芯片在 Arcs-EVB 开发板上的 GPIO 分配使用列表:
| 引脚/端口 | 主功能 | 复用功能 | 说明/连接外设 | 分类 |
|-----------|--------|----------|---------------|------|
| GPIOA_00 | LCD_PWM | CJTAG_TCK | LCM模组背光控制 | 显示 |
| GPIOA_01 | LCD RST | CJTAG_TMS | LCM模组复位 | 显示 |
| GPIOA_02 | UART0 RX | | LOAD&打印CP日志 | 烧录&日志 |
| GPIOA_03 | UART0 TX | | LOAD&打印CP日志 | 烧录&日志 |
| GPIOA_04 | SD DAT1 | | TF CARD | 存储 |
| GPIOA_05 | SD DAT0 | | TF CARD | 存储 |
| GPIOA_06 | SD CLK | | TF CARD | 存储 |
| GPIOA_07 | SD CMD | | TF CARD | 存储 |
| GPIOA_08 | SD DAT3 | | TF CARD | 存储 |
| GPIOA_09 | SD DAT2 | | TF CARD | 存储 |
| GPIOA_10 | vic_h_sync | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_11 | vic_v_sync | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_12 | vic_pixel_clk | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_13 | vic_pixel_data4 | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_14 | vic_pixel_data5 | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_15 | vic_pixel_data6 | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_16 | vic_pixel_data7 | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_17 | vic_pixel_data8 | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_18 | vic_pixel_data9 | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_19 | vic_pixel_data10 | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_20 | vic_pixel_data11 | | DVP摄像头 | 兼容SPI摄像头 |
| GPIOA_21 | UART1_TX | | 打印AP日志 | 调试 |
| GPIOA_22 | I2C0 SDA | | 摄像头和TP复用 | LCM模组 |
| GPIOA_23 | I2C0 SCL | | 摄像头和TP复用 | LCM模组 |
| GPIOA_24 | TP INT | | 触摸中断 | LCM模组 |
| GPIOA_25 | TP RST | | 触摸复位 | LCM模组 |
| GPIOA_26 | VIC_CLK_OUT | | MCLK (主时钟) | 摄像头 |
| GPIOA_27 | PA_EN | | 功放MUTE | 音频 |
| GPIOA_28 | MIC1 INP | | 硅麦 | 音频 |
| GPIOA_29 | MIC1 INN | | 硅麦 | 音频 |
| GPIOA_30 | MIC0 INP | | 硅麦 | 音频 |
| GPIOA_31 | MIC0 INN | | 硅麦 | 音频 |
| GPIOB_00 | LCD SPI MISO | D1 | LCM模组 (数据线1) | 显示 (SPI) |
| GPIOB_01 | LCD SPI MOSI | D0 | LCM模组 (数据线0) | 显示 (SPI) |
| GPIOB_02 | LCD SPI HOLD | D3 | LCM模组 (数据线3) | 显示 (SPI) |
| GPIOB_03 | LCD SPI CLK | CLK | LCM模组 (时钟线) | 显示 (SPI) |
| GPIOB_04 | LCD SPI WP | D2 | LCM模组 (数据线2) | 显示 (SPI) |
| GPIOB_05 | LCD_SPI CS | CS | LCM模组 (片选) | 显示 (SPI) |
| GPIOB_06 | KEY1 | | ADC按键 | 输入/控制 |
| GPIOB_07 | KEY2 | | 触摸按键 | 输入/控制 |
| GPIOB_08 | LCD_TE | | LCD TE中断 | 显示/中断 |
| GPIOB_09 | LED | | 单色指示灯 | GPIO |
| FLASH_CS_N | FLASH_CS_N | FLASH_CS_N | Boot Flash | 存储 (Flash) |
| FLASH_MISO | FLASH_MISO | FLASH_MISO | Boot Flash | 存储 (Flash) |
| FLASH_WP_N | FLASH_WP_N | FLASH_WP_N | Boot Flash | 存储 (Flash) |
| FLASH_HOLD_N | FLASH_HOLD_N | FLASH_HOLD_N | Boot Flash | 存储 (Flash) |
| FLASH_CLK | FLASH_CLK | FLASH_CLK | Boot Flash | 存储 (Flash) |
| FLASH_MOSI | FLASH_MOSI | FLASH_MOSI | Boot Flash | 存储 (Flash) |
| USB_DP | USB_DP | | USB口 | 通信 (USB) |
| USB_DM | USB_DM | | USB口 | 通信 (USB) |
| LIN_OUTP | LIN_OUTP | | 差分输出 正 | 音频 |
| LIN_OUTN | LIN_OUTN | | 差分输出 反 | 音频 |

View File

@@ -0,0 +1,17 @@
/*
* Copyright (c) 2025, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file board.c
* @brief 板级初始化实现
*/
#include "board.h"
const char* board_get_name(void)
{
return CONFIG_BOARD_NAME;
}

View File

@@ -0,0 +1,26 @@
/**
* @file board.h
* @brief 板级接口定义
*
* 本文件定义了板级支持包必须实现的标准接口。
* 所有板型都应该提供这些接口,以确保系统能够正确初始化硬件。
*/
#pragma once
#include "pinmux.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief 获取板型名称
*
* @return 指向板型名称字符串的指针(静态字符串,无需释放)
*/
const char* board_get_name(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,138 @@
/*
* Copyright (c) 2026, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file pinmux.c
* @brief 引脚复用配置
*
* 本文件由 LISA Pinmux Tool 自动生成
* 生成工具: https://tool.listenai.com/ls-pinmux-tool/
*
* 说明:
* - 所有外设的 pinmux 函数都会生成,未配置的外设函数体为空
* - 所有函数使用 weak 属性修饰,可在用户代码中重写
* - 尽量避免手动修改该文件,建议统一使用工具生成
*/
#include "pinmux.h"
#include "IOMuxManager.h"
__attribute__((weak)) void lisa_adc_pinmux()
{
AON_IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 6, 3);
}
__attribute__((weak)) void lisa_capture_pinmux()
{
}
__attribute__((weak)) void lisa_dvp_pinmux()
{
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 10, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 11, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 12, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 13, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 14, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 15, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 16, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 17, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 18, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 19, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 20, 16);
// IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 26, 16);
}
__attribute__((weak)) void lisa_gpioa_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, LCD_RST_PIN, 1);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, TP_INT_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, TP_RST_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, PA_EN_PIN, 0);
}
__attribute__((weak)) void lisa_gpiob_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, LCD_TE_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, LED_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, CAMERA_PWDN_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, LCD_CD_PIN, 0);
}
__attribute__((weak)) void lisa_i2c0_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 22, 8);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 23, 8);
}
__attribute__((weak)) void lisa_i2c1_pinmux()
{
}
__attribute__((weak)) void lisa_i2s0_pinmux()
{
}
__attribute__((weak)) void lisa_i2s1_pinmux()
{
}
__attribute__((weak)) void lisa_jtag_pinmux()
{
}
__attribute__((weak)) void lisa_pwm_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, LCD_PWM_PIN, 12);
}
__attribute__((weak)) void lisa_qspi_lcd_pinmux()
{
}
__attribute__((weak)) void lisa_rgb_pinmux()
{
}
__attribute__((weak)) void lisa_sdio_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 4, 15);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 5, 15);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 6, 15);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 7, 15);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 8, 15);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 9, 15);
}
__attribute__((weak)) void lisa_spi0_pinmux()
{
}
__attribute__((weak)) void lisa_spi1_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 5, 6);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 3, 6);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 1, 6);
}
__attribute__((weak)) void lisa_spi2_pinmux()
{
}
__attribute__((weak)) void lisa_uart0_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CP_LOG_RX_PIN, 2);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CP_LOG_TX_PIN, 2);
}
__attribute__((weak)) void lisa_uart1_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, AP_LOG_TX_PIN, 3);
}
__attribute__((weak)) void lisa_uart2_pinmux()
{
}

View File

@@ -0,0 +1,63 @@
/*
* Copyright (c) 2026, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file pinmux.h
* @brief 引脚复用配置头文件
*
* 本文件由 LISA Pinmux Tool 自动生成
* 生成工具: https://tool.listenai.com/ls-pinmux-tool/
*
* 说明:
* - 包含所有外设 pinmux 函数的声明
* - 包含引脚别名宏定义(如果有设置)
* - 尽量避免手动修改该文件,建议统一使用工具生成
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
// Pin aliases
#define LCD_PWM_PIN 0
#define LCD_RST_PIN 1
#define CP_LOG_RX_PIN 2
#define CP_LOG_TX_PIN 3
#define AP_LOG_TX_PIN 21
#define TP_INT_PIN 24
#define TP_RST_PIN 25
#define PA_EN_PIN 27
#define LCD_TE_PIN 8
#define LED_PIN 9
#define CAMERA_PWDN_PIN 7
#define LCD_CD_PIN 0
void lisa_adc_pinmux();
void lisa_capture_pinmux();
void lisa_dvp_pinmux();
void lisa_gpioa_pinmux();
void lisa_gpiob_pinmux();
void lisa_i2c0_pinmux();
void lisa_i2c1_pinmux();
void lisa_i2s0_pinmux();
void lisa_i2s1_pinmux();
void lisa_jtag_pinmux();
void lisa_pwm_pinmux();
void lisa_qspi_lcd_pinmux();
void lisa_rgb_pinmux();
void lisa_sdio_pinmux();
void lisa_spi0_pinmux();
void lisa_spi1_pinmux();
void lisa_spi2_pinmux();
void lisa_uart0_pinmux();
void lisa_uart1_pinmux();
void lisa_uart2_pinmux();
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,17 @@
# ARCS BOARD SUPPORT
#
# Copyright (c) 2025, LISTENAI
# SPDX-License-Identifier: Apache-2.0
# 创建板型库
listenai_library_named(module_boards)
# 添加源文件
listenai_library_sources(
pinmux.c
board.c
)
# 添加头文件路径
listenai_include_directories(${CMAKE_CURRENT_SOURCE_DIR})

View File

@@ -0,0 +1,18 @@
# Board Configuration
#
# Copyright (c) 2025, LISTENAI
# SPDX-License-Identifier: Apache-2.0
config BOARD_NAME
string
default "arcs_mini"
prompt "Board Name"
help
Board Name
config BOARD_ARCS_MINI
bool
default y
help
Board is arcs_mini

View File

@@ -0,0 +1,190 @@
# ARCS Mini 开发板
## 板型概述
ARCS Mini 是一款紧凑型开发板,适用于快速原型开发和嵌入式应用学习。
**板型标识:** `arcs_mini`
## 板型外观
![ARCS Mini 开发板](../../assets/arcs_mini_board.png)
*ARCS Mini 开发板外观图(标注序号说明见下表)*
## 硬件接口说明
下表详细说明了开发板上的各个接口和组件:
| 序号 | 接口/组件 | 说明 |
|------|----------|------|
| 1 | 预留烧录串口 | 引出可用于烧录 boot 固件和查看日志的引脚。注意boot 固件已在工厂预烧录,一般不需要使用此接口 |
| 2 | 屏幕SPI接口 | 屏幕连接器,用于连接开发板默认附带的显示屏 |
| 3 | 摄像头DVP接口 | 摄像头 FPC 连接器,用于连接开发板默认附带的摄像头 |
| 4 | I/O拓展接口 | 引出 6 个可编程 GPIO 和一组电源/GND可用于连接外部传感器或其他外部设备。<br>引脚定义PCBA 放置如图所示时,从下到上依次为 VCC(3.3V)、GND、A04、A05、A06、A07、A08、A09 |
| 5 | 主功能按键 | 用于开发板开关机等交互触发操作 |
| 6 | 充放电LED | 充电状态指示灯,充电时红色常亮 |
| 7 | USB接口 | TypeC 接口,提供供电、充电、固件烧录功能(需要已烧录 boot 固件) |
| 8 | 可编程LED | 支持通过编程控制的 LED使用 B01 引脚 |
| 9 | RST按钮 | Reset 按键,短按该按键会对开发板执行复位操作 |
| 10 | 麦克风接口 | 用于连接开发板默认附带的驻极体麦克风,用户也可以替换或外接其他麦克风 |
| 11 | 扬声器接口 | 用于连接开发板默认附带的扬声器,用户也可以替换或外接其他扬声器 |
| 12 | 锂电池接口 | 用于连接开发板默认附带的锂电池 |
## 硬件特性
### 主要参数
- **芯片平台**:基于 ARCS 架构
- **板型尺寸**:紧凑型设计
- **适用场景**:快速原型开发、教学演示、功能验证
### 外设支持
#### 串口通信UART
| 串口 | 引脚 | 功能 | 功能码 | 说明 |
|------|------|------|--------|------|
| UART0 | PAD_A[3] | AP_LOG_TX | 2 | 主串口 TXAP 日志输出) |
| UART0 | PAD_A[2] | AP_LOG_RX | 2 | 主串口 RXAP 日志输出) |
| UART2 | PAD_B[2] | CP_LOG_TX | 3 | 辅助串口 TXCP 日志输出) |
#### I2C 总线
| 总线 | 引脚 | 功能 | 功能码 | 说明 |
|------|------|------|--------|------|
| I2C0 | PAD_B[6] | SCL | 8 | 主 I2C 时钟线(摄像头) |
| I2C0 | PAD_B[7] | SDA | 8 | 主 I2C 数据线(摄像头) |
#### SPI 总线
| 总线 | 引脚 | 功能 | 功能码 | 说明 |
|------|------|------|--------|------|
| SPI0 | PAD_A[22] | CS | 5 | LCD SPI 片选 |
| SPI0 | PAD_A[24] | MOSI | 5 | LCD SPI 主出从入 |
| SPI0 | PAD_A[25] | CLK | 5 | LCD SPI 时钟线 |
#### GPIO通用输入/输出)
| 引脚组 | 引脚 | 功能名称 | 功能码 | 说明 |
|--------|------|----------|--------|------|
| GPIO_A | PAD_A[0] | CAMERA_RST | 1 | 摄像头复位控制 |
| GPIO_A | PAD_A[1] | PA_EN | 1 | 功放使能控制 |
| GPIO_A | PAD_A[4-9] | 可编程 GPIO | 0 | IO 扩展接口 |
| GPIO_A | PAD_A[23] | LCD_CD | 0 | LCD 命令/数据选择 |
| GPIO_A | PAD_A[27] | LCD_TE | 0 | LCD 撕裂效应信号 |
| GPIO_B | PAD_B[0] | USB_DET | 0 | USB 检测 |
| GPIO_B | PAD_B[1] | LED | 0 | LED 指示灯控制 |
| GPIO_B | PAD_B[3] | POWER_EN | 0 | 电源使能控制 |
| GPIO_B | PAD_B[4] | POWER_KEY | 0 | 电源按键输入 |
| GPIO_B | PAD_B[8] | CHARGE_DET | 0 | 充电检测 |
| GPIO_B | PAD_B[9] | LCD_RST | 0 | LCD 复位控制 |
#### PWM脉宽调制
| 功能名称 | 引脚 | 功能码 | 说明 |
|----------|------|--------|------|
| LCD_PWM | PAD_A[21] | 12 | LCD 背光亮度调节 |
#### SDIO
| 接口 | 引脚范围 | 引脚数量 | 功能码 | 说明 |
|------|----------|----------|--------|------|
| SDIO | PAD_A[4-9] | 6 | 15 | SD 卡/eMMC 接口(数据/控制线) |
#### DVP数字视频接口
| 接口 | 引脚范围 | 引脚数量 | 功能码 | 说明 |
|------|----------|----------|--------|------|
| DVP | PAD_A[10-20, 26] | 12 | 16 | 摄像头接口(数据线) |
#### ADC模数转换
| 功能 | 通道引脚 | 功能码 | 说明 |
|------|----------|--------|------|
| ADC | PAD_B[5] | 3 | 电池电压检测AON 域) |
## 引脚配置说明
所有外设的引脚复用配置定义在 [pinmux.h](pinmux.h) 和 [pinmux.c](pinmux.c) 中。这些文件由 LISA Pinmux Tool 自动生成,建议使用工具进行修改。
### 引脚别名
为方便使用,常用引脚已定义别名(参见 [pinmux.h:26-41](pinmux.h#L26-L41)
```c
CAMERA_RST_PIN // PAD_A[0]
PA_EN_PIN // PAD_A[1]
AP_LOG_RX_PIN // PAD_A[2]
AP_LOG_TX_PIN // PAD_A[3]
LCD_PWM_PIN // PAD_A[21]
LCD_CD_PIN // PAD_A[23]
LCD_TE_PIN // PAD_A[27]
CP_LOG_TX_PIN // PAD_B[2]
POWER_EN_PIN // PAD_B[3]
POWER_KEY_PIN // PAD_B[4]
BAT_ADC_PIN // PAD_B[5]
CHARGE_DET_PIN // PAD_B[8]
LCD_RST_PIN // PAD_B[9]
USB_DET_PIN // PAD_B[0]
LED_PIN // PAD_B[1]
```
### 引脚功能说明
下表为 LS26 芯片在 Arcs-Mini 开发板上的 GPIO 分配使用列表:
| 引脚/端口 | 主功能 | 说明/连接外设 | 分类 |
|-----------|--------|---------------|------|
| GPIOA_00 | CAM_RST | 摄像头复位 | 摄像头 |
| GPIOA_01 | PA_EN | 功放使能控制 | 音频 |
| GPIOA_02 | UART0 RX | 预留烧录串口 | 烧录&日志 |
| GPIOA_03 | UART0 TX | 预留烧录串口 | 烧录&日志 |
| GPIOA_04 | 可编程 GPIO | IO 扩展接口 | I/O 扩展 |
| GPIOA_05 | 可编程 GPIO | IO 扩展接口 | I/O 扩展 |
| GPIOA_06 | 可编程 GPIO | IO 扩展接口 | I/O 扩展 |
| GPIOA_07 | 可编程 GPIO | IO 扩展接口 | I/O 扩展 |
| GPIOA_08 | 可编程 GPIO | IO 扩展接口 | I/O 扩展 |
| GPIOA_09 | 可编程 GPIO | IO 扩展接口 | I/O 扩展 |
| GPIOA_10 | HSYNC | DVP 摄像头水平同步 | 摄像头 |
| GPIOA_11 | VSYNC | DVP 摄像头垂直同步 | 摄像头 |
| GPIOA_12 | DVP_CLK | DVP 摄像头像素时钟 | 摄像头 |
| GPIOA_13 | DVP_D4 | DVP 摄像头数据线 4 | 摄像头 |
| GPIOA_14 | DVP_D5 | DVP 摄像头数据线 5 | 摄像头 |
| GPIOA_15 | DVP_D6 | DVP 摄像头数据线 6 | 摄像头 |
| GPIOA_16 | DVP_D7 | DVP 摄像头数据线 7 | 摄像头 |
| GPIOA_17 | DVP_D8 | DVP 摄像头数据线 8 | 摄像头 |
| GPIOA_18 | DVP_D9 | DVP 摄像头数据线 9 | 摄像头 |
| GPIOA_19 | DVP_D10 | DVP 摄像头数据线 10 | 摄像头 |
| GPIOA_20 | DVP_D11 | DVP 摄像头数据线 11 | 摄像头 |
| GPIOA_21 | LCD_PWM | LCD 背光 PWM 控制 | 显示 |
| GPIOA_22 | LCD_SPI0_CS | LCD SPI 片选 | 显示 |
| GPIOA_23 | LCD_GPIO_WR | LCD 命令/数据选择 | 显示 |
| GPIOA_24 | LCD_SPI0_MOSI | LCD SPI 数据输出 | 显示 |
| GPIOA_25 | LCD_SPI0_CLK | LCD SPI 时钟 | 显示 |
| GPIOA_26 | DVP_MCLK | DVP 摄像头主时钟 | 摄像头 |
| GPIOA_27 | LCD_TE | LCD 撕裂效应信号 | 显示 |
| GPIOA_28 | MIC1 AEC_P | 硬回采正极 | 音频 |
| GPIOA_29 | MIC1 AEC_N | 硬回采负极 | 音频 |
| GPIOA_30 | MIC0 INP | 麦克风输入正极 | 音频 |
| GPIOA_31 | MIC0 INN | 麦克风输入负极 | 音频 |
| GPIOB_00 | USB_DET | USB 插入检测 | 通信 (USB) |
| GPIOB_01 | LED | 用户 LED | GPIO |
| GPIOB_02 | uart2_txd | 预留烧录串口 TX | 烧录&日志 |
| GPIOB_03 | POW_EN | 电源使能 | 电源 |
| GPIOB_04 | power_KEY | 主功能按键 | 输入/控制 |
| GPIOB_05 | ADC_Bat_Vol | 电池电量检测 | 电源 |
| GPIOB_06 | SDA0 | I2C0 数据线(摄像头) | 通信 (I2C) |
| GPIOB_07 | CLK0 | I2C0 时钟线(摄像头) | 通信 (I2C) |
| GPIOB_08 | CHARGE_DET | 充电状态检测 | 电源 |
| GPIOB_09 | LCD_RST | LCD 复位 | 显示 |
| FLASH_CS_N | FLASH_CS_N | Boot Flash 片选 | 存储 (Flash) |
| FLASH_MISO | FLASH_MISO | Boot Flash 数据输入 | 存储 (Flash) |
| FLASH_WP_N | FLASH_WP_N | Boot Flash 写保护 | 存储 (Flash) |
| FLASH_HOLD_N | FLASH_HOLD_N | Boot Flash 保持 | 存储 (Flash) |
| FLASH_CLK | FLASH_CLK | Boot Flash 时钟 | 存储 (Flash) |
| FLASH_MOSI | FLASH_MOSI | Boot Flash 数据输出 | 存储 (Flash) |
| USB_DP | USB_DP | USB 差分正极 | 通信 (USB) |
| USB_DM | USB_DM | USB 差分负极 | 通信 (USB) |
| MIC_BIAS | MIC_BIAS | 麦克风偏置 | 音频 |
| LIN_OUTP | LIN_OUTP | 差分输出正极 | 音频 |
| LIN_OUTN | LIN_OUTN | 差分输出负极 | 音频 |

View File

@@ -0,0 +1,17 @@
/*
* Copyright (c) 2025, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file board.c
* @brief 板级初始化实现
*/
#include "board.h"
const char* board_get_name(void)
{
return "arcs_mini";
}

View File

@@ -0,0 +1,26 @@
/**
* @file board.h
* @brief 板级接口定义
*
* 本文件定义了板级支持包必须实现的标准接口。
* 所有板型都应该提供这些接口,以确保系统能够正确初始化硬件。
*/
#pragma once
#include "pinmux.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief 获取板型名称
*
* @return 指向板型名称字符串的指针(静态字符串,无需释放)
*/
const char* board_get_name(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,134 @@
/*
* Copyright (c) 2026, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file pinmux.c
* @brief 引脚复用配置
*
* 本文件由 LISA Pinmux Tool 自动生成
* 生成工具: https://tool.listenai.com/ls-pinmux-tool/
*
* 说明:
* - 所有外设的 pinmux 函数都会生成,未配置的外设函数体为空
* - 所有函数使用 weak 属性修饰,可在用户代码中重写
* - 尽量避免手动修改该文件,建议统一使用工具生成
*/
#include "pinmux.h"
#include "IOMuxManager.h"
__attribute__((weak)) void lisa_adc_pinmux()
{
AON_IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, BAT_ADC_PIN, 3);
}
__attribute__((weak)) void lisa_capture_pinmux()
{
}
__attribute__((weak)) void lisa_dvp_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_HSYNC_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_VSYNC_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_PCLK_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_D0_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_D1_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_D2_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_D3_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_D4_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_D5_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_D6_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_D7_PIN, 16);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAM_MCLK_PIN, 16);
}
__attribute__((weak)) void lisa_gpioa_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CAMERA_RST_PIN, 1);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, PA_EN_PIN, 1);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, LCD_CD_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, LCD_TE_PIN, 0);
}
__attribute__((weak)) void lisa_gpiob_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, USB_DET_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, LED_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, POWER_EN_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, POWER_KEY_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, CHARGE_DET_PIN, 0);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, LCD_RST_PIN, 0);
}
__attribute__((weak)) void lisa_i2c0_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 6, 8);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 7, 8);
}
__attribute__((weak)) void lisa_i2c1_pinmux()
{
}
__attribute__((weak)) void lisa_i2s0_pinmux()
{
}
__attribute__((weak)) void lisa_i2s1_pinmux()
{
}
__attribute__((weak)) void lisa_jtag_pinmux()
{
}
__attribute__((weak)) void lisa_pwm_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, LCD_PWM_PIN, 12);
}
__attribute__((weak)) void lisa_qspi_lcd_pinmux()
{
}
__attribute__((weak)) void lisa_rgb_pinmux()
{
}
__attribute__((weak)) void lisa_sdio_pinmux()
{
}
__attribute__((weak)) void lisa_spi0_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, LCD_CS_PIN, 5);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, LCD_SPI_DATA_PIN, 5);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, LCD_SPI_CLK_PIN, 5);
}
__attribute__((weak)) void lisa_spi1_pinmux()
{
}
__attribute__((weak)) void lisa_spi2_pinmux()
{
}
__attribute__((weak)) void lisa_uart0_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, AP_LOG_RX_PIN, 2);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, AP_LOG_TX_PIN, 2);
}
__attribute__((weak)) void lisa_uart1_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, CP_LOG_TX_PIN, 3);
}
__attribute__((weak)) void lisa_uart2_pinmux()
{
}

View File

@@ -0,0 +1,81 @@
/*
* Copyright (c) 2026, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file pinmux.h
* @brief 引脚复用配置头文件
*
* 本文件由 LISA Pinmux Tool 自动生成
* 生成工具: https://tool.listenai.com/ls-pinmux-tool/
*
* 说明:
* - 包含所有外设 pinmux 函数的声明
* - 包含引脚别名宏定义(如果有设置)
* - 尽量避免手动修改该文件,建议统一使用工具生成
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
// Pin aliases
#define CAMERA_RST_PIN 0
#define PA_EN_PIN 1
#define AP_LOG_RX_PIN 2
#define AP_LOG_TX_PIN 3
#define CAM_HSYNC_PIN 10
#define CAM_VSYNC_PIN 11
#define CAM_PCLK_PIN 12
#define CAM_D0_PIN 13
#define CAM_D1_PIN 14
#define CAM_D2_PIN 15
#define CAM_D3_PIN 16
#define CAM_D4_PIN 17
#define CAM_D5_PIN 18
#define CAM_D6_PIN 19
#define CAM_D7_PIN 20
#define LCD_PWM_PIN 21
#define LCD_CS_PIN 22
#define LCD_CD_PIN 23
#define LCD_SPI_DATA_PIN 24
#define LCD_SPI_CLK_PIN 25
#define CAM_MCLK_PIN 26
#define LCD_TE_PIN 27
#define USB_DET_PIN 0
#define LED_PIN 1
#define CP_LOG_TX_PIN 2
#define POWER_EN_PIN 3
#define POWER_KEY_PIN 4
#define BAT_ADC_PIN 5
#define CHARGE_DET_PIN 8
#define LCD_RST_PIN 9
void lisa_adc_pinmux();
void lisa_capture_pinmux();
void lisa_dvp_pinmux();
void lisa_gpioa_pinmux();
void lisa_gpiob_pinmux();
void lisa_i2c0_pinmux();
void lisa_i2c1_pinmux();
void lisa_i2s0_pinmux();
void lisa_i2s1_pinmux();
void lisa_jtag_pinmux();
void lisa_pwm_pinmux();
void lisa_qspi_lcd_pinmux();
void lisa_rgb_pinmux();
void lisa_sdio_pinmux();
void lisa_spi0_pinmux();
void lisa_spi1_pinmux();
void lisa_spi2_pinmux();
void lisa_uart0_pinmux();
void lisa_uart1_pinmux();
void lisa_uart2_pinmux();
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,505 @@
{
"project": {
"id": 1,
"name": "ARCS_76PIN_MINI",
"sdk": "v0.1.0",
"soc": "LS2664",
"package": "QFN76"
},
"pinConfig": {
"PA00": {
"alias": "CAMERA_RST",
"function": "gpioa_00",
"instance": "GPIOA",
"peripheral": "GPIO",
"signal": "GPIO_A_00"
},
"PA01": {
"alias": "PA_EN",
"function": "gpioa_01",
"instance": "GPIOA",
"peripheral": "GPIO",
"signal": "GPIO_A_01"
},
"PA02": {
"alias": "AP_LOG_RX",
"function": "uart0_rxd",
"instance": "UART0",
"peripheral": "UART",
"signal": "RX"
},
"PA03": {
"alias": "AP_LOG_TX",
"function": "uart0_txd",
"instance": "UART0",
"peripheral": "UART",
"signal": "TX"
},
"PA10": {
"function": "vic_h_sync",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_H_SYNC",
"alias": "CAM_HSYNC"
},
"PA11": {
"function": "vic_v_sync",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_V_SYNC",
"alias": "CAM_VSYNC"
},
"PA12": {
"function": "vic_pixel_clk",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_PIXEL_CLK",
"alias": "CAM_PCLK"
},
"PA13": {
"function": "vic_pixel_data4",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_PIXEL_DATA4",
"alias": "CAM_D0"
},
"PA14": {
"function": "vic_pixel_data5",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_PIXEL_DATA5",
"alias": "CAM_D1"
},
"PA15": {
"function": "vic_pixel_data6",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_PIXEL_DATA6",
"alias": "CAM_D2"
},
"PA16": {
"function": "vic_pixel_data7",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_PIXEL_DATA7",
"alias": "CAM_D3"
},
"PA17": {
"function": "vic_pixel_data8",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_PIXEL_DATA8",
"alias": "CAM_D4"
},
"PA18": {
"function": "vic_pixel_data9",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_PIXEL_DATA9",
"alias": "CAM_D5"
},
"PA19": {
"function": "vic_pixel_data10",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_PIXEL_DATA10",
"alias": "CAM_D6"
},
"PA20": {
"function": "vic_pixel_data11",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_PIXEL_DATA11",
"alias": "CAM_D7"
},
"PA21": {
"alias": "LCD_PWM",
"function": "gpt_pwm_1",
"instance": "CH1",
"peripheral": "PWM",
"signal": "OUT"
},
"PA22": {
"function": "spi0_cs_n",
"peripheral": "SPI",
"instance": "SPI0",
"signal": "CS",
"alias": "LCD_CS"
},
"PA23": {
"alias": "LCD_CD",
"function": "gpioa_23",
"instance": "GPIOA",
"peripheral": "GPIO",
"signal": "GPIO_A_23"
},
"PA24": {
"function": "spi0_mosi",
"peripheral": "SPI",
"instance": "SPI0",
"signal": "MOSI",
"alias": "LCD_SPI_DATA"
},
"PA25": {
"function": "spi0_clk",
"peripheral": "SPI",
"instance": "SPI0",
"signal": "CLK",
"alias": "LCD_SPI_CLK"
},
"PA26": {
"function": "vic_clk_out",
"peripheral": "DVP",
"instance": "DVP",
"signal": "VIC_CLK_OUT",
"alias": "CAM_MCLK"
},
"PA27": {
"alias": "LCD_TE",
"function": "gpioa_27",
"instance": "GPIOA",
"peripheral": "GPIO",
"signal": "GPIO_A_27"
},
"PB00": {
"alias": "USB_DET",
"function": "gpiob_00",
"instance": "GPIOB",
"peripheral": "GPIO",
"signal": "GPIO_B_00"
},
"PB01": {
"alias": "LED",
"function": "gpiob_01",
"instance": "GPIOB",
"peripheral": "GPIO",
"signal": "GPIO_B_01"
},
"PB02": {
"alias": "CP_LOG_TX",
"function": "uart1_txd",
"instance": "UART1",
"peripheral": "UART",
"signal": "TX"
},
"PB03": {
"alias": "POWER_EN",
"function": "gpiob_03",
"instance": "GPIOB",
"peripheral": "GPIO",
"signal": "GPIO_B_03"
},
"PB04": {
"alias": "POWER_KEY",
"function": "gpiob_04",
"instance": "GPIOB",
"peripheral": "GPIO",
"signal": "GPIO_B_04"
},
"PB05": {
"alias": "BAT_ADC",
"function": "adc_ch3",
"instance": "CH3",
"peripheral": "ADC",
"signal": "IN"
},
"PB06": {
"function": "i2c0_sda",
"instance": "I2C0",
"peripheral": "I2C",
"signal": "SDA"
},
"PB07": {
"function": "i2c0_scl",
"instance": "I2C0",
"peripheral": "I2C",
"signal": "SCL"
},
"PB08": {
"alias": "CHARGE_DET",
"function": "gpiob_08",
"instance": "GPIOB",
"peripheral": "GPIO",
"signal": "GPIO_B_08"
},
"PB09": {
"alias": "LCD_RST",
"function": "gpiob_09",
"instance": "GPIOB",
"peripheral": "GPIO",
"signal": "GPIO_B_09"
}
},
"peripheralConfig": {
"ADC": {
"CH0": {
"IN": null
},
"CH1": {
"IN": null
},
"CH2": {
"IN": null
},
"CH3": {
"IN": "PB05"
},
"CH4": {
"IN": null
},
"CH5": {
"IN": null
}
},
"CAPTURE": {
"CH0": {
"IN": null
},
"CH1": {
"IN": null
},
"CH2": {
"IN": null
},
"CH3": {
"IN": null
},
"CH4": {
"IN": null
},
"CH5": {
"IN": null
},
"CH6": {
"IN": null
},
"CH7": {
"IN": null
}
},
"DVP": {
"DVP": {
"VIC_H_SYNC": "PA10",
"VIC_V_SYNC": "PA11",
"VIC_PIXEL_CLK": "PA12",
"VIC_CLK_OUT": "PA26",
"VIC_PIXEL_DATA0": null,
"VIC_PIXEL_DATA1": null,
"VIC_PIXEL_DATA2": null,
"VIC_PIXEL_DATA3": null,
"VIC_PIXEL_DATA4": "PA13",
"VIC_PIXEL_DATA5": "PA14",
"VIC_PIXEL_DATA6": "PA15",
"VIC_PIXEL_DATA7": "PA16",
"VIC_PIXEL_DATA8": "PA17",
"VIC_PIXEL_DATA9": "PA18",
"VIC_PIXEL_DATA10": "PA19",
"VIC_PIXEL_DATA11": "PA20"
}
},
"GPIO": {
"GPIOA": {
"GPIO_A_00": "PA00",
"GPIO_A_01": "PA01",
"GPIO_A_02": null,
"GPIO_A_03": null,
"GPIO_A_04": null,
"GPIO_A_05": null,
"GPIO_A_06": null,
"GPIO_A_07": null,
"GPIO_A_08": null,
"GPIO_A_09": null,
"GPIO_A_10": null,
"GPIO_A_11": null,
"GPIO_A_12": null,
"GPIO_A_13": null,
"GPIO_A_14": null,
"GPIO_A_15": null,
"GPIO_A_16": null,
"GPIO_A_17": null,
"GPIO_A_18": null,
"GPIO_A_19": null,
"GPIO_A_20": null,
"GPIO_A_21": null,
"GPIO_A_22": null,
"GPIO_A_23": "PA23",
"GPIO_A_24": null,
"GPIO_A_25": null,
"GPIO_A_26": null,
"GPIO_A_27": "PA27",
"GPIO_A_28": null,
"GPIO_A_29": null,
"GPIO_A_30": null,
"GPIO_A_31": null
},
"GPIOB": {
"GPIO_B_00": "PB00",
"GPIO_B_01": "PB01",
"GPIO_B_02": null,
"GPIO_B_03": "PB03",
"GPIO_B_04": "PB04",
"GPIO_B_05": null,
"GPIO_B_06": null,
"GPIO_B_07": null,
"GPIO_B_08": "PB08",
"GPIO_B_09": "PB09"
}
},
"I2C": {
"I2C0": {
"SCL": "PB07",
"SDA": "PB06"
},
"I2C1": {
"SCL": null,
"SDA": null
}
},
"I2S": {
"I2S0": {
"BCLK": null,
"LRCK": null,
"SDOUT": null,
"SDIN": null
},
"I2S1": {
"BCLK": null,
"LRCK": null,
"SDOUT": null,
"SDIN": null
}
},
"JTAG": {
"JTAG": {
"TCK": null,
"TMS": null,
"TDI": null,
"TDO": null
}
},
"PWM": {
"CH0": {
"OUT": null
},
"CH1": {
"OUT": "PA21"
},
"CH2": {
"OUT": null
},
"CH3": {
"OUT": null
},
"CH4": {
"OUT": null
},
"CH5": {
"OUT": null
},
"CH6": {
"OUT": null
},
"CH7": {
"OUT": null
}
},
"QSPI_LCD": {
"QSPI_LCD": {
"CS": null,
"CLK": null,
"IO0": null,
"IO1": null,
"IO2": null,
"IO3": null
}
},
"RGB": {
"RGB": {
"HSYNC": null,
"VSYNC": null,
"PCLK": null,
"DE": null,
"DR0": null,
"DR1": null,
"DR2": null,
"DR3": null,
"DR4": null,
"DR5": null,
"DR6": null,
"DR7": null,
"DG0": null,
"DG1": null,
"DG2": null,
"DG3": null,
"DG4": null,
"DG5": null,
"DG6": null,
"DG7": null,
"DB0": null,
"DB1": null,
"DB2": null,
"DB3": null,
"DB4": null,
"DB5": null,
"DB6": null,
"DB7": null
}
},
"SDIO": {
"SDIO": {
"CMD": null,
"CLK": null,
"DAT0": null,
"DAT1": null,
"DAT2": null,
"DAT3": null
}
},
"SPI": {
"SPI0": {
"CLK": "PA25",
"CS": "PA22",
"MISO": null,
"MOSI": "PA24",
"WP": null,
"HOLD": null
},
"SPI1": {
"CLK": null,
"CS": null,
"MISO": null,
"MOSI": null,
"WP": null,
"HOLD": null
},
"SPI2": {
"CLK": null,
"CS": null,
"MISO": null,
"MOSI": null,
"WP": null,
"HOLD": null
}
},
"UART": {
"UART0": {
"TX": "PA03",
"RX": "PA02",
"CTS": null,
"RTS": null
},
"UART1": {
"TX": "PB02",
"RX": null,
"CTS": null,
"RTS": null
},
"UART2": {
"TX": null,
"RX": null,
"CTS": null,
"RTS": null
}
}
}
}

View File

@@ -0,0 +1,37 @@
.. _boards:
板型支持
========
板型支持系统负责管理不同硬件板卡的配置和初始化。本系统采用模块化设计将引脚复用pinmux配置与板级初始化逻辑分离便于维护和扩展。
系统特性
--------
- **模块化设计**:板级代码与引脚配置分离
- **外部板型支持**:支持在 SDK 外部添加自定义板型,无需修改 SDK 源码
- **两级搜索机制**:优先搜索自定义路径,然后搜索 SDK 内置板型
- **简单易用**:通过 ``build.sh`` 命令行参数即可切换板型
- **配置管理**:通过 Kconfig 管理板型配置选项
已支持板型列表
--------------
SDK 当前内置以下板型:
* **arcs_mini** - ARCS Mini 开发板,紧凑型设计,适用于快速原型开发
* **arcs_evb** - ARCS EVB 评估板,功能丰富,适用于产品原型开发和功能评估
详细的板型技术资料请参考各板型目录下的 README.md 文档。
详细文档
--------
.. toctree::
:maxdepth: 1
BOARD_USAGE.md
BOARD_TEMPLATE.md
arcs_mini/README.md
arcs_evb/README.md