|
|
|
|
|
|
|
|
case 0x0221: |
|
|
case 0x0221: |
|
|
case 0x0321: |
|
|
case 0x0321: |
|
|
case 0x0421: |
|
|
case 0x0421: |
|
|
// TODO: remove this terrible kludge, but why oh why does servicing this |
|
|
|
|
|
// request stop the isochronous endpoints? Maybe a bug in endpoint0_receive? |
|
|
|
|
|
if (usb_audio_transmit_setting || usb_audio_receive_setting) break; // kludge!!! |
|
|
|
|
|
|
|
|
|
|
|
printf("set_feature, word1=%x, len=%d\n", setup.word1, setup.wLength); |
|
|
|
|
|
|
|
|
//printf("set_feature, word1=%x, len=%d\n", setup.word1, setup.wLength); |
|
|
if (setup.wLength <= sizeof(endpoint0_buffer)) { |
|
|
if (setup.wLength <= sizeof(endpoint0_buffer)) { |
|
|
endpoint0_setupdata.bothwords = setupdata; |
|
|
endpoint0_setupdata.bothwords = setupdata; |
|
|
endpoint0_receive(endpoint0_buffer, setup.wLength, 1); |
|
|
endpoint0_receive(endpoint0_buffer, setup.wLength, 1); |
|
|
|
|
|
|
|
|
case 0x84A1: |
|
|
case 0x84A1: |
|
|
if (setup.wLength <= sizeof(endpoint0_buffer)) { |
|
|
if (setup.wLength <= sizeof(endpoint0_buffer)) { |
|
|
uint32_t len; |
|
|
uint32_t len; |
|
|
static uint8_t buf[2]; |
|
|
|
|
|
if (usb_audio_get_feature(&setup, buf, &len)) { |
|
|
|
|
|
printf("GET feature, len=%d\n", len); |
|
|
|
|
|
endpoint0_transmit(buf, len, 0); |
|
|
|
|
|
|
|
|
if (usb_audio_get_feature(&setup, endpoint0_buffer, &len)) { |
|
|
|
|
|
//printf("GET feature, len=%d\n", len); |
|
|
|
|
|
endpoint0_transmit(endpoint0_buffer, len, 0); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
endpoint0_transfer_ack.pointer0 = 0; |
|
|
endpoint0_transfer_ack.pointer0 = 0; |
|
|
endpoint_queue_head[0].next = (uint32_t)&endpoint0_transfer_ack; |
|
|
endpoint_queue_head[0].next = (uint32_t)&endpoint0_transfer_ack; |
|
|
endpoint_queue_head[0].status = 0; |
|
|
endpoint_queue_head[0].status = 0; |
|
|
USB1_ENDPTCOMPLETE |= (1<<0) | (1<<16); |
|
|
|
|
|
|
|
|
USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); |
|
|
USB1_ENDPTPRIME |= (1<<0); |
|
|
USB1_ENDPTPRIME |= (1<<0); |
|
|
endpoint0_notify_mask = (notify ? (1 << 0) : 0); |
|
|
endpoint0_notify_mask = (notify ? (1 << 0) : 0); |
|
|
while (USB1_ENDPTPRIME) ; |
|
|
while (USB1_ENDPTPRIME) ; |
|
|
|
|
|
|
|
|
endpoint0_transfer_ack.pointer0 = 0; |
|
|
endpoint0_transfer_ack.pointer0 = 0; |
|
|
endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; |
|
|
endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; |
|
|
endpoint_queue_head[1].status = 0; |
|
|
endpoint_queue_head[1].status = 0; |
|
|
USB1_ENDPTCOMPLETE |= (1<<0) | (1<<16); |
|
|
|
|
|
|
|
|
USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); |
|
|
USB1_ENDPTPRIME |= (1<<16); |
|
|
USB1_ENDPTPRIME |= (1<<16); |
|
|
endpoint0_notify_mask = (notify ? (1 << 16) : 0); |
|
|
endpoint0_notify_mask = (notify ? (1 << 16) : 0); |
|
|
while (USB1_ENDPTPRIME) ; |
|
|
while (USB1_ENDPTPRIME) ; |
|
|
|
|
|
|
|
|
setup_t setup; |
|
|
setup_t setup; |
|
|
|
|
|
|
|
|
setup.bothwords = endpoint0_setupdata.bothwords; |
|
|
setup.bothwords = endpoint0_setupdata.bothwords; |
|
|
printf("complete %x %x %x\n", setup.word1, setup.word2, endpoint0_buffer[0]); |
|
|
|
|
|
|
|
|
//printf("complete %x %x %x\n", setup.word1, setup.word2, endpoint0_buffer[0]); |
|
|
#ifdef CDC_STATUS_INTERFACE |
|
|
#ifdef CDC_STATUS_INTERFACE |
|
|
if (setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/) { |
|
|
if (setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/) { |
|
|
memcpy(usb_cdc_line_coding, endpoint0_buffer, 7); |
|
|
memcpy(usb_cdc_line_coding, endpoint0_buffer, 7); |