本文基于 lib_board_support (v1.3.0) 源码及文档,深入分析 XMOS 开发板硬件配置库的实现机制与应用指南。
一、概述
- SDK 全称:lib_board_support: XMOS board support
- 提供方:XMOS
- 版本号:1.3.0
- 核心能力:提供各 XMOS 评估开发板的板级硬件配置代码,包括音频 CODEC 配置、PLL 初始化、I2C 控制等
- 分析范围:API 接口详解、数据结构、支持的开发板、配置参数、已知问题与解决方案
二、整体架构与模块关系
2.1 架构层次图
#mermaid-svg-p6b55u22OZ2v4t8N{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-p6b55u22OZ2v4t8N .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-p6b55u22OZ2v4t8N .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-p6b55u22OZ2v4t8N .error-icon{fill:#552222;}#mermaid-svg-p6b55u22OZ2v4t8N .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-p6b55u22OZ2v4t8N .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-p6b55u22OZ2v4t8N .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-p6b55u22OZ2v4t8N .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-p6b55u22OZ2v4t8N .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-p6b55u22OZ2v4t8N .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-p6b55u22OZ2v4t8N .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-p6b55u22OZ2v4t8N .marker{fill:#333333;stroke:#333333;}#mermaid-svg-p6b55u22OZ2v4t8N .marker.cross{stroke:#333333;}#mermaid-svg-p6b55u22OZ2v4t8N svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-p6b55u22OZ2v4t8N p{margin:0;}#mermaid-svg-p6b55u22OZ2v4t8N .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-p6b55u22OZ2v4t8N .cluster-label text{fill:#333;}#mermaid-svg-p6b55u22OZ2v4t8N .cluster-label span{color:#333;}#mermaid-svg-p6b55u22OZ2v4t8N .cluster-label span p{background-color:transparent;}#mermaid-svg-p6b55u22OZ2v4t8N .label text,#mermaid-svg-p6b55u22OZ2v4t8N span{fill:#333;color:#333;}#mermaid-svg-p6b55u22OZ2v4t8N .node rect,#mermaid-svg-p6b55u22OZ2v4t8N .node circle,#mermaid-svg-p6b55u22OZ2v4t8N .node ellipse,#mermaid-svg-p6b55u22OZ2v4t8N .node polygon,#mermaid-svg-p6b55u22OZ2v4t8N .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-p6b55u22OZ2v4t8N .rough-node .label text,#mermaid-svg-p6b55u22OZ2v4t8N .node .label text,#mermaid-svg-p6b55u22OZ2v4t8N .image-shape .label,#mermaid-svg-p6b55u22OZ2v4t8N .icon-shape .label{text-anchor:middle;}#mermaid-svg-p6b55u22OZ2v4t8N .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-p6b55u22OZ2v4t8N .rough-node .label,#mermaid-svg-p6b55u22OZ2v4t8N .node .label,#mermaid-svg-p6b55u22OZ2v4t8N .image-shape .label,#mermaid-svg-p6b55u22OZ2v4t8N .icon-shape .label{text-align:center;}#mermaid-svg-p6b55u22OZ2v4t8N .node.clickable{cursor:pointer;}#mermaid-svg-p6b55u22OZ2v4t8N .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-p6b55u22OZ2v4t8N .arrowheadPath{fill:#333333;}#mermaid-svg-p6b55u22OZ2v4t8N .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-p6b55u22OZ2v4t8N .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-p6b55u22OZ2v4t8N .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-p6b55u22OZ2v4t8N .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-p6b55u22OZ2v4t8N .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-p6b55u22OZ2v4t8N .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-p6b55u22OZ2v4t8N .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-p6b55u22OZ2v4t8N .cluster text{fill:#333;}#mermaid-svg-p6b55u22OZ2v4t8N .cluster span{color:#333;}#mermaid-svg-p6b55u22OZ2v4t8N div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-p6b55u22OZ2v4t8N .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-p6b55u22OZ2v4t8N rect.text{fill:none;stroke-width:0;}#mermaid-svg-p6b55u22OZ2v4t8N .icon-shape,#mermaid-svg-p6b55u22OZ2v4t8N .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-p6b55u22OZ2v4t8N .icon-shape p,#mermaid-svg-p6b55u22OZ2v4t8N .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-p6b55u22OZ2v4t8N .icon-shape .label rect,#mermaid-svg-p6b55u22OZ2v4t8N .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-p6b55u22OZ2v4t8N .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-p6b55u22OZ2v4t8N .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-p6b55u22OZ2v4t8N :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
硬件抽象层
板级支持库层
应用层
调用配置函数
使用驱动
I2C控制
PLL配置
断言
应用程序 XC/C
板 API 层
驱动 API 层
lib_i2c
lib_sw_pll
lib_xassert
图 1 参考资料:lib_board_support/doc/rst/lib_board_support.rst
2.2 支持的开发板
| XK_EVK_XU316 | XC / C | XU316 评估套件 | lib_board_support.rst |
| XK_AUDIO_316_MC_AB | XC / C | 316 音频开发板 | lib_board_support.rst |
| XK_AUDIO_216_MC_AB | XC / C | 216 音频开发板 | lib_board_support.rst |
| XK_EVK_XU216 | XC | XU216 评估套件 | lib_board_support.rst |
| XK_ETH_XU316_DUAL_100M | XC | 双 100M 以太网开发板(未发布) | lib_board_support.rst |
2.3 模块职责说明
| 板支持 API | lib_board_support/api/boards/ | 各开发板的板级硬件配置 API | lib_board_support.rst |
| 驱动 API | lib_board_support/api/drivers/ | CS2100、CS4384、CS5368、TLV320AIC3204 驱动 | lib_board_support.rst |
| 板实现源码 | lib_board_support/src/boards/ | 各开发板的配置实现 | lib_board_support.rst |
| 示例工程 | examples/ | XC 和 C 语言的应用示例 | lib_board_support.rst |
| XN 文件 | xn_files/ | 硬件描述文件 | lib_board_support.rst |
2.4 文件夹架构说明
lib_board_support/
│
├── lib_board_support/ # 库核心目录
│ ├── api/ # 公共API头文件
│ │ ├── boards/ # 板级API
│ │ │ ├── xk_audio_316_mc_ab/ # XK_AUDIO_316_MC_AB 板支持
│ │ │ │ ├── board.h # 板级配置API定义
│ │ │ │ └── boardconf.h # 板级配置默认值
│ │ │ ├── xk_audio_216_mc_ab/ # XK_AUDIO_216_MC_AB 板支持
│ │ │ ├── xk_evk_xu316/ # XK_EVK_XU316 板支持
│ │ │ ├── xk_evk_xu216/ # XK_EVK_XU216 板支持
│ │ │ └── xk_eth_xu316_dual_100m/ # 双以太网板支持(未发布)
│ │ └── drivers/ # 驱动API
│ │ ├── cs2100.h # Clock Multiplier驱动
│ │ ├── cs4384.h # DAC驱动
│ │ ├── cs5368.h # ADC驱动
│ │ └── tlv320aic3204.h # Audio CODEC驱动
│ │
│ ├── src/ # 实现源码
│ │ └── boards/ # 各开发板实现
│ │ ├── xk_audio_316_mc_ab/ # 316音频板实现
│ │ ├── xk_audio_216_mc_ab/ # 216音频板实现
│ │ ├── xk_evk_xu316/ # 316评估板实现
│ │ ├── xk_evk_xu216/ # 216评估板实现
│ │ └── xk_eth_xu316_dual_100m/ # 以太网板实现
│ │
│ ├── lib_build_info.cmake # CMake构建信息
│ └── module_build_info # 模块构建配置
│
├── doc/ # 文档目录
│ └── rst/
│ ├── lib_board_support.rst # 详细技术文档
│ └── images/ # 文档图片资源
│
├── examples/ # 示例应用
│ ├── app_adat_looping/ # ADAT环路示例
│ ├── app_audio_hub/ # 音频集线器示例
│ ├── app_looping/ # 环路示例
│ └── app_simple/ # 简单示例
│
├── xn_files/ # 硬件描述文件
│ ├── XK_AUDIO_316_MC_AB.xn # 316音频板XN文件
│ ├── XK_AUDIO_216_MC_AB.xn # 216音频板XN文件
│ ├── XK_EVK_XU316.xn # 316评估板XN文件
│ └── XK_EVK_XU216.xn # 216评估板XN文件
│
├── CHANGELOG.rst # 版本变更日志
├── README.rst # 模块说明文档
├── LICENSE.rst # 许可证
└── settings.yml # 项目设置
文件夹功能说明:
| api/boards/ | 各开发板的板级硬件配置API,包含初始化、CODEC配置、PLL设置等 | lib_board_support/lib_board_support/api/boards/ |
| api/drivers/ | 音频CODEC驱动(CS2100、CS4384、CS5368、TLV320AIC3204) | lib_board_support/lib_board_support/api/drivers/ |
| src/boards/ | 各开发板的具体实现源码 | lib_board_support/lib_board_support/src/boards/ |
| xn_files/ | XN硬件描述文件,定义tile、端口、时钟等硬件资源 | lib_board_support/xn_files/ |
| examples/ | 应用示例,展示板级API的使用方法 | lib_board_support/examples/ |
| doc/rst/lib_board_support.rst | 详细技术文档,包含API使用说明和示例 | lib_board_support/doc/rst/lib_board_support.rst |
三、API 接口详细分析
3.1 使用前配置
编译宏配置(基于资料:lib_board_support.rst ):
# 在项目 CMakeLists.txt 中设置
set(APP_COMPILER_FLAGS
-DBOARD_SUPPORT_BOARD=XK_AUDIO_316_MC_AB # 选择对应开发板
)
头文件包含:
#include "xk_audio_316_mc_ab/board.h" // 按实际选择的板包含对应头文件
3.2 XK_AUDIO_316_MC_AB 核心 API
公共接口(参考资料:lib_board_support/lib_board_support/api/boards/xk_audio_316_mc_ab/board.h ):
配置结构体
typedef struct {
xk_audio_316_mc_ab_mclk_modes_t clk_mode; // 时钟模式选择
char dac_is_clock_master; // DAC 是否作为 I2S 时钟主
unsigned default_mclk; // 默认主时钟频率
unsigned pll_sync_freq; // PLL 同步频率
xk_audio_316_mc_ab_pcm_format_t pcm_format; // PCM 格式(I2S/TDM)
unsigned i2s_n_bits; // I2S 位宽
unsigned i2s_chans_per_frame; // 每帧通道数
} xk_audio_316_mc_ab_config_t;
参数说明:
| clk_mode | enum | CLK_FIXED、CLK_CS2100、CLK_PLL | 时钟模式选择,使用应用 PLL 或外部 CS2100 | board.h |
| dac_is_clock_master | char | 0 或 1 | DAC 是否作为 I2S 时钟主 | board.h |
| default_mclk | unsigned | 11.2896MHz – 49.152MHz | 标称时钟频率(Hz) | board.h |
| pcm_format | enum | AUD_316_PCM_FORMAT_I2S、AUD_316_PCM_FORMAT_TDM | PCM 格式选择 | board.h |
核心函数
void xk_audio_316_mc_ab_board_setup(const xk_audio_316_mc_ab_config_t *config);
- 调用要求:必须从 Tile 0 调用,且在 AudioHwInit 之前
- 功能:执行所需的端口操作以启用平台上的音频硬件
- 来源:board.h
void xk_audio_316_mc_ab_i2c_master(i2c_master_if i_i2c[1]);
- 调用要求:从 Tile 0 启动,在 board_setup 之后,Tile 1 调用前
- 功能:启动 I2C 主任务,提供跨 Tile I2C 访问
- 来源:board.h
void xk_audio_316_mc_ab_AudioHwInit(
i2c_master_if i_i2c,
const xk_audio_316_mc_ab_config_t *config);
- 调用要求:在 board_setup 之后调用一次
- 功能:初始化音频硬件,准备配置
- 来源:board.h
void xk_audio_316_mc_ab_AudioHwConfig(
i2c_master_if i_i2c,
const xk_audio_316_mc_ab_config_t *config,
unsigned samFreq,
unsigned mClk,
unsigned dsdMode,
unsigned sampRes_DAC,
unsigned sampRes_ADC);
- 参数说明:
- samFreq:采样率(Hz)
- mClk:主时钟(Hz)
- dsdMode:DSD 模式(1)或 PCM 模式(0)
- sampRes_DAC/ADC:DAC/ADC 采样分辨率(位)
- 调用时机:每次采样率或流格式变更时调用
- 来源:board.h
void xk_audio_316_mc_ab_i2c_master_exit(i2c_master_if i_i2c);
- 调用要求:从 Tile 1 调用
- 功能:使 Tile 0 退出,释放线程;调用后 Tile 1 的硬件配置调用将永久阻塞
- 来源:board.h
void xk_audio_316_mc_ab_AudioHwShutdown(i2c_master_if i_i2c); // 关闭硬件但保持电源
void xk_audio_316_mc_ab_AudioHwPowerdown(void); // 关闭音频硬件电源
void xk_audio_316_mc_ab_core_voltage_set(const xk_audio_316_mc_ab_xcore_voltage_t voltage_setting);
- 电压设置选项(board.h):
- AUD_316_XCORE_VOLTAGE_0_925V
- AUD_316_XCORE_VOLTAGE_0_922V
- AUD_316_XCORE_VOLTAGE_0_9V
- AUD_316_XCORE_VOLTAGE_0_854V
- AUD_316_XCORE_VOLTAGE_0_85V
- 注意:核心电压控制需谨慎,仅在显著降频时支持;请查阅数据手册的工作条件
四、数据结构与配置参数
4.1 时钟模式枚举
typedef enum {
CLK_FIXED, // 固定时钟(应用 PLL)
CLK_CS2100, // CS2100 外部可调 PLL
CLK_PLL // 应用 PLL 可调或固定
} xk_audio_316_mc_ab_mclk_modes_t;
4.2 PCM 格式枚举
typedef enum {
AUD_316_PCM_FORMAT_I2S, // 多数据线 I2S 格式
AUD_316_PCM_FORMAT_TDM // 单数据线 TDM 多通道格式
} xk_audio_316_mc_ab_pcm_format_t;
4.3 配置参数表格
| BOARD_SUPPORT_BOARD | 宏 | – | NULL_BOARD、XK_EVK_XU316、XK_AUDIO_316_MC_AB 等 | 选择开发板,确保仅编译对应板代码 | lib_board_support.rst |
| clk_mode | enum | CLK_FIXED | CLK_FIXED、CLK_CS2100、CLK_PLL | 时钟模式选择 | board.h |
| dac_is_clock_master | char | 0 | 0 或 1 | DAC 是否作为 I2S 时钟主 | board.h |
| default_mclk | unsigned | 24576000 | 11.2896MHz – 49.152MHz | 默认主时钟频率 | board.h |
| i2s_n_bits | unsigned | 32 | 16、24、32 | I2S 位宽 | board.h |
| i2s_chans_per_frame | unsigned | 2 | – | 每帧音频通道数 | board.h |
五、线程模型与数据流
5.1 跨 Tile 架构
说明:由于 I2C 主和 I2S 初始化通常在不同 tile,需跨 tile 通信(基于 lib_board_support.rst )。
架构示意图:
#mermaid-svg-0yLTq1cqTXRvr3pq{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0yLTq1cqTXRvr3pq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0yLTq1cqTXRvr3pq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0yLTq1cqTXRvr3pq .error-icon{fill:#552222;}#mermaid-svg-0yLTq1cqTXRvr3pq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0yLTq1cqTXRvr3pq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0yLTq1cqTXRvr3pq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0yLTq1cqTXRvr3pq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0yLTq1cqTXRvr3pq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0yLTq1cqTXRvr3pq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0yLTq1cqTXRvr3pq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0yLTq1cqTXRvr3pq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0yLTq1cqTXRvr3pq .marker.cross{stroke:#333333;}#mermaid-svg-0yLTq1cqTXRvr3pq svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0yLTq1cqTXRvr3pq p{margin:0;}#mermaid-svg-0yLTq1cqTXRvr3pq .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-0yLTq1cqTXRvr3pq .cluster-label text{fill:#333;}#mermaid-svg-0yLTq1cqTXRvr3pq .cluster-label span{color:#333;}#mermaid-svg-0yLTq1cqTXRvr3pq .cluster-label span p{background-color:transparent;}#mermaid-svg-0yLTq1cqTXRvr3pq .label text,#mermaid-svg-0yLTq1cqTXRvr3pq span{fill:#333;color:#333;}#mermaid-svg-0yLTq1cqTXRvr3pq .node rect,#mermaid-svg-0yLTq1cqTXRvr3pq .node circle,#mermaid-svg-0yLTq1cqTXRvr3pq .node ellipse,#mermaid-svg-0yLTq1cqTXRvr3pq .node polygon,#mermaid-svg-0yLTq1cqTXRvr3pq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0yLTq1cqTXRvr3pq .rough-node .label text,#mermaid-svg-0yLTq1cqTXRvr3pq .node .label text,#mermaid-svg-0yLTq1cqTXRvr3pq .image-shape .label,#mermaid-svg-0yLTq1cqTXRvr3pq .icon-shape .label{text-anchor:middle;}#mermaid-svg-0yLTq1cqTXRvr3pq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0yLTq1cqTXRvr3pq .rough-node .label,#mermaid-svg-0yLTq1cqTXRvr3pq .node .label,#mermaid-svg-0yLTq1cqTXRvr3pq .image-shape .label,#mermaid-svg-0yLTq1cqTXRvr3pq .icon-shape .label{text-align:center;}#mermaid-svg-0yLTq1cqTXRvr3pq .node.clickable{cursor:pointer;}#mermaid-svg-0yLTq1cqTXRvr3pq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0yLTq1cqTXRvr3pq .arrowheadPath{fill:#333333;}#mermaid-svg-0yLTq1cqTXRvr3pq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0yLTq1cqTXRvr3pq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0yLTq1cqTXRvr3pq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0yLTq1cqTXRvr3pq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0yLTq1cqTXRvr3pq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0yLTq1cqTXRvr3pq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0yLTq1cqTXRvr3pq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0yLTq1cqTXRvr3pq .cluster text{fill:#333;}#mermaid-svg-0yLTq1cqTXRvr3pq .cluster span{color:#333;}#mermaid-svg-0yLTq1cqTXRvr3pq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0yLTq1cqTXRvr3pq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0yLTq1cqTXRvr3pq rect.text{fill:none;stroke-width:0;}#mermaid-svg-0yLTq1cqTXRvr3pq .icon-shape,#mermaid-svg-0yLTq1cqTXRvr3pq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0yLTq1cqTXRvr3pq .icon-shape p,#mermaid-svg-0yLTq1cqTXRvr3pq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0yLTq1cqTXRvr3pq .icon-shape .label rect,#mermaid-svg-0yLTq1cqTXRvr3pq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0yLTq1cqTXRvr3pq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0yLTq1cqTXRvr3pq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0yLTq1cqTXRvr3pq :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Tile 1
Tile 0
I2C 服务
I2C 控制
I2C 控制
xk_audio_316_mc_ab_board_setup
xk_audio_316_mc_ab_i2c_master
xk_audio_316_mc_ab_AudioHwInit
xk_audio_316_mc_ab_AudioHwConfig
I2C 通道
图 2 参考资料:lib_board_support/doc/rst/lib_board_support.rst
5.2 典型调用时序
"I2C 通道""Tile 1""Tile 0""应用""I2C 通道""Tile 1""Tile 0""应用"#mermaid-svg-s5HmwS1gsZfHx2g6{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-s5HmwS1gsZfHx2g6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-s5HmwS1gsZfHx2g6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-s5HmwS1gsZfHx2g6 .error-icon{fill:#552222;}#mermaid-svg-s5HmwS1gsZfHx2g6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-s5HmwS1gsZfHx2g6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-s5HmwS1gsZfHx2g6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-s5HmwS1gsZfHx2g6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-s5HmwS1gsZfHx2g6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-s5HmwS1gsZfHx2g6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-s5HmwS1gsZfHx2g6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-s5HmwS1gsZfHx2g6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-s5HmwS1gsZfHx2g6 .marker.cross{stroke:#333333;}#mermaid-svg-s5HmwS1gsZfHx2g6 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-s5HmwS1gsZfHx2g6 p{margin:0;}#mermaid-svg-s5HmwS1gsZfHx2g6 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-s5HmwS1gsZfHx2g6 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-s5HmwS1gsZfHx2g6 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-s5HmwS1gsZfHx2g6 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-s5HmwS1gsZfHx2g6 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-s5HmwS1gsZfHx2g6 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-s5HmwS1gsZfHx2g6 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-s5HmwS1gsZfHx2g6 .sequenceNumber{fill:white;}#mermaid-svg-s5HmwS1gsZfHx2g6 #sequencenumber{fill:#333;}#mermaid-svg-s5HmwS1gsZfHx2g6 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-s5HmwS1gsZfHx2g6 .messageText{fill:#333;stroke:none;}#mermaid-svg-s5HmwS1gsZfHx2g6 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-s5HmwS1gsZfHx2g6 .labelText,#mermaid-svg-s5HmwS1gsZfHx2g6 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-s5HmwS1gsZfHx2g6 .loopText,#mermaid-svg-s5HmwS1gsZfHx2g6 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-s5HmwS1gsZfHx2g6 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-s5HmwS1gsZfHx2g6 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-s5HmwS1gsZfHx2g6 .noteText,#mermaid-svg-s5HmwS1gsZfHx2g6 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-s5HmwS1gsZfHx2g6 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-s5HmwS1gsZfHx2g6 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-s5HmwS1gsZfHx2g6 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-s5HmwS1gsZfHx2g6 .actorPopupMenu{position:absolute;}#mermaid-svg-s5HmwS1gsZfHx2g6 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-s5HmwS1gsZfHx2g6 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-s5HmwS1gsZfHx2g6 .actor-man circle,#mermaid-svg-s5HmwS1gsZfHx2g6 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-s5HmwS1gsZfHx2g6 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}xk_audio_316_mc_ab_board_setup(&config)启动 I2C 主服务I2C 服务就绪xk_audio_316_mc_ab_AudioHwInit(i2c, &config)I2C 配置请求I2C 配置硬件硬件初始化完成xk_audio_316_mc_ab_AudioHwConfig(…)采样率/格式配置I2C 写入配置配置完成xk_audio_316_mc_ab_i2c_master_exit(i2c)退出命令I2C 服务终止
图 3 参考资料:examples/app_xk_audio_316_mc_simple_c/src/main.c
5.3 典型应用代码(C 语言)
完整示例(参考资料:examples/app_xk_audio_316_mc_simple_c/src/main.c ):
#include <stdio.h>
#include "xk_audio_316_mc_ab/board.h"
static const xk_audio_316_mc_ab_config_t hw_config = {
CLK_FIXED, // clk_mode. 驱动固定 MCLK
0, // 0 = dac_is_clock_master (xcore 是主)
24576000, // 24.576MHz 默认主时钟
0, // pll_sync_freq (固定时钟模式未使用)
AUD_316_PCM_FORMAT_I2S, // I2S 格式
32, // 32-bit 位宽
2 // 2 通道每帧
};
void tile_0_main(i2c_master_if i_i2c){
printf("Hello from tile[0]\\n");
xk_audio_316_mc_ab_board_setup(&hw_config); // 必须在 tile[0] 执行
xk_audio_316_mc_ab_i2c_master(&i_i2c); // I2C 主服务
printf("Bye from tile[0]\\n");
}
void tile_1_main(i2c_master_if i_i2c){
printf("Hello from tile[1]\\n");
xk_audio_316_mc_ab_AudioHwInit(i_i2c, &hw_config); // 初始化硬件
xk_audio_316_mc_ab_AudioHwConfig(i_i2c, &hw_config, 48000, hw_config.default_mclk, 0, 24, 24);
xk_audio_316_mc_ab_i2c_master_exit(i_i2c); // 退出 tile[0] 上的 I2C 主
printf("Bye from tile[1]\\n");
}
六、已知问题与隐式限制
6.1 官方已知问题(参考资料:README.rst)
| XK_EVK_XU216 当前仅支持 GigE PHY,所需的 lib_ethernet 未添加到该 repo 以避免非以太网应用的不必要依赖 | XK_EVK_XU216 | 已知 | 以太网 PHY 配置 | README.rst |
| XK_ETH_XU316_DUAL_100M 当前是未发布的开发板,因此没有文档 | XK_ETH_XU316_DUAL_100M | 未发布 | – | README.rst |
| XK_ETH_XU316_DUAL_100M 使用 TI DP83826 PHY,测试发现初始化后首次发送的包偶尔(约 1%)可能被某些链路伙伴丢弃,后续包总是正常 | XK_ETH_XU316_DUAL_100M | 已知 | 以太网发送 | README.rst |
| XK_EVK_XE216 的 PHY 地址可以是 0x1 或 0x4 | XK_EVK_XE216 | 已修复(1.3.0) | PHY 配置 | CHANGELOG.rst |
6.2 隐式限制与注意事项
Tile 约束:
- xk_audio_316_mc_ab_board_setup 必须在 Tile 0 调用
- I2C 主服务任务在 Tile 0 运行
- 跨 Tile 调用需在顶层 XC 主函数中声明通道
电源管理注意事项:
- xk_audio_316_mc_ab_AudioHwPowerdown 前需先调用 xk_audio_316_mc_ab_AudioHwShutdown 以避免爆音
- 重新上电后需调用 board_setup 和 AudioHwInit,才能再次使用 AudioHwConfig
核心电压控制警告(board.h):
- 仅在 xcore 显著降频时支持核心电压调节
- 查阅数据手册的工作条件/直流特性后使用
XK_ETH_XU316_DUAL_100M 发送问题的规避:
- 官方建议发送初始的空 TX 数据包作为规避方案
七、资源需求与依赖
7.1 编译依赖(参考资料:README.rst)
| lib_i2c | 6.4.0 | I2C 主控制器 | README.rst |
| lib_sw_pll | 2.4.0 | 软件 PLL 库 | README.rst |
| lib_xassert | 4.3.1 | 断言库 | README.rst |
7.2 工具链要求
| XMOS XTC Tools | 15.3.1 | README.rst |
八、文件及文件夹功能说明
8.1 目录结构总览
lib_board_support/
├── api/ # 公共 API 头文件
│ ├── boards/ # 各开发板 API
│ └── drivers/ # 设备驱动 API
├── src/ # 实现源码
│ └── boards/ # 各开发板实现
├── examples/ # 示例工程
│ ├── app_evk_316_simple_c/ # EVK 316 C 示例
│ ├── app_xk_audio_316_mc_simple_c/ # XK 316 音频板 C 示例
│ └── app_xk_audio_316_mc_simple_xc/ # XK 316 音频板 XC 示例
├── xn_files/ # XN 硬件描述文件
├── doc/ # 文档
│ └── rst/ # reStructuredText 文档
├── README.rst # 项目说明
└── CHANGELOG.rst # 版本变更
8.2 核心文件职责汇总
| 板配置头文件 | api/boards/xk_audio_316_mc_ab/board.h | XK AUDIO 316 MC 的 API 声明 | board.h |
| 板配置实现 | src/boards/xk_audio_316_mc_ab/xk_audio_316_mc_ab_board.xc | XK AUDIO 316 MC 的实际实现 | 目录结构 |
| XN 文件 | xn_files/xk-audio-316-mc.xn | XK AUDIO 316 MC 硬件描述文件 | 目录结构 |
8.3 文件功能关系图
#mermaid-svg-9BATXBDdKMXh1OvG{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9BATXBDdKMXh1OvG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9BATXBDdKMXh1OvG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9BATXBDdKMXh1OvG .error-icon{fill:#552222;}#mermaid-svg-9BATXBDdKMXh1OvG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9BATXBDdKMXh1OvG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9BATXBDdKMXh1OvG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9BATXBDdKMXh1OvG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9BATXBDdKMXh1OvG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9BATXBDdKMXh1OvG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9BATXBDdKMXh1OvG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9BATXBDdKMXh1OvG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9BATXBDdKMXh1OvG .marker.cross{stroke:#333333;}#mermaid-svg-9BATXBDdKMXh1OvG svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9BATXBDdKMXh1OvG p{margin:0;}#mermaid-svg-9BATXBDdKMXh1OvG .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-9BATXBDdKMXh1OvG .cluster-label text{fill:#333;}#mermaid-svg-9BATXBDdKMXh1OvG .cluster-label span{color:#333;}#mermaid-svg-9BATXBDdKMXh1OvG .cluster-label span p{background-color:transparent;}#mermaid-svg-9BATXBDdKMXh1OvG .label text,#mermaid-svg-9BATXBDdKMXh1OvG span{fill:#333;color:#333;}#mermaid-svg-9BATXBDdKMXh1OvG .node rect,#mermaid-svg-9BATXBDdKMXh1OvG .node circle,#mermaid-svg-9BATXBDdKMXh1OvG .node ellipse,#mermaid-svg-9BATXBDdKMXh1OvG .node polygon,#mermaid-svg-9BATXBDdKMXh1OvG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9BATXBDdKMXh1OvG .rough-node .label text,#mermaid-svg-9BATXBDdKMXh1OvG .node .label text,#mermaid-svg-9BATXBDdKMXh1OvG .image-shape .label,#mermaid-svg-9BATXBDdKMXh1OvG .icon-shape .label{text-anchor:middle;}#mermaid-svg-9BATXBDdKMXh1OvG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9BATXBDdKMXh1OvG .rough-node .label,#mermaid-svg-9BATXBDdKMXh1OvG .node .label,#mermaid-svg-9BATXBDdKMXh1OvG .image-shape .label,#mermaid-svg-9BATXBDdKMXh1OvG .icon-shape .label{text-align:center;}#mermaid-svg-9BATXBDdKMXh1OvG .node.clickable{cursor:pointer;}#mermaid-svg-9BATXBDdKMXh1OvG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9BATXBDdKMXh1OvG .arrowheadPath{fill:#333333;}#mermaid-svg-9BATXBDdKMXh1OvG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9BATXBDdKMXh1OvG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9BATXBDdKMXh1OvG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9BATXBDdKMXh1OvG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9BATXBDdKMXh1OvG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9BATXBDdKMXh1OvG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9BATXBDdKMXh1OvG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9BATXBDdKMXh1OvG .cluster text{fill:#333;}#mermaid-svg-9BATXBDdKMXh1OvG .cluster span{color:#333;}#mermaid-svg-9BATXBDdKMXh1OvG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9BATXBDdKMXh1OvG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9BATXBDdKMXh1OvG rect.text{fill:none;stroke-width:0;}#mermaid-svg-9BATXBDdKMXh1OvG .icon-shape,#mermaid-svg-9BATXBDdKMXh1OvG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9BATXBDdKMXh1OvG .icon-shape p,#mermaid-svg-9BATXBDdKMXh1OvG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9BATXBDdKMXh1OvG .icon-shape .label rect,#mermaid-svg-9BATXBDdKMXh1OvG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9BATXBDdKMXh1OvG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9BATXBDdKMXh1OvG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9BATXBDdKMXh1OvG :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
依赖库
板实现
板 API
应用层
main.c / main.xc
board.h
xk_audio_316_mc_ab_board.xc
i2c.h
sw_pll.h
图 4 参考项目文件结构
九、典型应用场景与示例
9.1 支持的应用笔记(基于资料:README.rst)
| AN02003 | SPDIF/ADAT/I²S Receive to I²S Slave Bridge with ASRC | 音频桥接应用 |
| AN02016 | Integrating Audio Weaver (AWE) Core into USB Audio | USB 音频集成应用 |
9.2 编译与运行示例
基于资料:lib_board_support.rst
cd examples/app_xk_audio_316_mc_simple_xc
cmake -G "Unix Makefiles" -B build
xmake -C build
xrun –io bin/app_xk_audio_316_mc_simple_xc.xe
十、总结与适用场景
10.1 适用场景
- XMOS 开发板硬件初始化:快速配置各 XMOS 评估板的外围设备
- 多 Tile 音频应用:提供跨 Tile I2C 服务,解决 Tile 间硬件配置问题
- 音频 CODEC 配置:内置 CS4384、CS5368、TLV320AIC3204 等驱动支持
- 项目复用:通过统一的板级支持库,避免重复开发板初始化代码
10.2 局限性与不适用场景
- 非 XMOS 开发板:该库专门为 XMOS 官方评估板设计,不支持第三方板卡
- 无配套驱动的外设:仅支持库中内置驱动的外围设备
十一、参考文档
| README.rst | 项目概述、功能、已知问题、依赖 | lib_board_support/README.rst |
| CHANGELOG.rst | 版本变更记录 | lib_board_support/CHANGELOG.rst |
| lib_board_support.rst | 详细技术文档、API 说明、使用指南 | lib_board_support/doc/rst/lib_board_support.rst |
| board.h | XK_AUDIO_316_MC_AB 板级 API 头文件 | lib_board_support/lib_board_support/api/boards/xk_audio_316_mc_ab/board.h |
| examples/app_xk_audio_316_mc_simple_c/src/main.c | C 语言示例工程 | lib_board_support/examples/app_xk_audio_316_mc_simple_c/src/main.c |
| examples/app_xk_audio_316_mc_simple_xc/src/main.xc | XC 语言示例工程 | 目录结构 |
| xn_files/readme.txt | XN 文件说明 | lib_board_support/xn_files/readme.txt |
> 版权声明:本文基于 XMOS lib_board_support (v1.3.0) 进行技术分析,仅供学习交流使用。
> 整理时间:2026 年
> 作者:稳态临界




