Skip to content

USB

struct usb_setup_packet {
uint8_t bitmap_request_type;
enum usb_rq_code request;
uint16_t value;
union {
uint16_t index;
uint16_t offset;
};
uint16_t length;
};

struct usb_setup_packet referenced types:

struct usb_device_descriptor {
uint8_t length;
uint8_t type;
uint16_t usb_num_bcd;
uint8_t class;
uint8_t subclass;
uint8_t protocol;
uint8_t max_packet_size;
uint16_t vendor_id;
uint16_t product_id;
uint16_t device_num_bcd;
uint8_t manufacturer;
uint8_t product;
uint8_t serial_num;
uint8_t num_configs;
};
struct usb_interface_descriptor {
uint8_t length;
uint8_t type;
uint8_t interface_number;
uint8_t alternate_setting;
uint8_t num_endpoints;
uint8_t class;
uint8_t subclass;
uint8_t protocol;
uint8_t interface;
};
struct usb_config_descriptor {
uint8_t length;
uint8_t descriptor_type;
uint16_t total_length;
uint8_t num_interfaces;
uint8_t configuration_value;
uint8_t configuration;
uint8_t bitmap_attributes;
uint8_t max_power;
};
struct usb_endpoint_descriptor {
uint8_t length;
uint8_t type;
uint8_t address;
uint8_t attributes;
uint16_t max_packet_size;
uint8_t interval;
};
struct usb_endpoint {
struct usb_endpoint_descriptor *desc;
uint8_t type;
uint8_t number;
bool in;
uint8_t *transfer_buffer;
uint16_t transfer_len;
uint16_t max_packet_size;
uint8_t address;
uint8_t attributes;
uint8_t interval;
void *hc_data;
};

struct usb_endpoint referenced types:

struct usb_controller_ops {
enum usb_status (*submit_control_transfer)(struct usb_request *);
enum usb_status (*submit_bulk_transfer)(struct usb_request *);
enum usb_status (*submit_interrupt_transfer)(struct usb_request *);
void (*reset_slot)(struct usb_device *dev);
enum usb_status (*configure_endpoint)(struct usb_device *dev);
void (*poll_ports)(struct usb_controller *);
};

struct usb_controller_ops referenced types:

struct usb_controller {
enum usb_controller_type type;
struct usb_controller_ops ops;
void *driver_data;
};

struct usb_controller referenced types:

struct usb_driver {
char *name;
uint8_t class_code;
uint8_t subclass;
uint8_t protocol;
enum usb_status (*bringup)(struct usb_device *dev);
void (*teardown)(struct usb_device *dev);
void (*free)(struct usb_device *dev);
};

struct usb_driver referenced types:

struct usb_device {
struct list_head hc_list;
enum usb_dev_status status;
char manufacturer[128];
char product[128];
char config_str[128];
uint8_t address;
uint8_t speed;
uint8_t port;
void *slot;
uint8_t max_packet_size;
struct usb_device_descriptor *descriptor;
struct usb_config_descriptor config;
struct usb_endpoint **endpoints;
uint8_t num_endpoints;
struct usb_controller *host;
struct usb_interface_descriptor **interfaces;
uint8_t num_interfaces;
struct usb_driver *driver;
void *driver_private;
bool configured;
refcount_t refcount;
atomic_bool alive;
void (*teardown)(struct usb_device *dev);
void (*free)(struct usb_device *dev);
};

struct usb_device referenced types:

struct usb_request {
struct usb_device *dev;
struct usb_endpoint *ep;
enum usb_transfer_type type;
struct usb_setup_packet *setup;
void *buffer;
size_t length;
enum usb_status status;
uint32_t flags;
uint64_t timeout_ns;
void (*complete)(struct usb_request *);
void *context;
bool direction_in;
void *hc_priv;
};

struct usb_request referenced types:

