avr-fw-modules/usb/include/usb/usb_device.h

109 lines
3.1 KiB
C

#pragma once
#define MAX_ENDPOINTS 7
#include <stdint.h>
#include <sys/errno.h>
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<<irqbit); };
static inline void avr_usb_endpoint_disable_irq(uint8_t irqbit) { UEIENX &= ~_BV(irqbit); };
static inline void avr_usb_endpoint_stall_request(void) { UECONX |= _BV(STALLRQ); };
/* Device Management Callbacks */
void usb_device_setup_event (void);
static inline void usb_device_enable_padreg(void) { UHWCON |= _BV(UVREGE); };
static inline void usb_device_disable_padreg(void) { UHWCON &= ~_BV(UVREGE); };
static inline void usb_device_enable_macro(void) { USBCON |= _BV(USBE); };
static inline void usb_device_disable_macro(void) { USBCON &= ~_BV(USBE); };
static inline void usb_device_enable_vbuspad(void) { USBCON |= _BV(OTGPADE); };
static inline void usb_device_disable_vbuspad(void) { USBCON &= ~_BV(OTGPADE); };
static inline void usb_device_freeze_clock(void) { USBCON |= _BV(FRZCLK); };
static inline void usb_device_unfreeze_clock(void) { USBCON &= ~_BV(FRZCLK); };
static inline uint8_t usb_device_bus_is_connected(void) { return (USBSTA & _BV(VBUS)) ? -1 : 0; };
static inline void usb_device_mode(void) {
#ifdef USB_CAN_HOST
UHWCON &= ~_BV(UIDE);
UHWCON |= _BV(UIMOD);
USBCON &= ~_BV(HOST);
#endif
};