struct __attribute__((packed,aligned(4))) usb_driver
{
void (*init)(const struct usb_instance* data);
void (*ep0_start_rx)(const struct usb_instance* data, int non_setup);
void (*ep0_start_tx)(const struct usb_instance* data, const void* buf, int len);
void (*start_rx)(const struct usb_instance* data, union usb_endpoint_number ep, void* buf, int size);
void (*start_tx)(const struct usb_instance* data, union usb_endpoint_number ep, const void* buf, int size);
void (*set_stall)(const struct usb_instance* data, union usb_endpoint_number ep, int stall);
void (*set_address)(const struct usb_instance* data, uint8_t address);
void (*configure_ep)(const struct usb_instance* data, union usb_endpoint_number ep, enum usb_endpoint_type type, int maxpacket);
void (*unconfigure_ep)(const struct usb_instance* data, union usb_endpoint_number ep);
};