static void usbReset(void) { pInformation->Current_Configuration = 0; /* current feature is current bmAttributes */ pInformation->Current_Feature = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELF_POWERED); USB_BASE->BTABLE = BTABLE_ADDRESS; /* setup control endpoint 0 */ usb_set_ep_type(USB_EP0, USB_EP_EP_TYPE_CONTROL); usb_set_ep_tx_stat(USB_EP0, USB_EP_STAT_TX_STALL); usb_set_ep_rx_addr(USB_EP0, USB_MIDI_CTRL_RX_ADDR); usb_set_ep_tx_addr(USB_EP0, USB_MIDI_CTRL_TX_ADDR); usb_clear_status_out(USB_EP0); usb_set_ep_rx_count(USB_EP0, pProperty->MaxPacketSize); usb_set_ep_rx_stat(USB_EP0, USB_EP_STAT_RX_VALID); /* TODO figure out differences in style between RX/TX EP setup */ /* set up data endpoint OUT (RX) */ usb_set_ep_type(USB_MIDI_RX_ENDP, USB_EP_EP_TYPE_BULK); usb_set_ep_rx_addr(USB_MIDI_RX_ENDP, USB_MIDI_RX_ADDR); usb_set_ep_rx_count(USB_MIDI_RX_ENDP, USB_MIDI_RX_EPSIZE); usb_set_ep_rx_stat(USB_MIDI_RX_ENDP, USB_EP_STAT_RX_VALID); /* set up data endpoint IN (TX) */ usb_set_ep_type(USB_MIDI_TX_ENDP, USB_EP_EP_TYPE_BULK); usb_set_ep_tx_addr(USB_MIDI_TX_ENDP, USB_MIDI_TX_ADDR); usb_set_ep_tx_stat(USB_MIDI_TX_ENDP, USB_EP_STAT_TX_NAK); usb_set_ep_rx_stat(USB_MIDI_TX_ENDP, USB_EP_STAT_RX_DISABLED); USBLIB->state = USB_ATTACHED; SetDeviceAddress(0); /* Reset the RX/TX state */ n_unread_packets = 0; n_unsent_packets = 0; rx_offset = 0; tx_offset = 0; transmitting = 0; }
static void midiDataRxCb(void) { usb_set_ep_rx_stat(USB_MIDI_RX_ENDP, USB_EP_STAT_RX_NAK); n_unread_packets = usb_get_ep_rx_count(USB_MIDI_RX_ENDP) / 4; /* This copy won't overwrite unread bytes, since we've set the RX * endpoint to NAK, and will only set it to VALID when all bytes * have been read. */ usb_copy_from_pma((uint8*)midiBufferRx, n_unread_packets * 4, USB_MIDI_RX_ADDR); if (n_unread_packets == 0) { usb_set_ep_rx_count(USB_MIDI_RX_ENDP, USB_MIDI_RX_EPSIZE); usb_set_ep_rx_stat(USB_MIDI_RX_ENDP, USB_EP_STAT_RX_VALID); rx_offset = 0; } }
/* Nonblocking byte receive. * * Copies up to len bytes from our private data buffer (*NOT* the PMA) * into buf and deq's the FIFO. */ uint32 usb_midi_rx(uint32* buf, uint32 packets) { /* Copy bytes to buffer. */ uint32 n_copied = usb_midi_peek(buf, packets); /* Mark bytes as read. */ n_unread_packets -= n_copied; rx_offset += n_copied; /* If all bytes have been read, re-enable the RX endpoint, which * was set to NAK when the current batch of bytes was received. */ if (n_unread_packets == 0) { usb_set_ep_rx_count(USB_MIDI_RX_ENDP, USB_MIDI_RX_EPSIZE); usb_set_ep_rx_stat(USB_MIDI_RX_ENDP, USB_EP_STAT_RX_VALID); rx_offset = 0; } return n_copied; }
static inline void set_rx_tx_status0(uint16 rx, uint16 tx) { usb_set_ep_rx_stat(USB_EP0, rx); usb_set_ep_tx_stat(USB_EP0, tx); }