37 Commits

Author SHA1 Message Date
Ross Owen
f035e1dc13 UserBufferManagementInit() now takes a sample rate param (#358)
UserBufferManagementInit() now takes a sample rate param
2023-12-07 17:30:27 +00:00
Ross Owen
c5496ea994 Fix issue creating SR list (#357)
Fix issue generating sample frequency list
2023-12-07 14:11:29 +00:00
Ross Owen
b0db22a50b Clock selection tidies and improvements (#355)
- Tidy up use of “tmp” variable when setting digital stream clock validity
- Simplify clock selection values
- Add better checks to clock selection
- Removed un-required clock selection code based on ADAT/SPDIF enabled
2023-12-06 16:08:00 +00:00
Ross Owen
1f74f8c601 Merge pull request #353 from xross/fix/352
Fixed ADAT Rx clock ID when SPDIF Rx also enabled
2023-11-29 10:23:15 +00:00
danielpieczko
9f8a4e737f Merge pull request #354 from danielpieczko/cmake
Add support for XCommon CMake
2023-11-07 10:55:00 +00:00
Daniel Pieczko
c57079cd4a Add support for XCommon CMake 2023-11-06 16:36:17 +00:00
Ross Owen
5a78b5079f Update Copyright comment 2023-11-03 10:59:28 +00:00
Ross Owen
5b5ee132e0 Fixed ADAT Rx clock ID when SPDIF Rx also enabled 2023-11-03 10:16:38 +00:00
Ross Owen
15c3007d1c Merge pull request #351 from xross/develop
Fixes for XUA_USB_EN=0
2023-11-03 10:11:31 +00:00
Ross Owen
ab7a94a821 Whitespace tidy only 2023-10-30 16:40:28 +00:00
Ross Owen
29156d5b19 Fixes for XUA_USB_EN=0 2023-10-30 13:33:53 +00:00
Ross Owen
5e5b2b7bd5 Merge feat/new_spdif_rx -> develop 2023-10-25 14:51:06 +01:00
Ross Owen
eebbb88fee Fixed spdif rx port declaration 2023-10-25 13:29:07 +01:00
Ross Owen
db63b93ac1 merge 2023-10-25 13:27:51 +01:00
Ross Owen
32c783795b merge 2023-10-25 13:26:05 +01:00
Ross Owen
5b37c4d224 Updates for spdif rx api change 2023-10-25 13:22:46 +01:00
Ross Owen
8fbe410e0e Merge pull request #350 from xross/develop
Tidy up QUAD_SPI_FLASH define (now XUA_QUAD_SPI_FLASH)
2023-10-05 12:16:29 +01:00
Ross Owen
52b72285e0 Update copyright comments 2023-10-05 12:34:41 +02:00
Ross Owen
2cfaff9221 Changelog update 2023-10-05 12:06:08 +02:00
Ross Owen
0f4cb1ccb5 Tidy up QUAD_SPI_FLASH define (now XUA_QUAD_SPI_FLASH). Enabled by default since most designs now use QSPI. 2023-10-05 12:02:27 +02:00
Ross Owen
bd702db2c6 Updates for new S/PDIF receiver (#348)
* Updates for new S/PDIF receiver
* Fixed some whitespace issues
2023-09-28 17:21:29 +01:00
Ross Owen
764fe0bfe9 Fixed some whitespace issues 2023-09-28 15:29:28 +01:00
Ross Owen
f1d902306f Fixed issue with checking S/PDIF rx parity 2023-09-28 13:33:12 +01:00
Ross Owen
74894341d1 Updated S/PDIF rx port definition 2023-09-28 13:10:05 +01:00
Ross Owen
a89df80da8 Updates for new S/PDIF receiver 2023-09-20 16:14:00 +01:00
Ross Owen
07ffd9221a Update README.rst 2023-09-11 10:10:03 +01:00
Ross Owen
7bbaff49af Merge pull request #344 from xross/develop
Removed usage of unused internal DFU commands
2023-09-06 16:35:54 +01:00
Ross Owen
f970623edf Removed usage of unused internal DFU commands 2023-09-06 11:18:27 +01:00
Ross Owen
b4c1587478 Merge branch 'develop' of github.com:xmos/lib_xua into develop 2023-08-23 14:17:52 +01:00
Ross Owen
be682f2b72 Merge branch 'master' into develop 2023-08-23 14:17:12 +01:00
Ross Owen
86f531b6ea Update CHANGELOG.rst 2023-08-23 14:15:23 +01:00
Ross Owen
66e6894f95 Merge pull request #342 from xross/develop
Resolve some minor buffering issues
2023-08-23 14:13:19 +01:00
Ross Owen
a8a0feaf52 Resolved build issue with NUM_USB_CHAN_OUT = 0 2023-08-23 13:00:24 +01:00
Ross Owen
fc3e3636ec - Resolve issue with sending 0 length packet when coming out of IN stream underflow
- Removed some output buffering code when not required.
2023-08-22 13:11:47 +01:00
Ross Owen
a796e1ee36 Merge pull request #341 from xross/develop 2023-08-21 15:53:51 +01:00
Ross Owen
b49bd69abe Changelog update 2023-08-18 15:11:23 +01:00
Ross Owen
ae550d5fc9 - Resolved issue where volume control is not enabled when mixer disabled
- Fixed issue with 32bit volume processing not occurring when required
2023-08-18 13:33:31 +01:00
15 changed files with 321 additions and 256 deletions

View File

@@ -1,6 +1,18 @@
lib_xua Change Log lib_xua Change Log
================== ==================
HEAD
----
* ADDED: Support for XCommon CMake build system
* RESOLVED: Output volume control not enabled by default when MIXER disabled
* RESOLVED: Full 32bit result of volume processing not calculated when required
* RESOLVED: Input stream sending an erroneous zero-length packet when exiting underflow state
* RESOLVED Build failures when XUA_USB_EN = 0
* RESOLVED: Clock configuration issues when ADAT and S/PDIF receive are enabled (#352)
* CHANGED: QUAD_SPI_FLASH replaced by XUA_QUAD_SPI_FLASH (default: 1)
* CHANGED: UserBufferManagementInit() now takes a sample rate parameter
3.5.1 3.5.1
----- -----

View File

@@ -14,7 +14,7 @@ Required hardware
................. .................
The example code provided with the application has been implemented The example code provided with the application has been implemented
and tested on the xCORE-200 Multi-channel Audio Board and tested on the xCORE.ai Multi-channel Audio Board
Prerequisites Prerequisites
............. .............

View File

@@ -76,7 +76,7 @@ void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode,
#endif // __XC__ #endif // __XC__
void UserBufferManagementInit(); void UserBufferManagementInit(unsigned samFreq);
void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[]); void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[]);

View File

@@ -85,10 +85,10 @@
#if defined(NATIVE_DSD) && (NATIVE_DSD == 0) #if defined(NATIVE_DSD) && (NATIVE_DSD == 0)
#undef NATIVE_DSD #undef NATIVE_DSD
#else #else
#define NATIVE_DSD 1 /* Always enable Native DSD when DSD mode is enabled */ #define NATIVE_DSD (1) /* Always enable Native DSD when DSD mode is enabled */
#endif #endif
#else #else
#define DSD_CHANS_DAC 0 #define DSD_CHANS_DAC (0)
#endif #endif
#define XUA_PCM_FORMAT_I2S (0) #define XUA_PCM_FORMAT_I2S (0)
@@ -114,9 +114,9 @@
**/ **/
#ifndef I2S_CHANS_PER_FRAME #ifndef I2S_CHANS_PER_FRAME
#if (XUA_PCM_FORMAT == XUA_PCM_FORMAT_TDM) #if (XUA_PCM_FORMAT == XUA_PCM_FORMAT_TDM)
#define I2S_CHANS_PER_FRAME 8 #define I2S_CHANS_PER_FRAME (8)
#else #else
#define I2S_CHANS_PER_FRAME 2 #define I2S_CHANS_PER_FRAME (2)
#endif #endif
#endif #endif
@@ -241,7 +241,9 @@
#endif #endif
/** /**
* @brief Default device sample frequency. A safe default should be used. Default: MIN_FREQ * @brief Default device sample frequency. A safe default should be used.
*
* Default: MIN_FREQ
*/ */
#ifndef DEFAULT_FREQ #ifndef DEFAULT_FREQ
#define DEFAULT_FREQ (MIN_FREQ) #define DEFAULT_FREQ (MIN_FREQ)
@@ -250,17 +252,21 @@
/* Audio Class Defines */ /* Audio Class Defines */
/** /**
* @brief USB Audio Class Version. Default: 2 (Audio Class version 2.0) * @brief USB Audio Class Version.
*
* Default: 2 (Audio Class version 2.0)
*/ */
#ifndef AUDIO_CLASS #ifndef AUDIO_CLASS
#define AUDIO_CLASS 2 #define AUDIO_CLASS (2)
#endif #endif
/** /**
* @brief Whether or not to fall back to Audio Class 1.0 in USB Full-speed. Default: 0 (Disabled) * @brief Whether or not to fall back to Audio Class 1.0 in USB Full-speed.
*
* Default: 0 (Disabled i.e. do not fall back to UAC 1.0
*/ */
#ifndef AUDIO_CLASS_FALLBACK #ifndef AUDIO_CLASS_FALLBACK
#define AUDIO_CLASS_FALLBACK 0 /* Default to not falling back to UAC 1 */ #define AUDIO_CLASS_FALLBACK (0)
#endif #endif
/** /**
@@ -272,7 +278,7 @@
#if (AUDIO_CLASS == 2) #if (AUDIO_CLASS == 2)
/* Whether to run in Audio Class 2.0 mode in USB Full-speed */ /* Whether to run in Audio Class 2.0 mode in USB Full-speed */
#if !defined(FULL_SPEED_AUDIO_2) && (AUDIO_CLASS_FALLBACK == 0) #if !defined(FULL_SPEED_AUDIO_2) && (AUDIO_CLASS_FALLBACK == 0)
#define FULL_SPEED_AUDIO_2 1 /* Default to falling back to UAC2 */ #define FULL_SPEED_AUDIO_2 (1) /* Default to falling back to UAC2 */
#endif #endif
#endif #endif
@@ -293,7 +299,9 @@
/* Feature defines */ /* Feature defines */
/** /**
* @brief Number of PDM microphones in the design. Default: None * @brief Number of PDM microphones in the design.
*
* Default: None
*/ */
#ifndef XUA_NUM_PDM_MICS #ifndef XUA_NUM_PDM_MICS
#define XUA_NUM_PDM_MICS (0) #define XUA_NUM_PDM_MICS (0)
@@ -310,14 +318,18 @@
#endif #endif
/** /**
* @brief Size of a frame of microphone data samples. Default: 1 * @brief Size of a frame of microphone data samples.
*
* Default: 1
*/ */
#ifndef XUA_MIC_FRAME_SIZE #ifndef XUA_MIC_FRAME_SIZE
#define XUA_MIC_FRAME_SIZE (1) #define XUA_MIC_FRAME_SIZE (1)
#endif #endif
/** /**
* @brief Enable MIDI functionality including buffering, descriptors etc. Default: DISABLED * @brief Enable MIDI functionality including buffering, descriptors etc.
*
* Default: 0 (Disabled)
*/ */
#ifndef MIDI #ifndef MIDI
#define MIDI (0) #define MIDI (0)
@@ -351,7 +363,9 @@
#endif #endif
/** /**
* @brief Enables ADAT Tx. Default: 0 (Disabled) * @brief Enables ADAT Tx.
*
* Default: 0 (Disabled)
*/ */
#ifndef XUA_ADAT_TX_EN #ifndef XUA_ADAT_TX_EN
#define XUA_ADAT_TX_EN (0) #define XUA_ADAT_TX_EN (0)
@@ -367,14 +381,18 @@
#endif #endif
/** /**
* @brief Enables SPDIF Rx. Default: 0 (Disabled) * @brief Enables SPDIF Rx.
*
* Default: 0 (Disabled)
*/ */
#ifndef XUA_SPDIF_RX_EN #ifndef XUA_SPDIF_RX_EN
#define XUA_SPDIF_RX_EN (0) #define XUA_SPDIF_RX_EN (0)
#endif #endif
/** /**
* @brief Enables ADAT Rx. Default: 0 (Disabled) * @brief Enables ADAT Rx.
*
* Default: 0 (Disabled)
*/ */
#ifndef XUA_ADAT_RX_EN #ifndef XUA_ADAT_RX_EN
#define XUA_ADAT_RX_EN (0) #define XUA_ADAT_RX_EN (0)
@@ -437,6 +455,15 @@
#undef XUA_DFU_EN #undef XUA_DFU_EN
#endif #endif
/**
* @brief Use a QSPI (rather than SPI) flash for DFU (and boot)
*
* Default: 1 (True i.e use QSPI flash)
*/
#if !defined(XUA_QUAD_SPI_FLASH)
#define XUA_QUAD_SPI_FLASH (1)
#endif
/** /**
* @brief Enable HID playback controls functionality. * @brief Enable HID playback controls functionality.
* *
@@ -1133,9 +1160,13 @@
#define VOLUME_RES_MIXER (0x100) #define VOLUME_RES_MIXER (0x100)
#endif #endif
/* Handle out volume control in the mixer - enabled by default */ /* Handle out volume control in the mixer - enabled by default if mixer enabled */
#ifndef OUT_VOLUME_IN_MIXER #ifndef OUT_VOLUME_IN_MIXER
#if MIXER
#define OUT_VOLUME_IN_MIXER (1) #define OUT_VOLUME_IN_MIXER (1)
#else
#define OUT_VOLUME_IN_MIXER (0)
#endif
#endif #endif
/* Apply out volume controls after the mix. Only relevant when OUT_VOLUME_IN_MIXER enabled. Enabled by default */ /* Apply out volume controls after the mix. Only relevant when OUT_VOLUME_IN_MIXER enabled. Enabled by default */
@@ -1148,7 +1179,7 @@
#define IN_VOLUME_IN_MIXER (0) #define IN_VOLUME_IN_MIXER (0)
#endif #endif
/* Apply in volume controls after the mix. Only relebant when IN_VOLUMNE_IN MIXER enabled. Enabled by default */ /* Apply in volume controls after the mix. Only relevant when IN_VOLUMNE_IN MIXER enabled. Enabled by default */
#ifndef IN_VOLUME_AFTER_MIX #ifndef IN_VOLUME_AFTER_MIX
#define IN_VOLUME_AFTER_MIX (1) #define IN_VOLUME_AFTER_MIX (1)
#endif #endif
@@ -1245,8 +1276,6 @@ enum USBEndpointNumber_Out
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */
#define AUDIO_STOP_FOR_DFU (0x12345678) #define AUDIO_STOP_FOR_DFU (0x12345678)
#define AUDIO_START_FROM_DFU (0x87654321)
#define AUDIO_REBOOT_FROM_DFU (0xa5a5a5a5)
/* Result of db_to_mult(MAX_VOLUME, 8, 29) */ /* Result of db_to_mult(MAX_VOLUME, 8, 29) */
#define MAX_VOLUME_MULT (0x20000000) #define MAX_VOLUME_MULT (0x20000000)
@@ -1349,7 +1378,7 @@ enum USBEndpointNumber_Out
/* Some defines that allow us to remove unused code */ /* Some defines that allow us to remove unused code */
/* Useful for dropping lower part of macs in volume processing... */ /* Useful for dropping lower part of macs in volume processing... */
#if (FS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS > 24) || (HS_STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS > 24) || \ #if (FS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS > 24) || (HS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS > 24) || \
(((FS_STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS > 24) || (HS_STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS > 24)) && (OUTPUT_FORMAT_COUNT > 1)) || \ (((FS_STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS > 24) || (HS_STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS > 24)) && (OUTPUT_FORMAT_COUNT > 1)) || \
(((FS_STREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS > 24) || (HS_STREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS > 24)) && (OUTPUT_FORMAT_COUNT > 2)) (((FS_STREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS > 24) || (HS_STREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS > 24)) && (OUTPUT_FORMAT_COUNT > 2))
#define STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED 1 #define STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED 1
@@ -1383,7 +1412,7 @@ enum USBEndpointNumber_Out
#endif #endif
/* Useful for dropping lower part of macs in volume processing... */ /* Useful for dropping lower part of macs in volume processing... */
#if (FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS > 24) || (FS_STREAM_FORMAT_INPUT_2_RESOLUTION_BITS > 24) #if (FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS > 24) || (HS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS > 24)
#define STREAM_FORMAT_INPUT_RESOLUTION_32BIT_USED 1 #define STREAM_FORMAT_INPUT_RESOLUTION_32BIT_USED 1
#else #else
#define STREAM_FORMAT_INPUT_RESOLUTION_32BIT_USED 0 #define STREAM_FORMAT_INPUT_RESOLUTION_32BIT_USED 0

View File

@@ -0,0 +1,51 @@
set(LIB_NAME lib_xua)
set(LIB_VERSION 3.5.1)
set(LIB_INCLUDES api
src/core
src/core/audiohub
src/core/buffer/ep
src/core/endpoint0
src/dfu
src/core/buffer/decouple
src/core/clocking
src/core/mixer
src/core/pdm_mics
src/core/ports
src/core/support
src/core/user
src/core/user/audiostream
src/core/user/hid
src/core/user/hostactive
src/hid
src/midi)
set(LIB_OPTIONAL_HEADERS xua_conf.h static_hid_report.h)
set(LIB_DEPENDENT_MODULES "lib_locks"
"lib_logging"
"lib_mic_array(feature/xcommon_cmake)"
"lib_spdif"
"lib_xassert"
"lib_xud"
"lib_adat")
set(LIB_COMPILER_FLAGS -O3 -DREF_CLK_FREQ=100 -fasm-linenum -fcomment-asm)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
list(APPEND LIB_COMPILER_FLAGS -DXASSERT_ENABLE_ASSERTIONS=1
-DXASSERT_ENABLE_DEBUG=1
-DXASSERT_ENBALE_LINE_NUMBERS=1)
else()
list(APPEND LIB_COMPILER_FLAGS -DXASSERT_ENABLE_ASSERTIONS=0
-DXASSERT_ENABLE_DEBUG=0
-DXASSERT_ENABLE_LINE_NUMBERS=0)
endif()
set(LIB_COMPILER_FLAGS_xua_endpoint0.c ${LIB_COMPILER_FLAGS} -Os -mno-dual-issue)
set(LIB_COMPILER_FLAGS_xua_ep0_uacreqs.xc ${LIB_COMPILER_FLAGS} -Os -mno-dual-issue)
set(LIB_COMPILER_FLAGS_dbcalc.xc ${LIB_COMPILER_FLAGS} -Os -mno-dual-issue)
set(LIB_COMPILER_FLAGS_audioports.c ${LIB_COMPILER_FLAGS} -Os -mno-dual-issue)
set(LIB_COMPILER_FLAGS_audioports.xc ${LIB_COMPILER_FLAGS} -Os -mno-dual-issue)
set(LIB_COMPILER_FLAGS_dfu.xc ${LIB_COMPILER_FLAGS} -Os -mno-dual-issue)
set(LIB_COMPILER_FLAGS_flash_interface.c ${LIB_COMPILER_FLAGS} -Os -mno-dual-issue)
set(LIB_COMPILER_FLAGS_flashlib_user.c ${LIB_COMPILER_FLAGS} -Os -mno-dual-issue)
XMOS_REGISTER_MODULE()

View File

@@ -1,13 +1,11 @@
// Copyright 2018-2022 XMOS LIMITED. // Copyright 2018-2023 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1. // This Software is subject to the terms of the XMOS Public Licence: Version 1.
unsigned adatCounter = 0; unsigned adatCounter = 0;
unsigned adatSamples[8]; unsigned adatSamples[8];
#pragma unsafe arrays #pragma unsafe arrays
static inline void TransferAdatTxSamples(chanend c_adat_out, const unsigned samplesFromHost[], int smux, int handshake) static inline void TransferAdatTxSamples(chanend c_adat_out, const unsigned samplesFromHost[], int smux, int handshake)
{ {
/* Do some re-arranging for SMUX.. */ /* Do some re-arranging for SMUX.. */
unsafe unsafe
{ {
@@ -29,7 +27,6 @@ static inline void TransferAdatTxSamples(chanend c_adat_out, const unsigned samp
if(adatCounter == smux) if(adatCounter == smux)
{ {
#ifdef ADAT_TX_USE_SHARED_BUFF #ifdef ADAT_TX_USE_SHARED_BUFF
unsafe unsafe
{ {

View File

@@ -241,12 +241,12 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out
} }
#endif // ((DEBUG_MIC_ARRAY == 1) && (XUA_NUM_PDM_MICS > 0)) #endif // ((DEBUG_MIC_ARRAY == 1) && (XUA_NUM_PDM_MICS > 0))
UserBufferManagementInit(); UserBufferManagementInit(curSamFreq);
unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord); unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord);
// Reinitialise user state before entering the main loop // Reinitialise user state before entering the main loop
UserBufferManagementInit(); UserBufferManagementInit(curSamFreq);
#if (XUA_ADAT_TX_EN) #if (XUA_ADAT_TX_EN)
unsafe{ unsafe{
@@ -806,7 +806,7 @@ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, clock ?clk_audio_bclk,
{ {
/* TODO wait for good mclk instead of delay */ /* TODO wait for good mclk instead of delay */
/* No delay for DFU modes */ /* No delay for DFU modes */
if (((curSamFreq / AUD_TO_USB_RATIO) != AUDIO_REBOOT_FROM_DFU) && ((curSamFreq / AUD_TO_USB_RATIO) != AUDIO_STOP_FOR_DFU) && command) if (((curSamFreq / AUD_TO_USB_RATIO) != AUDIO_STOP_FOR_DFU) && command)
{ {
#if 0 #if 0
/* User should ensure MCLK is stable in AudioHwConfig */ /* User should ensure MCLK is stable in AudioHwConfig */
@@ -916,13 +916,9 @@ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, clock ?clk_audio_bclk,
#else #else
dummy_deliver(c_aud, command); dummy_deliver(c_aud, command);
#endif #endif
/* Note, we do not expect to reach here */
curSamFreq = inuint(c_aud); curSamFreq = inuint(c_aud);
if (curSamFreq == AUDIO_START_FROM_DFU)
{
outct(c_aud, XS1_CT_END); outct(c_aud, XS1_CT_END);
break;
}
} }
} }
#endif #endif

View File

@@ -1,11 +1,11 @@
// Copyright 2016-2021 XMOS LIMITED. // Copyright 2016-2023 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1. // This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include "xccompat.h" #include "xccompat.h"
#include "xua_audiohub.h" #include "xua_audiohub.h"
/* Default implementation for UserBufferManagementInit() */ /* Default implementation for UserBufferManagementInit() */
void __attribute__ ((weak)) UserBufferManagementInit() void __attribute__ ((weak)) UserBufferManagementInit(unsigned sampFreq)
{ {
/* Do nothing */ /* Do nothing */
} }

View File

@@ -651,6 +651,7 @@ __builtin_unreachable();
#if (NUM_USB_CHAN_IN > 0) #if (NUM_USB_CHAN_IN > 0)
/* Mark Endpoint (IN) ready with an appropriately sized zero buffer */ /* Mark Endpoint (IN) ready with an appropriately sized zero buffer */
/* TODO We should properly size zeros packet rather than using "mid" */
static inline void SetupZerosSendBuffer(XUD_ep aud_to_host_usb_ep, unsigned sampFreq, unsigned slotSize, static inline void SetupZerosSendBuffer(XUD_ep aud_to_host_usb_ep, unsigned sampFreq, unsigned slotSize,
xc_ptr aud_to_host_zeros) xc_ptr aud_to_host_zeros)
{ {
@@ -659,8 +660,8 @@ static inline void SetupZerosSendBuffer(XUD_ep aud_to_host_usb_ep, unsigned samp
/* Set IN stream packet size to something sensible. We expect the buffer to /* Set IN stream packet size to something sensible. We expect the buffer to
* over flow and this to be reset */ * over flow and this to be reset */
SET_SHARED_GLOBAL(sampsToWrite, 0); SET_SHARED_GLOBAL(sampsToWrite, mid);
SET_SHARED_GLOBAL(totalSampsToWrite, 0); SET_SHARED_GLOBAL(totalSampsToWrite, mid);
mid *= g_numUsbChan_In * slotSize; mid *= g_numUsbChan_In * slotSize;
@@ -821,6 +822,7 @@ void XUA_Buffer_Decouple(chanend c_mix_out
SetupZerosSendBuffer(aud_to_host_usb_ep, sampFreq, g_curSubSlot_In, aud_to_host_zeros); SetupZerosSendBuffer(aud_to_host_usb_ep, sampFreq, g_curSubSlot_In, aud_to_host_zeros);
#endif #endif
#if (NUM_USB_CHAN_OUT > 0)
/* Reset OUT buffer state */ /* Reset OUT buffer state */
outUnderflow = 1; outUnderflow = 1;
SET_SHARED_GLOBAL(g_aud_from_host_rdptr, aud_from_host_fifo_start); SET_SHARED_GLOBAL(g_aud_from_host_rdptr, aud_from_host_fifo_start);
@@ -833,6 +835,7 @@ void XUA_Buffer_Decouple(chanend c_mix_out
XUD_SetReady_OutPtr(aud_from_host_usb_ep, aud_from_host_fifo_start + 4); XUD_SetReady_OutPtr(aud_from_host_usb_ep, aud_from_host_fifo_start + 4);
outOverflow = 0; outOverflow = 0;
} }
#endif
} }
/* Wait for handshake back and pass back up */ /* Wait for handshake back and pass back up */
@@ -906,6 +909,7 @@ void XUA_Buffer_Decouple(chanend c_mix_out
GET_SHARED_GLOBAL(dataFormat, g_formatChange_DataFormat); GET_SHARED_GLOBAL(dataFormat, g_formatChange_DataFormat);
GET_SHARED_GLOBAL(sampRes, g_formatChange_SampRes); GET_SHARED_GLOBAL(sampRes, g_formatChange_SampRes);
#if (NUM_USB_CHAN_OUT > 0)
/* Reset OUT buffer state */ /* Reset OUT buffer state */
SET_SHARED_GLOBAL(g_aud_from_host_rdptr, aud_from_host_fifo_start); SET_SHARED_GLOBAL(g_aud_from_host_rdptr, aud_from_host_fifo_start);
SET_SHARED_GLOBAL(g_aud_from_host_wrptr, aud_from_host_fifo_start); SET_SHARED_GLOBAL(g_aud_from_host_wrptr, aud_from_host_fifo_start);
@@ -921,6 +925,7 @@ void XUA_Buffer_Decouple(chanend c_mix_out
XUD_SetReady_OutPtr(aud_from_host_usb_ep, aud_from_host_fifo_start+4); XUD_SetReady_OutPtr(aud_from_host_usb_ep, aud_from_host_fifo_start+4);
outOverflow = 0; outOverflow = 0;
} }
#endif
#ifdef NATIVE_DSD #ifdef NATIVE_DSD
if(dataFormat == UAC_FORMAT_TYPEI_RAW_DATA) if(dataFormat == UAC_FORMAT_TYPEI_RAW_DATA)

View File

@@ -1,6 +1,5 @@
// Copyright 2011-2023 XMOS LIMITED. // Copyright 2011-2023 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1. // This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include <xs1.h> #include <xs1.h>
#include <assert.h> #include <assert.h>
#include <print.h> #include <print.h>
@@ -141,9 +140,6 @@ static inline void setClockValidity(chanend c_interruptControl, int clkIndex, in
} }
} }
/* Returns 1 for valid clock found else 0 */ /* Returns 1 for valid clock found else 0 */
static inline int validSamples(Counter &counter, int clockIndex) static inline int validSamples(Counter &counter, int clockIndex)
{ {
@@ -219,18 +215,6 @@ static inline int validSamples(Counter &counter, int clockIndex)
} }
#endif #endif
#if (XUA_SPDIF_RX_EN)
//:badParity
/* Returns 1 for bad parity, else 0 */
static inline int badParity(unsigned x)
{
unsigned X = (x>>4);
crc32(X, 0, 1);
return X & 1;
}
//:
#endif
#ifdef LEVEL_METER_LEDS #ifdef LEVEL_METER_LEDS
void VendorLedRefresh(unsigned levelData[]); void VendorLedRefresh(unsigned levelData[]);
unsigned g_inputLevelData[NUM_USB_CHAN_IN]; unsigned g_inputLevelData[NUM_USB_CHAN_IN];
@@ -248,7 +232,7 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
unsigned clkMode = CLOCK_INTERNAL; /* Current clocking mode in operation */ unsigned clkMode = CLOCK_INTERNAL; /* Current clocking mode in operation */
unsigned tmp; unsigned tmp;
/* start in no-SMUX (8-channel) mode */ /* Start in no-SMUX (8-channel) mode */
int smux = 0; int smux = 0;
#ifdef LEVEL_METER_LEDS #ifdef LEVEL_METER_LEDS
@@ -269,9 +253,10 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
int spdifUnderflow = 1; int spdifUnderflow = 1;
int spdifSamps = 0; /* Number of samples in buffer */ int spdifSamps = 0; /* Number of samples in buffer */
Counter spdifCounters; Counter spdifCounters;
int spdifReceivedTime; int spdifRxTime;
unsigned tmp2; unsigned tmp2;
unsigned spdifLeft = 0; unsigned spdifLeft = 0;
unsigned spdifRxData;
#endif #endif
#if (XUA_ADAT_RX_EN) #if (XUA_ADAT_RX_EN)
@@ -296,21 +281,21 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
} }
/* Init clock unit state */ /* Init clock unit state */
clockFreq[CLOCK_INTERNAL] = 0;
clockId[CLOCK_INTERNAL] = ID_CLKSRC_INT;
clockValid[CLOCK_INTERNAL] = 0;
clockInt[CLOCK_INTERNAL] = 0;
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN)
clockFreq[CLOCK_SPDIF_INDEX] = 0; clockFreq[CLOCK_SPDIF] = 0;
clockValid[CLOCK_SPDIF_INDEX] = 0; clockValid[CLOCK_SPDIF] = 0;
clockInt[CLOCK_SPDIF_INDEX] = 0; clockInt[CLOCK_SPDIF] = 0;
clockId[CLOCK_SPDIF_INDEX] = ID_CLKSRC_SPDIF; clockId[CLOCK_SPDIF] = ID_CLKSRC_SPDIF;
#endif #endif
clockFreq[CLOCK_INTERNAL_INDEX] = 0;
clockId[CLOCK_INTERNAL_INDEX] = ID_CLKSRC_INT;
clockValid[CLOCK_INTERNAL_INDEX] = 0;
clockInt[CLOCK_INTERNAL_INDEX] = 0;
#if (XUA_ADAT_RX_EN) #if (XUA_ADAT_RX_EN)
clockFreq[CLOCK_ADAT_INDEX] = 0; clockFreq[CLOCK_ADAT] = 0;
clockInt[CLOCK_ADAT_INDEX] = 0; clockInt[CLOCK_ADAT] = 0;
clockValid[CLOCK_ADAT_INDEX] = 0; clockValid[CLOCK_ADAT] = 0;
clockId[CLOCK_ADAT_INDEX] = ID_CLKSRC_ADAT; clockId[CLOCK_ADAT] = ID_CLKSRC_ADAT;
#endif #endif
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN)
spdifCounters.receivedSamples = 0; spdifCounters.receivedSamples = 0;
@@ -330,7 +315,6 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
adatCounters.samplesPerTick = 0; adatCounters.samplesPerTick = 0;
#endif #endif
t_local :> timeNextEdge; t_local :> timeNextEdge;
timeLastEdge = timeNextEdge; timeLastEdge = timeNextEdge;
timeNextClockDetection = timeNextEdge + (LOCAL_CLOCK_INCREMENT / 2); timeNextClockDetection = timeNextEdge + (LOCAL_CLOCK_INCREMENT / 2);
@@ -405,13 +389,9 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
case SET_SEL: case SET_SEL:
/* Update clock mode */ /* Update clock mode */
tmp = inuint(c_clk_ctl); clkMode = inuint(c_clk_ctl);
chkct(c_clk_ctl, XS1_CT_END); chkct(c_clk_ctl, XS1_CT_END);
if(tmp!=0)
{
clkMode = tmp;
}
#ifdef CLOCK_VALIDITY_CALL #ifdef CLOCK_VALIDITY_CALL
switch(clkMode) switch(clkMode)
{ {
@@ -420,12 +400,12 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
break; break;
#if (XUA_ADAT_RX_EN) #if (XUA_ADAT_RX_EN)
case CLOCK_ADAT: case CLOCK_ADAT:
VendorClockValidity(clockValid[CLOCK_ADAT_INDEX]); VendorClockValidity(clockValid[CLOCK_ADAT]);
break; break;
#endif #endif
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN)
case CLOCK_SPDIF: case CLOCK_SPDIF:
VendorClockValidity(clockValid[CLOCK_SPDIF_INDEX]); VendorClockValidity(clockValid[CLOCK_SPDIF]);
break; break;
#endif #endif
} }
@@ -499,58 +479,56 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
#endif #endif
break; break;
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
case t_external when timerafter(timeNextClockDetection) :> void: case t_external when timerafter(timeNextClockDetection) :> void:
{
int valid;
timeNextClockDetection += (LOCAL_CLOCK_INCREMENT); timeNextClockDetection += (LOCAL_CLOCK_INCREMENT);
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN)
tmp = spdifCounters.samplesPerTick;
/* Returns 1 if valid clock found */ /* Returns 1 if valid clock found */
tmp = validSamples(spdifCounters, CLOCK_SPDIF_INDEX); valid = validSamples(spdifCounters, CLOCK_SPDIF);
setClockValidity(c_clk_int, CLOCK_SPDIF_INDEX, tmp, clkMode); setClockValidity(c_clk_int, CLOCK_SPDIF, valid, clkMode);
#endif #endif
#if (XUA_ADAT_RX_EN) #if (XUA_ADAT_RX_EN)
tmp = validSamples(adatCounters, CLOCK_ADAT_INDEX); /* Returns 1 if valid clock found */
setClockValidity(c_clk_int, CLOCK_ADAT_INDEX, tmp, clkMode); valid = validSamples(adatCounters, CLOCK_ADAT);
setClockValidity(c_clk_int, CLOCK_ADAT, valid, clkMode);
#endif #endif
}
break; break;
#endif #endif
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN)
/* Receive sample from S/PDIF RX thread (steaming chan) */ /* Receive sample from S/PDIF RX thread (streaming chan) */
case c_spdif_rx :> tmp: case c_spdif_rx :> spdifRxData:
/* Record time of sample */ /* Record time of sample */
t_local :> spdifReceivedTime; t_local :> spdifRxTime;
/* Check parity and ignore if bad */ /* Check parity and ignore if bad */
if(badParity(tmp)) if(spdif_rx_check_parity(spdifRxData))
continue; continue;
/* Get pre-amble */ /* Get preamble */
tmp2 = tmp & 0xF; unsigned preamble = spdifRxData & SPDIF_RX_PREAMBLE_MASK;
switch(tmp2)
switch(preamble)
{ {
/* LEFT */ /* LEFT */
case SPDIF_FRAME_X: case SPDIF_FRAME_X:
case SPDIF_FRAME_Z: case SPDIF_FRAME_Z:
spdifLeft = SPDIF_RX_EXTRACT_SAMPLE(spdifRxData);
spdifLeft = tmp << 4;
break; break;
/* RIGHT */ /* RIGHT */
case SPDIF_FRAME_Y: case SPDIF_FRAME_Y:
/* Only store sample if not in overflow and stream is reasonably valid */ /* Only store sample if not in overflow and stream is reasonably valid */
if(!spdifOverflow && clockValid[CLOCK_SPDIF_INDEX]) if(!spdifOverflow && clockValid[CLOCK_SPDIF])
{ {
/* Store left and right sample pair to buffer */ /* Store left and right sample pair to buffer */
spdifSamples[spdifWr] = spdifLeft; spdifSamples[spdifWr] = spdifLeft;
spdifSamples[spdifWr+1] = tmp << 4; spdifSamples[spdifWr+1] = SPDIF_RX_EXTRACT_SAMPLE(spdifRxData);
spdifWr = (spdifWr + 2) & (MAX_SPDIF_SAMPLES - 1); spdifWr = (spdifWr + 2) & (MAX_SPDIF_SAMPLES - 1);
@@ -578,7 +556,7 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
spdifCounters.samples += 1; spdifCounters.samples += 1;
if(clkMode == CLOCK_SPDIF && clockValid[CLOCK_SPDIF_INDEX]) if(clkMode == CLOCK_SPDIF && clockValid[CLOCK_SPDIF])
{ {
spdifCounters.receivedSamples+=1; spdifCounters.receivedSamples+=1;
@@ -586,13 +564,13 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
if((spdifCounters.receivedSamples >= spdifCounters.samplesPerTick)) if((spdifCounters.receivedSamples >= spdifCounters.samplesPerTick))
{ {
/* Check edge is about right... S/PDIF may have changed freq... */ /* Check edge is about right... S/PDIF may have changed freq... */
if(timeafter(spdifReceivedTime, (timeLastEdge + LOCAL_CLOCK_INCREMENT - LOCAL_CLOCK_MARGIN))) if(timeafter(spdifRxTime, (timeLastEdge + LOCAL_CLOCK_INCREMENT - LOCAL_CLOCK_MARGIN)))
{ {
/* Record edge time */ /* Record edge time */
timeLastEdge = spdifReceivedTime; timeLastEdge = spdifRxTime;
/* Setup for next edge */ /* Setup for next edge */
timeNextEdge = spdifReceivedTime + LOCAL_CLOCK_INCREMENT + LOCAL_CLOCK_MARGIN; timeNextEdge = spdifRxTime + LOCAL_CLOCK_INCREMENT + LOCAL_CLOCK_MARGIN;
/* Toggle edge */ /* Toggle edge */
i_pll_ref.toggle_timed(1); i_pll_ref.toggle_timed(1);
@@ -627,7 +605,7 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
if (adatChannel == 8) if (adatChannel == 8)
{ {
/* only store left samples if not in overflow and stream is reasonably valid */ /* only store left samples if not in overflow and stream is reasonably valid */
if (!adatOverflow && clockValid[CLOCK_ADAT_INDEX]) if (!adatOverflow && clockValid[CLOCK_ADAT])
{ {
/* Unpick the SMUX.. */ /* Unpick the SMUX.. */
if(smux == 2) if(smux == 2)
@@ -684,7 +662,7 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
{ {
adatCounters.samples += 1; adatCounters.samples += 1;
if (clkMode == CLOCK_ADAT && clockValid[CLOCK_ADAT_INDEX]) if (clkMode == CLOCK_ADAT && clockValid[CLOCK_ADAT])
{ {
adatCounters.receivedSamples += 1; adatCounters.receivedSamples += 1;
@@ -705,7 +683,6 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
/* Reset counters */ /* Reset counters */
adatCounters.receivedSamples = 0; adatCounters.receivedSamples = 0;
} }
} }
} }
@@ -716,7 +693,6 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
break; break;
#endif #endif
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
/* AudioHub requests data */ /* AudioHub requests data */
case inuint_byref(c_dig_rx, tmp): case inuint_byref(c_dig_rx, tmp):
@@ -756,7 +732,6 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
spdifOverflow = 0; spdifOverflow = 0;
} }
} }
#endif #endif
#if (XUA_ADAT_RX_EN) #if (XUA_ADAT_RX_EN)
if (adatUnderflow) if (adatUnderflow)
@@ -842,8 +817,6 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
break; break;
#endif #endif
} }
} }
} }

View File

@@ -456,34 +456,35 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c
(buffer, unsigned char[])[0] = 1; (buffer, unsigned char[])[0] = 1;
return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 1, sp.wLength); return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 1, sp.wLength);
break; break;
#if (XUA_SPDIF_RX_EN)
case ID_CLKSRC_SPDIF: case ID_CLKSRC_SPDIF:
/* Interogate clockgen thread for validity */ /* Interogate clockgen thread for validity */
if (!isnull(c_clk_ctl)) if (!isnull(c_clk_ctl))
{ {
outuint(c_clk_ctl, GET_VALID); outuint(c_clk_ctl, GET_VALID);
outuint(c_clk_ctl, CLOCK_SPDIF_INDEX); outuint(c_clk_ctl, CLOCK_SPDIF);
outct(c_clk_ctl, XS1_CT_END); outct(c_clk_ctl, XS1_CT_END);
(buffer, unsigned char[])[0] = inuint(c_clk_ctl); (buffer, unsigned char[])[0] = inuint(c_clk_ctl);
chkct(c_clk_ctl, XS1_CT_END); chkct(c_clk_ctl, XS1_CT_END);
return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 1, sp.wLength); return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 1, sp.wLength);
} }
break; break;
#endif
#if (XUA_ADAT_RX_EN)
case ID_CLKSRC_ADAT: case ID_CLKSRC_ADAT:
if (!isnull(c_clk_ctl)) if (!isnull(c_clk_ctl))
{ {
outuint(c_clk_ctl, GET_VALID); outuint(c_clk_ctl, GET_VALID);
outuint(c_clk_ctl, CLOCK_ADAT_INDEX); outuint(c_clk_ctl, CLOCK_ADAT);
outct(c_clk_ctl, XS1_CT_END); outct(c_clk_ctl, XS1_CT_END);
(buffer, unsigned char[])[0] = inuint(c_clk_ctl); (buffer, unsigned char[])[0] = inuint(c_clk_ctl);
chkct(c_clk_ctl, XS1_CT_END); chkct(c_clk_ctl, XS1_CT_END);
return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 1, sp.wLength); return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 1, sp.wLength);
} }
break; break;
#endif
default: default:
//Unknown Unit ID in Clock Valid Control Request //Unknown Unit ID in Clock Valid Control Request
@@ -513,19 +514,23 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c
return result; return result;
} }
/* Check for correct datalength for clock sel */
if(datalength == 1) if(datalength == 1)
{
int clockIndex = (int) (buffer, unsigned char[])[0];
clockIndex -= 1; /* Index to/from host is 1-based */
if((clockIndex >= 0) && (clockIndex < CLOCK_COUNT))
{ {
if(!isnull(c_clk_ctl)) if(!isnull(c_clk_ctl))
{ {
outuint(c_clk_ctl, SET_SEL); outuint(c_clk_ctl, SET_SEL);
outuint(c_clk_ctl, (buffer, unsigned char[])[0]); outuint(c_clk_ctl, clockIndex);
outct(c_clk_ctl, XS1_CT_END); outct(c_clk_ctl, XS1_CT_END);
} }
/* Send 0 Length as status stage */ /* Send 0 Length as status stage */
return XUD_DoSetRequestStatus(ep0_in); return XUD_DoSetRequestStatus(ep0_in);
} }
}
} }
else else
{ {
@@ -533,13 +538,15 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c
(buffer, unsigned char[])[0] = 1; (buffer, unsigned char[])[0] = 1;
if (!isnull(c_clk_ctl)) if (!isnull(c_clk_ctl))
{ {
int clockIndex;
outuint(c_clk_ctl, GET_SEL); outuint(c_clk_ctl, GET_SEL);
outct(c_clk_ctl, XS1_CT_END); outct(c_clk_ctl, XS1_CT_END);
(buffer, unsigned char[])[0] = inuint(c_clk_ctl); clockIndex = inuint(c_clk_ctl);
clockIndex += 1; /* Index to/from host is 1-based */
(buffer, unsigned char[])[0] = (unsigned char) clockIndex;
chkct(c_clk_ctl, XS1_CT_END); chkct(c_clk_ctl, XS1_CT_END);
} }
return XUD_DoGetRequest( ep0_out, ep0_in, (buffer, unsigned char[]), 1, sp.wLength); return XUD_DoGetRequest( ep0_out, ep0_in, (buffer, unsigned char[]), 1, sp.wLength);
} }
} }
break; break;
@@ -916,17 +923,20 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c
{ {
storeFreq((buffer, unsigned char[]), i, currentFreq44); storeFreq((buffer, unsigned char[]), i, currentFreq44);
num_freqs++; num_freqs++;
currentFreq44*=2;
} }
if((currentFreq48 <= maxFreq)) currentFreq44*=2;
if((currentFreq48 <= maxFreq) && (currentFreq48 >= MIN_FREQ))
{ {
/* Note i passed byref here */ /* Note i passed byref here */
storeFreq((buffer, unsigned char[]), i, currentFreq48); storeFreq((buffer, unsigned char[]), i, currentFreq48);
num_freqs++; num_freqs++;
currentFreq48*=2;
} }
else
currentFreq48*=2;
if((currentFreq48 > MAX_FREQ) && (currentFreq44 > MAX_FREQ))
{ {
break; break;
} }

