uint32 usb_midi_tx(const uint32* buf, uint32 packets) { uint32 bytes=packets*4; /* Last transmission hasn't finished, so abort. */ if (usb_midi_is_transmitting()) { /* Copy to TxBuffer */ return 0; /* return len */ } /* We can only put USB_MIDI_TX_EPSIZE bytes in the buffer. */ if (bytes > USB_MIDI_TX_EPSIZE) { bytes = USB_MIDI_TX_EPSIZE; packets=bytes/4; } /* Queue bytes for sending. */ if (packets) { usb_copy_to_pma((uint8 *)buf, bytes, USB_MIDI_TX_ADDR); } // We still need to wait for the interrupt, even if we're sending // zero bytes. (Sending zero-size packets is useful for flushing // host-side buffers.) usb_set_ep_tx_count(USB_MIDI_TX_ENDP, bytes); n_unsent_packets = packets; transmitting = 1; usb_set_ep_tx_stat(USB_MIDI_TX_ENDP, USB_EP_STAT_TX_VALID); return packets; }
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; }
uint32 usb_midi_tx_send_buffer() { /* Queue bytes for sending. */ if (tx_offset) { usb_copy_to_pma((const uint8 *)midiBufferTx, 4*tx_offset, USB_MIDI_TX_ADDR); } usb_set_ep_tx_count(USB_MIDI_TX_ENDP, 4*tx_offset); n_unsent_packets = tx_offset; tx_offset = 0; transmitting = 1; usb_set_ep_tx_stat(USB_MIDI_TX_ENDP, USB_EP_STAT_TX_VALID); return n_unsent_packets; }
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); }