enum usb_rq_code {
USB_RQ_CODE_GET_STATUS = 0,
USB_RQ_CODE_CLEAR_FEATURE = 1,
USB_RQ_CODE_SET_FEATURE = 3,
USB_RQ_CODE_SET_ADDR = 5,
USB_RQ_CODE_GET_DESCRIPTOR = 6,
USB_RQ_CODE_SET_DESCRIPTOR = 7,
USB_RQ_CODE_GET_CONFIG = 8,
USB_RQ_CODE_SET_CONFIG = 9,
USB_RQ_CODE_GET_INTERFACE = 10,
USB_RQ_CODE_SET_INTERFACE = 11,
USB_RQ_CODE_SYNCH_FRAME = 12,
};
enum usb_controller_type {
USB_CONTROLLER_UHCI,
USB_CONTROLLER_EHCI,
USB_CONTROLLER_XHCI,
};
enum usb_transfer_type {
USB_TRANSFER_CONTROL,
USB_TRANSFER_BULK,
USB_TRANSFER_INTERRUPT,
};
enum usb_status {
USB_OK = 0,
USB_ERR_STALL,
USB_ERR_TIMEOUT,
USB_ERR_DISCONNECT,
USB_ERR_OVERFLOW,
USB_ERR_CRC,
USB_ERR_IO,
USB_ERR_PROTO,
USB_ERR_NO_DEVICE,
USB_ERR_CANCELLED,
USB_ERR_OOM,
USB_ERR_INVALID_ARGUMENT,
USB_ERR_NO_ENDPOINT,
};
enum usb_dev_status {
USB_DEV_UNDEF,
USB_DEV_DISCONNECTED,
USB_DEV_CONNECTED,
USB_DEV_ENABLED,
USB_DEV_RESETTING,
USB_DEV_ERROR,
};
void usb_device_put(struct usb_device *dev);

usb_device_put referenced types:

uint8_t get_ep_index(struct usb_endpoint *ep);

get_ep_index referenced types:

char usb_rq_code_str(enum usb_rq_code code);

usb_rq_code_str referenced types:

char usb_transfer_type_str(enum usb_transfer_type type);

usb_transfer_type_str referenced types:

