|
|
@@ -118,9 +118,8 @@ void usb_midi_configure(void) |
|
|
|
rx_available = 0; |
|
|
|
usb_config_rx(MIDI_RX_ENDPOINT, rx_packet_size, 0, rx_event); |
|
|
|
usb_config_tx(MIDI_TX_ENDPOINT, tx_packet_size, 0, NULL); // TODO: is ZLP needed? |
|
|
|
//int i; |
|
|
|
//for (i=0; i < RX_NUM; i++) rx_queue_transfer(i); |
|
|
|
// TODO: set up SOF interrupt.... |
|
|
|
int i; |
|
|
|
for (i=0; i < RX_NUM; i++) rx_queue_transfer(i); |
|
|
|
transmit_previous_timeout = 0; |
|
|
|
tx_noautoflush = 0; |
|
|
|
} |
|
|
@@ -251,92 +250,77 @@ void static sysex_byte(uint8_t b) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void rx_queue_transfer(int i) |
|
|
|
{ |
|
|
|
NVIC_DISABLE_IRQ(IRQ_USB1); |
|
|
|
void *buffer = rx_buffer + i * MIDI_RX_SIZE_480; |
|
|
|
usb_prepare_transfer(rx_transfer + i, buffer, rx_packet_size, i); |
|
|
|
arm_dcache_delete(buffer, rx_packet_size); |
|
|
|
usb_receive(MIDI_RX_ENDPOINT, rx_transfer + i); |
|
|
|
NVIC_ENABLE_IRQ(IRQ_USB1); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// called by USB interrupt when any packet is received |
|
|
|
static void rx_event(transfer_t *t) |
|
|
|
{ |
|
|
|
int len = rx_packet_size - ((t->status >> 16) & 0x7FFF); |
|
|
|
len &= 0xFFFC; // MIDI packets must be multiple of 4 bytes |
|
|
|
int i = t->callback_param; |
|
|
|
printf("rx event, len=%d, i=%d\n", len, i); |
|
|
|
if (len > 0) { |
|
|
|
uint32_t head = rx_head; |
|
|
|
rx_count[i] = len; |
|
|
|
rx_index[i] = 0; |
|
|
|
if (++head > RX_NUM) head = 0; |
|
|
|
rx_list[head] = i; |
|
|
|
rx_head = head; |
|
|
|
rx_available += len; |
|
|
|
} else { |
|
|
|
// received a zero length packet |
|
|
|
rx_queue_transfer(i); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uint32_t usb_midi_available(void) |
|
|
|
{ |
|
|
|
#if 0 |
|
|
|
uint32_t index; |
|
|
|
|
|
|
|
if (!rx_packet) { |
|
|
|
if (!usb_configuration) return 0; |
|
|
|
rx_packet = usb_rx(MIDI_RX_ENDPOINT); |
|
|
|
if (!rx_packet) return 0; |
|
|
|
if (rx_packet->len == 0) { |
|
|
|
usb_free(rx_packet); |
|
|
|
rx_packet = NULL; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
index = rx_packet->index; |
|
|
|
return rx_packet->len - index; |
|
|
|
#endif |
|
|
|
return 0; |
|
|
|
return rx_available / 4; |
|
|
|
} |
|
|
|
|
|
|
|
uint32_t usb_midi_read_message(void) |
|
|
|
{ |
|
|
|
#if 0 |
|
|
|
uint32_t n, index; |
|
|
|
|
|
|
|
if (!rx_packet) { |
|
|
|
if (!usb_configuration) return 0; |
|
|
|
rx_packet = usb_rx(MIDI_RX_ENDPOINT); |
|
|
|
if (!rx_packet) return 0; |
|
|
|
if (rx_packet->len == 0) { |
|
|
|
usb_free(rx_packet); |
|
|
|
rx_packet = NULL; |
|
|
|
return 0; |
|
|
|
uint32_t n = 0; |
|
|
|
NVIC_DISABLE_IRQ(IRQ_USB1); |
|
|
|
uint32_t tail = rx_tail; |
|
|
|
if (tail != rx_head) { |
|
|
|
if (++tail > RX_NUM) tail = 0; |
|
|
|
uint32_t i = rx_list[tail]; |
|
|
|
//uint32_t avail = (rx_count[i] - rx_index[i]) / 4; |
|
|
|
void *p = rx_buffer + i * MIDI_RX_SIZE_480 + rx_index[i]; |
|
|
|
n = *(uint32_t *)p; |
|
|
|
rx_available -= 4; |
|
|
|
rx_index[i] += 4; |
|
|
|
if (rx_index[i] >= rx_count[i]) { |
|
|
|
rx_tail = tail; |
|
|
|
rx_queue_transfer(i); |
|
|
|
} |
|
|
|
} |
|
|
|
index = rx_packet->index; |
|
|
|
n = ((uint32_t *)rx_packet->buf)[index/4]; |
|
|
|
index += 4; |
|
|
|
if (index < rx_packet->len) { |
|
|
|
rx_packet->index = index; |
|
|
|
} else { |
|
|
|
usb_free(rx_packet); |
|
|
|
rx_packet = usb_rx(MIDI_RX_ENDPOINT); |
|
|
|
} |
|
|
|
NVIC_ENABLE_IRQ(IRQ_USB1); |
|
|
|
return n; |
|
|
|
#endif |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int usb_midi_read(uint32_t channel) |
|
|
|
{ |
|
|
|
//uint32_t n, index, ch, type1, type2, b1; |
|
|
|
uint32_t n, ch, type1, type2, b1; |
|
|
|
|
|
|
|
return 0; |
|
|
|
#if 0 |
|
|
|
if (!rx_packet) { |
|
|
|
if (!usb_configuration) return 0; |
|
|
|
rx_packet = usb_rx(MIDI_RX_ENDPOINT); |
|
|
|
if (!rx_packet) return 0; |
|
|
|
if (rx_packet->len == 0) { |
|
|
|
usb_free(rx_packet); |
|
|
|
rx_packet = NULL; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
index = rx_packet->index; |
|
|
|
n = ((uint32_t *)rx_packet->buf)[index/4]; |
|
|
|
//serial_print("midi rx, n="); |
|
|
|
//serial_phex32(n); |
|
|
|
//serial_print("\n"); |
|
|
|
index += 4; |
|
|
|
if (index < rx_packet->len) { |
|
|
|
rx_packet->index = index; |
|
|
|
} else { |
|
|
|
usb_free(rx_packet); |
|
|
|
rx_packet = usb_rx(MIDI_RX_ENDPOINT); |
|
|
|
} |
|
|
|
#endif |
|
|
|
n = usb_midi_read_message(); |
|
|
|
if (n == 0) return 0; |
|
|
|
type1 = n & 15; |
|
|
|
type2 = (n >> 12) & 15; |
|
|
|
b1 = (n >> 8) & 0xFF; |