View File

@@ -30,8 +30,8 @@
#include "iap.h" #include "iap.h"
#endif #endif
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN || XUA_SPDIF_TX_EN)
#include "spdif.h" #include "spdif.h" /* From lib_spdif */
#endif #endif
#if (XUA_ADAT_RX_EN) #if (XUA_ADAT_RX_EN)
@@ -42,10 +42,6 @@
#include "xua_pdm_mic.h" #include "xua_pdm_mic.h"
#endif #endif
#if (XUA_SPDIF_TX_EN)
#include "spdif.h" /* From lib_spdif */
#endif
#if (XUA_DFU_EN == 1) #if (XUA_DFU_EN == 1)
[[distributable]] [[distributable]]
void DFUHandler(server interface i_dfu i, chanend ?c_user_cmd); void DFUHandler(server interface i_dfu i, chanend ?c_user_cmd);
@@ -340,7 +336,7 @@ void usb_audio_io(chanend ?c_aud_in,
par par
{ {
#if (MIXER) #if (MIXER && XUA_USB_EN)
/* Mixer cores(s) */ /* Mixer cores(s) */
{ {
thread_speed(); thread_speed();
@@ -497,14 +493,12 @@ int main()
on tile[XUD_TILE]: on tile[XUD_TILE]:
par par
{ {
#if (XUD_TILE == 0) #if XUA_USB_EN
#if ((XUD_TILE == 0) && (XUA_DFU_EN == 1))
/* Check if USB is on the flash tile (tile 0) */ /* Check if USB is on the flash tile (tile 0) */
#if (XUA_DFU_EN == 1)
[[distribute]] [[distribute]]
DFUHandler(dfuInterface, null); DFUHandler(dfuInterface, null);
#endif #endif
#endif
#if XUA_USB_EN
/* Core USB task, buffering, USB etc */ /* Core USB task, buffering, USB etc */
{ {

View File

@@ -1,8 +1,7 @@
// Copyright 2011-2021 XMOS LIMITED. // Copyright 2011-2023 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1. // This Software is subject to the terms of the XMOS Public Licence: Version 1.
#ifndef _XUA_COMMANDS_H_
#ifndef __XUA_INTERNAL_CMDS_H__ #define _XUA_COMMANDS_H_
#define __XUA_INTERNAL_CMDS_H__
#include "xua.h" #include "xua.h"
@@ -11,20 +10,19 @@
#define SET_SEL 1 /* Set value of clock selector */ #define SET_SEL 1 /* Set value of clock selector */
#define GET_FREQ 2 /* Get current freq */ #define GET_FREQ 2 /* Get current freq */
#define GET_VALID 3 /* Get current validity */ #define GET_VALID 3 /* Get current validity */
#define SET_SMUX 7 /* Set SMUX mode (ADAT) */
#define CLOCK_INTERNAL 1 enum
#define CLOCK_SPDIF 2 {
#if SPDIF_RX CLOCK_INTERNAL = 0,
#define CLOCK_ADAT 3 #if XUA_SPDIF_RX_EN
#else CLOCK_SPDIF,
#define CLOCK_ADAT 2
#endif #endif
#if XUA_ADAT_RX_EN
#define CLOCK_INTERNAL_INDEX (CLOCK_INTERNAL - 1) CLOCK_ADAT,
#define CLOCK_ADAT_INDEX (CLOCK_ADAT - 1) #endif
#define CLOCK_SPDIF_INDEX (CLOCK_SPDIF - 1) CLOCK_COUNT
};
#define SET_SMUX 7
/* c_audioControl */ /* c_audioControl */
#define SET_SAMPLE_FREQ 4 #define SET_SAMPLE_FREQ 4

View File

@@ -1,4 +1,4 @@
// Copyright 2011-2021 XMOS LIMITED. // Copyright 2011-2023 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1. // This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include <xs1.h> #include <xs1.h>
#include <flash.h> #include <flash.h>
@@ -72,7 +72,7 @@ int flash_cmd_init(void)
return 1; return 1;
} }
#ifndef QUAD_SPI_FLASH #if (!XUA_QUAD_SPI_FLASH)
// Disable flash protection // Disable flash protection
fl_setProtection(0); fl_setProtection(0);
#endif #endif

View File

@@ -1,11 +1,11 @@
// Copyright 2012-2021 XMOS LIMITED. // Copyright 2012-2023 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1. // This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include "xua.h" #include "xua.h"
#if (XUA_DFU_EN == 1) #if (XUA_DFU_EN == 1)
#include "uac_hwresources.h" #include "uac_hwresources.h"
#include <xs1.h> #include <xs1.h>
#include <xclib.h> #include <xclib.h>
#ifdef QUAD_SPI_FLASH #if (XUA_QUAD_SPI_FLASH)
#include <quadflashlib.h> #include <quadflashlib.h>
#else #else
#include <flashlib.h> #include <flashlib.h>
@@ -20,7 +20,7 @@
#ifdef DFU_FLASH_DEVICE #ifdef DFU_FLASH_DEVICE
#ifdef QUAD_SPI_FLASH #if (XUA_QUAD_SPI_FLASH)
/* Using specified flash device rather than all supported in tools */ /* Using specified flash device rather than all supported in tools */
fl_QuadDeviceSpec flash_devices[] = {DFU_FLASH_DEVICE}; fl_QuadDeviceSpec flash_devices[] = {DFU_FLASH_DEVICE};
#else #else
@@ -29,7 +29,7 @@ fl_DeviceSpec flash_devices[] = {DFU_FLASH_DEVICE};
#endif #endif
#endif #endif
#ifdef QUAD_SPI_FLASH #if (XUA_QUAD_SPI_FLASH)
/* /*
typedef struct { typedef struct {
out port qspiCS; out port qspiCS;
@@ -60,7 +60,7 @@ fl_PortHolderStruct p_flash =
int flash_cmd_enable_ports() int flash_cmd_enable_ports()
{ {
int result = 0; int result = 0;
#ifdef QUAD_SPI_FLASH #if (XUA_QUAD_SPI_FLASH)
/* Ports not shared */ /* Ports not shared */
#else #else
setc(p_flash.spiMISO, XS1_SETC_INUSE_OFF); setc(p_flash.spiMISO, XS1_SETC_INUSE_OFF);
@@ -89,14 +89,14 @@ int flash_cmd_enable_ports()
#endif #endif
#ifdef DFU_FLASH_DEVICE #ifdef DFU_FLASH_DEVICE
#ifdef QUAD_SPI_FLASH #if (XUA_QUAD_SPI_FLASH)
result = fl_connectToDevice(&p_qflash, flash_devices, sizeof(flash_devices) / sizeof(fl_QuadDeviceSpec)); result = fl_connectToDevice(&p_qflash, flash_devices, sizeof(flash_devices) / sizeof(fl_QuadDeviceSpec));
#else #else
result = fl_connectToDevice(&p_flash, flash_devices, sizeof(flash_devices) / sizeof(fl_DeviceSpec)); result = fl_connectToDevice(&p_flash, flash_devices, sizeof(flash_devices) / sizeof(fl_DeviceSpec));
#endif #endif
#else #else
/* Use default flash list */ /* Use default flash list */
#ifdef QUAD_SPI_FLASH #if (XUA_QUAD_SPI_FLASH)
result = fl_connect(&p_qflash); result = fl_connect(&p_qflash);
#else #else
result = fl_connect(&p_flash); result = fl_connect(&p_flash);
@@ -117,7 +117,7 @@ int flash_cmd_disable_ports()
{ {
fl_disconnect(); fl_disconnect();
#ifndef QUAD_SPI_FLASH #if (!XUA_QUAD_SPI_FLASH)
setc(p_flash.spiMISO, XS1_SETC_INUSE_OFF); setc(p_flash.spiMISO, XS1_SETC_INUSE_OFF);
setc(p_flash.spiCLK, XS1_SETC_INUSE_OFF); setc(p_flash.spiCLK, XS1_SETC_INUSE_OFF);
setc(p_flash.spiMOSI, XS1_SETC_INUSE_OFF); setc(p_flash.spiMOSI, XS1_SETC_INUSE_OFF);