void usb_reset(){ //if (USB_Options & USB_DEVICE_OPT_LOWSPEED) // CLK.USBCTRL = ((((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); //else CLK.USBCTRL = ((((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); USB.EPPTR = (unsigned) &usb_xmega_endpoints; USB.ADDR = 0; usb_xmega_endpoints[0].out.STATUS = 0; usb_xmega_endpoints[0].out.CTRL = USB_EP_TYPE_CONTROL_gc | USB_EP_size_to_gc(USB_EP0_SIZE); usb_xmega_endpoints[0].out.DATAPTR = (unsigned) &ep0_buf_out; usb_xmega_endpoints[0].in.STATUS = USB_EP_BUSNACK0_bm; usb_xmega_endpoints[0].in.CTRL = USB_EP_TYPE_CONTROL_gc | USB_EP_size_to_gc(USB_EP0_SIZE); usb_xmega_endpoints[0].in.DATAPTR = (unsigned) &ep0_buf_in; USB.CTRLA = USB_ENABLE_bm | USB_SPEED_bm | (usb_num_endpoints+1); }
// configure USB clock divider per 48mhz internal oscillator void USB_ResetInterface(){ //if (USB_Options & USB_DEVICE_OPT_LOWSPEED) // CLK.USBCTRL = ((((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); //else CLK.USBCTRL = ((((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); USB.EPPTR = (unsigned) &endpoints; USB.ADDR = 0; endpoints[0].out.STATUS = 0; endpoints[0].out.CTRL = USB_EP_TYPE_CONTROL_gc | USB_EP_size_to_gc(USB_EP0SIZE); endpoints[0].out.DATAPTR = (unsigned) &ep0_buf_out; endpoints[0].in.STATUS = USB_EP_BUSNACK0_bm; endpoints[0].in.CTRL = USB_EP_TYPE_CONTROL_gc | USB_EP_size_to_gc(USB_EP0SIZE); endpoints[0].in.DATAPTR = (unsigned) &ep0_buf_in; USB.CTRLA = USB_ENABLE_bm | USB_SPEED_bm | USB_MAXEP; USB_Attach(); }
inline void usb_ep_enable(uint8_t ep, uint8_t type, usb_size bufsize){ _USB_EP(ep); e->STATUS = USB_EP_BUSNACK0_bm; e->CTRL = type | USB_EP_size_to_gc(bufsize); }