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 list_headenum usb_dev_statusstruct usb_device_descriptorstruct usb_config_descriptorstruct usb_endpointstruct usb_controllerstruct usb_interface_descriptorstruct usb_driverrefcount_t
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:
struct usb_devicestruct usb_endpointenum usb_transfer_typestruct usb_setup_packetenum usb_status
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:
Defines
Section titled “Defines”#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 1USB_ENDPOINT_ATTR_USAGE_TYPE_IMPLICIT_FEEDBACK_DATA
Section titled “USB_ENDPOINT_ATTR_USAGE_TYPE_IMPLICIT_FEEDBACK_DATA”#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)USB_ENDPOINT_MAX_PACKET_SIZE_TRANSACT_OPP(byte)
Section titled “USB_ENDPOINT_MAX_PACKET_SIZE_TRANSACT_OPP(byte)”#define USB_ENDPOINT_MAX_PACKET_SIZE_TRANSACT_OPP(byte) ((byte >> 11) & 3)USB_ENDPOINT_MAX_PACKET_SIZE_TRANSACT_OPP_NUM(num)
Section titled “USB_ENDPOINT_MAX_PACKET_SIZE_TRANSACT_OPP_NUM(num)”#define USB_ENDPOINT_MAX_PACKET_SIZE_TRANSACT_OPP_NUM(num) (num + 1)USB_ENDPOINT_INTERVAL_TO_INTEGER_LOW_SPEED(num)
Section titled “USB_ENDPOINT_INTERVAL_TO_INTEGER_LOW_SPEED(num)”#define USB_ENDPOINT_INTERVAL_TO_INTEGER_LOW_SPEED(num) (num)USB_ENDPOINT_INTEGER_TO_INTERVAL_LOW_SPEED(num)
Section titled “USB_ENDPOINT_INTEGER_TO_INTERVAL_LOW_SPEED(num)”#define USB_ENDPOINT_INTEGER_TO_INTERVAL_LOW_SPEED(num) (num)USB_ENDPOINT_INTERVAL_TO_INTEGER_HIGH_SPEED(num)
Section titled “USB_ENDPOINT_INTERVAL_TO_INTEGER_HIGH_SPEED(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__)USB_DRIVER_REGISTER(n, cc, sc, proto, bringup_fn, teardown_fn, \ free_fn)
Section titled “USB_DRIVER_REGISTER(n, cc, sc, proto, bringup_fn, teardown_fn, \ free_fn)”#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)