summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorhathach <[email protected]>2020-04-22 19:50:23 +0700
committerhathach <[email protected]>2020-04-22 19:50:23 +0700
commit7acdcc2ebcf0d3e5a9949212d26d61357190dd7e (patch)
tree5dc4a6782a6028fab081b88cb6465a2994e19107 /src/class
parent19181ea11d4058b2b34672731bb650549f592418 (diff)
parente2cd5159fd041240257eb2d200ccee09ce26d08c (diff)
Merge branch 'master' into add-more-example
Diffstat (limited to 'src/class')
-rw-r--r--src/class/hid/hid.h4
-rw-r--r--src/class/hid/hid_device.h8
-rw-r--r--src/class/midi/midi_device.c31
3 files changed, 32 insertions, 11 deletions
diff --git a/src/class/hid/hid.h b/src/class/hid/hid.h
index 848274037..8803e4b66 100644
--- a/src/class/hid/hid.h
+++ b/src/class/hid/hid.h
@@ -413,8 +413,8 @@ enum {
#define HID_REPORT_SIZE(x) HID_REPORT_ITEM(x, 7, RI_TYPE_GLOBAL, 1)
#define HID_REPORT_SIZE_N(x, n) HID_REPORT_ITEM(x, 7, RI_TYPE_GLOBAL, n)
-#define HID_REPORT_ID(x) HID_REPORT_ITEM(x, 8, RI_TYPE_GLOBAL, 1)
-#define HID_REPORT_ID_N(x) HID_REPORT_ITEM(x, 8, RI_TYPE_GLOBAL, n)
+#define HID_REPORT_ID(x) HID_REPORT_ITEM(x, 8, RI_TYPE_GLOBAL, 1),
+#define HID_REPORT_ID_N(x) HID_REPORT_ITEM(x, 8, RI_TYPE_GLOBAL, n),
#define HID_REPORT_COUNT(x) HID_REPORT_ITEM(x, 9, RI_TYPE_GLOBAL, 1)
#define HID_REPORT_COUNT_N(x, n) HID_REPORT_ITEM(x, 9, RI_TYPE_GLOBAL, n)
diff --git a/src/class/hid/hid_device.h b/src/class/hid/hid_device.h
index f5e29d8a2..efdde9569 100644
--- a/src/class/hid/hid_device.h
+++ b/src/class/hid/hid_device.h
@@ -93,17 +93,17 @@ TU_ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t idle_rate);
* HID Report Descriptor Template
*
* Convenient for declaring popular HID device (keyboard, mouse, consumer,
- * gamepad etc...). Templates take "HID_REPORT_ID(n)," as input, leave
+ * gamepad etc...). Templates take "HID_REPORT_ID(n)" as input, leave
* empty if multiple reports is not used
*
* - Only 1 report: no parameter
* uint8_t const report_desc[] = { TUD_HID_REPORT_DESC_KEYBOARD() };
*
- * - Multiple Reports: "HID_REPORT_ID(ID)," must be passed to template
+ * - Multiple Reports: "HID_REPORT_ID(ID)" must be passed to template
* uint8_t const report_desc[] =
* {
- * TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(1), ) ,
- * TUD_HID_REPORT_DESC_MOUSE ( HID_REPORT_ID(2), )
+ * TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(1) ) ,
+ * TUD_HID_REPORT_DESC_MOUSE ( HID_REPORT_ID(2) )
* };
*--------------------------------------------------------------------*/
diff --git a/src/class/midi/midi_device.c b/src/class/midi/midi_device.c
index 56a27fbce..f8db63b73 100644
--- a/src/class/midi/midi_device.c
+++ b/src/class/midi/midi_device.c
@@ -85,6 +85,19 @@ bool tud_midi_n_mounted (uint8_t itf)
return midi->ep_in && midi->ep_out;
}
+static void _prep_out_transaction (midid_interface_t* p_midi)
+{
+ // skip if previous transfer not complete
+ if ( usbd_edpt_busy(TUD_OPT_RHPORT, p_midi->ep_out) ) return;
+
+ // Prepare for incoming data but only allow what we can store in the ring buffer.
+ uint16_t max_read = tu_fifo_remaining(&p_midi->rx_ff);
+ if ( max_read >= CFG_TUD_MIDI_EPSIZE )
+ {
+ usbd_edpt_xfer(TUD_OPT_RHPORT, p_midi->ep_out, p_midi->epout_buf, CFG_TUD_MIDI_EPSIZE);
+ }
+}
+
//--------------------------------------------------------------------+
// READ API
//--------------------------------------------------------------------+
@@ -138,11 +151,17 @@ void tud_midi_n_read_flush (uint8_t itf, uint8_t jack_id)
{
(void) jack_id;
tu_fifo_clear(&_midid_itf[itf].rx_ff);
+
+ if (tud_ready() && &_midid_itf[itf].ep_out != 0)
+ _prep_out_transaction(&_midid_itf[itf]);
}
bool tud_midi_n_receive (uint8_t itf, uint8_t packet[4])
{
- return tu_fifo_read_n(&_midid_itf[itf].rx_ff, packet, 4);
+ if (tud_ready() && &_midid_itf[itf].ep_out != 0)
+ _prep_out_transaction(&_midid_itf[itf]);
+
+ return tu_fifo_read_n(&_midid_itf[itf].rx_ff, packet, 4) == 4;
}
void midi_rx_done_cb(midid_interface_t* midi, uint8_t const* buffer, uint32_t bufsize) {
@@ -267,8 +286,8 @@ void midid_init(void)
midid_interface_t* midi = &_midid_itf[i];
// config fifo
- tu_fifo_config(&midi->rx_ff, midi->rx_ff_buf, CFG_TUD_MIDI_RX_BUFSIZE, 1, true);
- tu_fifo_config(&midi->tx_ff, midi->tx_ff_buf, CFG_TUD_MIDI_TX_BUFSIZE, 1, true);
+ tu_fifo_config(&midi->rx_ff, midi->rx_ff_buf, CFG_TUD_MIDI_RX_BUFSIZE, 1, false);
+ tu_fifo_config(&midi->tx_ff, midi->tx_ff_buf, CFG_TUD_MIDI_TX_BUFSIZE, 1, false);
#if CFG_FIFO_MUTEX
tu_fifo_config_mutex(&midi->rx_ff, osal_mutex_create(&midi->rx_ff_mutex));
@@ -358,7 +377,7 @@ bool midid_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t
*p_length = drv_len;
// Prepare for incoming data
- TU_ASSERT( usbd_edpt_xfer(rhport, p_midi->ep_out, p_midi->epout_buf, CFG_TUD_MIDI_EPSIZE), false);
+ _prep_out_transaction(p_midi);
return true;
}
@@ -381,6 +400,7 @@ bool midid_control_request(uint8_t rhport, tusb_control_request_t const * p_requ
bool midid_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
{
+ (void) rhport;
(void) result;
uint8_t itf = 0;
@@ -399,7 +419,8 @@ bool midid_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32
midi_rx_done_cb(p_midi, p_midi->epout_buf, xferred_bytes);
// prepare for next
- TU_ASSERT( usbd_edpt_xfer(rhport, p_midi->ep_out, p_midi->epout_buf, CFG_TUD_MIDI_EPSIZE), false );
+ _prep_out_transaction(p_midi);
+
} else if ( ep_addr == p_midi->ep_in ) {
maybe_transmit(p_midi, itf);
}