diff --git a/examples/AN00246_xua_example/src/app_xua_simple.xc b/examples/AN00246_xua_example/src/app_xua_simple.xc index 834ed0ec..51d55dde 100644 --- a/examples/AN00246_xua_example/src/app_xua_simple.xc +++ b/examples/AN00246_xua_example/src/app_xua_simple.xc @@ -5,7 +5,7 @@ * * It uses the main blocks from the lib_xua * - * - 2 in/ 2 out I2S only + * - 2 channels out I2S only * - No DFU * - I2S only * diff --git a/examples/AN00247_xua_example_spdif_tx/Makefile b/examples/AN00247_xua_example_spdif_tx/Makefile index 00fadd8d..43f0f3fe 100644 --- a/examples/AN00247_xua_example_spdif_tx/Makefile +++ b/examples/AN00247_xua_example_spdif_tx/Makefile @@ -1,12 +1,13 @@ -APP_NAME = app_xua_simple +APP_NAME = app_xua_spdiftx -TARGET = xk-audio-216-mc.xn +TARGET = xk-audio-316-mc.xn # The flags passed to xcc when building the application -XCC_FLAGS = -fcomment-asm -Xmapper --map -Xmapper MAPFILE -O3 -report -save-temps \ - -g -Wno-unused-function -Wno-timing -DXUD_SERIES_SUPPORT=XUD_X200_SERIES \ - -DXUD_CORE_CLOCK=600 -DUSB_TILE=tile[1] -DSDA_HIGH=2 -DSCL_HIGH=1 -fxscope \ - -DUAC_FORCE_FEEDBACK_EP=0 +XCC_FLAGS = -O3 -report \ + -g -Wno-unused-function \ + -DXUD_CORE_CLOCK=600 \ + -DUSB_TILE=tile[0] \ + -fxscope # The USED_MODULES variable lists other module used by the application. These # modules will extend the SOURCE_DIRS, INCLUDE_DIRS and LIB_DIRS variables. diff --git a/examples/AN00247_xua_example_spdif_tx/doc/rst/AN00247_xua_example_spdif_tx.rst b/examples/AN00247_xua_example_spdif_tx/doc/rst/AN00247_xua_example_spdif_tx.rst index d36ba8e4..e27a22e7 100644 --- a/examples/AN00247_xua_example_spdif_tx/doc/rst/AN00247_xua_example_spdif_tx.rst +++ b/examples/AN00247_xua_example_spdif_tx/doc/rst/AN00247_xua_example_spdif_tx.rst @@ -8,13 +8,13 @@ Overview Introduction ............ -The XMOS USB Audio (XUA) library provides an implemention of USB Audio Class versions 1.0 and 2.0. +The XMOS USB Audio (XUA) library provides an implementation of USB Audio Class versions 1.0 and 2.0. This application note demonstrates the implementation of a basic USB Audio Device with -S/PDIF transmit functionality the xCORE-200 MC Audio board. +S/PDIF transmit functionality the xCORE.ai Multichannel (MC) Audio board. To reduce complexity this application note does not enable any other audio interfaces other that S/PDIF transmit -(i.e. no I2S). Readers are encouraged to read applicaition note AN00246 in conjunction with this application +(i.e. no I2S). Readers are encouraged to read application note AN00246 in conjunction with this application note. @@ -30,14 +30,11 @@ The Makefile also includes:: USED_MODULES = .. lib_xud .. -``lib_xud`` library requires some flags for correct operation. Firstly the +``lib_xud`` library requires some flags for correct operation. Namely the tile on which ``lib_xud`` will be execute, for example:: - XCC_FLAGS = .. -DUSB_TILE=tile[1] .. + XCC_FLAGS = .. -DUSB_TILE=tile[0] .. -Secondly, the architecture of the target device, for example:: - - XCC_FLAGS = .. -DXUD_SERIES_SUPPORT=XUD_X200_SERIES .. Includes -------- @@ -69,7 +66,7 @@ Declarations Allocating hardware resources for lib_xua ......................................... -A minimal implementation of a USB Audio device, without I2S functionalilty, +A minimal implementation of a USB Audio device, without I2S functionality, using ``lib_xua`` requires the follow pins: - Audio Master clock (from clock source to xCORE) @@ -82,7 +79,7 @@ port for the master clock input signal. :end-on: in port p_mclk_in ``lib_xua`` also requires two ports for internally calculating USB feedback. Please refer to -the ``lib_xua`` library documentation for further details. The additonal input port for the master +the ``lib_xua`` library documentation for further details. The additional input port for the master clock is required since USB and S/PDIF do not reside of the same tiles on the example hardware. These ports are declared as follows: @@ -126,7 +123,7 @@ Other declarations For a simple application the following endpoints are required: - - ``Control`` enpoint zero + - ``Control`` endpoint zero - ``Isochonous`` endpoint for each direction for audio data to/from the USB host These are declared as follows: @@ -138,7 +135,7 @@ These are declared as follows: Configuring lib_xua ------------------- -``lib_xua`` must be configued to enable S/PDIF Tx functionality. +``lib_xua`` must be configured to enable S/PDIF Tx functionality. ``lib_xua`` has many parameters than can be configured at build time, some examples include: @@ -164,7 +161,7 @@ The application main() function The ``main()`` function sets up the tasks in the application. -Various channels are required in order to allow the required tasks to communcate. +Various channels are required in order to allow the required tasks to communicate. These must first be declared: .. literalinclude:: app_xua_simple.xc @@ -179,11 +176,11 @@ using the xC ``par`` construct: :end-before: return 0 This code starts the low-level USB task, an Endpoint 0 task, an Audio buffering task and a task to handle -the audio I/O. Note, since there is no I2S funcitonality in this example this task simply forwards samples to the +the audio I/O. Note, since there is no I2S functionality in this example this task simply forwards samples to the SPDIF transmitter task. In addition the ``spdif_tx()`` task is also run. Note that the ``spdif_tx_port_config()`` function is called before a nested ``par`` of ``spdif_tx()`` and ``XUA_AudioHub()``. -This is because of the "shared" nature of ``p_mclk_in`` and avoids a parrallel usage check failure by the XMOS toolchain. +This is because of the "shared" nature of ``p_mclk_in`` and avoids a parallel usage check failure by the XMOS tool-chain. |appendix| |newpage| @@ -191,7 +188,7 @@ This is because of the "shared" nature of ``p_mclk_in`` and avoids a parrallel u Demo Hardware Setup ------------------- -To run the demo, connect a USB cable to power the xCORE-200 MC Audio board +To run the demo, connect a USB cable to power the xCORE.ai MC Audio board and plug the xTAG to the board and connect the xTAG USB cable to your development machine. @@ -206,7 +203,7 @@ Launching the demo application ------------------------------ Once the demo example has been built either from the command line using xmake or -via the build mechanism of xTIMEcomposer studio it can be executed on the xCORE-200 +via the build mechanism of xTIMEcomposer studio it can be executed on the xCORE.ai MC Audio board. Once built there will be a ``bin/`` directory within the project which contains @@ -221,7 +218,7 @@ on the xCORE device:: xrun --xscope bin/app_xua_simple.xe Once this command has executed the application will be running on the -xCORE-200 MC Audio Board +xCORE.ai MC Audio Board Launching from xTIMEcomposer Studio ................................... @@ -233,7 +230,7 @@ enable the xSCOPE I/O mode in the dialog box and then select Run. Once this command has executed the application will be running on the -xCORE-200 MC Audio board. +xCORE.ai MC Audio board. Running the application ....................... diff --git a/examples/AN00247_xua_example_spdif_tx/src/app_xua_simple.xc b/examples/AN00247_xua_example_spdif_tx/src/app_xua_spdiftx.xc similarity index 88% rename from examples/AN00247_xua_example_spdif_tx/src/app_xua_simple.xc rename to examples/AN00247_xua_example_spdif_tx/src/app_xua_spdiftx.xc index c9c96881..9e5600ea 100644 --- a/examples/AN00247_xua_example_spdif_tx/src/app_xua_simple.xc +++ b/examples/AN00247_xua_example_spdif_tx/src/app_xua_spdiftx.xc @@ -20,9 +20,9 @@ #include "spdif.h" /* Lib_spdif port declarations. Note, the defines come from the xn file */ -buffered out port:32 p_spdif_tx = PORT_SPDIF_OUT; /* SPDIF transmit port */ +buffered out port:32 p_spdif_tx = PORT_COAX_OUT; /* SPDIF transmit port */ -clock clk_spdif_tx = on tile[0]: XS1_CLKBLK_4; /* Clock block for S/PDIF transmit */ +clock clk_spdif_tx = on tile[1]: XS1_CLKBLK_4; /* Clock block for S/PDIF transmit */ /* Lib_xua port declarations. Note, the defines come from the xn file */ in port p_mclk_in = PORT_MCLK_IN; /* Master clock for the audio IO tile */ @@ -32,14 +32,17 @@ in port p_for_mclk_count = PORT_MCLK_COUNT; /* Extra port for count in port p_mclk_in_usb = PORT_MCLK_IN_USB; /* Extra master clock input for the USB tile */ /* Clock-block declarations */ -clock clk_audio_mclk = on tile[0]: XS1_CLKBLK_5; /* Master clock */ -clock clk_audio_mclk_usb = on tile[1]: XS1_CLKBLK_1; /* Master clock for USB tile */ +clock clk_audio_mclk = on tile[1]: XS1_CLKBLK_5; /* Master clock */ +clock clk_audio_mclk_usb = on tile[0]: XS1_CLKBLK_1; /* Master clock for USB tile */ /* Endpoint type tables - informs XUD what the transfer types for each Endpoint in use and also * if the endpoint wishes to be informed of USB bus resets */ XUD_EpType epTypeTableOut[] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABLE, XUD_EPTYPE_ISO}; XUD_EpType epTypeTableIn[] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABLE, XUD_EPTYPE_ISO}; +/* From hwsupport.h */ +void ctrlPort(); + int main() { /* Channels for lib_xud */ @@ -61,15 +64,15 @@ int main() par { /* Low level USB device layer core */ - on tile[1]: XUD_Main(c_ep_out, 2, c_ep_in, 2, c_sof, epTypeTableOut, epTypeTableIn, XUD_SPEED_HS, XUD_PWR_SELF); + on tile[0]: XUD_Main(c_ep_out, 2, c_ep_in, 2, c_sof, epTypeTableOut, epTypeTableIn, XUD_SPEED_HS, XUD_PWR_SELF); /* Endpoint 0 core from lib_xua */ /* Note, since we are not using many features we pass in null for quite a few params.. */ - on tile[1]: XUA_Endpoint0(c_ep_out[0], c_ep_in[0], c_aud_ctl, null, null, null, null); + on tile[0]: XUA_Endpoint0(c_ep_out[0], c_ep_in[0], c_aud_ctl, null, null, null, null); /* Buffering cores - handles audio data to/from EP's and gives/gets data to/from the audio I/O core */ /* Note, this spawns two cores */ - on tile[1]: { + on tile[0]: { /* Connect master-clock clock-block to clock-block pin */ set_clock_src(clk_audio_mclk_usb, p_mclk_in_usb); /* Clock clock-block from mclk pin */ @@ -80,11 +83,13 @@ int main() } /* AudioHub() (I2S) and S/SPDIF Tx are on the same tile */ - on tile[0]: { + on tile[1]: { /* Setup S/PDIF tx port from clock etc - note we do this before par to avoid parallel usage */ spdif_tx_port_config(p_spdif_tx, clk_spdif_tx, p_mclk_in, 7); + start_clock(clk_spdif_tx); + par { while(1) @@ -98,6 +103,8 @@ int main() XUA_AudioHub(c_aud, clk_audio_mclk, null, p_mclk_in, null, null, null, null, c_spdif_tx); } } + + on tile[0]: ctrlPort(); } return 0; diff --git a/examples/AN00247_xua_example_spdif_tx/src/hid_report_descriptor.h b/examples/AN00247_xua_example_spdif_tx/src/hid_report_descriptor.h deleted file mode 100644 index 70e01717..00000000 --- a/examples/AN00247_xua_example_spdif_tx/src/hid_report_descriptor.h +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2021-2022 XMOS LIMITED. -// This Software is subject to the terms of the XMOS Public Licence: Version 1. -#ifndef __hid_report_descriptor_h__ -#define __hid_report_descriptor_h__ - -#include "xua_hid_report.h" - -#if 0 -/* Existing static report descriptor kept for reference */ -unsigned char hidReportDescriptor[] = -{ - 0x05, 0x0c, /* Usage Page (Consumer Device) */ - 0x09, 0x01, /* Usage (Consumer Control) */ - 0xa1, 0x01, /* Collection (Application) */ - 0x15, 0x00, /* Logical Minimum (0) */ - 0x25, 0x01, /* Logical Maximum (1) */ - 0x09, 0xb0, /* Usage (Play) */ - 0x09, 0xb5, /* Usage (Scan Next Track) */ - 0x09, 0xb6, /* Usage (Scan Previous Track) */ - 0x09, 0xe9, /* Usage (Volume Up) */ - 0x09, 0xea, /* Usage (Volume Down) */ - 0x09, 0xe2, /* Usage (Mute) */ - 0x75, 0x01, /* Report Size (1) */ - 0x95, 0x06, /* Report Count (6) */ - 0x81, 0x02, /* Input (Data, Var, Abs) */ - 0x95, 0x02, /* Report Count (2) */ - 0x81, 0x01, /* Input (Cnst, Ary, Abs) */ - 0xc0 /* End collection */ -}; -#endif - -/* - * Define non-configurable items in the HID Report descriptor. - */ -static const USB_HID_Short_Item_t hidCollectionApplication = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_COLLECTION), - .data = { 0x01, 0x00 } }; -static const USB_HID_Short_Item_t hidCollectionEnd = { - .header = HID_REPORT_SET_HEADER(0, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_END_COLLECTION), - .data = { 0x00, 0x00 } }; - -static const USB_HID_Short_Item_t hidInputConstArray = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT), - .data = { 0x01, 0x00 } }; -static const USB_HID_Short_Item_t hidInputDataVar = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT), - .data = { 0x02, 0x00 } }; - -static const USB_HID_Short_Item_t hidLogicalMaximum0 = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM), - .data = { 0x00, 0x00 } }; -static const USB_HID_Short_Item_t hidLogicalMaximum1 = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM), - .data = { 0x01, 0x00 } }; -static const USB_HID_Short_Item_t hidLogicalMinimum0 = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MINIMUM), - .data = { 0x00, 0x00 } }; - -static const USB_HID_Short_Item_t hidReportCount2 = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT), - .data = { 0x02, 0x00 } }; -static const USB_HID_Short_Item_t hidReportCount6 = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT), - .data = { 0x06, 0x00 } }; -static const USB_HID_Short_Item_t hidReportSize1 = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE), - .data = { 0x01, 0x00 } }; - -static const USB_HID_Short_Item_t hidUsageConsumerControl = { - .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), - .data = { 0x01, 0x00 } }; - -/* - * Define the HID Report Descriptor Item, Usage Page, Report ID and length for each HID Report - * For internal purposes, a report element with ID of 0 must be included if report IDs are not being used. - */ -static const USB_HID_Report_Element_t hidReportPageConsumer = { - .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE), - .item.data = { USB_HID_USAGE_PAGE_ID_CONSUMER, 0x00 }, - .location = HID_REPORT_SET_LOC( 0, 2, 0, 0 ) -}; - -/* - * Define configurable items in the HID Report descriptor. - */ -static USB_HID_Report_Element_t hidUsageByte0Bit5 = { - .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), - .item.data = { 0xE2, 0x00 }, - .location = HID_REPORT_SET_LOC(0, 0, 0, 5) -}; // Mute -static USB_HID_Report_Element_t hidUsageByte0Bit4 = { - .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), - .item.data = { 0xEA, 0x00 }, - .location = HID_REPORT_SET_LOC(0, 0, 0, 4) -}; // Vol- -static USB_HID_Report_Element_t hidUsageByte0Bit3 = { - .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), - .item.data = { 0xE9, 0x00 }, - .location = HID_REPORT_SET_LOC(0, 0, 0, 3) -}; // Vol+ -static USB_HID_Report_Element_t hidUsageByte0Bit2 = { - .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), - .item.data = { 0xB6, 0x00 }, - .location = HID_REPORT_SET_LOC(0, 0, 0, 2) -}; // Scan Prev -static USB_HID_Report_Element_t hidUsageByte0Bit1 = { - .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), - .item.data = { 0xB5, 0x00 }, - .location = HID_REPORT_SET_LOC(0, 0, 0, 1) -}; // Scan Next -static USB_HID_Report_Element_t hidUsageByte0Bit0 = { - .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), - .item.data = { 0xB0, 0x00 }, - .location = HID_REPORT_SET_LOC(0, 0, 0, 0) -}; // Play - -/* - * List the configurable elements in the HID Report descriptor. - */ -static USB_HID_Report_Element_t* const hidConfigurableElements[] = { - &hidUsageByte0Bit0, - &hidUsageByte0Bit1, - &hidUsageByte0Bit2, - &hidUsageByte0Bit3, - &hidUsageByte0Bit4, - &hidUsageByte0Bit5 -}; - -/* - * List HID Reports, one per Report ID. This should be a usage page item with the relevant - * If not using report IDs - still have one with report ID 0 - */ -static const USB_HID_Report_Element_t* const hidReports[] = { - &hidReportPageConsumer -}; - -/* - * List all items in the HID Report descriptor. - */ -static const USB_HID_Short_Item_t* const hidReportDescriptorItems[] = { - &(hidReportPageConsumer.item), - &hidUsageConsumerControl, - &hidCollectionApplication, - &hidLogicalMinimum0, - &hidLogicalMaximum1, - &(hidUsageByte0Bit0.item), - &(hidUsageByte0Bit1.item), - &(hidUsageByte0Bit2.item), - &(hidUsageByte0Bit3.item), - &(hidUsageByte0Bit4.item), - &(hidUsageByte0Bit5.item), - &hidReportSize1, - &hidReportCount6, - &hidInputDataVar, - &hidLogicalMaximum0, - &hidReportCount2, - &hidInputConstArray, - &hidCollectionEnd -}; - -/* - * Define the number of HID Reports - * Due to XC not supporting designated initializers, this constant has a hard-coded value. - * It must equal ( sizeof hidReports / sizeof ( USB_HID_Report_Element_t* )) - */ -#define HID_REPORT_COUNT ( 1 ) - -#endif // __hid_report_descriptor_h__ diff --git a/examples/AN00247_xua_example_spdif_tx/src/hwsupport.xc b/examples/AN00247_xua_example_spdif_tx/src/hwsupport.xc index 84e0464b..1ca91a3f 100644 --- a/examples/AN00247_xua_example_spdif_tx/src/hwsupport.xc +++ b/examples/AN00247_xua_example_spdif_tx/src/hwsupport.xc @@ -1,52 +1,56 @@ -// Copyright 2016-2021 XMOS LIMITED. +// Copyright 2017-2022 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. - +#include #include -#include - #include "xua.h" +#include "../../shared/apppll.h" -/* General output port bit definitions */ -#define P_GPIO_DSD_MODE (1 << 0) /* DSD mode select 0 = 8i/8o I2S, 1 = 8o DSD*/ -#define P_GPIO_DAC_RST_N (1 << 1) -#define P_GPIO_USB_SEL0 (1 << 2) -#define P_GPIO_USB_SEL1 (1 << 3) -#define P_GPIO_VBUS_EN (1 << 4) -#define P_GPIO_PLL_SEL (1 << 5) /* 1 = CS2100, 0 = Phaselink clock source */ -#define P_GPIO_ADC_RST_N (1 << 6) -#define P_GPIO_MCLK_FSEL (1 << 7) /* Select frequency on Phaselink clock. 0 = 24.576MHz for 48k, 1 = 22.5792MHz for 44.1k.*/ +on tile[0]: out port p_ctrl = XS1_PORT_8D; +/* p_ctrl: + * [0:3] - Unused + * [4] - EN_3v3_N + * [5] - EN_3v3A + * [6] - EXT_PLL_SEL (CS2100:0, SI: 1) + * [7] - MCLK_DIR (Out:0, In: 1) + */ +#define EXT_PLL_SEL__MCLK_DIR (0x80) -out port p_gpio = on tile[0]:XS1_PORT_8C; - -void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode, - unsigned sampRes_DAC, unsigned sampRes_ADC) +/* Note, this runs on Tile[0] */ +void ctrlPort() { - unsigned char gpioVal = 0; - - /* Set master clock select appropriately and put ADC and DAC into reset */ - if (mClk == MCLK_441) + // Drive control port to turn on 3V3 and set MCLK_DIR + // Note, "soft-start" to reduce current spike + // Note, 3v3_EN is inverted + for (int i = 0; i < 30; i++) { - gpioVal = P_GPIO_USB_SEL0 | P_GPIO_USB_SEL1; + p_ctrl <: EXT_PLL_SEL__MCLK_DIR | 0x30; /* 3v3: off, 3v3A: on */ + delay_microseconds(5); + p_ctrl <: EXT_PLL_SEL__MCLK_DIR | 0x20; /* 3v3: on, 3v3A: on */ + delay_microseconds(5); } - else - { - gpioVal = P_GPIO_USB_SEL0 | P_GPIO_USB_SEL1 | P_GPIO_MCLK_FSEL; - } - - /* Note, DAC and ADC held in reset */ - p_gpio <: gpioVal; - - /* Allow MCLK to settle */ - delay_microseconds(20000); - - return; } +/* Configures the external audio hardware at startup. Note this runs on Tile[1] */ void AudioHwInit() { - /* Set USB Mux to micro-b */ - /* ADC and DAC in reset */ - p_gpio <: P_GPIO_USB_SEL0 | P_GPIO_USB_SEL1; + /* Wait for power supply to come up */ + delay_milliseconds(100); + + /* Use xCORE Secondary PLL to generate *fixed* master clock */ + AppPllEnable_SampleRate(DEFAULT_FREQ); + + delay_milliseconds(100); + + /* DAC setup: For basic I2S input we don't need any register setup. DACs will clock auto detect etc. + * It holds DAC in reset until it gets clocks anyway. + * Note, this example doesn't use the ADC's + */ +} + +/* Configures the external audio hardware for the required sample frequency */ +void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode, unsigned sampRes_DAC, unsigned sampRes_ADC) +{ + AppPllEnable_SampleRate(samFreq); } diff --git a/examples/AN00247_xua_example_spdif_tx/src/xk-audio-216-mc.xn b/examples/AN00247_xua_example_spdif_tx/src/xk-audio-216-mc.xn deleted file mode 100644 index 88e6d699..00000000 --- a/examples/AN00247_xua_example_spdif_tx/src/xk-audio-216-mc.xn +++ /dev/null @@ -1,88 +0,0 @@ - - - Board - XS2 MC Audio - - tileref tile[2] - tileref usb_tile - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - --> - - - - - - - - - - --> - --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/AN00247_xua_example_spdif_tx/src/xk-audio-316-mc.xn b/examples/AN00247_xua_example_spdif_tx/src/xk-audio-316-mc.xn new file mode 100644 index 00000000..9da4b479 --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/src/xk-audio-316-mc.xn @@ -0,0 +1,92 @@ + + + Board + xcore.ai MC Audio Board + + + tileref tile[2] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/AN00247_xua_example_spdif_tx/src/xua_conf.h b/examples/AN00247_xua_example_spdif_tx/src/xua_conf.h index 1121ecdf..6459cb7f 100644 --- a/examples/AN00247_xua_example_spdif_tx/src/xua_conf.h +++ b/examples/AN00247_xua_example_spdif_tx/src/xua_conf.h @@ -4,29 +4,28 @@ #ifndef _XUA_CONF_H_ #define _XUA_CONF_H_ -#define NUM_USB_CHAN_OUT 2 -#define NUM_USB_CHAN_IN 0 -#define I2S_CHANS_DAC 0 -#define I2S_CHANS_ADC 0 -#define MCLK_441 (512 * 44100) -#define MCLK_48 (512 * 48000) -#define MIN_FREQ 48000 -#define MAX_FREQ 48000 +#define NUM_USB_CHAN_OUT (2) +#define NUM_USB_CHAN_IN (0) +#define I2S_CHANS_DAC (0) +#define I2S_CHANS_ADC (0) +#define MCLK_441 (512 * 44100) +#define MCLK_48 (512 * 48000) +#define MIN_FREQ (48000) +#define MAX_FREQ (48000) #define EXCLUDE_USB_AUDIO_MAIN -#define XUA_SPDIF_TX_EN 1 -#define SPDIF_TX_INDEX 0 -#define VENDOR_STR "XMOS" -#define VENDOR_ID 0x20B1 -#define PRODUCT_STR_A2 "XUA SPDIF Example" -#define PRODUCT_STR_A1 "XUA SPDIF Example" -#define PID_AUDIO_1 1 -#define PID_AUDIO_2 2 -#define AUDIO_CLASS 2 -#define AUDIO_CLASS_FALLBACK 0 -#define BCD_DEVICE 0x1234 -#define XUA_DFU_EN 0 -#define MIC_DUAL_ENABLED 0 // Use multi-threaded design +#define XUA_SPDIF_TX_EN (1) +#define SPDIF_TX_INDEX (0) +#define VENDOR_STR "XMOS" +#define VENDOR_ID 0x20B1 +#define PRODUCT_STR_A2 "XUA SPDIF Example" +#define PRODUCT_STR_A1 "XUA SPDIF Example" +#define PID_AUDIO_1 (1) +#define PID_AUDIO_2 (2) +#define AUDIO_CLASS (2) +#define AUDIO_CLASS_FALLBACK (0) +#define BCD_DEVICE (0x1234) +#define XUA_DFU_EN (0) #endif diff --git a/examples/AN00247_xua_example_spdif_tx/src/xud_conf.h b/examples/AN00247_xua_example_spdif_tx/src/xud_conf.h deleted file mode 100644 index 3fc13baf..00000000 --- a/examples/AN00247_xua_example_spdif_tx/src/xud_conf.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017-2021 XMOS LIMITED. -// This Software is subject to the terms of the XMOS Public Licence: Version 1. - -#include "xua_conf.h" - -/* TODO */ -#define XUD_UAC_NUM_USB_CHAN_OUT NUM_USB_CHAN_OUT -#define XUD_UAC_NUM_USB_CHAN_IN NUM_USB_CHAN_IN