Skip to main content

XU316源码修改说明

概述

本篇文章主要讲述XU316源码的基本功能使能、pin的定义、编译选项、XTC工具编译、烧录固件,DFU固件等

详细的介绍需观看sw_usb_audio-[design-guide]_6.16.1alpha1.pdf文档,本文章讲述的基本代码使用说明,会遗漏其他要点

基础文件

XU316-1024-QF60B Datasheet.pdf1 xCORE Multicore Microcontrollers部分

有如下图所示,xu316共有16个core,定义在tile0、tile1上,各有8个core

customdefines.h

主要包含:spdif、midi、mixer功能开启,out与in设定、pid_vid修改、晶振修改、dfu的spec等

路径:app_usb_aud_xk_316_mc\src\core\customdefines.h

1、在源码中xxxx_TILE的宏定义,代表运行在tile0还是tile1

#define AUDIO_IO_TILE      0
#define XUD_TILE 1

上述代码表示Audio在tile0、USB(xud)在tile1运行

2、包含一些开关功能的宏定义,下面代码为spdif输出功能开启

#ifndef SPDIF_TX
#define SPDIF_TX 1
#endif

其他宏定义类似,有MIXER、MIDI、SPDIF_RX、DFU、DSD_CHANS_DAC、HID_CONTROLS等

3、输入输出通道数,如下代码定义为2进4出

#ifndef NUM_USB_CHAN_IN
#define NUM_USB_CHAN_IN (2) /* Device to Host */
#endif
#ifndef NUM_USB_CHAN_OUT
#define NUM_USB_CHAN_OUT (4) /* Host to Device */
#endif

注意:定义通道数时,I2S_CHANS_DAC对应out通道数,I2S_CHANS_ADC对应in通道数

/* Number of IS2 chans to DAC..*/
#ifndef I2S_CHANS_DAC
#define I2S_CHANS_DAC (4)
#endif

/* Number of I2S chans from ADC */
#ifndef I2S_CHANS_ADC
#define I2S_CHANS_ADC (2)
#endif

4、晶振一致性

PCB板上使用的晶振大小需要在代码中定义,保持一至

#define MCLK_441           (1024*44100)   /* 44.1, 88.2 etc */
#define MCLK_48 (1024*48000) /* 48, 96 etc */

使用45.1584Mhz晶振时,源码中表示为44.1khz的1024倍,即1024*44100数值的由来

使用22.5792Mhz晶振时,源码中表示为44.1khz的512倍,修改为512*44100数值

4、最大播放采样率768khz,使用22.5792Mhz晶振时,修改为384000即可

#ifndef MAX_FREQ
#define MAX_FREQ (768000)
#endif

5、定义PID、VID

#define VENDOR_ID          (0x152A) /* XMOS VID */
#define PID_AUDIO_2 (0x887D) /* SKC_SU1 USB Audio Reference Design PID */
#define PID_AUDIO_1 (0x0009) /* SKC_SU1 Audio Reference Design PID */

6、DFU

功能需要确保相关宏定义置“1”,开启DFU功能

#define DFU               1

添加Flash的描述文件(spec),如下所示

#define FL_QUADDEVICE_UC25HQ40 \
{ \
0, /* UC25HQ40 - Just specify 0 as flash_id */ \
256, /* page size */ \
2048, /* num pages */ \
3, /* address size */ \
4, /* log2 clock divider */ \
0x9F, /* QSPI_RDID */ \
0, /* id dummy bytes */ \
3, /* id size in bytes */ \
0xB36013, /* device id */ \
0x20, /* QSPI_SE */ \
4096, /* Sector erase is always 4KB */ \
0x06, /* QSPI_WREN */ \
0x04, /* QSPI_WRDI */ \
PROT_TYPE_SR, /* Protection via SR */ \
{{0x3C,0x02},{0,0}}, /* QSPI_SP, QSPI_SU */ \
0x02, /* QSPI_PP */ \
0xEB, /* QSPI_READ_FAST */ \
1, /* 1 read dummy byte */ \
SECTOR_LAYOUT_REGULAR, /* mad sectors */ \
{4096,{0,{0}}}, /* regular sector sizes */ \
0x05, /* QSPI_RDSR */ \
0x01, /* QSPI_WRSR */ \
0x01, /* QSPI_WIP_BIT_MASK */ \
}

