|
|
@@ -366,6 +366,47 @@ static void usb_setup(void) |
|
|
|
break; |
|
|
|
// case 0xC940: |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(AUDIO_INTERFACE) |
|
|
|
case 0x0B01: // SET_INTERFACE (alternate setting) |
|
|
|
if (setup.wIndex == AUDIO_INTERFACE+1) { |
|
|
|
//audio_tx_alternate_setting = setup.wValue; |
|
|
|
} else if (setup.wIndex == AUDIO_INTERFACE+2) { |
|
|
|
//audio_rx_alternate_setting = setup.wValue; |
|
|
|
} else { |
|
|
|
endpoint0_stall(); |
|
|
|
return; |
|
|
|
} |
|
|
|
break; |
|
|
|
case 0x0A81: // GET_INTERFACE (alternate setting) |
|
|
|
datalen = 1; |
|
|
|
data = reply_buffer; |
|
|
|
if (setup.wIndex == AUDIO_INTERFACE+1) { |
|
|
|
reply_buffer[0] = 0; |
|
|
|
//reply_buffer[0] = audio_tx_alternate_setting; |
|
|
|
} else if (setup.wIndex == AUDIO_INTERFACE+2) { |
|
|
|
reply_buffer[0] = 0; |
|
|
|
//reply_buffer[0] = audio_rx_alternate_setting; |
|
|
|
} else { |
|
|
|
endpoint0_stall(); |
|
|
|
return; |
|
|
|
} |
|
|
|
break; |
|
|
|
case 0x0122: // SET_CUR (wValue=0, wIndex=interface, wLength=len) |
|
|
|
return; |
|
|
|
case 0x81A2: // GET_CUR (wValue=0, wIndex=interface, wLength=len) |
|
|
|
if (setup.wLength >= 3) { |
|
|
|
reply_buffer[0] = 44100 & 255; |
|
|
|
reply_buffer[1] = 44100 >> 8; |
|
|
|
reply_buffer[2] = 0; |
|
|
|
datalen = 3; |
|
|
|
data = reply_buffer; |
|
|
|
} else { |
|
|
|
endpoint0_stall(); |
|
|
|
return; |
|
|
|
} |
|
|
|
break; |
|
|
|
#endif |
|
|
|
default: |
|
|
|
endpoint0_stall(); |
|
|
|
return; |
|
|
@@ -508,6 +549,12 @@ static void usb_control(uint32_t stat) |
|
|
|
usb_reboot_timer = 5; |
|
|
|
endpoint0_transmit(NULL, 0); |
|
|
|
} |
|
|
|
#endif |
|
|
|
#ifdef AUDIO_INTERFACE |
|
|
|
if (setup.wRequestAndType == 0x0122 /* SET_CUR */) { |
|
|
|
// TODO: actually check data, do something with it? |
|
|
|
endpoint0_transmit(NULL, 0); |
|
|
|
} |
|
|
|
#endif |
|
|
|
// give the buffer back |
|
|
|
b->desc = BDT_DESC(EP0_SIZE, DATA1); |