#pragma once #define MAX_ENDPOINTS 7 #include #include typedef struct { usb_device_state_t state; int current_configuration; usb_device_setup_t *descriptor; usb_standard_endpoint_descriptor_t ep0desc; usb_ll_endpoint_t endpoints[ MAX_ENDPOINTS ]; uint8_t _addr_setup; } usb_device_t; extern usb_device_t usb_device; /** APPLICATION / USER API **/ int usb_device_on (usb_device_setup_t *ddesc); void usb_device_off (void); void usb_device_attach (void); void usb_device_detach (void); int usb_device_check_attachment (void); int usb_device_wait_vbus (void); int usb_endpoint_set_buffer (int endpoint,void *buffer,int size); int usb_endpoint_unset_buffer (int endpoint); int usb_endpoint_check_buffer (int endpoint); int usb_endpoint_read (int endpoint,void *buffer,int len); int usb_endpoint_write (int endpoint,void *buffer,int len); #define usb_endpoint_print(ep,te) usb_endpoint_write( ep, te, strlen(te) ) static inline int usb_device_has_configuration(int nConfiguration){ if (usb_device.current_configuration == nConfiguration) return ESUCCESS; return -EFAIL; }; /** LOW LEVEL Functions **/ void usb_irq_endpoint_setup (uint8_t endpoint); void usb_irq_endpoint_txin (uint8_t endpoint); void usb_irq_endpoint_rxout (uint8_t endpoint); void usb_irq_endpoint_nakin (uint8_t endpoint); int usb_ll_endpoint_select (uint8_t endpoint); void usb_ll_enable_irq (uint16_t irq); void usb_ll_disable_irq (uint16_t irq); void usb_ll_disable_all_irq (void); void usb_ll_disable_all_endpoint_irq (void); void usb_ll_clear_irq (uint16_t irq); void usb_ll_setup_configuration (int nConfiguration); void usb_ll_endpoint_disable (int nEP); void usb_ll_endpoint_enable (struct usb_standard_endpoint_descriptor* descriptor); int usb_ll_setup_request (int endpoint,usb_device_request_t *request); static inline void avr_usb_endpoint_enable_irq(uint8_t irqbit) { UEIENX |= (1<