// see pic18_usb.h for documentation int1 usb_flush_in(int8 endpoint, int16 len, USB_DTS_BIT tgl) { unsigned int8 i; debug_usb(debug_putc,"\r\nPUT %X %U %LU",endpoint, tgl, len); if (usb_tbe(endpoint)) { EP_BDxCNT_I(endpoint)=len; debug_display_ram(len, EP_BDxADR_I(endpoint)); #if USB_IGNORE_TX_DTS i=0x80; #else if (tgl == USB_DTS_TOGGLE) { i = EP_BDxST_I(endpoint); if (bit_test(i,6)) tgl = USB_DTS_DATA0; //was DATA1, goto DATA0 else tgl = USB_DTS_DATA1; //was DATA0, goto DATA1 } else if (tgl == USB_DTS_USERX) { i = EP_BDxST_O(endpoint); if (bit_test(i,6)) tgl = USB_DTS_DATA1; else tgl = USB_DTS_DATA0; } if (tgl == USB_DTS_DATA1) i=0xC8; //DATA1, UOWN else //if (tgl == USB_DTS_DATA0) i=0x88; //DATA0, UOWN #endif //set BC8 and BC9 if (bit_test(len,8)) {bit_set(i,0);} if (bit_test(len,9)) {bit_set(i,1);} debug_usb(debug_putc, " %X", i); EP_BDxST_I(endpoint) = i;//save changes //putc('!'); return(1); } else { //putc('_'); debug_usb(debug_putc,"\r\nPUT ERR"); } return(0); }
// see usb_hw_layer.h for documentation void usb_set_configured(int8 config) { int8 en; int16 addy; int8 new_uep; int16 len; int8 i; /*if (config == 0) { // if config=0 then set addressed state usb_state = USB_STATE_ADDRESS; usb_disable_endpoints(); } else */ { // else set configed state usb_state = USB_STATE_CONFIGURED; addy = (int16)USB_DATA_BUFFER_LOCATION+(2*USB_MAX_EP0_PACKET_LENGTH); for (en=1; en<USB_NUM_UEP; en++) { // enable and config endpoints based upon user configuration usb_disable_endpoint(en); new_uep = 0; if (usb_ep_rx_type[en] != USB_ENABLE_DISABLED) { new_uep = 0x04; len = usb_ep_rx_size[en]; EP_BDxCNT_O(en) = len; EP_BDxADR_O(en) = addy; addy += usb_ep_rx_size[en]; #if USB_IGNORE_RX_DTS i = 0x80; #else i = 0x88; #endif if (bit_test(len,8)) {bit_set(i,0);} if (bit_test(len,9)) {bit_set(i,1);} EP_BDxST_O(en) = i; } if (usb_ep_tx_type[en] != USB_ENABLE_DISABLED) { new_uep |= 0x02; EP_BDxADR_I(en) = addy; addy += usb_ep_tx_size[en]; EP_BDxST_I(en) = 0x40; } if (new_uep == 0x06) {new_uep = 0x0E;} if (usb_ep_tx_type[en] != USB_ENABLE_ISOCHRONOUS) {new_uep |= 0x10;} UEP(en) = new_uep; } } }
void usb_init_ep0_setup(void) { EP_BDxCNT_O(0) = USB_MAX_EP0_PACKET_LENGTH; EP_BDxADR_O(0) = USB_DATA_BUFFER_LOCATION; #if USB_IGNORE_RX_DTS EP_BDxST_O(0) = 0x80; //give control to SIE, data toggle synch off #else EP_BDxST_O(0) = 0x88; //give control to SIE, DATA0, data toggle synch on #endif EP_BDxST_I(0) = 0; EP_BDxADR_I(0) = USB_DATA_BUFFER_LOCATION + (int16)USB_MAX_EP0_PACKET_LENGTH; }
// 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); }