From 2c3604311951264f8456463ca8268dd8f3f900c8 Mon Sep 17 00:00:00 2001 From: Richard Osborne Date: Tue, 3 Dec 2013 18:10:40 +0000 Subject: [PATCH 1/5] Assign unique string indexes using a enum instead of #defines. --- module_usb_audio/endpoint0/descriptors.h | 44 +++++++++--------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/module_usb_audio/endpoint0/descriptors.h b/module_usb_audio/endpoint0/descriptors.h index 8d494be6..46abddea 100644 --- a/module_usb_audio/endpoint0/descriptors.h +++ b/module_usb_audio/endpoint0/descriptors.h @@ -243,44 +243,32 @@ unsigned char devQualDesc_Null[] = // Positions in strDescs_Audio2 -#define INTERNAL_CLOCK_STRING_INDEX (14) -#define SPDIF_CLOCK_STRING_INDEX (15) - +enum { + INTERNAL_CLOCK_STRING_INDEX = 14, #ifdef SPDIF_RX -#define ADAT_CLOCK_STRING_INDEX (SPDIF_CLOCK_STRING_INDEX + 1) -#else -#define ADAT_CLOCK_STRING_INDEX (SPDIF_CLOCK_STRING_INDEX) + SPDIF_CLOCK_STRING_INDEX, #endif - #ifdef ADAT_RX -#define DFU_STRING_INDEX (ADAT_CLOCK_STRING_INDEX + 1) -#else -#define DFU_STRING_INDEX (ADAT_CLOCK_STRING_INDEX) + ADAT_CLOCK_STRING_INDEX, #endif - #ifdef DFU -#define MIDI_OUT_STRING_INDEX (DFU_STRING_INDEX + 1) -#else -#define MIDI_OUT_STRING_INDEX (DFU_STRING_INDEX) + DFU_STRING_INDEX, #endif - -#define MIDI_IN_STRING_INDEX (MIDI_OUT_STRING_INDEX + 1) - #ifdef MIDI -#define OUTPUT_INTERFACE_STRING_INDEX (MIDI_OUT_STRING_INDEX + 2) -#else -#define OUTPUT_INTERFACE_STRING_INDEX (MIDI_OUT_STRING_INDEX) + MIDI_OUT_STRING_INDEX, + MIDI_IN_STRING_INDEX, #endif - -#define INPUT_INTERFACE_STRING_INDEX (OUTPUT_INTERFACE_STRING_INDEX + NUM_USB_CHAN_OUT) - -#define MIXER_STRING_INDEX (INPUT_INTERFACE_STRING_INDEX + NUM_USB_CHAN_IN) - + OUTPUT_INTERFACE_STRING_INDEX, + OUTPUT_INTERFACE_LAST_STRING_INDEX = OUTPUT_INTERFACE_STRING_INDEX + NUM_USB_CHAN_OUT - 1, + INPUT_INTERFACE_STRING_INDEX, + INPUT_INTERFACE_LAST_STRING_INDEX = INPUT_INTERFACE_STRING_INDEX + NUM_USB_CHAN_IN - 1, #ifdef MIXER -#define IAP_INTERFACE_STRING_INDEX (MIXER_STRING_INDEX + MAX_MIX_COUNT) -#else -#define IAP_INTERFACE_STRING_INDEX (MIXER_STRING_INDEX) + MIXER_STRING_INDEX, #endif +#ifdef IAP + IAP_INTERFACE_STRING_INDEX, +#endif +}; #ifdef HID_CONTROLS unsigned char hidReportDescriptor[] = { From 47d56e71385330144dd8e1aa59a1db3800e1973c Mon Sep 17 00:00:00 2001 From: Richard Osborne Date: Tue, 3 Dec 2013 18:10:56 +0000 Subject: [PATCH 2/5] Update comment. --- module_usb_audio/endpoint0/descriptors.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_usb_audio/endpoint0/descriptors.h b/module_usb_audio/endpoint0/descriptors.h index 46abddea..a98a8fe3 100644 --- a/module_usb_audio/endpoint0/descriptors.h +++ b/module_usb_audio/endpoint0/descriptors.h @@ -242,7 +242,7 @@ unsigned char devQualDesc_Null[] = #define OUTPUT_ALT_LENGTH (OUTPUT_ALT_LENGTH_ADAT + OUTPUT_ALT_LENGTH_DSD) -// Positions in strDescs_Audio2 +// Positions in strDescs enum { INTERNAL_CLOCK_STRING_INDEX = 14, #ifdef SPDIF_RX From c337eccf0add0c96f6f6aa4374c7852b35b0237a Mon Sep 17 00:00:00 2001 From: Richard Osborne Date: Wed, 4 Dec 2013 11:46:18 +0000 Subject: [PATCH 3/5] Remove duplicate constants for string indicies. It looks like STR_INDEX_OUT_CHAN STR_INDEX_IN_CHAN weren't calculated correctly, and we already have existing constants for the index of the input / output strings. --- module_usb_audio/endpoint0/descriptors.h | 30 ------------------ module_usb_audio/endpoint0/endpoint0.xc | 40 ++++++++++++------------ 2 files changed, 20 insertions(+), 50 deletions(-) diff --git a/module_usb_audio/endpoint0/descriptors.h b/module_usb_audio/endpoint0/descriptors.h index a98a8fe3..3e6911e9 100644 --- a/module_usb_audio/endpoint0/descriptors.h +++ b/module_usb_audio/endpoint0/descriptors.h @@ -1390,36 +1390,6 @@ unsigned char cfgDesc_Audio2[] = }; - - -/* String table */ -#ifdef SPDIF_RX -#define SPDIF_RX_NUM_STRS 1 -#else -#define SPDIF_RX_NUM_STRS 0 -#endif - -#ifdef ADAT_RX -#define ADAT_RX_NUM_STRS 1 -#else -#define ADAT_RX_NUM_STRS 0 -#endif - -#ifdef MIDI -#define MIDI_NUM_STRS 2 -#else -#define MIDI_NUM_STRS 0 -#endif - -#ifdef DFU -#define DFU_NUM_STRS 1 -#else -#define DFU_NUM_STRS 0 -#endif - -#define STR_INDEX_OUT_CHAN (10 + SPDIF_RX_NUM_STRS + ADAT_RX_NUM_STRS + MIDI_NUM_STRS + DFU_NUM_STRS) -#define STR_INDEX_IN_CHAN (STR_INDEX_OUT_CHAN + NUM_USB_CHAN_OUT) - #define APPEND_VENDOR_STR(x) VENDOR_STR" "#x #define APPEND_PRODUCT_STR_A2(x) PRODUCT_STR_A2 " "#x diff --git a/module_usb_audio/endpoint0/endpoint0.xc b/module_usb_audio/endpoint0/endpoint0.xc index ef389052..b69e66a0 100755 --- a/module_usb_audio/endpoint0/endpoint0.xc +++ b/module_usb_audio/endpoint0/endpoint0.xc @@ -198,33 +198,33 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, /* Build up channel string table - By default all channels are marked as analogue * TODO We really want to do this an build time... */ #if defined(SPDIF_RX) && (SPDIF_RX_INDEX != 0) - safestrcpy(strDescs[SPDIF_RX_INDEX + STR_INDEX_IN_CHAN], "S/PDIF 1"); - safestrcpy(strDescs[SPDIF_RX_INDEX + STR_INDEX_IN_CHAN + 1], "S/PDIF 2"); + safestrcpy(strDescs[SPDIF_RX_INDEX + INPUT_INTERFACE_STRING_INDEX], "S/PDIF 1"); + safestrcpy(strDescs[SPDIF_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 1], "S/PDIF 2"); #endif #if defined(ADAT_RX) && (ADAT_RX_INDEX != 0) - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN], "ADAT 1"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 1], "ADAT 2"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 2], "ADAT 3"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 3], "ADAT 4"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 4], "ADAT 5"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 5], "ADAT 6"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 6], "ADAT 7"); - safestrcpy(strDescs[ADAT_RX_INDEX + STR_INDEX_IN_CHAN + 7], "ADAT 8"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX], "ADAT 1"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 1], "ADAT 2"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 2], "ADAT 3"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 3], "ADAT 4"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 4], "ADAT 5"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 5], "ADAT 6"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 6], "ADAT 7"); + safestrcpy(strDescs[ADAT_RX_INDEX + INPUT_INTERFACE_STRING_INDEX + 7], "ADAT 8"); #endif #if defined(SPDIF) && (SPDIF_TX_INDEX != 0) /* "Analogue naming gets priority */ - safestrcpy(strDescs[SPDIF_TX_INDEX + STR_INDEX_OUT_CHAN], "S/PDIF 1"); - safestrcpy(strDescs[SPDIF_TX_INDEX + STR_INDEX_OUT_CHAN + 1], "S/PDIF 2"); + safestrcpy(strDescs[SPDIF_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX], "S/PDIF 1"); + safestrcpy(strDescs[SPDIF_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 1], "S/PDIF 2"); #endif #if defined(ADAT_TX) && (ADAT_TX_INDEX != 0) - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN], "ADAT 1"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 1], "ADAT 2"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 2], "ADAT 3"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 3], "ADAT 4"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 4], "ADAT 5"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 5], "ADAT 6"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 6], "ADAT 7"); - safestrcpy(strDescs[ADAT_TX_INDEX + STR_INDEX_OUT_CHAN + 7], "ADAT 8"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX], "ADAT 1"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 1], "ADAT 2"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 2], "ADAT 3"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 3], "ADAT 4"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 4], "ADAT 5"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 5], "ADAT 6"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 6], "ADAT 7"); + safestrcpy(strDescs[ADAT_TX_INDEX + OUTPUT_INTERFACE_STRING_INDEX + 7], "ADAT 8"); #endif #ifdef VENDOR_AUDIO_REQS From 4b6b98af107819db53cb3470b9807620be1d12b5 Mon Sep 17 00:00:00 2001 From: Richard Osborne Date: Wed, 4 Dec 2013 16:24:22 +0000 Subject: [PATCH 4/5] Remove unnecessary runtime initialization. --- module_usb_audio/endpoint0/descriptors.h | 7 +++++-- module_usb_audio/endpoint0/endpoint0.xc | 15 --------------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/module_usb_audio/endpoint0/descriptors.h b/module_usb_audio/endpoint0/descriptors.h index 3e6911e9..61f8aa95 100644 --- a/module_usb_audio/endpoint0/descriptors.h +++ b/module_usb_audio/endpoint0/descriptors.h @@ -1404,10 +1404,13 @@ unsigned char cfgDesc_Audio2[] = #endif #endif + +#define STR_USENG 0x0409 + static unsigned char strDescs[][40] = { - "Langids", // 0 LangIDs place holder - APPEND_VENDOR_STR(), // 1 iManufacturer (at MANUFACTURER_STRING_INDEX) + { STR_USENG & 0xff, STR_USENG >> 8, '\0'}, // 0 LangID + APPEND_VENDOR_STR(), // 1 iManufacturer (at MANUFACTURER_STRING_INDEX) "",//SERIAL_STR, // 2 iSerialNumber (at SERIAL_STR_INDEX) diff --git a/module_usb_audio/endpoint0/endpoint0.xc b/module_usb_audio/endpoint0/endpoint0.xc index b69e66a0..5bdd6205 100755 --- a/module_usb_audio/endpoint0/endpoint0.xc +++ b/module_usb_audio/endpoint0/endpoint0.xc @@ -100,24 +100,11 @@ unsigned g_curUsbSpeed = 0; extern unsigned g_iap_reset; #endif - -#define STR_USENG 0x0409 - -#define DESC_STR_LANGIDS \ -{ \ - STR_USENG & 0xff, /* 2 wLangID[0] */ \ - STR_USENG>>8, /* 3 wLangID[0] */ \ - '\0' \ -} - #ifdef NATIVE_DSD /* We remember if we are in DSD mode to avoid Configuring the DAC too often - thus avoiding pops and clicks */ unsigned g_dsdMode = 0; #endif -/* String descriptors */ -static unsigned char strDesc_langIDs[] = DESC_STR_LANGIDS; - void VendorAudioRequestsInit(chanend c_audioControl, chanend ?c_mix_ctl, chanend ?c_clk_ctl); /* Endpoint 0 function. Handles all requests to the device */ @@ -193,8 +180,6 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, } #endif - safememcpy(strDescs[0], strDesc_langIDs, sizeof(strDesc_langIDs)); - /* Build up channel string table - By default all channels are marked as analogue * TODO We really want to do this an build time... */ #if defined(SPDIF_RX) && (SPDIF_RX_INDEX != 0) From e7ade114d656bef6ab214c5859db29eaf5f78e04 Mon Sep 17 00:00:00 2001 From: Richard Osborne Date: Mon, 9 Dec 2013 18:21:50 +0000 Subject: [PATCH 5/5] Add functions for working with queues of bytes. This is used by the IAP code. --- module_queue/src/queue.h | 11 +++++++++++ module_queue/src/queue.xc | 2 ++ 2 files changed, 13 insertions(+) diff --git a/module_queue/src/queue.h b/module_queue/src/queue.h index 23e4cea5..39b57728 100644 --- a/module_queue/src/queue.h +++ b/module_queue/src/queue.h @@ -43,6 +43,17 @@ inline unsigned queue_pop_word(queue_t &q, unsigned array[]) { return array[q.rdptr++ & q.mask]; } +inline void queue_push_byte(queue_t &q, unsigned char array[], unsigned data) +{ + assert(!queue_is_full(q)); + array[q.wrptr++ & q.mask] = data; +} + +inline unsigned queue_pop_byte(queue_t &q, unsigned char array[]) { + assert(!queue_is_empty(q)); + return array[q.rdptr++ & q.mask]; +} + inline unsigned queue_items(const queue_t &q) { return q.wrptr - q.rdptr; } diff --git a/module_queue/src/queue.xc b/module_queue/src/queue.xc index 58c78248..c78f2b0f 100644 --- a/module_queue/src/queue.xc +++ b/module_queue/src/queue.xc @@ -7,5 +7,7 @@ extern inline int queue_is_empty(const queue_t &q); extern inline int queue_is_full(const queue_t &q); extern inline void queue_push_word(queue_t &q, unsigned array[], unsigned data); extern inline unsigned queue_pop_word(queue_t &q, unsigned array[]); +extern inline void queue_push_byte(queue_t &q, unsigned char array[], unsigned data); +extern inline unsigned queue_pop_byte(queue_t &q, unsigned char array[]); extern inline unsigned queue_space(const queue_t &q); extern inline unsigned queue_items(const queue_t &q);