| 1 | /* TODO: spec citations per structure */ |
| 2 | |
| 3 | #include <drivers/usb/usb.h> |
| 4 | #include <drivers/verifier.h> |
| 5 | |
| 6 | /* USB specification, page 276 */ |
| 7 | #define DV_STRUCT usb_setup_packet |
| 8 | dv_size(0x08); |
| 9 | dv_align(1); |
| 10 | dv_field(uint8_t, bitmap_request_type, 0x00); |
| 11 | dv_field(enum usb_rq_code, request, 0x01); |
| 12 | dv_field(uint16_t, value, 0x02); |
| 13 | dv_field(uint16_t, length, 0x06); |
| 14 | #undef DV_STRUCT |
| 15 | |
| 16 | /* USB specification, page 290 */ |
| 17 | #define DV_STRUCT usb_device_descriptor |
| 18 | dv_size(0x12); |
| 19 | dv_align(1); |
| 20 | dv_field(uint8_t, length, 0x00); |
| 21 | dv_field(uint8_t, type, 0x01); |
| 22 | dv_field(uint16_t, usb_num_bcd, 0x02); |
| 23 | dv_field(uint8_t, class, 0x04); |
| 24 | dv_field(uint8_t, subclass, 0x05); |
| 25 | dv_field(uint8_t, protocol, 0x06); |
| 26 | dv_field(uint8_t, max_packet_size, 0x07); |
| 27 | dv_field(uint16_t, vendor_id, 0x08); |
| 28 | dv_field(uint16_t, product_id, 0x0A); |
| 29 | dv_field(uint16_t, device_num_bcd, 0x0C); |
| 30 | dv_field(uint8_t, manufacturer, 0x0E); |
| 31 | dv_field(uint8_t, product, 0x0F); |
| 32 | dv_field(uint8_t, serial_num, 0x10); |
| 33 | dv_field(uint8_t, num_configs, 0x11); |
| 34 | #undef DV_STRUCT |
| 35 | |
| 36 | /* TODO: spec citation */ |
| 37 | #define DV_STRUCT usb_interface_descriptor |
| 38 | dv_size(0x09); |
| 39 | dv_align(1); |
| 40 | dv_field(uint8_t, length, 0x00); |
| 41 | dv_field(uint8_t, type, 0x01); |
| 42 | dv_field(uint8_t, interface_number, 0x02); |
| 43 | dv_field(uint8_t, alternate_setting, 0x03); |
| 44 | dv_field(uint8_t, num_endpoints, 0x04); |
| 45 | dv_field(uint8_t, class, 0x05); |
| 46 | dv_field(uint8_t, subclass, 0x06); |
| 47 | dv_field(uint8_t, protocol, 0x07); |
| 48 | dv_field(uint8_t, interface, 0x08); |
| 49 | #undef DV_STRUCT |
| 50 | |
| 51 | /* TODO: spec citation */ |
| 52 | #define DV_STRUCT usb_config_descriptor |
| 53 | dv_size(0x09); |
| 54 | dv_align(1); |
| 55 | dv_field(uint8_t, length, 0x00); |
| 56 | dv_field(uint8_t, descriptor_type, 0x01); |
| 57 | dv_field(uint16_t, total_length, 0x02); |
| 58 | dv_field(uint8_t, num_interfaces, 0x04); |
| 59 | dv_field(uint8_t, configuration_value, 0x05); |
| 60 | dv_field(uint8_t, configuration, 0x06); |
| 61 | dv_field(uint8_t, bitmap_attributes, 0x07); |
| 62 | dv_field(uint8_t, max_power, 0x08); |
| 63 | #undef DV_STRUCT |
| 64 | |
| 65 | /* TODO: spec citation */ |
| 66 | #define DV_STRUCT usb_endpoint_descriptor |
| 67 | dv_size(0x07); |
| 68 | dv_align(1); |
| 69 | dv_field(uint8_t, length, 0x00); |
| 70 | dv_field(uint8_t, type, 0x01); |
| 71 | dv_field(uint8_t, address, 0x02); |
| 72 | dv_field(uint8_t, attributes, 0x03); |
| 73 | dv_field(uint16_t, max_packet_size, 0x04); |
| 74 | dv_field(uint8_t, interval, 0x06); |
| 75 | #undef DV_STRUCT |
| 76 | |