109 lines
3.1 KiB
C
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
|
|
}; |