Flash的描述文件可查看Flash的datasheet文件,来编写正确的spec文件

在DFU_FLASH_DEVICE后添加Flash描述宏定义

#define DFU_FLASH_DEVICE FL_QUADDEVICE_UC25HQ40

可以添加多个类似FL_QUADDEVICE_UC25HQ40的定义,用“逗号”隔开,举例如下

#define DFU_FLASH_DEVICE FL_QUADDEVICE_UC25HQ40,FL_QUADDEVICE_AT25SF161

注意:Flash的描述文件(spec)写错会导致DFU失败,无法正常DFU

XN文件

主要修改pin脚,与PCB板设计一致,正常播放录制; 路径:app_usb_aud_xk_316_mc\src\core\xk-audio-316-mc.xn

芯片引脚的定义是分tile0、tile1属性的,比如Audio功能运行在tile0时,相关联的pin同样需要定义在tile0上,pin脚的定义与硬件PCB上一致,是一一 对应的

1、源码中有如下代码体现tile0、tile1

<Tile Number="0" Reference="tile[0]">
...
<!-- Some port -->
...
</Tile>
<Tile Number="1" Reference="tile[1]">
...
<!-- Some port -->
...
</Tile>

2、Flash引脚定义

Flash引脚定义是固定的pin、无法修改,一般情况下无需改动

<Port Location="XS1_PORT_1B" Name="PORT_SQI_CS"/>
<Port Location="XS1_PORT_1C" Name="PORT_SQI_SCLK"/>
<Port Location="XS1_PORT_4B" Name="PORT_SQI_SIO"/>

分别在tile0的1B、1C、4B端口

3、USB Audio

<Port Location="XS1_PORT_1L"  Name="PORT_MCLK_IN"/>
<Port Location="XS1_PORT_1N" Name="PORT_I2S_LRCLK"/>
<Port Location="XS1_PORT_1O" Name="PORT_I2S_BCLK"/>
<Port Location="XS1_PORT_1M" Name="PORT_I2S_DAC0"/>
<Port Location="XS1_PORT_1P" Name="PORT_I2S_ADC0"/>

<Port Location="XS1_PORT_1M" Name="PORT_DSD_DAC0"/>
<port Location="XS1_PORT_1N" Name="PORT_DSD_DAC1"/>
<Port Location="XS1_PORT_1O" Name="PORT_DSD_CLK"/>

USB Audio运行tile0,上述源码定义相关pin脚,MCLK定义pin在1L、BCLK定义pin在1O、LRCLK定义pin在1N、DAC定义pin在1M

DSD相关pin脚的定义与I2S的pin脚定义保持一致

2、XMOS USB Device

<Port Location="XS1_PORT_1H"  Name="PORT_USB_TX_READYIN"/>
<Port Location="XS1_PORT_1J" Name="PORT_USB_CLK"/>
<Port Location="XS1_PORT_1K" Name="PORT_USB_TX_READYOUT"/>
<Port Location="XS1_PORT_1I" Name="PORT_USB_RX_READY"/>
<Port Location="XS1_PORT_1E" Name="PORT_USB_FLAG0"/>
<Port Location="XS1_PORT_1F" Name="PORT_USB_FLAG1"/>
<Port Location="XS1_PORT_1G" Name="PORT_USB_FLAG2"/>
<Port Location="XS1_PORT_8A" Name="PORT_USB_TXD"/>
<Port Location="XS1_PORT_8B" Name="PORT_USB_RXD"/>
<Port Location="XS1_PORT_16B" Name="PORT_MCLK_COUNT"/>

