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);
};