#ifndef _DESCRIPTORS_H_
#define _DESCRIPTORS_H_

#include <stdint.h>
#include "usb.h"

#define ESB_ENDPOINT_MSC_IN         2
#define ESB_ENDPOINT_MSC_OUT        1
#define ESB_ENDPOINT_CDCACM_NOTIFY  3
#define ESB_ENDPOINT_CDCACM_IN      2
#define ESB_ENDPOINT_CDCACM_OUT     1

/* device types */
#define DT_DEVICE       0x01
#define DT_CONFIG       0x02
#define DT_INTERFACE    0x04
#define DT_ENDPOINT     0x05
#define DT_FUNCTIONAL   0x24

/* interface classes */
#define CLS_UNSPECIFIED 0x00
#define CLS_COMM        0x02
#define CLS_MASS_STOR   0x08
#define CLS_DATA        0x0a

/* sub-classes */
#define SCLS_NONE       0x00
#define SCLS_ACM        0x02
#define SCLS_SCSI_CMDS  0x06

/* interface protocols */
#define PROT_AT_CMDS    0x01
#define PROT_BULK_TRANS 0x50

/* endpoint attributes */
#define ATTR_BULK       0x02
#define ATTR_INTERRUPT  0x03


#define VNDR_MAXIM  0x0B6A

#if defined(__GNUC__)
#define PACKED_STRUCT struct __attribute__((packed))
#else
#define PACKED_STRUCT __packed struct
#endif




PACKED_STRUCT
config_descriptor_cdcacm {
    usb_configuration_descriptor_t  config;
    usb_interface_descriptor_t      comm_interface;
    uint8_t                         header_functional[5];
    uint8_t                         call_management[5];
    uint8_t                         acm_functional[4];
    uint8_t                         union_functional[5];
    usb_endpoint_descriptor_t       endpoint_notify;
    usb_interface_descriptor_t      data_interface;
    usb_endpoint_descriptor_t       endpoint_out;
    usb_endpoint_descriptor_t       endpoint_in;
};

PACKED_STRUCT
config_descriptor_msc {
    usb_configuration_descriptor_t  config;
    usb_interface_descriptor_t      msc_interface;
    usb_endpoint_descriptor_t       endpoint_out;
    usb_endpoint_descriptor_t       endpoint_in;
};

struct esb_device_descriptors {
    usb_device_descriptor_t* device;
    union {
        usb_configuration_descriptor_t* config;
        struct config_descriptor_cdcacm* cdcacm;
        struct config_descriptor_msc* msc;
    };
};


#endif /* _DESCRIPTORS_H_ */