usb运行在tile1上,pin脚对应定义在tile1

注意:USB的pin脚是固定的

USB在tile1运行时,为保证其他功能的正常运行,还有MCLK2的pin脚定义

<Port Location="XS1_PORT_1G"  Name="PORT_MCLK_IN2"/>

源码定义在tile1的1G引脚

Makefile

主要包含:版本号修改、xmake编译选项、module模块等部分; 路径:app_usb_aud_xk_316_mc\Makefile

1、选择不同的XN文件,使用的xn文件为xk-audio-316-mc.xn

TARGET = xk-audio-316-mc.xn

2、提前确定编译之后xe的文件名:app_xu316_usb_audio

APP_NAME = app_xu316_usb_audio

空白时,编译生成的xe文件名为项目文件名+版本号

3、版本号

XCC_FLAGS_V101 = $(BUILD_FLAGS) -DBCD_DEVICE=0x101
INCLUDE_ONLY_IN_V101 =

修改 -DBCD_DEVICE= 之后的0x101数值即版本号,V101表示编译之后,xe文件所在的文件夹名

4、使用的模块

USED_MODULES =lib_xud module_usb_audio module_spdif_tx module_spdif_rx module_usb_midi module_dfu module_i2c_shared module_i2c_single_port module_adat_tx module_adat_rx 

每个模块名之间用空格断开,没有使用的模块可以删除其模块名

5、BUILD_FLAGS

源码中的BUILD_FLAGS 部分一般情况不做修改

audiohw.xc

主要包含:MCLK晶振使能、DAC芯片配置; 路径:app_usb_aud_xk_316_mc\src\extensions\audiohw.xc

1、MCLK时钟晶振使能

pin脚定义

on tile[0] : out port p_gpio = XS1_PORT_4F;

具体使用tile0中4F端口的4F1、4F2,左移来确定4F0、4F1、4F2、4F3选定pin脚,在同目录下gpio_access.h文件中定义

#define MCLK_441_ENABLE         (1 << 2)
#define MCLK_480_ENABLE (1 << 1)

在AudioHwInit()初始化函数中定义44.1khz对应的MCLK晶振使能

set_gpio(MCLK_441_ENABLE,1);

在采样率变化时,源码AudioHwConfig()函数有如下定义

if (mClk == MCLK_441)
{
set_gpio(MCLK_441_ENABLE,1);
set_gpio(MCLK_480_ENABLE,0);
}
else
{
set_gpio(MCLK_441_ENABLE,0);
set_gpio(MCLK_480_ENABLE,1);
}

通过mclk判断采样率变化,在44.1khz、48khz对应的MCLK时钟晶振来回切换

2、DAC芯片配置

(1)为避免产品启动时出现爆破音的现象,在AudioHwInit()初始化函数需要对DAC做一个复位处理

DAC复位pin脚:on tile[0] : out port DAC_REST = XS1_PORT_8D;

DAC_REST <: 0b00000000;
wait_us(10000);
DAC_REST <: 0b00010000;

DAC复位在8D4端口,首先置“0”复位,通过延时后,达到无爆破音过度,在使能DAC芯片正常运行

(2)通过I2C配置DAC芯片内部参数

I2C配置pin脚:on tile[0] : struct r_i2c r_i2c = {XS1_PORT_4E};

在源码中,使用tile0中4E端口的4E2、4E3,具体在i2c.h中定义,路径:module_i2c_single_port\src\i2c.h

#define SDA_HIGH    8
#define SCL_HIGH 4
#define S_REST 0x03

其中S_REST设定0x03表示将不用的4E0、4E1端口置“1”拉高,避免影响

SDA_HIGH、SCL_HIGH设定8、4源码中有如下说明

/** This constant defines the bit value of a high data bit on the I2C port. The

* default value is 1, meaning that this is on bit 0 of the port. Set to 2,

* 4, 8, ... for other bits of the port.

*/

