summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhathach <[email protected]>2019-07-05 17:21:39 +0700
committerGitHub <[email protected]>2019-07-05 17:21:39 +0700
commit2d7e61e6714f9a1acb9ef06b26a506fb26998c15 (patch)
tree0a618b17523842b125b867d73e45b3ea7fb11c1f /src
parent2dd8dba4a7dc7b288a94054080932513ab1e98e3 (diff)
parent216ccc6e93fe294e80bb17bfb873bfb00f5ac038 (diff)
Merge pull request #85 from hathach/develop
midi only use audio 1.0 without IAD
Diffstat (limited to 'src')
-rw-r--r--src/class/midi/midi_device.c8
-rw-r--r--src/device/usbd.h4
-rw-r--r--src/portable/microchip/samd21/dcd_samd21.c81
-rw-r--r--src/portable/microchip/samd51/dcd_samd51.c78
4 files changed, 85 insertions, 86 deletions
diff --git a/src/class/midi/midi_device.c b/src/class/midi/midi_device.c
index 76776d71c..267167720 100644
--- a/src/class/midi/midi_device.c
+++ b/src/class/midi/midi_device.c
@@ -250,15 +250,13 @@ bool midid_open(uint8_t rhport, tusb_desc_interface_t const * p_interface_desc,
(*p_length) = sizeof(tusb_desc_interface_t);
// Skip over the class specific descriptor.
- (*p_length) += p_desc[DESC_OFFSET_LEN];
+ (*p_length) += tu_desc_len(p_desc);
p_desc = tu_desc_next(p_desc);
return true;
}
- if ( AUDIO_SUBCLASS_MIDI_STREAMING != p_interface_desc->bInterfaceSubClass ||
- p_interface_desc->bInterfaceProtocol != AUDIO_PROTOCOL_V1 ) {
- return false;
- }
+ TU_VERIFY(AUDIO_SUBCLASS_MIDI_STREAMING == p_interface_desc->bInterfaceSubClass &&
+ AUDIO_PROTOCOL_V1 == p_interface_desc->bInterfaceProtocol );
// Find available interface
midid_interface_t * p_midi = NULL;
diff --git a/src/device/usbd.h b/src/device/usbd.h
index d3a5dce66..bb9c62f2f 100644
--- a/src/device/usbd.h
+++ b/src/device/usbd.h
@@ -174,14 +174,12 @@ TU_ATTR_WEAK void tud_resume_cb(void);
//------------- MIDI -------------//
// Length of template descriptor (96 bytes)
-#define TUD_MIDI_DESC_LEN (8 + 9 + 9 + 9 + 7 + 6 + 6 + 9 + 9 + 7 + 5 + 7 + 5)
+#define TUD_MIDI_DESC_LEN (9 + 9 + 9 + 7 + 6 + 6 + 9 + 9 + 7 + 5 + 7 + 5)
// MIDI simple descriptor
// - 1 Embedded Jack In connected to 1 External Jack Out
// - 1 Embedded Jack out connected to 1 External Jack In
#define TUD_MIDI_DESCRIPTOR(_itfnum, _stridx, _epin, _epout, _epsize) \
- /* Interface Associate */\
- 8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUSB_CLASS_AUDIO, 0x00, AUDIO_PROTOCOL_V1, 0,\
/* Audio Control (AC) Interface */\
9, TUSB_DESC_INTERFACE, _itfnum, 0, 0, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_CONTROL, AUDIO_PROTOCOL_V1, _stridx,\
/* AC Header */\
diff --git a/src/portable/microchip/samd21/dcd_samd21.c b/src/portable/microchip/samd21/dcd_samd21.c
index 7f3c34959..231abc7d0 100644
--- a/src/portable/microchip/samd21/dcd_samd21.c
+++ b/src/portable/microchip/samd21/dcd_samd21.c
@@ -232,60 +232,63 @@ void dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr)
/*------------------------------------------------------------------*/
static bool maybe_handle_setup_packet(void) {
- if (USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.bit.RXSTP)
- {
- USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_RXSTP;
+ if (USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.bit.RXSTP)
+ {
+ USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_RXSTP;
- // This copies the data elsewhere so we can reuse the buffer.
- dcd_event_setup_received(0, (uint8_t*) sram_registers[0][0].ADDR.reg, true);
- return true;
- }
- return false;
+ // This copies the data elsewhere so we can reuse the buffer.
+ dcd_event_setup_received(0, (uint8_t*) sram_registers[0][0].ADDR.reg, true);
+ return true;
+ }
+ return false;
}
void maybe_transfer_complete(void) {
- uint32_t epints = USB->DEVICE.EPINTSMRY.reg;
- for (uint8_t epnum = 0; epnum < USB_EPT_NUM; epnum++) {
- if ((epints & (1 << epnum)) == 0) {
- continue;
- }
+ uint32_t epints = USB->DEVICE.EPINTSMRY.reg;
+
+ for (uint8_t epnum = 0; epnum < USB_EPT_NUM; epnum++) {
+ if ((epints & (1 << epnum)) == 0) {
+ continue;
+ }
- if (maybe_handle_setup_packet()) {
- continue;
- }
- UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
+ if (maybe_handle_setup_packet()) {
+ continue;
+ }
- uint32_t epintflag = ep->EPINTFLAG.reg;
+ UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
- uint16_t total_transfer_size = 0;
+ uint32_t epintflag = ep->EPINTFLAG.reg;
- // Handle IN completions
- if ((epintflag & USB_DEVICE_EPINTFLAG_TRCPT1) != 0) {
- ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT1;
+ uint16_t total_transfer_size = 0;
- UsbDeviceDescBank* bank = &sram_registers[epnum][TUSB_DIR_IN];
- total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;
+ // Handle IN completions
+ if ((epintflag & USB_DEVICE_EPINTFLAG_TRCPT1) != 0) {
+ ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT1;
- uint8_t ep_addr = epnum | TUSB_DIR_IN_MASK;
- dcd_event_xfer_complete(0, ep_addr, total_transfer_size, XFER_RESULT_SUCCESS, true);
- }
+ UsbDeviceDescBank* bank = &sram_registers[epnum][TUSB_DIR_IN];
+ total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;
- // Handle OUT completions
- if ((epintflag & USB_DEVICE_EPINTFLAG_TRCPT0) != 0) {
- ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT0;
+ uint8_t ep_addr = epnum | TUSB_DIR_IN_MASK;
+ dcd_event_xfer_complete(0, ep_addr, total_transfer_size, XFER_RESULT_SUCCESS, true);
+ }
- UsbDeviceDescBank* bank = &sram_registers[epnum][TUSB_DIR_OUT];
- total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;
+ // Handle OUT completions
+ if ((epintflag & USB_DEVICE_EPINTFLAG_TRCPT0) != 0) {
+ ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT0;
- uint8_t ep_addr = epnum;
- dcd_event_xfer_complete(0, ep_addr, total_transfer_size, XFER_RESULT_SUCCESS, true);
- }
+ UsbDeviceDescBank* bank = &sram_registers[epnum][TUSB_DIR_OUT];
+ total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;
- // just finished status stage (total size = 0), prepare for next setup packet
- if (epnum == 0 && total_transfer_size == 0) {
- dcd_edpt_xfer(0, 0, _setup_packet, sizeof(_setup_packet));
- }
+ uint8_t ep_addr = epnum;
+ dcd_event_xfer_complete(0, ep_addr, total_transfer_size, XFER_RESULT_SUCCESS, true);
}
+
+ // Just finished status stage (total size = 0), prepare for next setup packet
+ // TODO could cause issue with actual zero length data used by class such as DFU
+ if (epnum == 0 && total_transfer_size == 0) {
+ dcd_edpt_xfer(0, 0, _setup_packet, sizeof(_setup_packet));
+ }
+ }
}
void USB_Handler(void)
diff --git a/src/portable/microchip/samd51/dcd_samd51.c b/src/portable/microchip/samd51/dcd_samd51.c
index f2aff857c..f58e7cbc7 100644
--- a/src/portable/microchip/samd51/dcd_samd51.c
+++ b/src/portable/microchip/samd51/dcd_samd51.c
@@ -213,9 +213,9 @@ void dcd_edpt_stall (uint8_t rhport, uint8_t ep_addr)
UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
if (tu_edpt_dir(ep_addr) == TUSB_DIR_IN) {
- ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ1;
+ ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ1;
} else {
- ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ0;
+ ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ0;
}
}
@@ -236,15 +236,15 @@ void dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr)
/*------------------------------------------------------------------*/
static bool maybe_handle_setup_packet(void) {
- if (USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.bit.RXSTP)
- {
- USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_RXSTP;
+ if (USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.bit.RXSTP)
+ {
+ USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_RXSTP;
- // This copies the data elsewhere so we can reuse the buffer.
- dcd_event_setup_received(0, (uint8_t*) sram_registers[0][0].ADDR.reg, true);
- return true;
- }
- return false;
+ // This copies the data elsewhere so we can reuse the buffer.
+ dcd_event_setup_received(0, (uint8_t*) sram_registers[0][0].ADDR.reg, true);
+ return true;
+ }
+ return false;
}
/*
*------------------------------------------------------------------*/
@@ -309,42 +309,42 @@ void USB_0_Handler(void) {
/* USB_SOF_HSOF */
void USB_1_Handler(void) {
- USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_SOF;
- dcd_event_bus_signal(0, DCD_EVENT_SOF, true);
+ USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_SOF;
+ dcd_event_bus_signal(0, DCD_EVENT_SOF, true);
}
void transfer_complete(uint8_t direction) {
- uint32_t epints = USB->DEVICE.EPINTSMRY.reg;
- for (uint8_t epnum = 0; epnum < USB_EPT_NUM; epnum++) {
- if ((epints & (1 << epnum)) == 0) {
- continue;
- }
+ uint32_t epints = USB->DEVICE.EPINTSMRY.reg;
+ for (uint8_t epnum = 0; epnum < USB_EPT_NUM; epnum++) {
+ if ((epints & (1 << epnum)) == 0) {
+ continue;
+ }
- if (direction == TUSB_DIR_OUT && maybe_handle_setup_packet()) {
- continue;
- }
- UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
+ if (direction == TUSB_DIR_OUT && maybe_handle_setup_packet()) {
+ continue;
+ }
+ UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
- UsbDeviceDescBank* bank = &sram_registers[epnum][direction];
- uint16_t total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;
+ UsbDeviceDescBank* bank = &sram_registers[epnum][direction];
+ uint16_t total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;
- uint8_t ep_addr = epnum;
- if (direction == TUSB_DIR_IN) {
- ep_addr |= TUSB_DIR_IN_MASK;
- }
- dcd_event_xfer_complete(0, ep_addr, total_transfer_size, XFER_RESULT_SUCCESS, true);
+ uint8_t ep_addr = epnum;
+ if (direction == TUSB_DIR_IN) {
+ ep_addr |= TUSB_DIR_IN_MASK;
+ }
+ dcd_event_xfer_complete(0, ep_addr, total_transfer_size, XFER_RESULT_SUCCESS, true);
- // just finished status stage (total size = 0), prepare for next setup packet
- if (epnum == 0 && total_transfer_size == 0) {
- dcd_edpt_xfer(0, 0, _setup_packet, sizeof(_setup_packet));
- }
+ // just finished status stage (total size = 0), prepare for next setup packet
+ if (epnum == 0 && total_transfer_size == 0) {
+ dcd_edpt_xfer(0, 0, _setup_packet, sizeof(_setup_packet));
+ }
- if (direction == TUSB_DIR_IN) {
- ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT1;
- } else {
- ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT0;
- }
+ if (direction == TUSB_DIR_IN) {
+ ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT1;
+ } else {
+ ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT0;
}
+ }
}
// Bank zero is for OUT and SETUP transactions.
@@ -352,7 +352,7 @@ void transfer_complete(uint8_t direction) {
USB_TRCPT0_3, USB_TRCPT0_4, USB_TRCPT0_5,
USB_TRCPT0_6, USB_TRCPT0_7 */
void USB_2_Handler(void) {
- transfer_complete(TUSB_DIR_OUT);
+ transfer_complete(TUSB_DIR_OUT);
}
// Bank one is used for IN transactions.
@@ -360,7 +360,7 @@ void USB_2_Handler(void) {
USB_TRCPT1_3, USB_TRCPT1_4, USB_TRCPT1_5,
USB_TRCPT1_6, USB_TRCPT1_7 */
void USB_3_Handler(void) {
- transfer_complete(TUSB_DIR_IN);
+ transfer_complete(TUSB_DIR_IN);
}
#endif