#define USB_DESC_TYPE_DEVICE 1
#define USB_DESC_TYPE_CONFIG 2
#define USB_DESC_TYPE_STRING 3
#define USB_DESC_TYPE_INTERFACE 4
#define USB_DESC_TYPE_ENDPOINT 5
#define USB_DESC_TYPE_DEV_QUALIFIER 6
#define USB_DESC_TYPE_OTHER_SPEED_CONFIG 7
#define USB_DESC_TYPE_INTERFACE_POWER 8
#define USB_DESC_TYPE_SHIFT 8
#define USB_REQUEST_TRANS_HTD 0
#define USB_REQUEST_TRANS_DTH 1
#define USB_REQUEST_TYPE_STANDARD 0
#define USB_REQUEST_TYPE_CLASS 1
#define USB_REQUEST_TYPE_VENDOR 2
#define USB_REQUEST_RECIPIENT_DEVICE 0
#define USB_REQUEST_RECIPIENT_INTERFACE 1
#define USB_REQUEST_RECIPIENT_ENDPOINT 2
#define USB_REQUEST_RECIPIENT_OTHER 3
#define USB_REQUEST_TRANSFER_SHIFT 7
#define USB_REQUEST_TRANSFER_MASK 1
#define USB_REQUEST_TYPE_SHIFT 5
#define USB_REQUEST_TYPE_MASK 3
#define USB_REQUEST_RECIPIENT_MASK 0x1F
#define USB_REQUEST_TRANSFER(byte) ((byte >> 7) & 1)
#define USB_REQUEST_TYPE(byte) ((byte >> 5) & 3)
#define USB_REQUEST_RECIPIENT(byte) (byte & 0x1F)
#define USB_CONFIG_SELF_POWERED (1 << 7)
#define USB_CONFIG_REMOTE_WAKEUP (1 << 6)
#define USB_ENDPOINT_ADDR_EP_DIRECTION_OUT 0
#define USB_ENDPOINT_ADDR_EP_DIRECTION_IN 1
#define USB_ENDPOINT_ADDR_EP_NUM(byte) (byte & 0xF)
#define USB_ENDPOINT_ADDR_EP_DIRECTION(byte) ((byte >> 7) & 1)
#define USB_ENDPOINT_ATTR_TRANS_TYPE_CONTROL 0
#define USB_ENDPOINT_ATTR_TRANS_TYPE_ISOCHRONOUS 1
#define USB_ENDPOINT_ATTR_TRANS_TYPE_BULK 2
#define USB_ENDPOINT_ATTR_TRANS_TYPE_INTERRUPT 3
#define USB_ENDPOINT_ATTR_SYNC_TYPE_NO_SYNC 0
#define USB_ENDPOINT_ATTR_SYNC_TYPE_ASYNC 1
#define USB_ENDPOINT_ATTR_SYNC_TYPE_ADAPTIVE 2
#define USB_ENDPOINT_ATTR_SYNC_TYPE_SYNC 3
#define USB_ENDPOINT_ATTR_USAGE_TYPE_DATA 0
#define USB_ENDPOINT_ATTR_USAGE_TYPE_FEEDBACK 1
#define USB_ENDPOINT_ATTR_USAGE_TYPE_IMPLICIT_FEEDBACK_DATA 2
#define USB_ENDPOINT_ATTR_TRANS_TYPE(byte) (byte & 3)
#define USB_ENDPOINT_ATTR_SYNC_TYPE(byte) ((byte >> 2) & 3)
#define USB_ENDPOINT_ATTR_USAGE_TYPE(byte) ((byte >> 4) & 3)
#define USB_ENDPOINT_MAX_PACKET_SIZE_SIZE(byte) (byte & 0x3FF)
#define USB_ENDPOINT_MAX_PACKET_SIZE_TRANSACT_OPP(byte) ((byte >> 11) & 3)
#define USB_ENDPOINT_MAX_PACKET_SIZE_TRANSACT_OPP_NUM(num) (num + 1)
#define USB_ENDPOINT_INTERVAL_TO_INTEGER_LOW_SPEED(num) (num)
#define USB_ENDPOINT_INTEGER_TO_INTERVAL_LOW_SPEED(num) (num)
#define USB_ENDPOINT_INTERVAL_TO_INTEGER_HIGH_SPEED(num) (2 << (num - 2))
#define USB_CLASS_AUDIO 0x1
#define USB_CLASS_COMMS 0x2
#define USB_CLASS_HID 0x3
#define USB_SUBCLASS_HID_NONE 0x0
#define USB_SUBCLASS_HID_BOOT_INTERFACE 0x1
#define USB_PROTOCOL_HID_NONE 0x0
#define USB_PROTOCOL_HID_KEYBOARD 0x1
#define USB_PROTOCOL_HID_MOUSE 0x2
#define USB_CLASS_PHYSICAL 0x5
#define USB_CLASS_IMAGE 0x6
#define USB_CLASS_PRINTER 0x7
#define USB_CLASS_MASS_STORAGE 0x8
#define USB_CLASS_HUB 0x9
#define USB_CLASS_DATA 0xA
#define USB_CLASS_SMART_CARD 0xB
#define USB_CLASS_CONTENT_SECURITY 0xD
#define USB_CLASS_VIDEO 0xE
#define USB_CLASS_PERSONAL_HEALTHCARE 0xF
#define USB_CLASS_AUDIO_VIDEO 0x10
#define USB_CLASS_BILLBOARD 0x11
#define USB_CLASS_USB_TYPE_C 0x12
#define USB_CLASS_BULK_DISPLAY 0x13
#define USB_CLASS_MCTP_OVER_USB 0x14
#define USB_CLASS_I3C_DEVICE 0x3C
#define USB_CLASS_DIAGNOSTIC_DEVICE 0xDC
#define USB_CLASS_WIRELESS 0xE0
#define USB_CLASS_MISC 0xEF
#define USB_CLASS_APPLICATION_SPECIFIC 0xFE
#define USB_CLASS_VENDOR_SPECIFIC 0xFF
#define usb_log(lvl, fmt, ...) \ log(LOG_SITE(usb), LOG_HANDLE(usb), lvl, fmt, ##__VA_ARGS__)
#define usb_err(fmt, ...) usb_log(LOG_ERROR, fmt, ##__VA_ARGS__)
#define usb_warn(fmt, ...) usb_log(LOG_WARN, fmt, ##__VA_ARGS__)
#define usb_info(fmt, ...) usb_log(LOG_INFO, fmt, ##__VA_ARGS__)
#define usb_debug(fmt, ...) usb_log(LOG_DEBUG, fmt, ##__VA_ARGS__)
#define usb_trace(fmt, ...) usb_log(LOG_TRACE, fmt, ##__VA_ARGS__)
#define USB_DRIVER_REGISTER(n, cc, sc, proto, bringup_fn, teardown_fn, \ free_fn) \ static struct usb_driver usb_driver_##n __attribute__(( \ section(".kernel_usb_drivers"), used)) = {.name = #n, \ .class_code = cc, \ .subclass = sc, \ .protocol = proto, \ .bringup = bringup_fn, \ .teardown = teardown_fn, \ .free = free_fn};
#define USB_REQ_INIT(_req, _dev) \ do { \ memset((_req), 0, sizeof(*(_req))); \ (_req)->dev = (_dev); \ } while (0)