如下源码中,DAC相关的参数修改配置,需参考DAC芯片的datasheet,

DAC_REGWRITE(ESS9038_Input_Setect,   0b11000000);

一般情况下,DAC参数不用修改,出厂时会有默认的参数

编译

用户需要拥有XMOS的专用XTAG调试工具,使用XTC 15.1.0或最新版本XTC工具

XTC 15.1.0 下载链接:https://www.xmos.ai/file/tools-15-microsoft?version=latest

运行XTC 15.1.0 工具,确保上电XU316硬件和接好XTAG,键入指令

xrun -l

, Enter键后,查看XU316和XTAG是否握手成功,Device下显示P[0],握手成功

clean和xe生成使用XTC 15.1.0工具,进入Makefile文件的路径

Makefile文件路径:app_usb_aud_xk_316_mc\Makefile

1、源码工程编译之前,或者编译出现奇怪错误时,需要clean后再xmake编译

工程完全clean

xmake clean

v100工程单独clean

xmake CONFIG=V100 clean

2、XE文件生成

xmake CONFIG=V100 all

其中V100是变化的,根据在Makefile中自定义的XCC_FLAGS_V100来确定,XCC_FLAGS_V101时的编译命令

xmake CONFIG=V101 all

3、烧录xe固件

xflash --factory xxxx.xe --spi-spec xxxx.spec

xxxx.xe为xe文件名,xxxx.spec为Flash的描述文件,描述文件错误会导致烧录后无法正常枚举

4、factory固件

xflash --factory xxxx.xe --spi-spec xxxx.spec -o xxxxx_v100.bin

xxxx.xe为xe文件名,xxxx.spec为Flash的描述文件,xxxxx_v100为factory固件自定义名称,描述文件错误会导致生成的factory固件烧录无法正常枚举

5、DFU.bin生成

使用XTC 15.1.0工具,进入xe文件所在路径

xe路径:app_usb_aud_xk_316_mc\bin\V100

xflash --factory-version 15.0 --upgrade 1 xxxx_v100.xe -o xxxx.bin

xxxx_v100.xe为xe文件名,xxxx.bin为自定义的DFU文件名

常用功能

SPDIF

SPDIF的使用在源码中包含以下几个部分:

1、spdif发送、接收功能的开启

2、晶振对spdif发送的影响,修改解决

启用spdif

在customdefines.h文件中,将SPDIF_TX宏定义置“1”,开启spdif tx功能

#ifndef SPDIF_TX
#define SPDIF_TX 1
#endif

spdif rx功能开启类似spdif tx的开启

引脚定义

spdif out默认在tile0运行,需要在xk-audio-316-mc.xn文件tile0中添加定义如下

<Tile Number="0" Reference="tile[0]">
............
<Port Location="XS1_PORT_1A" Name="PORT_SPDIF_OUT"/> //添加

spdif in默认在在tile1运行,需要在xk-audio-316-mc.xn文件tile1中添加定义如下

<Tile Number="1" Reference="tile[1]">
............
<Port Location="XS1_PORT_1A" Name="PORT_SPDIF_IN"/> //添加

晶振影响

在源码工程customdefines.h文件中,设定默认晶振为45.1584Mhz、49.152Mhz

#define MCLK_441           (1024*44100)   /* 44.1, 88.2 etc */
#define MCLK_48 (1024*48000) /* 48, 96 etc */

(1024*44100)代表晶振45.1584Mhz、即44100的1024倍为45.1584(Mhz)

(1024*48000)代表49.152Mhz晶振、即48000的1024倍为49.152(Mhz)

在开启spdif功能之后,能够正常spdif输出

注意:PCB板上使用22.5792Mhz、24.576Mhz的晶振时,保证spdif out正常运行需要如下操作

1、修改晶振的大小至22.5792Mhz、24.576Mhz

