XU316源码修改说明
概述
本篇文章主要讲述XU316源码的基本功能使能、pin的定义、编译选项、XTC工具编译、烧录固件,DFU固件等
详细的介绍需观看sw_usb_audio-[design-guide]_6.16.1alpha1.pdf文档,本文章讲述的基本代码使用说明,会遗漏其他要点
基础文件
在XU316-1024-QF60B Datasheet.pdf中1 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 脚即可