37 Commits

Author SHA1 Message Date
Ross Owen
3a2926d1d8 Set default XUA_I2S_DUMMY_SAMPS value to 0 2023-06-12 18:07:10 +01:00
Ross Owen
85fd297336 Merge remote-tracking branch 'upstream' into feat/dummy_samps 2023-06-12 16:22:57 +01:00
Ross Owen
c92a640439 Added support for I2S/TDM “dummy samples” via XUA_I2S_DUMMY_SAMPS 2023-06-12 16:22:35 +01:00
Ross Owen
355df6d6b8 Fixed doc build 2023-06-07 15:24:29 +01:00
Ross Owen
0bff3dc5a8 Removed documentation for XUA_I2S_N_BITS=24 2023-06-07 12:32:07 +01:00
Ross Owen
9abd3b33f3 Bump lib_spdif dependency requirement 2023-06-07 12:17:40 +01:00
Ross Owen
0932ca0ccc Documentation updates relating to TDM/I2S 2023-06-07 11:53:42 +01:00
Ross Owen
f1df805b17 Added checks on XUA_I2S_N_BITS value 2023-06-07 10:24:40 +01:00
Ross Owen
867fb3f228 Use XUA_I2S_N_BITS when deciding whether or not to delay falling edge of bit clock when CODEC_MASTER=1 2023-06-06 20:20:15 +01:00
Ross Owen
9cbdf6374e Copyright date update 2023-06-06 19:34:36 +01:00
Ross Owen
a5922ce3ea Fixed issue with when XUA_I2S_N_BITS !=32 and CODEC_MASTER == 1 2023-06-06 19:13:25 +01:00
Ross Owen
e24bbe42eb test_i2s_loopback: add testing support for 16bit 2023-06-06 18:31:52 +01:00
Ross Owen
1488ace820 Fixed issue with I2S input when XUA_I2S_N_BITS != 32 2023-06-06 18:10:42 +01:00
Ross Owen
06bd547c69 Set XUA_I2S_N_BITS in test_i2s_loopback 2023-06-06 15:27:00 +01:00
Ross Owen
c2e1a8f17a Fixed issue where sample rate not set in test_i2s_loopback 2023-06-06 15:22:34 +01:00
Ross Owen
58bb074f0d Rationalisation of test_i2s_loopback config building 2023-06-06 14:52:03 +01:00
Ross Owen
c794ee77d5 Update copyright comment 2023-06-06 12:01:46 +01:00
Ross Owen
1cd24963d5 Fixed build issues when CODEC_MASTER set 2023-06-05 14:37:01 +01:00
Ross Owen
b27514fd9a Added XUA_I2S_N_BITS (was N_BITS_I2S) and tidied up usage of define 2023-06-05 14:24:59 +01:00
Ross Owen
5d886487fa Fixed operation when N_BITS_I2S define and small tidies 2023-06-02 16:37:43 +01:00
Ross Owen
1b50abb7a2 Resolve build issues post merge 2023-06-02 14:35:15 +01:00
Ross Owen
d3f0f11d9e Removed example 2023-06-02 14:20:44 +01:00
Ross Owen
897328f9c1 Resolved conflicts merging with develop 2023-06-02 14:18:44 +01:00
Ed
f7b05be05b Merge commit 'a44d5466b5ff4d1d766236d7036daceedef9f2c2' into variable_i2s_bit_width 2021-05-19 10:08:20 +01:00
Ed
fbda8fe92a Merge branch 'develop' of github.com:xmos/lib_xua into variable_i2s_bit_width 2021-05-19 10:02:22 +01:00
Ed
be69d3468e Initial guarding of variable bit I2S modifications 2019-08-23 16:15:47 +01:00
Ed
7cae9c385c Merge remote-tracking branch 'xmos/develop' into variable_i2s_bit_width 2019-08-23 15:34:06 +01:00
Ed Clarke
d9de1f0322 Add clock divider checks and remove debug prints 2019-05-01 10:58:15 +01:00
Ed Clarke
dd21ed0a84 Fix LRCLK alignment when N_BITS < 32 2019-05-01 10:25:22 +01:00
Ed Clarke
d50c9510c6 Fix app so that it loops (working 32b I2S master) 2019-05-01 09:49:36 +01:00
Ed Clarke
b032310302 Initial modifications to extend support to variable bit width master 2019-04-30 18:09:23 +01:00
Ed Clarke
8f9828ea2c Add simple test app for I2S loopback (no USB) 2019-04-30 18:07:15 +01:00
Ed Clarke
50097db00d Merge commit 'c59f9a7c0c628bffc9f9de5a6a4ee55e660d32fe' into variable_i2s_bit_width 2019-04-30 16:01:25 +01:00
Ed Clarke
c59f9a7c0c Make lrcheck mask track the data size 2018-10-15 08:56:57 +01:00
Ed Clarke
7ae04ca313 Enable error checking (helps recover from noise) 2018-10-12 14:26:02 +01:00
Ed Clarke
2562f0eb31 Fix I2S alignment 2018-10-12 14:25:47 +01:00
Ed Clarke
baaef3b749 Initial modifications for 24b I2S slave (without sync error check) 2018-10-10 11:21:44 +01:00
19 changed files with 250 additions and 235 deletions

