欢迎光临
我们一直在努力

【lib_board_support】深度分析:XMOS 开发板支持库

本文基于 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 支持的开发板

Board 型号支持语言说明来源
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
核心函数
  • 板初始化(Tile 0 调用)
  • void xk_audio_316_mc_ab_board_setup(const xk_audio_316_mc_ab_config_t *config);

    • 调用要求:必须从 Tile 0 调用,且在 AudioHwInit 之前
    • 功能:执行所需的端口操作以启用平台上的音频硬件
    • 来源:board.h
  • I2C 主服务
  • 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
  • I2C 主服务退出
  • void xk_audio_316_mc_ab_i2c_master_exit(i2c_master_if i_i2c);

    • 调用要求:从 Tile 1 调用
    • 功能:使 Tile 0 退出,释放线程;调用后 Tile 1 的硬件配置调用将永久阻塞
    • 来源:board.h
  • 电源管理 API
  • 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)

    AN 编号标题说明
    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 年
    > 作者:稳态临界

    赞(0)
    未经允许不得转载:171主机测评 » 【lib_board_support】深度分析:XMOS 开发板支持库
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址