#ifndef usb_serial_h__
#define usb_serial_h__


#include <stdint.h>

// setup
void usb_init(void);             // initialize everything
uint8_t usb_configured(void);    // is the USB port configured

int8_t usb_rawhid_recv(uint8_t *buffer, uint8_t timeout);  // receive a packet, with timeout
int8_t usb_rawhid_send(const uint8_t *buffer, uint8_t timeout); // send a packet, with timeout




// This file does not include the HID debug functions, so these empty
// macros replace them with nothing, so users can compile code that
// has calls to these functions.
#define usb_debug_putchar(c)
#define usb_debug_flush_output()



// Everything below this point is only intended for usb_serial.c
#ifdef USB_SERIAL_PRIVATE_INCLUDE
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

#define EP_TYPE_CONTROL             0x00
#define EP_TYPE_BULK_IN             0x81
#define EP_TYPE_BULK_OUT            0x80
#define EP_TYPE_INTERRUPT_IN        0xC1
#define EP_TYPE_INTERRUPT_OUT       0xC0
#define EP_TYPE_ISOCHRONOUS_IN      0x41
#define EP_TYPE_ISOCHRONOUS_OUT     0x40
#define EP_SINGLE_BUFFER            0x02
#define EP_DOUBLE_BUFFER            0x06
#define EP_SIZE(s)   ((s) == 64 ? 0x30 :\
                     ((s) == 32 ? 0x20 :\
                     ((s) == 16 ? 0x10 :\
                                 0x00)))

#define MAX_ENDPOINT		4

#define LSB(n) (n & 255)
#define MSB(n) ((n >> 8) & 255)


#define HW_CONFIG() (UHWCON = 0x01)
#define PLL_CONFIG() (PLLCSR = 0x12)
#define USB_CONFIG() (USBCON = ((1<<USBE)|(1<<OTGPADE)))
#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK)))


// standard control endpoint request types
#define GET_STATUS            0
#define CLEAR_FEATURE         1
#define SET_FEATURE           3
#define SET_ADDRESS           5
#define GET_DESCRIPTOR        6
#define GET_CONFIGURATION     8
#define SET_CONFIGURATION     9
#define GET_INTERFACE         10
#define SET_INTERFACE         11
#define USBRQ_SYNCH_FRAME       12


/* USB descriptor constants */
#define USBDESCR_DEVICE         1
#define USBDESCR_CONFIG         2
#define USBDESCR_STRING         3
#define USBDESCR_INTERFACE      4
#define USBDESCR_ENDPOINT       5
#define USBDESCR_HID            0x21
#define USBDESCR_HID_REPORT     0x22
#define USBDESCR_HID_PHYS       0x23


//#define USBATTR_BUSPOWER        0x80  // USB 1.1 does not define this value any more
#define USBATTR_SELFPOWER       0x40
#define USBATTR_REMOTEWAKE      0x20



// HID (human interface device)
#define HID_GET_REPORT        1
#define HID_GET_IDLE          2
#define HID_GET_PROTOCOL      3
#define HID_SET_REPORT        9
#define HID_SET_IDLE          10
#define HID_SET_PROTOCOL      11


// CDC (communication class device)
#define CDC_SET_LINE_CODING         0x20
#define CDC_GET_LINE_CODING         0x21
#define CDC_SET_CONTROL_LINE_STATE  0x22
#endif
#endif
