summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2012-02-29 11:52:21 +0100
committerHarald Welte <laforge@gnumonks.org>2012-02-29 11:52:21 +0100
commitb6697b17fcf76dc56d095caa517ba489f1ff59e5 (patch)
tree292a1ae12f451343f6258c5876f1dce351c249fd
parentcc42e4df365a68580c21d92103bf106ce581c78d (diff)
fast_source: implement get/set of mute feature
this avoids unneccessary stalls on EP0
-rw-r--r--firmware/src/fast_source.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/firmware/src/fast_source.c b/firmware/src/fast_source.c
index 4cef913..fcc049d 100644
--- a/firmware/src/fast_source.c
+++ b/firmware/src/fast_source.c
@@ -33,6 +33,8 @@
#include <usb/device/core/USBDCallbacks.h>
#include <usb/common/audio/AUDGenericRequest.h>
#include <usb/common/audio/AUDFeatureUnitRequest.h>
+#include <usb/common/audio/AUDFeatureUnitDescriptor.h>
+
#include <fast_source_descr.h>
#include <fast_source.h>
@@ -44,6 +46,7 @@ static USBDDriver fast_source_driver;
struct usb_state {
struct llist_head queue;
int active;
+ uint8_t muted;
};
static struct usb_state usb_state;
@@ -52,15 +55,21 @@ static struct usb_state usb_state;
static void fastsource_get_feat_cur_val(uint8_t entity, uint8_t channel,
uint8_t control, uint8_t length)
{
- /* FIXME */
- USBD_Stall(0);
+ TRACE_INFO("get_feat(E%u, CN%u, CS%u, L%u) ", entity, channel, control, length);
+ if (channel == 0 && control == AUDFeatureUnitDescriptor_MUTE && length == 1)
+ USBD_Write(0, &usb_state.muted, sizeof(usb_state.muted), 0, 0);
+ else
+ USBD_Stall(0);
}
static void fastsource_set_feat_cur_val(uint8_t entity, uint8_t channel,
uint8_t control, uint8_t length)
{
- /* FIXME */
- USBD_Stall(0);
+ TRACE_INFO("set_feat(E%u, CO%u, CH%u, L%u) ", entity, channel, control, length);
+ if (channel == 0 && control == AUDFeatureUnitDescriptor_MUTE && length == 1)
+ USBD_Read(0, &usb_state.muted, sizeof(usb_state.muted), 0, 0);
+ else
+ USBD_Stall(0);
}
/* handler for EP0 (control) requests */
@@ -208,6 +217,7 @@ void USBDCallbacks_RequestReceived(const USBGenericRequest *request)
void USBDDriverCallbacks_InterfaceSettingChanged(unsigned char interface,
unsigned char setting)
{
+ printf("USB_IF_CHANGED(%u, %u)\n\r", interface, setting);
if ((interface == AUDDLoopRecDriverDescriptors_STREAMING)
&& (setting == 0))
LED_Clear(USBD_LEDOTHER);