// see usb_hw_layer.h for documentation int1 usb_put_packet(int8 endpoint, int8 * ptr, int16 len, USB_DTS_BIT tgl) { int8 * buff_add; if (usb_tbe(endpoint)) { buff_add = EP_BDxADR_I(endpoint); memcpy(buff_add, ptr, len); return(usb_flush_in(endpoint, len, tgl)); } return(0); }
// see usb_hw_layer.h for documentation int1 usb_put_packet(unsigned int8 endpoint, unsigned int8 * ptr, unsigned int16 len, USB_DTS_BIT tgl) { unsigned int8 * buff_add; if (usb_tbe(endpoint)) { buff_add = EP_BDxADR_I(endpoint); memcpy(buff_add, ptr, len); return(usb_flush_in(endpoint, len, tgl)); } else { //putc('-'); //printf("%X", EP_BDxST_I(endpoint)); debug_usb(debug_putc,"\r\nPUT ERR"); } return(0); }
void usb_isr_tok_dne(void) { int8 en; en = USTATCopy>>3; if (USTATCopy == USTAT_OUT_SETUP_E0) { //new out or setup token in the buffer int8 pidKey; pidKey = EP_BDxST_O(0) & 0x3C; //save PID EP_BDxST_O(0) &= 0x43; //clear pid, prevent bdstal/pid confusion if (pidKey == USB_PIC_PID_SETUP) { if ((EP_BDxST_I(0) & 0x80) != 0x00) EP_BDxST_I(0)=0; // return the in buffer to us (dequeue any pending requests) usb_isr_tok_setup_dne(); UCON_PKTDIS=0; // UCON,PKT_DIS ; Assuming there is nothing to dequeue, clear the packet disable bit //if setup_0_tx_size==0xFF - stall ep0 (unhandled request) (see usb_request_stall()) //if setup_0_tx_size==0xFE - get EP0OUT ready for a data packet, leave EP0IN alone (see usb_request_get_data()) //else setup_0_tx_size=size of response, get EP0OUT ready for a setup packet, mark EPOIN ready for transmit (see usb_request_send_response()) if (__setup_0_tx_size == 0xFF) usb_flush_out(0, USB_DTS_STALL); else { usb_flush_out(0, USB_DTS_TOGGLE); if (__setup_0_tx_size != 0xFE) usb_flush_in(0 ,__setup_0_tx_size, USB_DTS_USERX); } } else if (pidKey == USB_PIC_PID_OUT) { usb_isr_tok_out_dne(0); usb_flush_out(0, USB_DTS_TOGGLE); if ((__setup_0_tx_size!=0xFE) && (__setup_0_tx_size!=0xFF)) { usb_flush_in(0,__setup_0_tx_size,USB_DTS_DATA1); //send response (usually a 0len) } } } else if (USTATCopy == USTAT_IN_E0) { //pic -> host transfer completed EP_BDxST_I(0) = EP_BDxST_I(0) & 0x43; //clear up any BDSTAL confusion __setup_0_tx_size = 0xFF; usb_isr_tok_in_dne(0); if (__setup_0_tx_size!=0xFF) usb_flush_in(0, __setup_0_tx_size, USB_DTS_TOGGLE); else { //usb_init_ep0_setup(); //REMOVED JUN/9/2009 } } else { if (!bit_test(USTATCopy, 2)) { EP_BDxST_O(en) = EP_BDxST_O(en) & 0x43; //clear up any BDSTAL confusion usb_isr_tok_out_dne(en); } else { EP_BDxST_I(en) = EP_BDxST_I(en) & 0x43; //clear up any BDSTAL confusion usb_isr_tok_in_dne(en); } } }