#define MCLK_441           (512*44100)   /* 44.1, 88.2 etc */
#define MCLK_48 (512*48000) /* 48, 96 etc */

2、SpdifTransmit.xc修改

路径:module_spdif_tx\src\SpdifTransmit.xc

在24行的configure_clock_src_divide(clk, p_mclk,1);

void SpdifTransmitPortConfig(out buffered port:32 p, clock clk, in port p_mclk)
{
/* Clock clock block from master-clock */
configure_clock_src_divide(clk, p_mclk,1);
/*
...... more code
*/
}

修改如下

void SpdifTransmitPortConfig(out buffered port:32 p, clock clk, in port p_mclk)
{
/* Clock clock block from master-clock */
configure_clock_src(clk, p_mclk);
/*
...... more code
*/
}

在833行如下代码,后添加 divide/=2;

    /* Calculate required divide */
divide = mclkFreq / (samFreq * 2 * 32 * 2);

添加后代码如下

    /* Calculate required divide */
divide = mclkFreq / (samFreq * 2 * 32 * 2);
divide/=2;

MIDI

midi的发送与接收实际上就是UART 发送与接收,只需要开启midi,设定pin脚即可

启用midi

在customdefines.h文件中,将MIDI宏定义置“1”,开启midi功能

#ifndef MIDI
#define MIDI 1
#endif

midi运行在tile1,源码如下设定

#define MIDI_TILE          1

设定pin脚

xn文件路径:app_usb_aud_xk_316_mc\src\core\xk-audio-316-mc.xn

midi运行在tile1,如下在xn文件<Tile Number="1" Reference="tile[1]">后添加定义

<Tile Number="1" Reference="tile[1]">
...........................
<Port Location="XS1_PORT_1A" Name="PORT_MIDI_OUT"/>
<Port Location="XS1_PORT_1B" Name="PORT_MIDI_IN"/>

MIXER

xu316一共有8个mixer混频器,在启用mixer用,还需要确定使用几个混频器

启用mixer

在customdefines.h文件中,将mixer宏定义置“1”,开启mixer功能

#ifndef MIXER
#define MIXER 1
#endif

开启8个混频器

#ifndef MAX_MIX_COUNT
#define MAX_MIX_COUNT 8
#endif

可以用杜邦线短接MIDI OUT与MIDI IN,通过MidiPlayer播放midi歌曲,用MidiPlayer播放录制,即可验证MIDI功能;

xmos目前MIDI 只支持USB MIDI 1.0

软件定义

在mixer.xc文件中定义混频,路径:module_usb_audio\mixer\mixer.xc

mixer1()函数while中添加如下代码

write_word_to_mix_mult(0, 0, 33554432);
write_word_to_mix_mult(1, 1, 33554432);
write_word_to_mix_mult(0, 2, 33554432);
write_word_to_mix_mult(1, 3, 33554432);

write_via_xc_ptr_indexed(samples_to_host_map,0,4);
write_via_xc_ptr_indexed(samples_to_host_map,1,5);

write_word_to_mix_mult(x,y,z);的意思是把y通道的数据放到混频器x,

其中z为对应的声音大小,最小13,最大33554432。

x=0代表混频器0,y的通道数为out在前,in在后,比如两出两进则out0和out1对应y= 0,y=1,而四个进in0-1对应y值为2-3

write_via_xc_ptr_indexed(x,y,z);是把混频器数据放入通道中。

x为samples_to_device_map表示把混频器数据丢到out;

x为samples_to_host_map则表示把混频器数据丢到in,被上传到主机。

y表示通道,通道对应排序,y的通道数为out在前,in在后,

z表示混频器的序号(注意此处混频器序号是从通道数之后开始排序,比如两出两进,则混频器0为4,混频器1为5,依次排下去)

mixer效果

在启用mixer、软件定义之后,可以通过Audacity软件录制查看mixer效果

1、打开Audacity软件,选定线路、录制声道、扬声器如下图一致,

2、点击"录制"

