From 45e5ef770221860b0495a7eb8d4c548676e89304 Mon Sep 17 00:00:00 2001 From: Henk Muller Date: Sat, 10 Jun 2023 18:07:25 +0100 Subject: [PATCH 1/9] Enabling a static HID report descriptor in addition to the built-in dynamically created one. This is required for AudioWeaver. This also enables the option of an OUT HID endpoint --- lib_xua/api/xua_conf_default.h | 39 +++- lib_xua/module_build_info | 2 +- lib_xua/src/core/buffer/ep/ep_buffer.xc | 10 +- lib_xua/src/core/endpoint0/descriptor_defs.h | 7 +- lib_xua/src/core/endpoint0/xua_endpoint0.c | 24 +- .../src/core/endpoint0/xua_ep0_descriptors.h | 17 +- lib_xua/src/core/main.xc | 218 +++++++----------- lib_xua/src/core/user/hid/user_hid.h | 2 +- lib_xua/src/hid/hid.xc | 2 +- lib_xua/src/hid/hid_report.c | 2 +- .../xua_hid_endpoint_descriptor_contents.h | 28 +++ .../xua_hid_interface_descriptor_contents.h | 3 +- 12 files changed, 200 insertions(+), 154 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 8b6242cd..d78457d3 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -431,6 +431,40 @@ #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) * @@ -1146,7 +1180,7 @@ enum USBEndpointNumber_In #ifdef MIDI ENDPOINT_NUMBER_IN_MIDI, #endif -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED ENDPOINT_NUMBER_IN_HID, #endif #ifdef IAP @@ -1173,6 +1207,9 @@ 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 */ }; diff --git a/lib_xua/module_build_info b/lib_xua/module_build_info index b95b65f6..f66eb0f0 100644 --- a/lib_xua/module_build_info +++ b/lib_xua/module_build_info @@ -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 +OPTIONAL_HEADERS += xua_conf.h static_hid_report.h EXPORT_INCLUDE_DIRS = api \ src/core \ diff --git a/lib_xua/src/core/buffer/ep/ep_buffer.xc b/lib_xua/src/core/buffer/ep/ep_buffer.xc index 0fc7a13e..20d84bcd 100644 --- a/lib_xua/src/core/buffer/ep/ep_buffer.xc +++ b/lib_xua/src/core/buffer/ep/ep_buffer.xc @@ -10,7 +10,7 @@ #include "xud.h" #include "testct_byref.h" -#if( 0 < HID_CONTROLS ) +#if XUA_HID_ENABLED #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( 0 < HID_CONTROLS ) +#if XUA_HID_ENABLED , 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( 0 < HID_CONTROLS ) +#if XUA_HID_ENABLED 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( 0 < HID_CONTROLS ) +#if XUA_HID_ENABLED while (!hidIsReportDescriptorPrepared()) ; @@ -897,7 +897,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out, #endif #endif -#if( 0 < HID_CONTROLS ) +#if XUA_HID_ENABLED /* HID Report Data */ case XUD_SetData_Select(c_hid, ep_hid, result): hid_ready_flag = 0U; diff --git a/lib_xua/src/core/endpoint0/descriptor_defs.h b/lib_xua/src/core/endpoint0/descriptor_defs.h index 42567878..c7dc866b 100644 --- a/lib_xua/src/core/endpoint0/descriptor_defs.h +++ b/lib_xua/src/core/endpoint0/descriptor_defs.h @@ -33,6 +33,7 @@ #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 @@ -60,7 +61,7 @@ enum USBInterfaceNumber INTERFACE_NUMBER_IAP_EA_NATIVE_TRANS, #endif #endif -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED INTERFACE_NUMBER_HID, #endif INTERFACE_COUNT /* End marker */ @@ -70,4 +71,8 @@ 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 diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index a21e605a..c24dfefc 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -26,7 +26,7 @@ #include "xc_ptr.h" #include "xua_ep0_uacreqs.h" -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED #include "hid.h" #include "xua_hid.h" #include "xua_hid_report.h" @@ -442,6 +442,15 @@ 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_) { @@ -513,11 +522,13 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, NULLABLE_RESOURCE(c #endif // XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED +#if XUA_HID_ENABLED hidReportInit(); hidPrepareReportDescriptor(); size_t hidReportDescriptorLength = hidGetReportDescriptorLength(); +#endif unsigned char hidReportDescriptorLengthLo = hidReportDescriptorLength & 0xFF; unsigned char hidReportDescriptorLengthHi = (hidReportDescriptorLength & 0xFF00) >> 8; @@ -528,6 +539,7 @@ 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 } @@ -731,7 +743,7 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0 switch(sp.bRequest) { -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED case USB_GET_DESCRIPTOR: /* Check what inteface request is for */ @@ -746,15 +758,17 @@ 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, - sizeof(hidDescriptor), sp.wLength); + hidDescriptor[0], 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); } @@ -858,7 +872,7 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0 } } #endif -#if( 0 < HID_CONTROLS ) +#if XUA_HID_ENABLED if (interfaceNum == INTERFACE_NUMBER_HID) { result = HidInterfaceClassRequests(ep0_out, ep0_in, &sp); diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 91fd3b94..f08697ca 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -787,10 +787,13 @@ typedef struct #endif #endif // IAP -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED 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; @@ -2208,14 +2211,14 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2= #endif #endif /* IAP */ -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED #include "xua_hid_descriptors.h" #endif }; #endif /* (AUDIO_CLASS == 2) */ -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED #if (AUDIO_CLASS ==1 ) unsigned char hidDescriptor[] = { @@ -2330,14 +2333,14 @@ const unsigned num_freqs_a1 = MAX(3, (0 #define DFU_INTERFACES_A1 0 #endif -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED /* * 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 ) +#define HID_INTERFACE_BYTES ( 9 + 9 + (7 * (1 + HID_OUT_REQUIRED))) // always IN #define HID_INTERFACES_A1 1 #else #define HID_INTERFACE_BYTES 0 @@ -2379,7 +2382,7 @@ const unsigned num_freqs_a1 = MAX(3, (0 #endif -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED #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 @@ -2893,7 +2896,7 @@ unsigned char cfgDesc_Audio1[] = offsetof(StringDescTable_t, ctrlStr)/sizeof(char *), /* 8 iInterface */ #endif -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED #include "xua_hid_descriptors.h" #endif diff --git a/lib_xua/src/core/main.xc b/lib_xua/src/core/main.xc index 17c418e1..1e2a5145 100755 --- a/lib_xua/src/core/main.xc +++ b/lib_xua/src/core/main.xc @@ -213,6 +213,9 @@ 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 @@ -233,7 +236,7 @@ XUD_EpType epTypeTableIn[ENDPOINT_COUNT_IN] = { XUD_EPTYPE_CTL | XUD_STATUS_ENAB #ifdef MIDI XUD_EPTYPE_BUL, #endif -#if( 0 < HID_CONTROLS ) +#if XUA_OR_STATIC_HID_ENABLED XUD_EPTYPE_INT, #endif #ifdef IAP @@ -267,115 +270,6 @@ 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) { @@ -575,6 +469,20 @@ 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 @@ -597,27 +505,77 @@ int main() #endif #endif #if XUA_USB_EN - /* Core USB audio task, buffering, USB etc */ - usb_audio_core(c_mix_out -#ifdef MIDI - , c_midi -#endif -#ifdef IAP - , c_iap -#ifdef IAP_EA_NATIVE_TRANS - , c_ea_data -#endif -#endif -#if (MIXER) - , c_mix_ctl -#endif - , c_clk_int, c_clk_ctl, dfuInterface -#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) - , i_pll_ref -#endif - VENDOR_REQUESTS_PARAMS_ - ); + /* 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 +#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 (XUA_HID_ENABLED) + , 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 */ } diff --git a/lib_xua/src/core/user/hid/user_hid.h b/lib_xua/src/core/user/hid/user_hid.h index b17a4dd5..c14411a7 100644 --- a/lib_xua/src/core/user/hid/user_hid.h +++ b/lib_xua/src/core/user/hid/user_hid.h @@ -34,7 +34,7 @@ typedef struct hidEvent_t { #define HID_MAX_DATA_BYTES ( 4 ) #define HID_EVENT_INVALID_ID ( 0x100 ) -#if( 0 < HID_CONTROLS ) +#if XUA_HID_REQUIRED /** * \brief Get the data for the next HID Report diff --git a/lib_xua/src/hid/hid.xc b/lib_xua/src/hid/hid.xc index 0f506d59..ade13c4a 100644 --- a/lib_xua/src/hid/hid.xc +++ b/lib_xua/src/hid/hid.xc @@ -13,7 +13,7 @@ #define DEBUG_PRINT_ENABLE_HID_XC 0 #include "debug_print.h" -#if( 0 < HID_CONTROLS ) +#if XUA_HID_ENABLED 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 ); diff --git a/lib_xua/src/hid/hid_report.c b/lib_xua/src/hid/hid_report.c index 204f6235..28161776 100644 --- a/lib_xua/src/hid/hid_report.c +++ b/lib_xua/src/hid/hid_report.c @@ -1,7 +1,7 @@ // 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( 0 < HID_CONTROLS ) +#if XUA_HID_ENABLED #include #include diff --git a/lib_xua/src/hid/xua_hid_endpoint_descriptor_contents.h b/lib_xua/src/hid/xua_hid_endpoint_descriptor_contents.h index d6bcc6b3..17ec8cf3 100644 --- a/lib_xua/src/hid/xua_hid_endpoint_descriptor_contents.h +++ b/lib_xua/src/hid/xua_hid_endpoint_descriptor_contents.h @@ -31,6 +31,19 @@ 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 = @@ -44,6 +57,21 @@ .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 diff --git a/lib_xua/src/hid/xua_hid_interface_descriptor_contents.h b/lib_xua/src/hid/xua_hid_interface_descriptor_contents.h index 83d69fbd..241b673e 100644 --- a/lib_xua/src/hid/xua_hid_interface_descriptor_contents.h +++ b/lib_xua/src/hid/xua_hid_interface_descriptor_contents.h @@ -15,7 +15,8 @@ #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 ) /* Number of endpoitns for this interface (excluding 0) */ +#define HID_INTERFACE_NUMBER_OF_ENDPOINTS ( 0x01 + HID_OUT_REQUIRED ) + /* Number of endpoints for this interface (excluding 0) */ #define HID_INTERFACE_CLASS ( 0x03 ) #define HID_INTERFACE_SUBCLASS ( 0x00 ) /* No boot device */ #define HID_INTERFACE_PROTOCOL ( 0x00 ) From 136ec2506cbbcb18ac0c9eea929b63a15f02147b Mon Sep 17 00:00:00 2001 From: Henk Muller Date: Mon, 12 Jun 2023 09:20:43 +0100 Subject: [PATCH 2/9] One of the intermediate XUA_HID_REQUIRED slipped through the refactoring --- lib_xua/src/core/user/hid/user_hid.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/core/user/hid/user_hid.h b/lib_xua/src/core/user/hid/user_hid.h index c14411a7..a391601a 100644 --- a/lib_xua/src/core/user/hid/user_hid.h +++ b/lib_xua/src/core/user/hid/user_hid.h @@ -34,7 +34,7 @@ typedef struct hidEvent_t { #define HID_MAX_DATA_BYTES ( 4 ) #define HID_EVENT_INVALID_ID ( 0x100 ) -#if XUA_HID_REQUIRED +#if XUA_HID_ENABLED /** * \brief Get the data for the next HID Report From 1702078e7c0c3e3bad3b5674273d5a248f4cdad1 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 12 Jun 2023 17:14:42 +0100 Subject: [PATCH 3/9] Update copyright comment --- lib_xua/src/core/buffer/ep/ep_buffer.xc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/core/buffer/ep/ep_buffer.xc b/lib_xua/src/core/buffer/ep/ep_buffer.xc index 20d84bcd..a2e42199 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-2022 XMOS LIMITED. +// Copyright 2011-2023 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. #include "xua.h" #if XUA_USB_EN From b0e732110da5deeb9d57cafc28f7e3ed8c917b6d Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 12 Jun 2023 17:15:21 +0100 Subject: [PATCH 4/9] Update copyright comment --- lib_xua/src/core/endpoint0/descriptor_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/core/endpoint0/descriptor_defs.h b/lib_xua/src/core/endpoint0/descriptor_defs.h index c7dc866b..c547dfad 100644 --- a/lib_xua/src/core/endpoint0/descriptor_defs.h +++ b/lib_xua/src/core/endpoint0/descriptor_defs.h @@ -1,4 +1,4 @@ -// Copyright 2015-2021 XMOS LIMITED. +// Copyright 2015-2023 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. #ifndef __DESCRIPTOR_DEFS_H__ From 5ca0738b026748be8ba8dff3878e5f3dcad2c7e0 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 12 Jun 2023 17:15:42 +0100 Subject: [PATCH 5/9] Update copyright comment --- lib_xua/src/core/user/hid/user_hid.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/core/user/hid/user_hid.h b/lib_xua/src/core/user/hid/user_hid.h index a391601a..b5c6090d 100644 --- a/lib_xua/src/core/user/hid/user_hid.h +++ b/lib_xua/src/core/user/hid/user_hid.h @@ -1,4 +1,4 @@ -// Copyright 2013-2021 XMOS LIMITED. +// Copyright 2013-2023 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. /** From a6387d5fefa0120cf70a9b00c5350f910c6236c9 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 12 Jun 2023 17:16:11 +0100 Subject: [PATCH 6/9] Update copyright comment --- lib_xua/src/hid/hid.xc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/hid/hid.xc b/lib_xua/src/hid/hid.xc index ade13c4a..99d33b51 100644 --- a/lib_xua/src/hid/hid.xc +++ b/lib_xua/src/hid/hid.xc @@ -1,4 +1,4 @@ -// Copyright 2019-2022 XMOS LIMITED. +// Copyright 2019-2023 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. #include #include From 3d7e66bdc07c5208cdc0c379392ccf6ac59de627 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 12 Jun 2023 17:16:26 +0100 Subject: [PATCH 7/9] Update copyright comment --- lib_xua/src/hid/hid_report.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/hid/hid_report.c b/lib_xua/src/hid/hid_report.c index 28161776..f74c478d 100644 --- a/lib_xua/src/hid/hid_report.c +++ b/lib_xua/src/hid/hid_report.c @@ -1,4 +1,4 @@ -// Copyright 2021-2022 XMOS LIMITED. +// Copyright 2021-2023 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 From 799ad7ba868fa35ed580f36f7722e53d855c4c19 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 12 Jun 2023 17:16:43 +0100 Subject: [PATCH 8/9] Update copyright comment --- lib_xua/src/hid/xua_hid_endpoint_descriptor_contents.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/hid/xua_hid_endpoint_descriptor_contents.h b/lib_xua/src/hid/xua_hid_endpoint_descriptor_contents.h index 17ec8cf3..293ee13c 100644 --- a/lib_xua/src/hid/xua_hid_endpoint_descriptor_contents.h +++ b/lib_xua/src/hid/xua_hid_endpoint_descriptor_contents.h @@ -1,4 +1,4 @@ -// Copyright 2021 XMOS LIMITED. +// Copyright 2023 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. /** From 6815f12a903cf2000cbac8f41177e61291879654 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 12 Jun 2023 17:16:56 +0100 Subject: [PATCH 9/9] Update copyright comment --- lib_xua/src/hid/xua_hid_interface_descriptor_contents.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/hid/xua_hid_interface_descriptor_contents.h b/lib_xua/src/hid/xua_hid_interface_descriptor_contents.h index 241b673e..548bb4ec 100644 --- a/lib_xua/src/hid/xua_hid_interface_descriptor_contents.h +++ b/lib_xua/src/hid/xua_hid_interface_descriptor_contents.h @@ -1,4 +1,4 @@ -// Copyright 2021 XMOS LIMITED. +// Copyright 2023 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. /**