2021-12-22 11:31:06 -06:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#ifndef USB_H
|
|
|
|
#define USB_H
|
|
|
|
/*
|
|
|
|
* Provides definitions of various values and data structures defined by the
|
2022-01-08 17:00:28 -06:00
|
|
|
* USB specifications.
|
2021-12-22 11:31:06 -06:00
|
|
|
*
|
2022-01-08 17:00:28 -06:00
|
|
|
* Copyright (C) 2021-2022 Martin Whitaker.
|
2021-12-22 11:31:06 -06:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
|
2022-01-23 11:32:55 -06:00
|
|
|
// Basic limits.
|
|
|
|
|
|
|
|
#define USB_MAX_ADDRESS 127
|
|
|
|
|
2022-01-08 17:00:28 -06:00
|
|
|
// Request types.
|
2021-12-22 11:31:06 -06:00
|
|
|
|
2022-01-08 17:00:28 -06:00
|
|
|
#define USB_REQ_TO_DEVICE 0x00
|
|
|
|
#define USB_REQ_TO_INTERFACE 0x01
|
|
|
|
#define USB_REQ_TO_ENDPOINT 0x02
|
|
|
|
#define USB_REQ_TO_HUB_PORT 0x03
|
|
|
|
|
|
|
|
#define USB_REQ_FROM_DEVICE 0x80
|
|
|
|
#define USB_REQ_FROM_INTERFACE 0x81
|
|
|
|
#define USB_REQ_FROM_ENDPOINT 0x82
|
|
|
|
#define USB_REQ_FROM_HUB_PORT 0x83
|
|
|
|
|
|
|
|
#define USB_REQ_CLASS 0x20
|
|
|
|
|
|
|
|
// Request codes.
|
|
|
|
|
|
|
|
#define USB_GET_STATUS 0
|
|
|
|
#define USB_CLR_FEATURE 1
|
|
|
|
#define USB_SET_FEATURE 3
|
|
|
|
#define USB_SET_ADDRESS 5
|
|
|
|
#define USB_GET_DESCRIPTOR 6
|
|
|
|
#define USB_SET_DESCRIPTOR 7
|
|
|
|
#define USB_GET_CONFIGURATION 8
|
|
|
|
#define USB_SET_CONFIGURATION 9
|
|
|
|
#define USB_GET_INTERFACE 10
|
|
|
|
#define USB_SET_INTERFACE 11
|
|
|
|
|
|
|
|
#define HID_GET_REPORT 1
|
|
|
|
#define HID_GET_IDLE 2
|
|
|
|
#define HID_GET_PROTOCOL 3
|
|
|
|
#define HID_SET_REPORT 9
|
|
|
|
#define HID_SET_IDLE 10
|
|
|
|
#define HID_SET_PROTOCOL 11
|
|
|
|
|
|
|
|
#define HUB_GET_STATUS 0
|
|
|
|
#define HUB_CLR_FEATURE 1
|
|
|
|
#define HUB_SET_FEATURE 3
|
|
|
|
#define HUB_GET_DESCRIPTOR 6
|
|
|
|
#define HUB_SET_DESCRIPTOR 7
|
|
|
|
|
|
|
|
// Descriptor types.
|
|
|
|
|
|
|
|
#define USB_DESC_DEVICE 1
|
|
|
|
#define USB_DESC_CONFIGURATION 2
|
|
|
|
#define USB_DESC_INTERFACE 4
|
|
|
|
#define USB_DESC_ENDPOINT 5
|
|
|
|
|
|
|
|
#define HUB_DESC_DEVICE 0x29
|
|
|
|
|
|
|
|
// Class codes.
|
|
|
|
|
|
|
|
#define USB_CLASS_HID 3
|
|
|
|
#define USB_CLASS_HUB 9
|
|
|
|
|
|
|
|
// Hub feature selectors.
|
|
|
|
|
|
|
|
#define HUB_PORT_ENABLE 1
|
|
|
|
#define HUB_PORT_RESET 4
|
|
|
|
#define HUB_PORT_POWER 8
|
|
|
|
|
|
|
|
// Hub port status.
|
|
|
|
|
|
|
|
#define HUB_PORT_CONNECTED 0x00000001
|
|
|
|
#define HUB_PORT_ENABLED 0x00000002
|
|
|
|
#define HUB_PORT_RESETTING 0x00000010
|
|
|
|
#define HUB_PORT_POWERED 0x00000100
|
|
|
|
#define HUB_PORT_LOW_SPEED 0x00000200
|
|
|
|
#define HUB_PORT_HIGH_SPEED 0x00000400
|
|
|
|
|
|
|
|
// Data structures.
|
|
|
|
|
|
|
|
typedef struct __attribute__((packed)) {
|
2021-12-22 11:31:06 -06:00
|
|
|
uint8_t type;
|
|
|
|
uint8_t request;
|
|
|
|
uint16_t value;
|
|
|
|
uint16_t index;
|
|
|
|
uint16_t length;
|
|
|
|
} usb_setup_pkt_t;
|
|
|
|
|
2022-01-08 17:00:28 -06:00
|
|
|
typedef struct __attribute__((packed)) {
|
2021-12-22 11:31:06 -06:00
|
|
|
uint8_t length;
|
|
|
|
uint8_t type;
|
|
|
|
} usb_desc_header_t;
|
|
|
|
|
2022-01-08 17:00:28 -06:00
|
|
|
typedef struct __attribute__((packed)) {
|
2021-12-22 11:31:06 -06:00
|
|
|
uint8_t length;
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t usb_minor;
|
|
|
|
uint8_t usb_major;
|
|
|
|
uint8_t class;
|
|
|
|
uint8_t subclass;
|
|
|
|
uint8_t protocol;
|
|
|
|
uint8_t max_packet_size;
|
|
|
|
uint16_t vendor_id;
|
|
|
|
uint16_t product_id;
|
|
|
|
uint8_t device_minor;
|
|
|
|
uint8_t device_major;
|
|
|
|
uint8_t vendor_str;
|
|
|
|
uint8_t product_str;
|
|
|
|
uint8_t serial_num_str;
|
|
|
|
uint8_t num_configs;
|
|
|
|
} usb_device_desc_t;
|
|
|
|
|
2022-01-08 17:00:28 -06:00
|
|
|
typedef struct __attribute__((packed)) {
|
2021-12-22 11:31:06 -06:00
|
|
|
uint8_t length;
|
|
|
|
uint8_t type;
|
|
|
|
uint16_t total_length;
|
|
|
|
uint8_t num_interfaces;
|
|
|
|
uint8_t config_num;
|
|
|
|
uint8_t config_str;
|
|
|
|
uint8_t attributes;
|
|
|
|
uint8_t max_power;
|
|
|
|
} usb_config_desc_t;
|
|
|
|
|
2022-01-08 17:00:28 -06:00
|
|
|
typedef struct __attribute__((packed)) {
|
2021-12-22 11:31:06 -06:00
|
|
|
uint8_t length;
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t interface_num;
|
|
|
|
uint8_t alt_setting;
|
|
|
|
uint8_t num_endpoints;
|
|
|
|
uint8_t class;
|
|
|
|
uint8_t subclass;
|
|
|
|
uint8_t protocol;
|
|
|
|
uint8_t interface_str;
|
|
|
|
} usb_interface_desc_t;
|
|
|
|
|
2022-01-08 17:00:28 -06:00
|
|
|
typedef struct __attribute__((packed)) {
|
2021-12-22 11:31:06 -06:00
|
|
|
uint8_t length;
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t address;
|
|
|
|
uint8_t attributes;
|
|
|
|
uint16_t max_packet_size;
|
|
|
|
uint8_t interval;
|
|
|
|
} usb_endpoint_desc_t;
|
|
|
|
|
2022-01-08 17:00:28 -06:00
|
|
|
typedef struct __attribute__((packed)) {
|
|
|
|
uint8_t length;
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t num_ports;
|
|
|
|
uint16_t characteristics;
|
|
|
|
uint8_t power_up_delay;
|
|
|
|
uint8_t controller_current;
|
|
|
|
uint8_t port_flags[];
|
|
|
|
} usb_hub_desc_t;
|
|
|
|
|
|
|
|
typedef struct __attribute__((packed)) {
|
2021-12-22 11:31:06 -06:00
|
|
|
uint8_t modifiers;
|
|
|
|
uint8_t reserved;
|
|
|
|
uint8_t key_code[6];
|
|
|
|
} hid_kbd_rpt_t;
|
|
|
|
|
|
|
|
#endif // USB_H
|