3、在声音界面,在播放栏项,选择Audacity定义的扬声器,右键选择"测试",即可看到下图所示效果

TDM

TDM同样是I2S的一种形式,在xmos源码中支持TDM,设定USB Audio 8进8出功能,只需两个数据线data out与data in

TDM使用在源码中需如下修改

customdefines.h中添加宏定义

#define  I2S_MODE_TDM   1 

修改USB Audio通道数8i8o

#ifndef NUM_USB_CHAN_IN
#define NUM_USB_CHAN_IN (8) /* Device to Host */
#endif
#ifndef NUM_USB_CHAN_OUT
#define NUM_USB_CHAN_OUT (8) /* Host to Device */
#endif

/* Number of IS2 chans to DAC..*/
#ifndef I2S_CHANS_DAC
#define I2S_CHANS_DAC (8)
#endif

/* Number of I2S chans from ADC */
#ifndef I2S_CHANS_ADC
#define I2S_CHANS_ADC (8)
#endif

pin脚定义无需修改,TDM功能只需短接data out(DAC0)与data in(ADC0),即可测试验证

其余功能

volume control

volume control默认为开启状态,在Makefile,BUILD_FLAGS 部分有如下定义

-DINPUT_VOLUME_CONTROL=1 \
-DOUTPUT_VOLUME_CONTROL=1 \

TILE 0 run USB

源码中USB默认运行在TILE 1,如需在TILE 0运行USB部分,需做如下修改

customdefines.h中XUD_TILE修改如下

#define XUD_TILE           0

在Makefile中,BUILD_FLAGS部分 -DUSB_TILE=tile[1] 修改

-DUSB_TILE=tile[0]

在xk-audio-316-mc.xn中,将USB引脚定义从TILE 1移至 TILE0

<Tile Number="0" Reference="tile[0]">
.................
<Port Location="XS1_PORT_1H" Name="PORT_USB_TX_READYIN"/>
<Port Location="XS1_PORT_1J" Name="PORT_USB_CLK"/>
<Port Location="XS1_PORT_1K" Name="PORT_USB_TX_READYOUT"/>
<Port Location="XS1_PORT_1I" Name="PORT_USB_RX_READY"/>
<Port Location="XS1_PORT_1E" Name="PORT_USB_FLAG0"/>
<Port Location="XS1_PORT_1F" Name="PORT_USB_FLAG1"/>
<Port Location="XS1_PORT_1G" Name="PORT_USB_FLAG2"/>
<Port Location="XS1_PORT_8A" Name="PORT_USB_TXD"/>
<Port Location="XS1_PORT_8B" Name="PORT_USB_RXD"/>
<Port Location="XS1_PORT_16B" Name="PORT_MCLK_COUNT"/>

音频流state

可通过UserAudioStreamStart()、UserAudioStreamStop()两个函数,添加端口输出状态,分别指示音频流的开始与结束;

同时可以在上述函数中定义DAC的mute,通过延时来解决可能存在的爆破音问题,这是软件上的MUTE处理

音频流mute代码参考

extern struct r_i2c r_i2c2;
unsigned char data_DAC2[1] = {0};
#define DAC_REGWRITE_STREAM(reg, val) {data_DAC2[0] = val; i2c_shared_master_write_reg(r_i2c2,ES9038_ADDS, reg, data_DAC2, 1);}

void UserAudioStreamStart(void)
{
DAC_REGWRITE_STREAM(ESS9038_System_Mute,0b10000000); //通过I2C配置来控制DAC mute
unsigned int time;
timer t;
t :> time;
time = time + 5000000;
t when timerafter(time) :> void;
}
void UserAudioStreamStop(void)
{
unsigned int time;
timer t;
t :> time;
time = time + 5000000;
t when timerafter(time) :> void;
DAC_REGWRITE_STREAM(ESS9038_System_Mute,0b10000001); //通过I2C配置来控制DAC mute
}

USB state

