Annotation of qemu/hw/usb/desc.h, revision 1.1.1.1

1.1       root        1: #ifndef QEMU_HW_USB_DESC_H
                      2: #define QEMU_HW_USB_DESC_H
                      3: 
                      4: #include <inttypes.h>
                      5: 
                      6: /* binary representation */
                      7: typedef struct USBDescriptor {
                      8:     uint8_t                   bLength;
                      9:     uint8_t                   bDescriptorType;
                     10:     union {
                     11:         struct {
                     12:             uint8_t           bcdUSB_lo;
                     13:             uint8_t           bcdUSB_hi;
                     14:             uint8_t           bDeviceClass;
                     15:             uint8_t           bDeviceSubClass;
                     16:             uint8_t           bDeviceProtocol;
                     17:             uint8_t           bMaxPacketSize0;
                     18:             uint8_t           idVendor_lo;
                     19:             uint8_t           idVendor_hi;
                     20:             uint8_t           idProduct_lo;
                     21:             uint8_t           idProduct_hi;
                     22:             uint8_t           bcdDevice_lo;
                     23:             uint8_t           bcdDevice_hi;
                     24:             uint8_t           iManufacturer;
                     25:             uint8_t           iProduct;
                     26:             uint8_t           iSerialNumber;
                     27:             uint8_t           bNumConfigurations;
                     28:         } device;
                     29:         struct {
                     30:             uint8_t           bcdUSB_lo;
                     31:             uint8_t           bcdUSB_hi;
                     32:             uint8_t           bDeviceClass;
                     33:             uint8_t           bDeviceSubClass;
                     34:             uint8_t           bDeviceProtocol;
                     35:             uint8_t           bMaxPacketSize0;
                     36:             uint8_t           bNumConfigurations;
                     37:             uint8_t           bReserved;
                     38:         } device_qualifier;
                     39:         struct {
                     40:             uint8_t           wTotalLength_lo;
                     41:             uint8_t           wTotalLength_hi;
                     42:             uint8_t           bNumInterfaces;
                     43:             uint8_t           bConfigurationValue;
                     44:             uint8_t           iConfiguration;
                     45:             uint8_t           bmAttributes;
                     46:             uint8_t           bMaxPower;
                     47:         } config;
                     48:         struct {
                     49:             uint8_t           bInterfaceNumber;
                     50:             uint8_t           bAlternateSetting;
                     51:             uint8_t           bNumEndpoints;
                     52:             uint8_t           bInterfaceClass;
                     53:             uint8_t           bInterfaceSubClass;
                     54:             uint8_t           bInterfaceProtocol;
                     55:             uint8_t           iInterface;
                     56:         } interface;
                     57:         struct {
                     58:             uint8_t           bEndpointAddress;
                     59:             uint8_t           bmAttributes;
                     60:             uint8_t           wMaxPacketSize_lo;
                     61:             uint8_t           wMaxPacketSize_hi;
                     62:             uint8_t           bInterval;
                     63:             uint8_t           bRefresh;        /* only audio ep */
                     64:             uint8_t           bSynchAddress;   /* only audio ep */
                     65:         } endpoint;
                     66:     } u;
                     67: } QEMU_PACKED USBDescriptor;
                     68: 
                     69: struct USBDescID {
                     70:     uint16_t                  idVendor;
                     71:     uint16_t                  idProduct;
                     72:     uint16_t                  bcdDevice;
                     73:     uint8_t                   iManufacturer;
                     74:     uint8_t                   iProduct;
                     75:     uint8_t                   iSerialNumber;
                     76: };
                     77: 
                     78: struct USBDescDevice {
                     79:     uint16_t                  bcdUSB;
                     80:     uint8_t                   bDeviceClass;
                     81:     uint8_t                   bDeviceSubClass;
                     82:     uint8_t                   bDeviceProtocol;
                     83:     uint8_t                   bMaxPacketSize0;
                     84:     uint8_t                   bNumConfigurations;
                     85: 
                     86:     const USBDescConfig       *confs;
                     87: };
                     88: 
                     89: struct USBDescConfig {
                     90:     uint8_t                   bNumInterfaces;
                     91:     uint8_t                   bConfigurationValue;
                     92:     uint8_t                   iConfiguration;
                     93:     uint8_t                   bmAttributes;
                     94:     uint8_t                   bMaxPower;
                     95: 
                     96:     /* grouped interfaces */
                     97:     uint8_t                   nif_groups;
                     98:     const USBDescIfaceAssoc   *if_groups;
                     99: 
                    100:     /* "normal" interfaces */
                    101:     uint8_t                   nif;
                    102:     const USBDescIface        *ifs;
                    103: };
                    104: 
                    105: /* conceptually an Interface Association Descriptor, and releated interfaces */
                    106: struct USBDescIfaceAssoc {
                    107:     uint8_t                   bFirstInterface;
                    108:     uint8_t                   bInterfaceCount;
                    109:     uint8_t                   bFunctionClass;
                    110:     uint8_t                   bFunctionSubClass;
                    111:     uint8_t                   bFunctionProtocol;
                    112:     uint8_t                   iFunction;
                    113: 
                    114:     uint8_t                   nif;
                    115:     const USBDescIface        *ifs;
                    116: };
                    117: 
                    118: struct USBDescIface {
                    119:     uint8_t                   bInterfaceNumber;
                    120:     uint8_t                   bAlternateSetting;
                    121:     uint8_t                   bNumEndpoints;
                    122:     uint8_t                   bInterfaceClass;
                    123:     uint8_t                   bInterfaceSubClass;
                    124:     uint8_t                   bInterfaceProtocol;
                    125:     uint8_t                   iInterface;
                    126: 
                    127:     uint8_t                   ndesc;
                    128:     USBDescOther              *descs;
                    129:     USBDescEndpoint           *eps;
                    130: };
                    131: 
                    132: struct USBDescEndpoint {
                    133:     uint8_t                   bEndpointAddress;
                    134:     uint8_t                   bmAttributes;
                    135:     uint16_t                  wMaxPacketSize;
                    136:     uint8_t                   bInterval;
                    137:     uint8_t                   bRefresh;
                    138:     uint8_t                   bSynchAddress;
                    139: 
                    140:     uint8_t                   is_audio; /* has bRefresh + bSynchAddress */
                    141:     uint8_t                   *extra;
                    142: };
                    143: 
                    144: struct USBDescOther {
                    145:     uint8_t                   length;
                    146:     const uint8_t             *data;
                    147: };
                    148: 
                    149: typedef const char *USBDescStrings[256];
                    150: 
                    151: struct USBDesc {
                    152:     USBDescID                 id;
                    153:     const USBDescDevice       *full;
                    154:     const USBDescDevice       *high;
                    155:     const char* const         *str;
                    156: };
                    157: 
                    158: /* generate usb packages from structs */
                    159: int usb_desc_device(const USBDescID *id, const USBDescDevice *dev,
                    160:                     uint8_t *dest, size_t len);
                    161: int usb_desc_device_qualifier(const USBDescDevice *dev,
                    162:                               uint8_t *dest, size_t len);
                    163: int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len);
                    164: int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest,
                    165:                          size_t len);
                    166: int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len);
                    167: int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len);
                    168: int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len);
                    169: 
                    170: /* control message emulation helpers */
                    171: void usb_desc_init(USBDevice *dev);
                    172: void usb_desc_attach(USBDevice *dev);
                    173: void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str);
                    174: void usb_desc_create_serial(USBDevice *dev);
                    175: const char *usb_desc_get_string(USBDevice *dev, uint8_t index);
                    176: int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len);
                    177: int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len);
                    178: int usb_desc_handle_control(USBDevice *dev, USBPacket *p,
                    179:         int request, int value, int index, int length, uint8_t *data);
                    180: 
                    181: #endif /* QEMU_HW_USB_DESC_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.