#include #include #include #include #include int usb_endpoint_set_buffer (int endpoint,void *buffer,int size){ ATOMIC uint8_t cfg0x; usb_device.endpoints[ endpoint ].buffer = buffer; usb_device.endpoints[ endpoint ].blen = size; usb_device.endpoints[ endpoint ].bpos = 0; usb_ll_endpoint_select( endpoint ); cfg0x = UECFG0X; if ((cfg0x & 0xC0) == 0){ // CONTROL-EP if ((usb_device.endpoints[ endpoint ].request->bmRequestType & 0x80 )) { usb_ll_enable_irq( USB_IRQ_TXIN ); usb_ll_enable_irq( USB_IRQ_RXOUT ); } else { if (usb_device._addr_setup){ usb_ll_enable_irq( USB_IRQ_TXIN ); } else { usb_ll_enable_irq( USB_IRQ_RXOUT ); usb_ll_clear_irq( USB_IRQ_NAKIN ); usb_ll_enable_irq( USB_IRQ_NAKIN ); }; }; } else if (cfg0x & _BV(0)){ usb_ll_enable_irq( USB_IRQ_TXIN ); } else { usb_ll_enable_irq( USB_IRQ_RXOUT ); }; return ESUCCESS; }; int usb_endpoint_unset_buffer (int endpoint){ ATOMIC int l = usb_device.endpoints[ endpoint ].bpos; usb_device.endpoints[ endpoint ].buffer = NULL; usb_device.endpoints[ endpoint ].blen = 0; usb_device.endpoints[ endpoint ].bpos = 0; usb_ll_endpoint_select( endpoint ); usb_ll_disable_irq( USB_IRQ_RXOUT ); usb_ll_disable_irq( USB_IRQ_TXIN ); return l; }; int usb_endpoint_check_buffer (int endpoint){ ATOMIC if (!usb_device.endpoints[ endpoint ].buffer){ return -ENULLPTR; }; return usb_device.endpoints[ endpoint ].blen - usb_device.endpoints[ endpoint ].bpos; }; int usb_endpoint_write(int endpoint,void *buffer,int len){ usb_endpoint_set_buffer( endpoint, buffer, len ); while (usb_endpoint_check_buffer( endpoint ) > 0){ wait_ms(1); }; return usb_endpoint_unset_buffer( endpoint ); }; int usb_endpoint_read(int endpoint,void *buffer,int len){ usb_endpoint_set_buffer( endpoint, buffer, len ); while (usb_endpoint_check_buffer( endpoint ) > 0){ wait_ms(1); }; return usb_endpoint_unset_buffer( endpoint ); };