USB state方式与音频流state是同样的原理, UserHostActive()函数中添加端口输出状态,分别指示上电、掉电状态;

注意: UserHostActive()函数是运行在tile 0的,需要USB 在tile 0运行,才能正常工作;当USB 在tile 1运行,确定义了USB state时,设备运行时会出现卡住的现象,设备无法正常运转起来

位深修改

源码中的位深默认是24/16bit,如需修改为32/24bit位深,需做如下修改

在Makefile,自定义编译选项XCC_FLAGS_xxxx = 后添加 -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=32 -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=24,参考如下

XCC_FLAGS_xxxx = $(BUILD_FLAGS) -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=32 -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=24
INCLUDE_ONLY_IN_xxxx =

UAC 1.0

源码默认是UAC 2.0模式,UAC 2.0定义如下

/* USB Audio Class Version. Default: 2 (Audio Class version 2.0) */
#define AUDIO_CLASS (2)

/* Whether or not to fall back to Audio Class 1.0 in USB Full-speed. Default: 0 (Disabled) */
#define AUDIO_CLASS_FALLBACK (0) /* Default to not falling back to UAC 1 */

在customdefines.h中添加UAC 定义,UAC 1.0定义如下

/* USB Audio Class Version. Default: 2 (Audio Class version 2.0) */
#define AUDIO_CLASS (1)

/* Whether or not to fall back to Audio Class 1.0 in USB Full-speed. Default: 0 (Disabled) */
#define AUDIO_CLASS_FALLBACK (1) /* Default to not falling back to UAC 1 */

HID control

customdefines.h中,HID_CONTROLS宏定义置" 1 "启用HID功能

#ifndef HID_CONTROLS
#define HID_CONTROLS 1
#endif

具体实现HID在app_usb_aud_xk_316_mc\src\extensions\hidbuttons.xc文件,源码默认为HID_CONTROL_VOLUP控制

开启HID功能后,可在void UserReadHIDButtons(unsigned char hidData[])中自行添加HID控制

HID 控制端口可根据需求自定义;hidbuttons.xc参考使用tile 1的4D端口,如下

#ifdef HID_CONTROLS
in port p_sw = on tile[1] : XS1_PORT_4D;

源码默认有定义如下hid控制

#define HID_CONTROL_NEXT        0x02
#define HID_CONTROL_PLAYPAUSE 0x01
#define HID_CONTROL_PREV 0x04
#define HID_CONTROL VOLUP 0x08
#define HID_CONTROL_VOLDN 0x10
#define HID_CONTROL_MUTE 0x20

hid功能实现主要是将hid控制给 hidData[0] 来实现,可自行修改

if(state == STATE_PLAY)
{
hidData[0] = HID_CONTROL_PLAYPAUSE;
}
else if(state == STATE_NEXTPREV)
{
if(lastA)
hidData[0] = HID_CONTROL_PREV;
else
hidData[0] = HID_CONTROL_NEXT;
}

USB VBUS set

xCORE AI不像xCORE - 200,xCORE AI不包括USB VBus专用的I/O,允许使用任何I/O端口。这可以是一个1位端口,也可以是一个用于其他输入的多位端口中未使用的位。

注意:应该使用适当的电路将5V USB VBus线转换为合适的I/O电压

为了在VBus出现时正确地通知lib_xud,应该为实现以下函数

unsigned int XUD_HAL_GetVBusState(void);

路径:lib_xud\src\core\XUD_Default.c

VBus 检测参考代码

on tile[1] : in port p_vbus = XS1_PORT_1A;
unsigned int XUD_HAL_GetVBusState(void)
{
unsigned vBusValid;
p_vbus :> vBusValid;
return vBusValid;
}

DSD左右声道互换

在DSD的测试的过程中,会可能会出现左右声道互换的情况,因为有些DAC芯片的设定是互换的,还有可能是软件定义上互换,重新在XN文件中重新定义pin 脚即可