#ifndef USB_DEVICE_H
#define USB_DEVICE_H
//
#include <stm32h747xx.h>
typedef enum {
// error states first so they are lowest
CONTROL_ERROR = -4,
ERROR = -3,
UNKNOWN_INTERRUPT = -2,
OTG_ERROR = -1, // shouldn't happen, since otg is not used
INIT = 0,
RESET = 1,
RESET_DONE = 2,
SET_ADDRESS_RCVD = 3,
SET_CONFIG_RCVD = 4,
ENUMERATED = 5,
} usb_device_state_t;
typedef struct {
USB_OTG_GlobalTypeDef *core;
USB_OTG_DeviceTypeDef *device;
USB_OTG_OUTEndpointTypeDef *out;
USB_OTG_INEndpointTypeDef *in;
uint8_t endpoint_count;
usb_device_state_t state;
} usb_device_t;
struct usb_configuration_t;
typedef struct {
} usb_class_t;
// has configuration etc
#define USB_DEVICE_SIZE sizeof(usb_device_t)
extern usb_device_t* usb1_device;
void* usb_device_init(void* peripheral_address, usb_class_t* class, void* buffer);
void usb_device_setup(void* device);
void usb_device_wait_for_handshake(void* device);
#endif // USB_DEVICE_H