瀏覽代碼

T4 USB MIDI receive

teensy4-core
PaulStoffregen 5 年之前
父節點
當前提交
ecb0ea28e8
共有 1 個文件被更改,包括 52 次插入68 次删除
  1. +52
    -68
      teensy4/usb_midi.c

+ 52
- 68
teensy4/usb_midi.c 查看文件

@@ -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;

Loading…
取消
儲存