View File

@@ -1,26 +1,14 @@
lib_xua Change Log
==================
3.5.0
-----
UNRELEASED
----------
* ADDED: Configurable word-length for I2S/TDM via XUA_I2S_N_BITS
* ADDED: Support for statically defined custom HID descriptor
* CHANGED: Rearranged main() such that adding custom code that uses lib_xud
is possible
* CHANGED: bNumConfigurations changed from 2 to 1, removing a work-around to
stop old Windows versions loading the composite driver
* FIXED: Memory corruption due to erroneous initialisation of mixer
weights when not in use (#152)
* ADDED: Configurable word-length for I2S/TDM via XUA_I2S_N_BITS
* FIXED: Memory corruption due to erroneous initialisation of mixer weights when not in use (#152)
* FIXED: UserHostActive() not being called as expected (#326)
* FIXED: Exception when entering DSD mode (#327)
* Changes to dependencies:
- lib_spdif: 4.2.1 -> 5.0.0
- lib_xud: 2.2.2 -> 2.2.3
3.4.0
-----

View File

@@ -1,9 +1,10 @@
lib_xua
#######
:Version: 3.5.0
:Version: 3.4.0
:Vendor: XMOS
:Scope: General Use
Summary
@@ -40,9 +41,9 @@ Key features of the various components in this repository are as follows
- Synchronisation to external digital streams i.e. S/PDIF or ADAT (when in asynchronous mode)
- I2S (slave/master modes with configurable word-length)
- I2S slave & master modes
- TDM (slave/master modes with configurable word-length)
- TDM slave & master modes
- MIDI input/output (Compliant to USB Class Specification for MIDI devices)
@@ -52,8 +53,6 @@ Key features of the various components in this repository are as follows
- Simple playback controls via USB Human Interface Device (HID) Class
- Support for adding custom HID interfaces
Note, not all features may be supported at all sample frequencies, simultaneously or on all devices.
Some features may also require specific host driver support.

View File

@@ -197,6 +197,23 @@
#define I2S_DOWNSAMPLE_CHANS_IN I2S_CHANS_ADC
#endif
#ifndef XUA_I2S_DUMMY_SAMPS
#define XUA_I2S_DUMMY_SAMPS (0)
#endif
/**
* @brief Number of bits per channel for I2S/TDM. Supported values: 16/32-bit.
*
* Default: 32 bits
*/
#ifndef XUA_I2S_N_BITS
#define XUA_I2S_N_BITS (32)
#endif
#if (XUA_I2S_N_BITS != 16) && (XUA_I2S_N_BITS != 32)
#error Unsupported value for XUA_I2S_N_BITS (only values 16/32 supported)
#endif
/**
* @brief Number of bits per channel for I2S/TDM. Supported values: 16/32-bit.
*
@@ -448,40 +465,6 @@
#define HID_CONTROLS (0)
#endif
/**
* HID may be required in two forms: the built-in XUA-HID reports, or a
* user-provided static HID. Some sections of code are always needed, they
* are enclosed in XUA_OR_STATIC_HID_ENABLED; code specific to XUA-HID
* reports are enclosed in XUA_HID_ENABLED.
*
* HID_CONTROLS implies that the XUA_HID is used, and hence defines both.
* In order to roll your own, do not enable HID_CONTROLS, but instead
* create a file static_hid_report.h that contains the static descriptor.
*
* You must also supply your own function to deal with the HID endpoint(s)
* in this case.
*/
#if( 0 < HID_CONTROLS )
#define XUA_HID_ENABLED (1)
#define XUA_OR_STATIC_HID_ENABLED (1)
#endif
#if defined(__static_hid_report_h_exists__)
#define XUA_OR_STATIC_HID_ENABLED (1)
#endif
/**
* @brief Enable a HID OUT endpoint. Only use this if you supply your own HID control.
*
* 1 for enabled, 0 for disabled.
*
* Default 0 (Disabled)
*/
#ifndef HID_OUT_REQUIRED
#define HID_OUT_REQUIRED (0)
#endif
/**
* @brief Defines whether XMOS device runs as master (i.e. drives LR and Bit clocks)
*
@@ -1197,7 +1180,7 @@ enum USBEndpointNumber_In
#ifdef MIDI
ENDPOINT_NUMBER_IN_MIDI,
#endif
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
ENDPOINT_NUMBER_IN_HID,
#endif
#ifdef IAP
@@ -1224,9 +1207,6 @@ enum USBEndpointNumber_Out
#ifdef IAP_EA_NATIVE_TRANS
ENDPOINT_NUMBER_OUT_IAP_EA_NATIVE_TRANS,
#endif
#endif
#if XUA_OR_STATIC_HID_ENABLED && HID_OUT_REQUIRED
ENDPOINT_NUMBER_OUT_HID,
#endif
XUA_ENDPOINT_COUNT_OUT /* End marker */
};

View File

@@ -1,4 +1,4 @@
VERSION = 3.5.0
VERSION = 3.4.0
DEBUG ?= 0
@@ -35,7 +35,7 @@ XCC_FLAGS_dfu.xc = $(MODULE_XCC_FLAGS) -Os -mno-dual-issue
XCC_FLAGS_flash_interface.c = $(MODULE_XCC_FLAGS) -Os -mno-dual-issue
XCC_FLAGS_flashlib_user.c = $(MODULE_XCC_FLAGS) -Os -mno-dual-issue
OPTIONAL_HEADERS += xua_conf.h static_hid_report.h
OPTIONAL_HEADERS += xua_conf.h
EXPORT_INCLUDE_DIRS = api \
src/core \

View File

@@ -38,12 +38,12 @@ void InitPorts_master(buffered _XUA_CLK_DIR port:32 p_lrclk, buffered _XUA_CLK_D
#endif
unsigned tmp;
if(XUA_I2S_N_BITS == 32)
p_lrclk <: 0 @ tmp;
else
tmp = partout_timestamped(p_lrclk, XUA_I2S_N_BITS, 0);
tmp += 100;
/* Since BCLK is free-running, setup outputs/inputs at a known point in the future */
@@ -72,7 +72,7 @@ void InitPorts_master(buffered _XUA_CLK_DIR port:32 p_lrclk, buffered _XUA_CLK_D
for(int i = 0; i < I2S_WIRES_ADC; i++)
{
asm("setpt res[%0], %1"::"r"(p_i2s_adc[i]),"r"(tmp-1));
if(XUA_I2S_N_BITS != 32)
set_port_shift_count(p_i2s_adc[i], XUA_I2S_N_BITS);
}
@@ -127,13 +127,13 @@ void InitPorts_slave(buffered _XUA_CLK_DIR port:32 p_lrclk, buffered _XUA_CLK_DI
for(int i = 0; i < I2S_WIRES_ADC; i++)
{
asm("setpt res[%0], %1"::"r"(p_i2s_adc[i]),"r"(tmp-1));
if(XUA_I2S_N_BITS != 32)
if(XUA_I2S_N_BITS != 32)
set_port_shift_count(p_i2s_adc[i], XUA_I2S_N_BITS);
}
#endif
asm("setpt res[%0], %1"::"r"(p_lrclk),"r"(tmp-1));
if(XUA_I2S_N_BITS != 32)
if(XUA_I2S_N_BITS != 32)
set_port_shift_count(p_lrclk, XUA_I2S_N_BITS);
#endif /* (I2S_CHANS_ADC != 0 || I2S_CHANS_DAC != 0) */
}

View File

@@ -80,13 +80,21 @@ unsigned dsdMode = DSD_MODE_OFF;
#endif
#include "xua_audiohub_st.h"
static inline void PortOutput(buffered out port:32 p, int bits, int value)
{
if(bits == 32)
p <: value;
else
partout(p, bits, value);
}
static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:32 p_lrclk)
{
#if CODEC_MASTER
unsigned syncError = 0;
unsigned lrval = 0;
const unsigned lrval_mask = (0xffffffff << (32 - XUA_I2S_N_BITS));
if(XUA_I2S_N_BITS != 32)
{
asm volatile("in %0, res[%1]":"=r"(lrval):"r"(p_lrclk):"memory");
@@ -286,6 +294,19 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out
else
#endif
{
#if XUA_I2S_DUMMY_SAMPS
if(frameCount == 0)
{
for(int j = 0; j < XUA_I2S_DUMMY_SAMPS; j++)
for(int i = 0; i < I2S_WIRES_DAC; i++)
{
PortOutput(p_i2s_dac[i], XUA_I2S_N_BITS, 0);
}
}
#endif
#if (I2S_CHANS_ADC != 0)
#if (AUD_TO_USB_RATIO > 1)
if (0 == audioToUsbRatioCounter)
@@ -306,7 +327,7 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out
// Manual IN instruction since compiler generates an extra setc per IN (bug #15256)
unsigned sample;
asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index]));
sample = bitrev(sample);
if(XUA_I2S_N_BITS != 32)
{
@@ -478,6 +499,25 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out
}
#endif
#if XUA_I2S_DUMMY_SAMPS
if(frameCount == 1)
{
int dummyBits;
for(int j = 0; j < XUA_I2S_DUMMY_SAMPS; j++)
{
for(int i = 0; i < I2S_WIRES_ADC; i++)
{
asm volatile("in %0, res[%1]" : "=r"(dummyBits) : "r"(p_i2s_adc[i]));
if(XUA_I2S_N_BITS)
set_port_shift_count(p_i2s_adc[i], XUA_I2S_N_BITS);
}
asm volatile("in %0, res[%1]" : "=r"(dummyBits) : "r"(p_lrclk));
if(XUA_I2S_N_BITS)
set_port_shift_count(p_lrclk, XUA_I2S_N_BITS);
}
}
#endif
#if (I2S_CHANS_ADC != 0 || I2S_CHANS_DAC != 0)
syncError += HandleSampleClock(frameCount, p_lrclk);
#endif

View File

@@ -394,7 +394,7 @@ __builtin_unreachable();
unsigned l;
unsafe
{
mult = multInPtr[i];
mult = multInPtr[i];
}
{h, l} = macs(mult, sample, 0, 0);
sample = h << 3;
@@ -427,7 +427,7 @@ __builtin_unreachable();
unsigned l;
unsafe
{
mult = multInPtr[i];
mult = multInPtr[i];
}
{h, l} = macs(mult, sample, 0, 0);
sample = h << 3;
@@ -461,7 +461,7 @@ __builtin_unreachable();
unsigned l;
unsafe
{
mult = multInPtr[i];
mult = multInPtr[i];
}
{h, l} = macs(mult, sample, 0, 0);
sample = h << 3;

View File

@@ -1,4 +1,4 @@
// Copyright 2011-2023 XMOS LIMITED.
// Copyright 2011-2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include "xua.h"
#if XUA_USB_EN
@@ -10,7 +10,7 @@
#include "xud.h"
#include "testct_byref.h"
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
#include "xua_hid_report.h"
#include "user_hid.h"
#include "xua_hid.h"
@@ -134,7 +134,7 @@ void XUA_Buffer(
c_clk_int,
#endif
c_sof, c_aud_ctl, p_off_mclk
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
, c_hid
#endif
#ifdef CHAN_BUFF_CTRL
@@ -224,7 +224,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
XUD_ep ep_int = XUD_InitEp(c_ep_int);
#endif
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
XUD_ep ep_hid = XUD_InitEp(c_hid);
#endif
unsigned u_tmp;
@@ -332,7 +332,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
#endif
#endif
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
while (!hidIsReportDescriptorPrepared())
;
@@ -897,7 +897,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
#endif
#endif
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
/* HID Report Data */
case XUD_SetData_Select(c_hid, ep_hid, result):
hid_ready_flag = 0U;

View File

@@ -1,4 +1,4 @@
// Copyright 2015-2023 XMOS LIMITED.
// Copyright 2015-2021 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#ifndef __DESCRIPTOR_DEFS_H__
@@ -33,7 +33,6 @@
#define ENDPOINT_ADDRESS_OUT_MIDI (ENDPOINT_NUMBER_OUT_MIDI)
#define ENDPOINT_ADDRESS_OUT_IAP (ENDPOINT_NUMBER_OUT_IAP)
#define ENDPOINT_ADDRESS_OUT_IAP_EA_NATIVE_TRANS (ENDPOINT_NUMBER_OUT_IAP_EA_NATIVE_TRANS)
#define ENDPOINT_ADDRESS_OUT_HID (ENDPOINT_NUMBER_OUT_HID)
/* Interface numbers enum */
enum USBInterfaceNumber
@@ -61,7 +60,7 @@ enum USBInterfaceNumber
INTERFACE_NUMBER_IAP_EA_NATIVE_TRANS,
#endif
#endif
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
INTERFACE_NUMBER_HID,
#endif
INTERFACE_COUNT /* End marker */
@@ -71,8 +70,4 @@ enum USBInterfaceNumber
#define ENDPOINT_INT_INTERVAL_IN_HID 0x08
#endif
#ifndef ENDPOINT_INT_INTERVAL_OUT_HID
#define ENDPOINT_INT_INTERVAL_OUT_HID 0x08
#endif
#endif

View File

@@ -26,7 +26,7 @@
#include "xc_ptr.h"
#include "xua_ep0_uacreqs.h"
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
#include "hid.h"
#include "xua_hid.h"
#include "xua_hid_report.h"
@@ -442,15 +442,6 @@ void XUA_Endpoint0_setBcdDevice(unsigned short bcd) {
#endif // AUDIO_CLASS == 1}
}
#if defined(__static_hid_report_h_exists__)
#define hidReportDescriptorLength (sizeof(hidReportDescriptorPtr))
static unsigned char hidReportDescriptorPtr[] = {
#include "static_hid_report.h"
};
#endif
void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, NULLABLE_RESOURCE(chanend, c_audioControl),
chanend c_mix_ctl, chanend c_clk_ctl, chanend c_EANativeTransport_ctrl, CLIENT_INTERFACE(i_dfu, dfuInterface) VENDOR_REQUESTS_PARAMS_DEC_)
{
@@ -522,13 +513,11 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, NULLABLE_RESOURCE(c
#endif // XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES
#if XUA_OR_STATIC_HID_ENABLED
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
hidReportInit();
hidPrepareReportDescriptor();
size_t hidReportDescriptorLength = hidGetReportDescriptorLength();
#endif
unsigned char hidReportDescriptorLengthLo = hidReportDescriptorLength & 0xFF;
unsigned char hidReportDescriptorLengthHi = (hidReportDescriptorLength & 0xFF00) >> 8;
@@ -539,7 +528,6 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, NULLABLE_RESOURCE(c
hidDescriptor[HID_DESCRIPTOR_LENGTH_FIELD_OFFSET ] = hidReportDescriptorLengthLo;
hidDescriptor[HID_DESCRIPTOR_LENGTH_FIELD_OFFSET + 1] = hidReportDescriptorLengthHi;
#endif // 0 < HID_CONTROLS
}
@@ -743,7 +731,7 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0
switch(sp.bRequest)
{
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
case USB_GET_DESCRIPTOR:
/* Check what inteface request is for */
@@ -758,17 +746,15 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0
{
/* Return HID Descriptor */
result = XUD_DoGetRequest(ep0_out, ep0_in, hidDescriptor,
hidDescriptor[0], sp.wLength);
sizeof(hidDescriptor), sp.wLength);
}
break;
case HID_REPORT:
{
/* Return HID report descriptor */
#if XUA_HID_ENABLED
unsigned char* hidReportDescriptorPtr;
hidReportDescriptorPtr = hidGetReportDescriptor();
size_t hidReportDescriptorLength = hidGetReportDescriptorLength();
#endif
result = XUD_DoGetRequest(ep0_out, ep0_in, hidReportDescriptorPtr,
hidReportDescriptorLength, sp.wLength);
}
@@ -872,7 +858,7 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0
}
}
#endif
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
if (interfaceNum == INTERFACE_NUMBER_HID)
{
result = HidInterfaceClassRequests(ep0_out, ep0_in, &sp);

View File

@@ -481,7 +481,7 @@ USB_Descriptor_Device_t devDesc_Audio2 =
.iManufacturer = offsetof(StringDescTable_t, vendorStr)/sizeof(char *),
.iProduct = offsetof(StringDescTable_t, productStr_Audio2)/sizeof(char *),
.iSerialNumber = offsetof(StringDescTable_t, serialStr)/sizeof(char *),
.bNumConfigurations = 0x01
.bNumConfigurations = 0x02 /* Set to 2 such that windows does not load composite driver */
};
/* Device Descriptor for Null Device */
@@ -787,13 +787,10 @@ typedef struct
#endif
#endif // IAP
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
USB_Descriptor_Interface_t HID_Interface;
USB_HID_Descriptor_t HID_Descriptor;
USB_Descriptor_Endpoint_t HID_In_Endpoint;
#if HID_OUT_REQUIRED
USB_Descriptor_Endpoint_t HID_Out_Endpoint;
#endif
#endif
}__attribute__((packed)) USB_Config_Descriptor_Audio2_t;
@@ -2211,14 +2208,14 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
#endif
#endif /* IAP */
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
#include "xua_hid_descriptors.h"
#endif
};
#endif /* (AUDIO_CLASS == 2) */
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
#if (AUDIO_CLASS ==1 )
unsigned char hidDescriptor[] =
{
@@ -2333,14 +2330,14 @@ const unsigned num_freqs_a1 = MAX(3, (0
#define DFU_INTERFACES_A1 0
#endif
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
/*
* The value of HID_INTERFACE_BYTES must match the length of the descriptors defined in
* - xua_hid_descriptor_contents.h
* - xua_hid_endpoint_descriptor_contents.h and
* - xua_hid_interface_descriptor_contents.h
*/
#define HID_INTERFACE_BYTES ( 9 + 9 + (7 * (1 + HID_OUT_REQUIRED))) // always IN
#define HID_INTERFACE_BYTES ( 9 + 9 + 7 )
#define HID_INTERFACES_A1 1
#else
#define HID_INTERFACE_BYTES 0
@@ -2382,7 +2379,7 @@ const unsigned num_freqs_a1 = MAX(3, (0
#endif
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
#define USB_HID_DESCRIPTOR_OFFSET (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + INTERFACE_DESCRIPTOR_BYTES)
#endif
@@ -2896,7 +2893,7 @@ unsigned char cfgDesc_Audio1[] =
offsetof(StringDescTable_t, ctrlStr)/sizeof(char *), /* 8 iInterface */
#endif
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
#include "xua_hid_descriptors.h"
#endif

View File

@@ -145,7 +145,7 @@ static void updateMasterVol(int unitID, chanend ?c_mix_ctl)
outuint(c_mix_ctl, x);
outct(c_mix_ctl, XS1_CT_END);
}
#else
#else
unsafe
{
unsigned int * unsafe multOutPtr = multOut;

View File

@@ -213,9 +213,6 @@ XUD_EpType epTypeTableOut[ENDPOINT_COUNT_OUT] = { XUD_EPTYPE_CTL | XUD_STATUS_EN
#ifdef MIDI
XUD_EPTYPE_BUL, /* MIDI */
#endif
#if HID_OUT_REQUIRED
XUD_EPTYPE_INT,
#endif
#ifdef IAP
XUD_EPTYPE_BUL, /* iAP */
#ifdef IAP_EA_NATIVE_TRANS
@@ -236,7 +233,7 @@ XUD_EpType epTypeTableIn[ENDPOINT_COUNT_IN] = { XUD_EPTYPE_CTL | XUD_STATUS_ENAB
#ifdef MIDI
XUD_EPTYPE_BUL,
#endif
#if XUA_OR_STATIC_HID_ENABLED
#if( 0 < HID_CONTROLS )
XUD_EPTYPE_INT,
#endif
#ifdef IAP
@@ -270,6 +267,115 @@ void xscope_user_init()
}
#endif
#if XUA_USB_EN
/* Core USB Audio functions - must be called on the Tile connected to the USB Phy */
void usb_audio_core(chanend c_mix_out
#ifdef MIDI
, chanend c_midi
#endif
#if (MIXER)
, chanend c_mix_ctl
#endif
, chanend ?c_clk_int
, chanend ?c_clk_ctl
, client interface i_dfu ?dfuInterface
#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
, client interface pll_ref_if i_pll_ref
#endif
VENDOR_REQUESTS_PARAMS_DEC_
)
{
chan c_sof;
chan c_xud_out[ENDPOINT_COUNT_OUT]; /* Endpoint channels for XUD */
chan c_xud_in[ENDPOINT_COUNT_IN];
chan c_aud_ctl;
#if (!MIXER)
#define c_mix_ctl null
#endif
#ifdef IAP_EA_NATIVE_TRANS
chan c_EANativeTransport_ctrl;
#else
#define c_EANativeTransport_ctrl null
#endif
par
{
{
#ifdef XUD_PRIORITY_HIGH
set_core_high_priority_on();
#endif
/* Run UAC2.0 at high-speed, UAC1.0 at full-speed */
unsigned usbSpeed = (AUDIO_CLASS == 2) ? XUD_SPEED_HS : XUD_SPEED_FS;
unsigned xudPwrCfg = (XUA_POWERMODE == XUA_POWERMODE_SELF) ? XUD_PWR_SELF : XUD_PWR_BUS;
/* USB interface core */
XUD_Main(c_xud_out, ENDPOINT_COUNT_OUT, c_xud_in, ENDPOINT_COUNT_IN,
c_sof, epTypeTableOut, epTypeTableIn, usbSpeed, xudPwrCfg);
}
{
unsigned x;
thread_speed();
/* Attach mclk count port to mclk clock-block (for feedback) */
//set_port_clock(p_for_mclk_count, clk_audio_mclk);
#if(AUDIO_IO_TILE != XUD_TILE)
set_clock_src(clk_audio_mclk_usb, p_mclk_in_usb);
set_port_clock(p_for_mclk_count, clk_audio_mclk_usb);
start_clock(clk_audio_mclk_usb);
#else
/* Clock port from same clock-block as I2S */
/* TODO remove asm() */
asm("ldw %0, dp[clk_audio_mclk]":"=r"(x));
asm("setclk res[%0], %1"::"r"(p_for_mclk_count), "r"(x));
#endif
/* Endpoint & audio buffering cores */
XUA_Buffer(c_xud_out[ENDPOINT_NUMBER_OUT_AUDIO],/* Audio Out*/
#if (NUM_USB_CHAN_IN > 0)
c_xud_in[ENDPOINT_NUMBER_IN_AUDIO], /* Audio In */
#endif
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
c_xud_in[ENDPOINT_NUMBER_IN_FEEDBACK], /* Audio FB */
#endif
#ifdef MIDI
c_xud_out[ENDPOINT_NUMBER_OUT_MIDI], /* MIDI Out */ // 2
c_xud_in[ENDPOINT_NUMBER_IN_MIDI], /* MIDI In */ // 4
c_midi,
#endif
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
/* Audio Interrupt - only used for interrupts on external clock change */
c_xud_in[ENDPOINT_NUMBER_IN_INTERRUPT],
c_clk_int,
#endif
c_sof, c_aud_ctl, p_for_mclk_count
#if (HID_CONTROLS)
, c_xud_in[ENDPOINT_NUMBER_IN_HID]
#endif
, c_mix_out
#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
, i_pll_ref
#endif
);
//:
}
/* Endpoint 0 Core */
{
thread_speed();
XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_);
}
//:
}
}
#endif /* XUA_USB_EN */
#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE)
void SpdifTxWrapper(chanend c_spdif_tx)
{
@@ -469,20 +575,6 @@ int main()
#if ((XUA_SYNCMODE == XUA_SYNCMODE_SYNC) || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
interface pll_ref_if i_pll_ref;
#endif
chan c_sof;
chan c_xud_out[ENDPOINT_COUNT_OUT]; /* Endpoint channels for XUD */
chan c_xud_in[ENDPOINT_COUNT_IN];
chan c_aud_ctl;
#if (!MIXER)
#define c_mix_ctl null
#endif
#ifdef IAP_EA_NATIVE_TRANS
chan c_EANativeTransport_ctrl;
#else
#define c_EANativeTransport_ctrl null
#endif
USER_MAIN_DECLARATIONS
@@ -505,77 +597,27 @@ int main()
#endif
#endif
#if XUA_USB_EN
/* Core USB task, buffering, USB etc */
{
#ifdef XUD_PRIORITY_HIGH
set_core_high_priority_on();
#endif
/* Run UAC2.0 at high-speed, UAC1.0 at full-speed */
unsigned usbSpeed = (AUDIO_CLASS == 2) ? XUD_SPEED_HS : XUD_SPEED_FS;
unsigned xudPwrCfg = (XUA_POWERMODE == XUA_POWERMODE_SELF) ? XUD_PWR_SELF : XUD_PWR_BUS;
/* USB interface core */
XUD_Main(c_xud_out, ENDPOINT_COUNT_OUT, c_xud_in, ENDPOINT_COUNT_IN,
c_sof, epTypeTableOut, epTypeTableIn, usbSpeed, xudPwrCfg);
}
/* Core USB audio task, buffering, USB etc */
{
unsigned x;
thread_speed();
/* Attach mclk count port to mclk clock-block (for feedback) */
//set_port_clock(p_for_mclk_count, clk_audio_mclk);
#if(AUDIO_IO_TILE != XUD_TILE)
set_clock_src(clk_audio_mclk_usb, p_mclk_in_usb);
set_port_clock(p_for_mclk_count, clk_audio_mclk_usb);
start_clock(clk_audio_mclk_usb);
#else
/* Clock port from same clock-block as I2S */
/* TODO remove asm() */
asm("ldw %0, dp[clk_audio_mclk]":"=r"(x));
asm("setclk res[%0], %1"::"r"(p_for_mclk_count), "r"(x));
#endif
/* Endpoint & audio buffering cores */
XUA_Buffer(c_xud_out[ENDPOINT_NUMBER_OUT_AUDIO],/* Audio Out*/
#if (NUM_USB_CHAN_IN > 0)
c_xud_in[ENDPOINT_NUMBER_IN_AUDIO], /* Audio In */
#endif
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
c_xud_in[ENDPOINT_NUMBER_IN_FEEDBACK], /* Audio FB */
#endif
usb_audio_core(c_mix_out
#ifdef MIDI
c_xud_out[ENDPOINT_NUMBER_OUT_MIDI], /* MIDI Out */ // 2
c_xud_in[ENDPOINT_NUMBER_IN_MIDI], /* MIDI In */ // 4
c_midi,
, c_midi
#endif
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
/* Audio Interrupt - only used for interrupts on external clock change */
c_xud_in[ENDPOINT_NUMBER_IN_INTERRUPT],
c_clk_int,
#ifdef IAP
, c_iap
#ifdef IAP_EA_NATIVE_TRANS
, c_ea_data
#endif
c_sof, c_aud_ctl, p_for_mclk_count
#if (XUA_HID_ENABLED)
, c_xud_in[ENDPOINT_NUMBER_IN_HID]
#endif
, c_mix_out
#if (MIXER)
, c_mix_ctl
#endif
, c_clk_int, c_clk_ctl, dfuInterface
#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
, i_pll_ref
, i_pll_ref
#endif
);
//:
}
/* Endpoint 0 Core */
{
thread_speed();
XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_);
}
VENDOR_REQUESTS_PARAMS_
);
#endif /* XUA_USB_EN */
}

View File

@@ -1,4 +1,4 @@
// Copyright 2013-2023 XMOS LIMITED.
// Copyright 2013-2021 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
/**
@@ -34,7 +34,7 @@ typedef struct hidEvent_t {
#define HID_MAX_DATA_BYTES ( 4 )
#define HID_EVENT_INVALID_ID ( 0x100 )
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
/**
* \brief Get the data for the next HID Report
@@ -61,5 +61,21 @@ size_t UserHIDGetData( const unsigned id, unsigned char hidData[ HID_MAX_DATA_BY
*/
void UserHIDInit( void );
/**
* \brief Record that a HID event has occurred
*
* \param[in] hidEvent A list of events which have occurred.
* Each element specifies a HID Report ID, a bit and byte
* within the HID Report and the value for it.
* Set the Report ID to zero if not using Report IDs
* (see 5.6, 6.2.2.7, 8.1 and 8.2).
* \param[in] hidEventCnt The length of the \a hidEvent list.
*
* \returns The index of the first unrecorded event in \a hidEvent
* \retval Zero indicates no events were recorded
* \retval \a hidEventCnt indicates all events were recorded
*/
size_t UserHIDRecordEvent( const hidEvent_t hidEvent[], const size_t hidEventCnt );
#endif /* ( 0 < HID_CONTROLS ) */
#endif /* __USER_HID_H__ */

View File

@@ -1,4 +1,4 @@
// Copyright 2019-2023 XMOS LIMITED.
// Copyright 2019-2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include <stdint.h>
#include <xs1.h>
@@ -13,7 +13,7 @@
#define DEBUG_PRINT_ENABLE_HID_XC 0
#include "debug_print.h"
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
static unsigned HidCalcNewReportTime( const unsigned currentPeriod, const unsigned reportTime, const unsigned reportToSetIdleInterval, const unsigned newPeriod );
static unsigned HidCalcReportToSetIdleInterval( const unsigned reportTime );
static unsigned HidFindSetIdleActivationPoint( const unsigned currentPeriod, const unsigned timeWithinPeriod );

View File

@@ -1,7 +1,7 @@
// Copyright 2021-2023 XMOS LIMITED.
// Copyright 2021-2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include "xua_conf_full.h"
#if XUA_HID_ENABLED
#if( 0 < HID_CONTROLS )
#include <assert.h>
#include <stddef.h>

View File

@@ -1,4 +1,4 @@
// Copyright 2021-2023 XMOS LIMITED.
// Copyright 2021 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
/**
@@ -31,19 +31,6 @@
HID_ENDPOINT_DESCRIPTOR_PACKET_SIZE_HI, /* 5 wMaxPacketSize */
ENDPOINT_INT_INTERVAL_IN_HID, /* 6 bInterval */
#if (HID_OUT_REQUIRED)
/* HID Endpoint descriptor (OUT) */
HID_ENDPOINT_DESCRIPTOR_LENGTH, /* 0 bLength */
HID_ENDPOINT_DESCRIPTOR_TYPE, /* 1 bDescriptorType */
ENDPOINT_ADDRESS_OUT_HID, /* 2 bEndpointAddress */
HID_ENDPOINT_ATTRIBUTES, /* 3 bmAttributes (INTERRUPT) */
HID_ENDPOINT_DESCRIPTOR_PACKET_SIZE_LO, /* 4 wMaxPacketSize */
HID_ENDPOINT_DESCRIPTOR_PACKET_SIZE_HI, /* 5 wMaxPacketSize */
ENDPOINT_INT_INTERVAL_OUT_HID, /* 6 bInterval */
#endif
#elif (AUDIO_CLASS == 2)
.HID_In_Endpoint =
@@ -57,21 +44,6 @@
.bInterval = ENDPOINT_INT_INTERVAL_IN_HID,
},
#if (HID_OUT_REQUIRED)
.HID_Out_Endpoint =
{
/* Endpoint descriptor (OUT) */
.bLength = sizeof(USB_Descriptor_Endpoint_t),
.bDescriptorType = HID_ENDPOINT_DESCRIPTOR_TYPE,
.bEndpointAddress = ENDPOINT_ADDRESS_OUT_HID,
.bmAttributes = HID_ENDPOINT_ATTRIBUTES,
.wMaxPacketSize = HID_ENDPOINT_DESCRIPTOR_PACKET_SIZE_LO,
.bInterval = ENDPOINT_INT_INTERVAL_OUT_HID,
},
#endif
#else
#error "Unknown Audio Class"
#endif

View File

@@ -1,4 +1,4 @@
// Copyright 2021-2023 XMOS LIMITED.
// Copyright 2021 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
/**
@@ -15,8 +15,7 @@
#define HID_INTERFACE_DESCRIPTOR_LENGTH ( 0x09 ) /* Size of descriptor in Bytes */
#define HID_INTERFACE_DESCRIPTOR_TYPE ( 0x04 ) /* Interface 0x04 */
#define HID_INTERFACE_ALTERNATE_SETTING ( 0x00 ) /* Value used alternate interfaces using SetInterface Request */
#define HID_INTERFACE_NUMBER_OF_ENDPOINTS ( 0x01 + HID_OUT_REQUIRED )
/* Number of endpoints for this interface (excluding 0) */
#define HID_INTERFACE_NUMBER_OF_ENDPOINTS ( 0x01 ) /* Number of endpoitns for this interface (excluding 0) */
#define HID_INTERFACE_CLASS ( 0x03 )
#define HID_INTERFACE_SUBCLASS ( 0x00 ) /* No boot device */
#define HID_INTERFACE_PROTOCOL ( 0x00 )

View File

@@ -1,6 +1,7 @@
// Copyright 2016-2023 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#ifdef SIMULATION
#include "xua.h"
#include <platform.h>
#include <print.h>
@@ -45,7 +46,7 @@ void slave_mode_clk_setup(const unsigned samFreq, const unsigned chans_per_frame
const unsigned mclk_freq = 24576000;
const unsigned mclk_bclk_ratio = mclk_freq / (chans_per_frame * samFreq * data_bits);
const unsigned bclk_lrclk_ratio = (chans_per_frame * data_bits); // 48.828Hz LRCLK
const unsigned bclk_lrclk_ratio = (chans_per_frame * data_bits + (data_bits * XUA_I2S_DUMMY_SAMPS)); // 48.828Hz LRCLK
//bclk
configure_clock_src_divide(clk_audio_bclk_gen, p_mclk_gen, mclk_bclk_ratio/2);