diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 518aab7b..0f6fee2f 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,6 +1,12 @@
lib_xua Change Log
==================
+3.1.0
+-----
+
+ * CHANGED: Removed logic from HID API functions allowing a Report ID of 0 to
+ be used as "all/any" Report
+
3.0.0
-----
@@ -10,6 +16,10 @@ lib_xua Change Log
* CHANGED: Renamed the HID API file xua_hid_report_descriptor.h to
xua_hid_report.h
+ * Changes to dependencies:
+
+ - lib_locks: Added dependency 2.1.0
+
2.1.1
-----
diff --git a/lib_xua/.cproject b/lib_xua/.cproject
deleted file mode 100644
index 08cfa4f2..00000000
--- a/lib_xua/.cproject
+++ /dev/null
@@ -1,860 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib_xua/.project b/lib_xua/.project
deleted file mode 100644
index c752d2f7..00000000
--- a/lib_xua/.project
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
- lib_xua
-
-
-
-
-
- com.xmos.cdt.core.ProjectInfoSyncBuilder
-
-
-
-
- com.xmos.cdt.core.LegacyProjectCheckerBuilder
-
-
-
-
- com.xmos.cdt.core.ModulePathBuilder
-
-
-
-
- org.eclipse.cdt.managedbuilder.core.genmakebuilder
- clean,full,incremental,
-
-
-
-
- org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
- full,incremental,
-
-
-
-
-
- org.eclipse.cdt.core.cnature
- org.eclipse.cdt.managedbuilder.core.managedBuildNature
- org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
- com.xmos.cdt.core.XdeProjectNature
-
-
diff --git a/lib_xua/.xproject b/lib_xua/.xproject
deleted file mode 100644
index 2a5ae266..00000000
--- a/lib_xua/.xproject
+++ /dev/null
@@ -1 +0,0 @@
-lib_xuaXM-012639-SM
diff --git a/lib_xua/module_build_info b/lib_xua/module_build_info
index e566c11b..4ed428e5 100644
--- a/lib_xua/module_build_info
+++ b/lib_xua/module_build_info
@@ -1,10 +1,11 @@
-VERSION = 3.0.0
+VERSION = 3.1.0
DEPENDENT_MODULES = lib_logging(>=3.0.0) \
lib_xassert(>=4.0.0) \
lib_xud(>=2.0.1) \
lib_spdif(>=4.0.0) \
- lib_mic_array(>=4.0.0)
+ lib_mic_array(>=4.0.0) \
+ lib_locks(>=2.0.3)
MODULE_XCC_FLAGS = $(XCC_FLAGS) \
-O3 \
diff --git a/lib_xua/src/core/buffer/ep/ep_buffer.xc b/lib_xua/src/core/buffer/ep/ep_buffer.xc
index e2f81ef4..a9a9a9a1 100644
--- a/lib_xua/src/core/buffer/ep/ep_buffer.xc
+++ b/lib_xua/src/core/buffer/ep/ep_buffer.xc
@@ -1,4 +1,4 @@
-// Copyright 2011-2021 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
@@ -93,7 +93,7 @@ unsigned int fb_clocks[4];
void XUA_Buffer(
register chanend c_aud_out,
#if (NUM_USB_CHAN_IN > 0)
- register chanend c_aud_in,
+ register chanend c_aud_in,
#endif
#if (NUM_USB_CHAN_IN == 0) || defined (UAC_FORCE_FEEDBACK_EP)
chanend c_aud_fb,
@@ -198,7 +198,7 @@ unsafe{volatile unsigned * unsafe masterClockFreq_ptr;}
*/
void XUA_Buffer_Ep(register chanend c_aud_out,
#if (NUM_USB_CHAN_IN > 0)
- register chanend c_aud_in,
+ register chanend c_aud_in,
#endif
#if (NUM_USB_CHAN_IN == 0) || defined (UAC_FORCE_FEEDBACK_EP)
chanend c_aud_fb,
@@ -373,15 +373,13 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
#endif
#if( 0 < HID_CONTROLS )
- UserHIDInit();
while (!hidIsReportDescriptorPrepared())
;
- /* Get the a report - we don't really care which it is, so long as there's some data we can grab. */
- int hidReportLength = (int) UserHIDGetData(hidGetNextValidReportId(0), g_hidData);
-
- XUD_SetReady_In(ep_hid, g_hidData, hidReportLength);
+ UserHIDInit();
+ unsigned hid_ready_flag = 0U;
+ unsigned hid_ready_id = 0U;
#endif
@@ -392,6 +390,8 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
#endif
#endif
+ timer tmr;
+
while(1)
{
XUD_Result_t result;
@@ -448,9 +448,9 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
if(receivedSampleFreq != AUDIO_STOP_FOR_DFU)
{
sampleFreq = receivedSampleFreq;
- #ifdef FB_TOLERANCE_TEST
+#ifdef FB_TOLERANCE_TEST
expected_fb = ((sampleFreq * 0x2000) / frameTime);
- #endif
+#endif
/* Reset FB */
/* Note, Endpoint 0 will hold off host for a sufficient period to allow our feedback
* to stabilise (i.e. sofCount == 128 to fire) */
@@ -711,7 +711,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
#endif
sofCount++;
}
- break;
+ break;
#if (NUM_USB_CHAN_IN > 0)
/* Sent audio packet DEVICE -> HOST */
@@ -719,8 +719,8 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
{
/* Inform stream that buffer sent */
SET_SHARED_GLOBAL0(g_aud_to_host_flag, bufferIn+1);
+ break;
}
- break;
#endif
#if (NUM_USB_CHAN_OUT > 0)
@@ -740,8 +740,8 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
{
XUD_SetReady_In(ep_aud_fb, (fb_clocks, unsigned char[]), 3);
}
+ break;
}
- break;
#endif
/* Received Audio packet HOST -> DEVICE. Datalength written to length */
case XUD_GetData_Select(c_aud_out, ep_aud_out, length, result):
@@ -752,175 +752,165 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
/* Sync with decouple thread */
SET_SHARED_GLOBAL0(g_aud_from_host_flag, 1);
- }
break;
+ }
#endif
#ifdef MIDI
- case XUD_GetData_Select(c_midi_from_host, ep_midi_from_host, length, result):
+ case XUD_GetData_Select(c_midi_from_host, ep_midi_from_host, length, result):
- if((result == XUD_RES_OKAY) && (length > 0))
- {
- /* Get buffer data from host - MIDI OUT from host always into a single buffer */
- midi_data_remaining_to_device = length;
-
- midi_from_host_rdptr = midi_from_host_buffer;
-
- if (midi_data_remaining_to_device)
+ if((result == XUD_RES_OKAY) && (length > 0))
{
- read_via_xc_ptr(datum, midi_from_host_rdptr);
- outuint(c_midi, datum);
- midi_from_host_rdptr += 4;
- midi_data_remaining_to_device -= 4;
+ /* Get buffer data from host - MIDI OUT from host always into a single buffer */
+ midi_data_remaining_to_device = length;
+
+ midi_from_host_rdptr = midi_from_host_buffer;
+
+ if (midi_data_remaining_to_device)
+ {
+ read_via_xc_ptr(datum, midi_from_host_rdptr);
+ outuint(c_midi, datum);
+ midi_from_host_rdptr += 4;
+ midi_data_remaining_to_device -= 4;
+ }
}
- }
- break;
+ break;
- /* MIDI IN to host */
- case XUD_SetData_Select(c_midi_to_host, ep_midi_to_host, result):
+ /* MIDI IN to host */
+ case XUD_SetData_Select(c_midi_to_host, ep_midi_to_host, result):
- /* The buffer has been sent to the host, so we can ack the midi thread */
- if (midi_data_collected_from_device != 0)
- {
- /* Swap the collecting and sending buffer */
- swap(midi_to_host_buffer_being_collected, midi_to_host_buffer_being_sent);
+ /* The buffer has been sent to the host, so we can ack the midi thread */
+ if (midi_data_collected_from_device != 0)
+ {
+ /* Swap the collecting and sending buffer */
+ swap(midi_to_host_buffer_being_collected, midi_to_host_buffer_being_sent);
- /* Request to send packet */
- XUD_SetReady_InPtr(ep_midi_to_host, midi_to_host_buffer_being_sent, midi_data_collected_from_device);
+ /* Request to send packet */
+ XUD_SetReady_InPtr(ep_midi_to_host, midi_to_host_buffer_being_sent, midi_data_collected_from_device);
- /* Mark as waiting for host to poll us */
- midi_waiting_on_send_to_host = 1;
- /* Reset the collected data count */
- midi_data_collected_from_device = 0;
- }
- else
- {
- midi_waiting_on_send_to_host = 0;
- }
- break;
+ /* Mark as waiting for host to poll us */
+ midi_waiting_on_send_to_host = 1;
+ /* Reset the collected data count */
+ midi_data_collected_from_device = 0;
+ }
+ else
+ {
+ midi_waiting_on_send_to_host = 0;
+ }
+ break;
#endif
#ifdef IAP
- /* IAP OUT from host. Datalength writen to tmp */
- case XUD_GetData_Select(c_iap_from_host, ep_iap_from_host, length, result):
+ /* IAP OUT from host. Datalength writen to tmp */
+ case XUD_GetData_Select(c_iap_from_host, ep_iap_from_host, length, result):
- if((result == XUD_RES_OKAY) && (length > 0))
- {
- iap_data_remaining_to_device = length;
-
- if(iap_data_remaining_to_device)
+ if((result == XUD_RES_OKAY) && (length > 0))
{
- // Send length first so iAP thread knows how much data to expect
- // Don't expect ack from this to make it simpler
- outuint(c_iap, iap_data_remaining_to_device);
+ iap_data_remaining_to_device = length;
- /* Send out first byte in buffer */
- datum_iap = iap_from_host_buffer[0];
- outuint(c_iap, datum_iap);
+ if(iap_data_remaining_to_device)
+ {
+ // Send length first so iAP thread knows how much data to expect
+ // Don't expect ack from this to make it simpler
+ outuint(c_iap, iap_data_remaining_to_device);
- /* Set read ptr to next byte in buffer */
- iap_from_host_rdptr = 1;
- iap_data_remaining_to_device -= 1;
+ /* Send out first byte in buffer */
+ datum_iap = iap_from_host_buffer[0];
+ outuint(c_iap, datum_iap);
+
+ /* Set read ptr to next byte in buffer */
+ iap_from_host_rdptr = 1;
+ iap_data_remaining_to_device -= 1;
+ }
}
- }
- break;
+ break;
- /* IAP IN to host */
- case XUD_SetData_Select(c_iap_to_host, ep_iap_to_host, result):
+ /* IAP IN to host */
+ case XUD_SetData_Select(c_iap_to_host, ep_iap_to_host, result):
- if(result == XUD_RES_RST)
- {
- XUD_ResetEndpoint(ep_iap_to_host, null);
+ if(result == XUD_RES_RST)
+ {
+ XUD_ResetEndpoint(ep_iap_to_host, null);
#ifdef IAP_INT_EP
- XUD_ResetEndpoint(ep_iap_to_host_int, null);
+ XUD_ResetEndpoint(ep_iap_to_host_int, null);
#endif
- iap_send_reset(c_iap);
- iap_draining_chan = 1; // Drain c_iap until a reset is sent back
- iap_data_collected_from_device = 0;
- iap_data_remaining_to_device = -1;
- iap_expected_data_length = 0;
- iap_from_host_rdptr = 0;
- }
- else
- {
- /* Send out an iAP packet to host, ACK last msg from iAP to let it know we can move on..*/
- iap_send_ack(c_iap);
- }
- break; /* IAP IN to host */
+ iap_send_reset(c_iap);
+ iap_draining_chan = 1; // Drain c_iap until a reset is sent back
+ iap_data_collected_from_device = 0;
+ iap_data_remaining_to_device = -1;
+ iap_expected_data_length = 0;
+ iap_from_host_rdptr = 0;
+ }
+ else
+ {
+ /* Send out an iAP packet to host, ACK last msg from iAP to let it know we can move on..*/
+ iap_send_ack(c_iap);
+ }
+ break; /* IAP IN to host */
#ifdef IAP_INT_EP
- case XUD_SetData_Select(c_iap_to_host_int, ep_iap_to_host_int, result):
+ case XUD_SetData_Select(c_iap_to_host_int, ep_iap_to_host_int, result):
- /* Do nothing.. */
- /* Note, could get a reset notification here, but deal with it in the case above */
- break;
+ /* Do nothing.. */
+ /* Note, could get a reset notification here, but deal with it in the case above */
+ break;
#endif
#ifdef IAP_EA_NATIVE_TRANS
- /* iAP EA Native Transport OUT from host */
- case XUD_GetData_Select(c_iap_ea_native_out, ep_iap_ea_native_out, iap_ea_native_rx_length, result):
- if ((result == XUD_RES_OKAY) && iap_ea_native_rx_length > 0)
- {
- // Notify EA Protocol user code we have iOS app data from XUD
- iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_DATA);
- }
- break;
+ /* iAP EA Native Transport OUT from host */
+ case XUD_GetData_Select(c_iap_ea_native_out, ep_iap_ea_native_out, iap_ea_native_rx_length, result):
+ if ((result == XUD_RES_OKAY) && iap_ea_native_rx_length > 0)
+ {
+ // Notify EA Protocol user code we have iOS app data from XUD
+ iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_DATA);
+ }
+ break;
- /* iAP EA Native Transport IN to host */
- case XUD_SetData_Select(c_iap_ea_native_in, ep_iap_ea_native_in, result):
- switch (result)
- {
- case XUD_RES_RST:
- XUD_ResetEndpoint(ep_iap_ea_native_in, null);
- // Notify user code of USB reset to allow any state to be cleared
- iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_CONTROL);
- // Set up the control flag to send to EA Protocol user code when it responds
- iap_ea_native_control_flag = EA_NATIVE_RESET;
- iap_ea_native_control_to_send = 1;
- break;
+ /* iAP EA Native Transport IN to host */
+ case XUD_SetData_Select(c_iap_ea_native_in, ep_iap_ea_native_in, result):
+ switch (result)
+ {
+ case XUD_RES_RST:
+ XUD_ResetEndpoint(ep_iap_ea_native_in, null);
+ // Notify user code of USB reset to allow any state to be cleared
+ iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_CONTROL);
+ // Set up the control flag to send to EA Protocol user code when it responds
+ iap_ea_native_control_flag = EA_NATIVE_RESET;
+ iap_ea_native_control_to_send = 1;
+ break;
- case XUD_RES_OKAY: // EA Protocol user data successfully passed to XUD
- // Notify user code
- iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_CONTROL);
- // Set up the control flag to send to EA Protocol user code when it responds
- iap_ea_native_control_flag = EA_NATIVE_DATA_SENT;
- iap_ea_native_control_to_send = 1;
- break;
- }
- break;
- //::
+ case XUD_RES_OKAY: // EA Protocol user data successfully passed to XUD
+ // Notify user code
+ iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_CONTROL);
+ // Set up the control flag to send to EA Protocol user code when it responds
+ iap_ea_native_control_flag = EA_NATIVE_DATA_SENT;
+ iap_ea_native_control_to_send = 1;
+ break;
+ }
+ break;
+ //::
#endif
#endif
#if( 0 < HID_CONTROLS )
- /* HID Report Data */
- case (hidIsChangePending(0U) || !HidIsSetIdleSilenced(0U)) => XUD_SetData_Select(c_hid, ep_hid, result):
- {
- timer tmr;
+ /* HID Report Data */
+ case XUD_SetData_Select(c_hid, ep_hid, result):
+ hid_ready_flag = 0U;
unsigned reportTime;
tmr :> reportTime;
-
- for(unsigned id = hidIsReportIdInUse(); id < hidGetReportIdLimit(); ++id) {
- if(0U == id || (hidIsChangePending(id) || !HidIsSetIdleSilenced(id))) {
- hidCaptureReportTime(id, reportTime);
- int hidDataLength = (int) UserHIDGetData(id, g_hidData);
- XUD_SetReady_In(ep_hid, g_hidData, hidDataLength);
- hidCalcNextReportTime(id);
- hidClearChangePending(id);
- break;
- }
- }
- }
- break;
+ hidCaptureReportTime(hid_ready_id, reportTime);
+ hidCalcNextReportTime(hid_ready_id);
+ hidClearChangePending(hid_ready_id);
+ break;
#endif
#ifdef MIDI
- /* Received word from MIDI thread - Check for ACK or Data */
+ /* Received word from MIDI thread - Check for ACK or Data */
case midi_get_ack_or_data(c_midi, is_ack, datum):
if (is_ack)
{
/* An ack from the midi/uart thread means it has accepted some data we sent it
- * we are okay to send another word */
+ * we are okay to send another word */
if (midi_data_remaining_to_device <= 0)
{
/* We have read an entire packet - Mark ready to receive another */
@@ -985,7 +975,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
if (is_ack_iap)
{
/* An ack from the iap/uart thread means it has accepted some data we sent it
- * we are okay to send another word */
+ * we are okay to send another word */
if (iap_data_remaining_to_device == 0)
{
/* We have read an entire packet - Mark ready to receive another */
@@ -1018,7 +1008,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
}
else
{
- // Too many events from device - drop
+ // Too many events from device - drop
}
/* Once we have the whole message, sent it to host */
@@ -1056,7 +1046,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
}
break;
-# if IAP_EA_NATIVE_TRANS
+ # if IAP_EA_NATIVE_TRANS
/* Change of EA Native Transport interface setting */
case inuint_byref(c_iap_ea_native_ctrl, iap_ea_native_interface_alt_setting):
/* Handshake */
@@ -1114,6 +1104,26 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
break;
}
break;
+
+ default:
+#if ( 0 < HID_CONTROLS )
+ if (!hid_ready_flag)
+ {
+ for (unsigned id = hidIsReportIdInUse(); id < hidGetReportIdLimit(); id++)
+ {
+ if ( hidIsChangePending(id) || !HidIsSetIdleSilenced(id) )
+ {
+ int hidDataLength = (int) UserHIDGetData(id, g_hidData);
+ XUD_SetReady_In(ep_hid, g_hidData, hidDataLength);
+
+ hid_ready_id = id;
+ hid_ready_flag = 1U;
+ break;
+ }
+ }
+ }
+#endif
+ break;
//::
#endif
@@ -1121,7 +1131,6 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
}
-
}
}
#endif /* XUA_USB_EN */
diff --git a/lib_xua/src/hid/hid.xc b/lib_xua/src/hid/hid.xc
index 0c09d609..0f506d59 100644
--- a/lib_xua/src/hid/hid.xc
+++ b/lib_xua/src/hid/hid.xc
@@ -1,4 +1,4 @@
-// Copyright 2019-2021 XMOS LIMITED.
+// Copyright 2019-2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include
#include
@@ -9,6 +9,10 @@
#include "xua_hid.h"
#include "xua_hid_report.h"
+#define DEBUG_UNIT HID_XC
+#define DEBUG_PRINT_ENABLE_HID_XC 0
+#include "debug_print.h"
+
#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 );
@@ -37,26 +41,26 @@ XUD_Result_t HidInterfaceClassRequests(
unsigned HidIsSetIdleSilenced( const unsigned id )
{
- unsigned isSilenced = hidIsIdleActive( id );
+ unsigned isSilenced = hidIsIdleActive( id );
- if( !isSilenced ) {
- unsigned currentTime;
- // Use inline assembly to access the time without creating a side-effect.
- // The mapper complains if the time comes from an XC timer because this function is called in the guard of a select case.
- // Appearently the use of a timer creates a side-effect that prohibits the operation of the select functionality.
- asm volatile( "gettime %0" : "=r" ( currentTime ));
- isSilenced = ( 0U == hidGetReportPeriod( id ) || ( timeafter( hidGetNextReportTime( id ), currentTime )));
- }
+ if( !isSilenced ) {
+ unsigned currentTime;
+ // Use inline assembly to access the time without creating a side-effect.
+ // The mapper complains if the time comes from an XC timer because this function is called in the guard of a select case.
+ // Appearently the use of a timer creates a side-effect that prohibits the operation of the select functionality.
+ asm volatile( "gettime %0" : "=r" ( currentTime ));
+ isSilenced = ( 0U == hidGetReportPeriod( id ) || ( timeafter( hidGetNextReportTime( id ), currentTime )));
+ }
- return isSilenced;
+ return isSilenced;
}
/**
* \brief Calculate the timer value for sending the next HID Report.
*
* With regard to Section 7.2.4 Set_Idle Request of the USB Device Class Definition for Human
- * Interface Devices (HID) Version 1.11, I've interpreted 'currently executing period' and
- * 'current period' to mean the previously established Set Idle duration if one has been
+ * Interface Devices (HID) Version 1.11, 'currently executing period' and 'current period' have
+ * been interpreted to mean the previously established Set Idle duration if one has been
* established or the polling interval from the HID Report Descriptor if a Set Idle duration
* has not been established.
*
@@ -147,8 +151,6 @@ static void HidUpdateReportPeriod( unsigned reportId, unsigned reportDuration )
unsigned nextReportTime = HidCalcNewReportTime( currentPeriod, reportTime, reportToSetIdleInterval, reportDuration * MS_IN_TICKS );
hidSetNextReportTime( reportId, nextReportTime );
currentPeriod = reportDuration * MS_IN_TICKS;
- } else {
- currentPeriod = ENDPOINT_INT_INTERVAL_IN_HID * MS_IN_TICKS;
}
hidSetReportPeriod( reportId, currentPeriod );
diff --git a/lib_xua/src/hid/hid_report.c b/lib_xua/src/hid/hid_report.c
index a647204e..02c8122c 100644
--- a/lib_xua/src/hid/hid_report.c
+++ b/lib_xua/src/hid/hid_report.c
@@ -1,4 +1,4 @@
-// Copyright 2021 XMOS LIMITED.
+// Copyright 2021-2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include
#include
@@ -9,15 +9,20 @@
#include "descriptor_defs.h"
#include "xua_hid_report.h"
#include "hid_report_descriptor.h"
+#include "swlock.h"
#define HID_REPORT_ITEM_LOCATION_SIZE ( 1 )
#define HID_REPORT_DESCRIPTOR_ITEM_COUNT ( sizeof hidReportDescriptorItems / sizeof ( USB_HID_Short_Item_t* ))
#define HID_REPORT_DESCRIPTOR_MAX_LENGTH ( HID_REPORT_DESCRIPTOR_ITEM_COUNT * \
( sizeof ( USB_HID_Short_Item_t ) - HID_REPORT_ITEM_LOCATION_SIZE ))
+
+swlock_t hidStaticVarLock = SWLOCK_INITIAL_VALUE;
+
/*
* Each element in s_hidChangePending corresponds to an element in hidReports.
*/
+
static unsigned s_hidChangePending[ HID_REPORT_COUNT ];
static unsigned char s_hidReportDescriptor[ HID_REPORT_DESCRIPTOR_MAX_LENGTH ];
static size_t s_hidReportDescriptorLength;
@@ -131,33 +136,42 @@ static unsigned hidGetUsagePage( const unsigned id );
*/
static size_t hidTranslateItem( const USB_HID_Short_Item_t* inPtr, unsigned char** outPtrPtr );
+unsigned hidIsReportIdInUse ( void ) {
+ return !hidIsReportIdValid(0U);
+}
void hidCalcNextReportTime( const unsigned id )
{
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
s_hidNextReportTime[ idx ] = s_hidReportTime[ idx ] + s_hidCurrentPeriod[ idx ];
}
}
+ swlock_release(&hidStaticVarLock);
}
void hidCaptureReportTime( const unsigned id, const unsigned time )
{
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
s_hidReportTime[ idx ] = time;
}
}
+ swlock_release(&hidStaticVarLock);
}
void hidClearChangePending( const unsigned id )
{
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
if(( id == 0U ) || ( id == hidGetElementReportId( hidReports[ idx ]->location ))) {
s_hidChangePending[ idx ] = 0U;
break;
}
}
+ swlock_release(&hidStaticVarLock);
}
static unsigned hidGetElementBitLocation( const unsigned short location )
@@ -203,74 +217,56 @@ static unsigned hidGetItemType( const unsigned char header )
}
unsigned hidGetNextReportTime( const unsigned id ) {
+ swlock_acquire(&hidStaticVarLock);
unsigned retVal = 0U;
- for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
+ for ( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
retVal = s_hidNextReportTime[ idx ];
}
- }
+ }
+ swlock_release(&hidStaticVarLock);
return retVal;
}
-unsigned hidIsReportDescriptorPrepared( void )
-{
- return s_hidReportDescriptorPrepared;
-}
-
unsigned char* hidGetReportDescriptor( void )
{
unsigned char* retVal = NULL;
+ swlock_acquire(&hidStaticVarLock);
if( s_hidReportDescriptorPrepared ) {
retVal = s_hidReportDescriptor;
}
+ swlock_release(&hidStaticVarLock);
return retVal;
}
size_t hidGetReportDescriptorLength( void )
{
+ swlock_acquire(&hidStaticVarLock);
size_t retVal = ( s_hidReportDescriptorPrepared ) ? s_hidReportDescriptorLength : 0U;
+ swlock_release(&hidStaticVarLock);
return retVal;
}
unsigned hidGetReportIdLimit ( void ) {
unsigned retVal = 0U;
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
if( reportId >= retVal ) {
retVal = reportId + 1;
}
}
- return retVal;
-}
-
-unsigned hidIsReportIdInUse ( void ) {
- if ( hidGetElementReportId( hidReports[ 0 ]->location ) ) {
- return 1;
- }
- return 0;
-}
-
-unsigned hidIsReportIdValid ( unsigned id ) {
- size_t retVal = 0;
-
- for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
- unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
- if( reportId == id ) {
- retVal = 1;
- break;
- }
- }
-
+ swlock_release(&hidStaticVarLock);
return retVal;
}
unsigned hidGetNextValidReportId ( unsigned idPrev ) {
size_t retIndex = 0;
-
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
if( reportId == idPrev ) {
@@ -279,7 +275,9 @@ unsigned hidGetNextValidReportId ( unsigned idPrev ) {
}
}
- return hidGetElementReportId( hidReports[ retIndex ]->location );
+ unsigned retVal = hidGetElementReportId( hidReports[ retIndex ]->location );
+ swlock_release(&hidStaticVarLock);
+ return retVal;
}
#define HID_CONFIGURABLE_ELEMENT_COUNT ( sizeof hidConfigurableElements / sizeof ( USB_HID_Report_Element_t* ))
@@ -294,7 +292,10 @@ unsigned hidGetReportItem(
{
unsigned retVal = HID_STATUS_BAD_ID;
for( size_t elementIdx = 0U; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) {
+ swlock_acquire(&hidStaticVarLock);
USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ];
+ swlock_release(&hidStaticVarLock);
+
unsigned bBit = hidGetElementBitLocation( element.location );
unsigned bByte = hidGetElementByteLocation( element.location );
unsigned bId = hidGetElementReportId( element.location );
@@ -320,6 +321,7 @@ unsigned hidGetReportItem(
size_t hidGetReportLength( const unsigned id )
{
+ swlock_acquire(&hidStaticVarLock);
size_t retVal = 0U;
if( s_hidReportDescriptorPrepared ) {
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
@@ -328,11 +330,13 @@ size_t hidGetReportLength( const unsigned id )
}
}
}
+ swlock_release(&hidStaticVarLock);
return retVal;
}
unsigned hidGetReportPeriod( const unsigned id )
{
+ swlock_acquire(&hidStaticVarLock);
unsigned retVal = 0U;
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
@@ -340,10 +344,13 @@ unsigned hidGetReportPeriod( const unsigned id )
break;
}
}
+ swlock_release(&hidStaticVarLock);
return retVal;
}
-unsigned hidGetReportTime( const unsigned id ) {
+unsigned hidGetReportTime( const unsigned id )
+{
+ swlock_acquire(&hidStaticVarLock);
unsigned retVal = 0U;
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
@@ -351,55 +358,85 @@ unsigned hidGetReportTime( const unsigned id ) {
retVal = s_hidReportTime[ idx ];
}
}
+
+ swlock_release(&hidStaticVarLock);
return retVal;
}
static unsigned hidGetUsagePage( const unsigned id )
{
unsigned retVal = 0U;
+ swlock_acquire(&hidStaticVarLock);
+
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
retVal = hidReports[ idx ]->item.data[ 0 ];
break;
}
}
+
+ swlock_release(&hidStaticVarLock);
return retVal;
}
unsigned hidIsChangePending( const unsigned id )
{
unsigned retVal = 0U;
+ swlock_acquire(&hidStaticVarLock);
+
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
- if( id == 0U && s_hidChangePending[ idx ] != 0U ) {
- retVal = 1;
- } else if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
+ if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
retVal = ( s_hidChangePending[ idx ] != 0U );
break;
}
}
+
+ swlock_release(&hidStaticVarLock);
return retVal;
}
unsigned hidIsIdleActive( const unsigned id )
{
unsigned retVal = 0U;
- if( 0U == id ) {
- retVal = 1U;
- }
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
- if( id == 0U ) {
- retVal &= ( s_hidIdleActive[ idx ] != 0U );
- } else if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
+ if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
retVal = ( s_hidIdleActive[ idx ] != 0U );
break;
}
}
- return retVal;
+ swlock_release(&hidStaticVarLock);
+ return retVal;
+}
+
+unsigned hidIsReportDescriptorPrepared( void )
+{
+ swlock_acquire(&hidStaticVarLock);
+ unsigned retVal = s_hidReportDescriptorPrepared;
+ swlock_release(&hidStaticVarLock);
+ return retVal;
+}
+
+unsigned hidIsReportIdValid ( unsigned id ) {
+ size_t retVal = 0;
+
+ swlock_acquire(&hidStaticVarLock);
+ for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
+ unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
+ if( reportId == id ) {
+ retVal = 1;
+ break;
+ }
+ }
+
+ swlock_release(&hidStaticVarLock);
+ return retVal;
}
void hidPrepareReportDescriptor( void )
{
+ swlock_acquire(&hidStaticVarLock);
if( !s_hidReportDescriptorPrepared ) {
s_hidReportDescriptorLength = 0U;
unsigned char* ptr = s_hidReportDescriptor;
@@ -410,49 +447,60 @@ void hidPrepareReportDescriptor( void )
s_hidReportDescriptorPrepared = 1U;
}
+ swlock_release(&hidStaticVarLock);
}
void hidReportInit( void )
{
+ swlock_acquire(&hidStaticVarLock);
for( unsigned idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
- s_hidCurrentPeriod[ idx ] = ENDPOINT_INT_INTERVAL_IN_HID * MS_IN_TICKS;
+ s_hidCurrentPeriod[ idx ] = ENDPOINT_INT_INTERVAL_IN_HID * MS_IN_TICKS * HID_REPORT_COUNT;
}
memset( s_hidIdleActive, 0, sizeof( s_hidIdleActive ) );
memset( s_hidChangePending, 0, sizeof( s_hidChangePending ) );
+ swlock_release(&hidStaticVarLock);
}
void hidResetReportDescriptor( void )
{
+ swlock_acquire(&hidStaticVarLock);
s_hidReportDescriptorPrepared = 0U;
+ swlock_release(&hidStaticVarLock);
}
void hidSetChangePending( const unsigned id )
{
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
s_hidChangePending[ idx ] = 1U;
break;
}
}
+ swlock_release(&hidStaticVarLock);
}
void hidSetIdle( const unsigned id, const unsigned state )
{
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
s_hidIdleActive[ idx ] = ( state != 0U );
break;
}
}
+ swlock_release(&hidStaticVarLock);
}
void hidSetNextReportTime( const unsigned id, const unsigned time )
{
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
s_hidNextReportTime[ idx ] = time;
}
}
+ swlock_release(&hidStaticVarLock);
}
unsigned hidSetReportItem(
@@ -478,7 +526,10 @@ unsigned hidSetReportItem(
retVal = HID_STATUS_BAD_HEADER;
} else {
for( size_t elementIdx = 0U; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) {
+ swlock_acquire(&hidStaticVarLock);
USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ];
+ swlock_release(&hidStaticVarLock);
+
unsigned bBit = hidGetElementBitLocation( element.location );
unsigned bByte = hidGetElementByteLocation( element.location );
unsigned bId = hidGetElementReportId( element.location );
@@ -501,7 +552,9 @@ unsigned hidSetReportItem(
element.item.data[ dataIdx ] = 0U;
}
+ swlock_acquire(&hidStaticVarLock);
*hidConfigurableElements[ elementIdx ] = element;
+ swlock_release(&hidStaticVarLock);
retVal = HID_STATUS_GOOD;
break;
}
@@ -510,18 +563,19 @@ unsigned hidSetReportItem(
}
}
}
-
return retVal;
}
void hidSetReportPeriod( const unsigned id, const unsigned period )
{
+ swlock_acquire(&hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
s_hidCurrentPeriod[ idx ] = period;
break;
}
}
+ swlock_release(&hidStaticVarLock);
}
static size_t hidTranslateItem( const USB_HID_Short_Item_t* inPtr, unsigned char** outPtrPtr )
@@ -796,4 +850,4 @@ unsigned hidReportValidate( void )
} else {
return hidReportValidateInfoStruct( &info );
}
-}
\ No newline at end of file
+}
diff --git a/lib_xua/src/hid/xua_hid.h b/lib_xua/src/hid/xua_hid.h
index 6e5d31b2..6730a57e 100644
--- a/lib_xua/src/hid/xua_hid.h
+++ b/lib_xua/src/hid/xua_hid.h
@@ -1,4 +1,4 @@
-// Copyright 2019-2021 XMOS LIMITED.
+// Copyright 2019-2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
/**
diff --git a/lib_xua/src/hid/xua_hid_report.h b/lib_xua/src/hid/xua_hid_report.h
index e05810da..41dd7441 100644
--- a/lib_xua/src/hid/xua_hid_report.h
+++ b/lib_xua/src/hid/xua_hid_report.h
@@ -1,4 +1,4 @@
-// Copyright 2021 XMOS LIMITED.
+// Copyright 2021-2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
/**
@@ -113,6 +113,45 @@ typedef struct
unsigned short location;
} USB_HID_Report_Element_t;
+/**
+ * \brief Calculate the next time to respond with a HID Report.
+ *
+ * If the USB Host has previously sent a valid HID Set_Idle request with
+ * a duration of zero or greater than the default reporting interval,
+ * the device sends HID Reports periodically or when the value of the
+ * payload has changed.
+ *
+ * This function calculates the time for sending the next periodic
+ * HID Report.
+ *
+ * Parameters:
+ *
+ * @param[in] id The identifier for the HID Report (see 5.6, 6.2.2.7, 8.1 and 8.2)
+ * A value of zero means the application does not use Report IDs.
+ */
+void hidCalcNextReportTime( const unsigned id );
+
+/**
+ * \brief Capture the time of sending the current HID Report.
+ *
+ * If the USB Host has previously sent a valid HID Set_Idle request with
+ * a duration of zero or greater than the default reporting interval,
+ * the device sends HID Reports periodically or when the value of the
+ * payload has changed.
+ *
+ * This function captures the time when the HID Report was sent so that
+ * a subsequent call to HidCalNextReportTime() can calculate the time
+ * to send the next periodic HID Report.
+ *
+ * Parameters:
+ *
+ * @param[in] id The identifier for the HID Report (see 5.6, 6.2.2.7, 8.1 and 8.2)
+ * A value of zero means the application does not use Report IDs.
+ *
+ * @param[in] time The time when the HID Report for the given \a id was sent.
+ */
+void hidCaptureReportTime( const unsigned id, const unsigned time );
+
/**
* \brief Register that a previously changed HID Report data has been sent
* to the USB Host.
@@ -134,22 +173,24 @@ typedef struct
* HID data has been reported to the USB Host.
*
* \warning This function will fail silently if given an id that is not
- * either the value zero, or a Report ID that is in use.
+ * either the value zero (in the case that Report IDs are not in use),
+ * or a Report ID that is in use.
*
* \param[in] id A HID Report ID.
- * Zero clears the pending status of all Report IDs.
* Use zero if the application does not use Report IDs.
*/
void hidClearChangePending( const unsigned id );
/**
- * @brief Indicate if the HID Report descriptor has been prepared
- *
- * \returns A Boolean indicating whether the HID Report descriptor has been prepared.
- * \retval True The HID Report descriptor has been prepared.
- * \retval False The HID Report descriptor has not been prepared.
+ * @brief Get the next valid report ID - iterator style.
+ *
+ * This function will loop around and start returning the first report ID again once it has
+ * returned all valid report IDs.
+ *
+ * @param idPrev The previous returned id, or 0 if this is the first call
+ * @return unsigned The next valid report ID.
*/
- unsigned hidIsReportDescriptorPrepared( void );
+unsigned hidGetNextValidReportId ( unsigned idPrev );
/**
* @brief Get the HID Report descriptor
@@ -190,44 +231,6 @@ size_t hidGetReportDescriptorLength( void );
*/
unsigned hidGetReportIdLimit ( void );
-/**
- * @brief Does the application use Report IDs?
- *
- * If the application is not using Report IDs, then the id value that is passed around
- * everywhere can just be zero. Otherwise zero is an invalid ID that has a special meaning
- * in some cases (read the documentation for each function).
- *
- * @return Boolean
- * @retval 1 Report IDs are in use
- * @retval 0 Report IDs are not in use
- */
-unsigned hidIsReportIdInUse ( void );
-
-/**
- * @brief Is the provided report ID valid for passing to other functions.
- *
- * e.g If Report IDs are not in use, then only 0 will return true.
- * e.g If Report IDs are in use, then 0 will return false and the report IDs that
- * are in use will return true when passed to thsi function.
- *
- * @param id The ID to check
- * @return boolean
- * @retval 0 The report ID is not valid, other functions may fail silently
- * @retval 1 The report ID is valid and can be used as the argument to other functions
- */
-unsigned hidIsReportIdValid ( unsigned id );
-
-/**
- * @brief Get the next valid report ID - iterator style.
- *
- * This function will loop around and start returning the first report ID again once it has
- * returned all valid report IDs.
- *
- * @param idPrev The previous returned id, or 0 if this is the first call
- * @return unsigned The next valid report ID.
- */
-unsigned hidGetNextValidReportId ( unsigned idPrev );
-
/**
* @brief Get a HID Report descriptor item
*
@@ -265,45 +268,6 @@ unsigned hidGetReportItem(
unsigned char data[]);
#endif
-/**
- * \brief Calculate the next time to respond with a HID Report.
- *
- * If the USB Host has previously sent a valid HID Set_Idle request with
- * a duration of zero or greater than the default reporting interval,
- * the device sends HID Reports periodically or when the value of the
- * payload has changed.
- *
- * This function calculates the time for sending the next periodic
- * HID Report.
- *
- * Parameters:
- *
- * @param[in] id The identifier for the HID Report (see 5.6, 6.2.2.7, 8.1 and 8.2)
- * A value of zero means the application does not use Report IDs.
- */
-void hidCalcNextReportTime( const unsigned id );
-
-/**
- * \brief Capture the time of sending the current HID Report.
- *
- * If the USB Host has previously sent a valid HID Set_Idle request with
- * a duration of zero or greater than the default reporting interval,
- * the device sends HID Reports periodically or when the value of the
- * payload has changed.
- *
- * This function captures the time when the HID Report was sent so that
- * a subsequent call to HidCalNextReportTime() can calculate the time
- * to send the next periodic HID Report.
- *
- * Parameters:
- *
- * @param[in] id The identifier for the HID Report (see 5.6, 6.2.2.7, 8.1 and 8.2)
- * A value of zero means the application does not use Report IDs.
- *
- * @param[in] time The time when the HID Report for the given \a id was sent.
- */
-void hidCaptureReportTime( const unsigned id, const unsigned time );
-
/**
* @brief Get the time to send the next HID Report for the given \a id
*
@@ -378,18 +342,16 @@ unsigned hidGetReportTime( const unsigned id );
* whether unreported HID data exists for that Report ID.
*
* \warning This function will return zero if given an id that is not
- * either the value zero, or a Report ID that is in use.
+ * either the value zero (in the case that Report IDs are not in use),
+ * or a Report ID that is in use.
*
* \param[in] id A HID Report ID.
- * Zero reports the pending status of all Report IDs.
* Use zero if the application does not use Report IDs.
*
* \returns A Boolean indicating whether the given \a id has a changed
* HID Report not yet sent to the USB Host.
* \retval True The given \a id has changed HID Report data.
- * For an \a id of zero, some HID Report has changed data.
* \retval False The given \a id does not have changed HID Report data.
- * For an \a id of zero, no HID Report has changed data.
*/
unsigned hidIsChangePending( const unsigned id );
@@ -399,16 +361,48 @@ unsigned hidIsChangePending( const unsigned id );
* Parameters:
*
* @param[in] id The identifier for the HID Report (see 5.6, 6.2.2.7, 8.1 and 8.2)
- * A value of zero returns the collective Idle state.
*
* \returns A Boolean indicating whether the HID Report for the given \a id is idle.
* \retval True The HID Report is idle.
- * For an \a id of zero, all HID Reports are idle.
* \retval False The HID Report is not idle.
- * For an \a id of zero, at least one HID Report is not idle.
*/
unsigned hidIsIdleActive( const unsigned id );
+/**
+ * @brief Indicate if the HID Report descriptor has been prepared
+ *
+ * \returns A Boolean indicating whether the HID Report descriptor has been prepared.
+ * \retval True The HID Report descriptor has been prepared.
+ * \retval False The HID Report descriptor has not been prepared.
+ */
+ unsigned hidIsReportDescriptorPrepared( void );
+
+/**
+ * @brief Does the application use Report IDs?
+ *
+ * If the application is not using Report IDs, then the id value that is passed around
+ * everywhere can just be zero. Otherwise zero is an invalid ID.
+ *
+ * @return Boolean
+ * @retval 1 Report IDs are in use
+ * @retval 0 Report IDs are not in use
+ */
+unsigned hidIsReportIdInUse ( void );
+
+/**
+ * @brief Is the provided report ID valid for passing to other functions.
+ *
+ * e.g If Report IDs are not in use, then only 0 will return true.
+ * e.g If Report IDs are in use, then 0 will return false and the report IDs that
+ * are in use will return true when passed to this function.
+ *
+ * @param id The ID to check
+ * @return boolean
+ * @retval 0 The report ID is not valid, other functions may fail silently
+ * @retval 1 The report ID is valid and can be used as the argument to other functions
+ */
+unsigned hidIsReportIdValid ( unsigned id );
+
/**
* @brief Prepare the USB HID Report descriptor
*
@@ -454,7 +448,8 @@ void hidResetReportDescriptor( void );
* Host.
*
* \warning This function will fail silently if given an id that is not
- * either the value zero, or a Report ID that is in use.
+ * either the value zero (in the case that Report IDs are not in use),
+ * or a Report ID that is in use.
*
* \param[in] id A HID Report ID.
* Use zero if the application does not use Report IDs.
diff --git a/module_locks/README.rst b/module_locks/README.rst
new file mode 100644
index 00000000..ecde319a
--- /dev/null
+++ b/module_locks/README.rst
@@ -0,0 +1,7 @@
+module_locks Readme
+===================
+
+:scope: Dummy module
+:description: Allows compiling legacy_tests in lib_xua with lib_locks. sc_i2c is used in the tests and it requires module_locks from sc_util, but the definitions in sc_utils conflict with the ones in lib_locks.
+:keywords: dummy
+:boards: XMOS Dev Kit
diff --git a/module_locks/module_build_info b/module_locks/module_build_info
new file mode 100644
index 00000000..d90ffd43
--- /dev/null
+++ b/module_locks/module_build_info
@@ -0,0 +1 @@
+# Dummy module used in legacy_tests. See README.rst for more details.
diff --git a/tests/xua_unit_tests/src/test_multi_report/test_hid_multi_report.c b/tests/xua_unit_tests/src/test_multi_report/test_hid_multi_report.c
index bad4c699..d5f01760 100644
--- a/tests/xua_unit_tests/src/test_multi_report/test_hid_multi_report.c
+++ b/tests/xua_unit_tests/src/test_multi_report/test_hid_multi_report.c
@@ -1,4 +1,4 @@
-// Copyright 2021 XMOS LIMITED.
+// Copyright 2021-2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include
#include
@@ -775,7 +775,6 @@ void test_initial_modification_with_subsequent_verification_2( void )
//setIdle and associated timing functionality tests
void test_set_idle( void )
{
- unsigned reportIdAll = 0;
unsigned reportId = 1;
unsigned reportId2 = 2;
@@ -785,23 +784,16 @@ void test_set_idle( void )
setIdle = hidIsIdleActive( reportId2 );
TEST_ASSERT_EQUAL_UINT( 0, setIdle );
- setIdle = hidIsIdleActive( reportIdAll );
- TEST_ASSERT_EQUAL_UINT( 0, setIdle );
-
hidSetIdle( reportId, 1 );
setIdle = hidIsIdleActive( reportId );
TEST_ASSERT_EQUAL_UINT( 1, setIdle );
- setIdle = hidIsIdleActive( reportIdAll );
- TEST_ASSERT_EQUAL_UINT( 0, setIdle );
-
setIdle = hidIsIdleActive( reportId2 );
TEST_ASSERT_EQUAL_UINT( 0, setIdle );
}
void test_set_all_idle( void )
{
- unsigned reportIdAll = 0;
unsigned reportId = 1;
unsigned reportId2 = 2;
@@ -811,22 +803,15 @@ void test_set_all_idle( void )
setIdle = hidIsIdleActive( reportId2 );
TEST_ASSERT_EQUAL_UINT( 0, setIdle );
- setIdle = hidIsIdleActive( reportIdAll );
- TEST_ASSERT_EQUAL_UINT( 0, setIdle );
-
for ( reportId = 1; reportId <= HID_REPORT_COUNT; ++reportId ) {
hidSetIdle( reportId, 1 );
setIdle = hidIsIdleActive( reportId );
TEST_ASSERT_EQUAL_UINT( 1, setIdle );
}
-
- setIdle = hidIsIdleActive( reportIdAll );
- TEST_ASSERT_EQUAL_UINT( 1, setIdle );
}
void test_change_pending( void )
{
- unsigned reportIdAll = 0;
unsigned reportId = 1;
unsigned reportId2 = 2;
@@ -836,39 +821,26 @@ void test_change_pending( void )
changePending = hidIsChangePending( reportId2 );
TEST_ASSERT_EQUAL_UINT( 0, changePending );
- changePending = hidIsChangePending( reportIdAll );
- TEST_ASSERT_EQUAL_UINT( 0, changePending );
-
hidSetChangePending( reportId );
changePending = hidIsChangePending( reportId );
TEST_ASSERT_EQUAL_UINT( 1, changePending );
- changePending = hidIsChangePending( reportIdAll );
- TEST_ASSERT_EQUAL_UINT( 1, changePending );
-
changePending = hidIsChangePending( reportId2 );
TEST_ASSERT_EQUAL_UINT( 0, changePending );
}
void test_change_pending_all( void )
{
- unsigned reportIdAll = 0;
unsigned reportId = 1;
unsigned changePending = hidIsChangePending( reportId );
TEST_ASSERT_EQUAL_UINT( 0, changePending );
- changePending = hidIsChangePending( reportIdAll );
- TEST_ASSERT_EQUAL_UINT( 0, changePending );
-
for ( reportId = 1; reportId <= HID_REPORT_COUNT; ++reportId ) {
hidSetChangePending( reportId );
changePending = hidIsChangePending( reportId );
TEST_ASSERT_EQUAL_UINT( 1, changePending );
}
-
- changePending = hidIsChangePending( reportIdAll );
- TEST_ASSERT_EQUAL_UINT( 1, changePending );
}
void test_report_time( void )
diff --git a/tests/xua_unit_tests/src/test_simple/test_hid.c b/tests/xua_unit_tests/src/test_simple/test_hid.c
index 856edd79..3bd930bc 100644
--- a/tests/xua_unit_tests/src/test_simple/test_hid.c
+++ b/tests/xua_unit_tests/src/test_simple/test_hid.c
@@ -1,4 +1,4 @@
-// Copyright 2021 XMOS LIMITED.
+// Copyright 2021-2022 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include
#include
diff --git a/xpd.xml b/xpd.xml
deleted file mode 100644
index 65d892c5..00000000
--- a/xpd.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-
-
-
-
- XMOS USB Audio Reference Designes
- DFU
-
-
-
- UAC2
-
-
- XR-USB-AUDIO-20-MC
- USB Audio UAC2
-
-
-
- module_queue
- MIDI
-
-
- USB Audio Shared Components. For use in the XMOS USB Audio Refererence Designs.
- module_dfu/doc
- False
- git://git/apps/sc_usb_audio
- USB Audio Shared Components
- xross
- XM-004719-DH
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- XM-004720-SM
- XMOS
-
-
-
-
-
- 1.0
-
\ No newline at end of file