Annotation of qemu/hw/usb.h, revision 1.1.1.12

1.1       root        1: /*
                      2:  * QEMU USB API
1.1.1.5   root        3:  *
1.1       root        4:  * Copyright (c) 2005 Fabrice Bellard
1.1.1.5   root        5:  *
1.1       root        6:  * Permission is hereby granted, free of charge, to any person obtaining a copy
                      7:  * of this software and associated documentation files (the "Software"), to deal
                      8:  * in the Software without restriction, including without limitation the rights
                      9:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
                     10:  * copies of the Software, and to permit persons to whom the Software is
                     11:  * furnished to do so, subject to the following conditions:
                     12:  *
                     13:  * The above copyright notice and this permission notice shall be included in
                     14:  * all copies or substantial portions of the Software.
                     15:  *
                     16:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
                     17:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
                     19:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
                     20:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
                     21:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
                     22:  * THE SOFTWARE.
                     23:  */
1.1.1.7   root       24: 
                     25: #include "block.h"
1.1.1.9   root       26: #include "qdev.h"
                     27: #include "qemu-queue.h"
1.1.1.7   root       28: 
1.1.1.12! root       29: /* Constants related to the USB / PCI interaction */
        !            30: #define USB_SBRN    0x60 /* Serial Bus Release Number Register */
        !            31: #define USB_RELEASE_1  0x10 /* USB 1.0 */
        !            32: #define USB_RELEASE_2  0x20 /* USB 2.0 */
        !            33: #define USB_RELEASE_3  0x30 /* USB 3.0 */
        !            34: 
1.1       root       35: #define USB_TOKEN_SETUP 0x2d
                     36: #define USB_TOKEN_IN    0x69 /* device -> host */
                     37: #define USB_TOKEN_OUT   0xe1 /* host -> device */
                     38: 
                     39: /* specific usb messages, also sent in the 'pid' parameter */
                     40: #define USB_MSG_ATTACH   0x100
                     41: #define USB_MSG_DETACH   0x101
                     42: #define USB_MSG_RESET    0x102
                     43: 
1.1.1.5   root       44: #define USB_RET_NODEV  (-1)
1.1       root       45: #define USB_RET_NAK    (-2)
                     46: #define USB_RET_STALL  (-3)
                     47: #define USB_RET_BABBLE (-4)
1.1.1.4   root       48: #define USB_RET_ASYNC  (-5)
1.1       root       49: 
                     50: #define USB_SPEED_LOW   0
                     51: #define USB_SPEED_FULL  1
                     52: #define USB_SPEED_HIGH  2
1.1.1.11  root       53: #define USB_SPEED_SUPER 3
                     54: 
                     55: #define USB_SPEED_MASK_LOW   (1 << USB_SPEED_LOW)
                     56: #define USB_SPEED_MASK_FULL  (1 << USB_SPEED_FULL)
                     57: #define USB_SPEED_MASK_HIGH  (1 << USB_SPEED_HIGH)
                     58: #define USB_SPEED_MASK_SUPER (1 << USB_SPEED_SUPER)
1.1       root       59: 
                     60: #define USB_STATE_NOTATTACHED 0
                     61: #define USB_STATE_ATTACHED    1
                     62: //#define USB_STATE_POWERED     2
                     63: #define USB_STATE_DEFAULT     3
                     64: //#define USB_STATE_ADDRESS     4
                     65: //#define      USB_STATE_CONFIGURED  5
                     66: #define USB_STATE_SUSPENDED   6
                     67: 
                     68: #define USB_CLASS_AUDIO                        1
                     69: #define USB_CLASS_COMM                 2
                     70: #define USB_CLASS_HID                  3
                     71: #define USB_CLASS_PHYSICAL             5
                     72: #define USB_CLASS_STILL_IMAGE          6
                     73: #define USB_CLASS_PRINTER              7
                     74: #define USB_CLASS_MASS_STORAGE         8
                     75: #define USB_CLASS_HUB                  9
                     76: #define USB_CLASS_CDC_DATA             0x0a
                     77: #define USB_CLASS_CSCID                        0x0b
                     78: #define USB_CLASS_CONTENT_SEC          0x0d
                     79: #define USB_CLASS_APP_SPEC             0xfe
                     80: #define USB_CLASS_VENDOR_SPEC          0xff
                     81: 
                     82: #define USB_DIR_OUT                    0
                     83: #define USB_DIR_IN                     0x80
                     84: 
                     85: #define USB_TYPE_MASK                  (0x03 << 5)
                     86: #define USB_TYPE_STANDARD              (0x00 << 5)
                     87: #define USB_TYPE_CLASS                 (0x01 << 5)
                     88: #define USB_TYPE_VENDOR                        (0x02 << 5)
                     89: #define USB_TYPE_RESERVED              (0x03 << 5)
                     90: 
                     91: #define USB_RECIP_MASK                 0x1f
                     92: #define USB_RECIP_DEVICE               0x00
                     93: #define USB_RECIP_INTERFACE            0x01
                     94: #define USB_RECIP_ENDPOINT             0x02
                     95: #define USB_RECIP_OTHER                        0x03
                     96: 
                     97: #define DeviceRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
                     98: #define DeviceOutRequest ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
                     99: #define InterfaceRequest \
                    100:         ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
                    101: #define InterfaceOutRequest \
                    102:         ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
                    103: #define EndpointRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8)
                    104: #define EndpointOutRequest \
                    105:         ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8)
1.1.1.10  root      106: #define ClassInterfaceRequest \
                    107:         ((USB_DIR_IN|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8)
                    108: #define ClassInterfaceOutRequest \
                    109:         ((USB_DIR_OUT|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8)
1.1       root      110: 
                    111: #define USB_REQ_GET_STATUS             0x00
                    112: #define USB_REQ_CLEAR_FEATURE          0x01
                    113: #define USB_REQ_SET_FEATURE            0x03
                    114: #define USB_REQ_SET_ADDRESS            0x05
                    115: #define USB_REQ_GET_DESCRIPTOR         0x06
                    116: #define USB_REQ_SET_DESCRIPTOR         0x07
                    117: #define USB_REQ_GET_CONFIGURATION      0x08
                    118: #define USB_REQ_SET_CONFIGURATION      0x09
                    119: #define USB_REQ_GET_INTERFACE          0x0A
                    120: #define USB_REQ_SET_INTERFACE          0x0B
                    121: #define USB_REQ_SYNCH_FRAME            0x0C
                    122: 
                    123: #define USB_DEVICE_SELF_POWERED                0
                    124: #define USB_DEVICE_REMOTE_WAKEUP       1
                    125: 
                    126: #define USB_DT_DEVICE                  0x01
                    127: #define USB_DT_CONFIG                  0x02
                    128: #define USB_DT_STRING                  0x03
                    129: #define USB_DT_INTERFACE               0x04
                    130: #define USB_DT_ENDPOINT                        0x05
1.1.1.11  root      131: #define USB_DT_DEVICE_QUALIFIER         0x06
                    132: #define USB_DT_OTHER_SPEED_CONFIG       0x07
1.1.1.12! root      133: #define USB_DT_DEBUG                    0x0A
        !           134: #define USB_DT_INTERFACE_ASSOC          0x0B
1.1       root      135: 
1.1.1.6   root      136: #define USB_ENDPOINT_XFER_CONTROL      0
                    137: #define USB_ENDPOINT_XFER_ISOC         1
                    138: #define USB_ENDPOINT_XFER_BULK         2
                    139: #define USB_ENDPOINT_XFER_INT          3
                    140: 
1.1.1.9   root      141: typedef struct USBBus USBBus;
1.1.1.12! root      142: typedef struct USBBusOps USBBusOps;
1.1       root      143: typedef struct USBPort USBPort;
                    144: typedef struct USBDevice USBDevice;
1.1.1.9   root      145: typedef struct USBDeviceInfo USBDeviceInfo;
1.1.1.4   root      146: typedef struct USBPacket USBPacket;
1.1       root      147: 
1.1.1.11  root      148: typedef struct USBDesc USBDesc;
                    149: typedef struct USBDescID USBDescID;
                    150: typedef struct USBDescDevice USBDescDevice;
                    151: typedef struct USBDescConfig USBDescConfig;
1.1.1.12! root      152: typedef struct USBDescIfaceAssoc USBDescIfaceAssoc;
1.1.1.11  root      153: typedef struct USBDescIface USBDescIface;
                    154: typedef struct USBDescEndpoint USBDescEndpoint;
                    155: typedef struct USBDescOther USBDescOther;
                    156: typedef struct USBDescString USBDescString;
                    157: 
                    158: struct USBDescString {
                    159:     uint8_t index;
                    160:     char *str;
                    161:     QLIST_ENTRY(USBDescString) next;
                    162: };
                    163: 
1.1       root      164: /* definition of a USB device */
                    165: struct USBDevice {
1.1.1.9   root      166:     DeviceState qdev;
                    167:     USBDeviceInfo *info;
1.1.1.11  root      168:     USBPort *port;
                    169:     char *port_path;
1.1       root      170:     void *opaque;
1.1.1.6   root      171: 
1.1.1.12! root      172:     /* Actual connected speed */
1.1.1.9   root      173:     int speed;
1.1.1.12! root      174:     /* Supported speeds, not in info because it may be variable (hostdevs) */
        !           175:     int speedmask;
1.1.1.9   root      176:     uint8_t addr;
                    177:     char product_desc[32];
                    178:     int auto_attach;
                    179:     int attached;
                    180: 
1.1.1.11  root      181:     int32_t state;
1.1.1.9   root      182:     uint8_t setup_buf[8];
1.1.1.12! root      183:     uint8_t data_buf[4096];
1.1.1.11  root      184:     int32_t remote_wakeup;
                    185:     int32_t setup_state;
                    186:     int32_t setup_len;
                    187:     int32_t setup_index;
                    188: 
                    189:     QLIST_HEAD(, USBDescString) strings;
                    190:     const USBDescDevice *device;
                    191:     const USBDescConfig *config;
1.1.1.9   root      192: };
                    193: 
                    194: struct USBDeviceInfo {
                    195:     DeviceInfo qdev;
                    196:     int (*init)(USBDevice *dev);
                    197: 
                    198:     /*
                    199:      * Process USB packet.
1.1.1.6   root      200:      * Called by the HC (Host Controller).
                    201:      *
1.1.1.9   root      202:      * Returns length of the transaction
1.1.1.6   root      203:      * or one of the USB_RET_XXX codes.
1.1.1.9   root      204:      */
1.1.1.4   root      205:     int (*handle_packet)(USBDevice *dev, USBPacket *p);
1.1.1.6   root      206: 
1.1.1.9   root      207:     /*
1.1.1.12! root      208:      * Called when a packet is canceled.
        !           209:      */
        !           210:     void (*cancel_packet)(USBDevice *dev, USBPacket *p);
        !           211: 
        !           212:     /*
1.1.1.6   root      213:      * Called when device is destroyed.
                    214:      */
1.1.1.3   root      215:     void (*handle_destroy)(USBDevice *dev);
                    216: 
1.1.1.6   root      217:     /*
1.1.1.11  root      218:      * Attach the device
                    219:      */
                    220:     void (*handle_attach)(USBDevice *dev);
                    221: 
                    222:     /*
1.1.1.6   root      223:      * Reset the device
1.1.1.9   root      224:      */
1.1       root      225:     void (*handle_reset)(USBDevice *dev);
1.1.1.6   root      226: 
                    227:     /*
                    228:      * Process control request.
                    229:      * Called from handle_packet().
                    230:      *
                    231:      * Returns length or one of the USB_RET_ codes.
                    232:      */
1.1.1.12! root      233:     int (*handle_control)(USBDevice *dev, USBPacket *p, int request, int value,
1.1       root      234:                           int index, int length, uint8_t *data);
1.1.1.6   root      235: 
                    236:     /*
                    237:      * Process data transfers (both BULK and ISOC).
                    238:      * Called from handle_packet().
                    239:      *
                    240:      * Returns length or one of the USB_RET_ codes.
                    241:      */
1.1.1.4   root      242:     int (*handle_data)(USBDevice *dev, USBPacket *p);
1.1.1.6   root      243: 
1.1.1.9   root      244:     const char *product_desc;
1.1.1.11  root      245:     const USBDesc *usb_desc;
1.1.1.5   root      246: 
1.1.1.9   root      247:     /* handle legacy -usbdevice command line options */
                    248:     const char *usbdevice_name;
                    249:     USBDevice *(*usbdevice_init)(const char *params);
1.1       root      250: };
                    251: 
1.1.1.11  root      252: typedef struct USBPortOps {
                    253:     void (*attach)(USBPort *port);
                    254:     void (*detach)(USBPort *port);
1.1.1.12! root      255:     /*
        !           256:      * This gets called when a device downstream from the device attached to
        !           257:      * the port (iow attached through a hub) gets detached.
        !           258:      */
        !           259:     void (*child_detach)(USBPort *port, USBDevice *child);
        !           260:     void (*wakeup)(USBPort *port);
        !           261:     /*
        !           262:      * Note that port->dev will be different then the device from which
        !           263:      * the packet originated when a hub is involved, if you want the orginating
        !           264:      * device use p->owner
        !           265:      */
        !           266:     void (*complete)(USBPort *port, USBPacket *p);
1.1.1.11  root      267: } USBPortOps;
1.1.1.3   root      268: 
1.1       root      269: /* USB port on which a device can be connected */
                    270: struct USBPort {
                    271:     USBDevice *dev;
1.1.1.11  root      272:     int speedmask;
                    273:     char path[16];
                    274:     USBPortOps *ops;
1.1       root      275:     void *opaque;
                    276:     int index; /* internal port index, may be used with the opaque */
1.1.1.9   root      277:     QTAILQ_ENTRY(USBPort) next;
1.1       root      278: };
                    279: 
1.1.1.4   root      280: typedef void USBCallback(USBPacket * packet, void *opaque);
                    281: 
                    282: /* Structure used to hold information about an active USB packet.  */
                    283: struct USBPacket {
                    284:     /* Data fields for use by the driver.  */
                    285:     int pid;
                    286:     uint8_t devaddr;
                    287:     uint8_t devep;
                    288:     uint8_t *data;
                    289:     int len;
                    290:     /* Internal use by the USB layer.  */
1.1.1.12! root      291:     USBDevice *owner;
1.1.1.4   root      292: };
                    293: 
1.1.1.12! root      294: int usb_handle_packet(USBDevice *dev, USBPacket *p);
        !           295: void usb_packet_complete(USBDevice *dev, USBPacket *p);
        !           296: void usb_cancel_packet(USBPacket * p);
1.1.1.4   root      297: 
1.1       root      298: void usb_attach(USBPort *port, USBDevice *dev);
1.1.1.11  root      299: void usb_wakeup(USBDevice *dev);
1.1.1.4   root      300: int usb_generic_handle_packet(USBDevice *s, USBPacket *p);
1.1.1.12! root      301: void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p);
1.1       root      302: int set_usb_string(uint8_t *buf, const char *str);
1.1.1.4   root      303: void usb_send_msg(USBDevice *dev, int msg);
                    304: 
1.1       root      305: /* usb-linux.c */
                    306: USBDevice *usb_host_device_open(const char *devname);
1.1.1.6   root      307: int usb_host_device_close(const char *devname);
1.1.1.8   root      308: void usb_host_info(Monitor *mon);
1.1       root      309: 
                    310: /* usb-hid.c */
1.1.1.6   root      311: void usb_hid_datain_cb(USBDevice *dev, void *opaque, void (*datain)(void *));
1.1.1.3   root      312: 
1.1.1.6   root      313: /* usb-bt.c */
                    314: USBDevice *usb_bt_init(HCIInfo *hci);
                    315: 
1.1.1.5   root      316: /* usb ports of the VM */
                    317: 
                    318: #define VM_USB_HUB_SIZE 8
                    319: 
1.1.1.6   root      320: /* usb-musb.c */
                    321: enum musb_irq_source_e {
                    322:     musb_irq_suspend = 0,
                    323:     musb_irq_resume,
                    324:     musb_irq_rst_babble,
                    325:     musb_irq_sof,
                    326:     musb_irq_connect,
                    327:     musb_irq_disconnect,
                    328:     musb_irq_vbus_request,
                    329:     musb_irq_vbus_error,
                    330:     musb_irq_rx,
                    331:     musb_irq_tx,
                    332:     musb_set_vbus,
                    333:     musb_set_session,
                    334:     __musb_irq_max,
                    335: };
                    336: 
1.1.1.8   root      337: typedef struct MUSBState MUSBState;
                    338: MUSBState *musb_init(qemu_irq *irqs);
                    339: uint32_t musb_core_intr_get(MUSBState *s);
                    340: void musb_core_intr_clear(MUSBState *s, uint32_t mask);
                    341: void musb_set_size(MUSBState *s, int epnum, int size, int is_tx);
1.1.1.9   root      342: 
                    343: /* usb-bus.c */
                    344: 
                    345: struct USBBus {
                    346:     BusState qbus;
1.1.1.12! root      347:     USBBusOps *ops;
1.1.1.9   root      348:     int busnr;
                    349:     int nfree;
                    350:     int nused;
                    351:     QTAILQ_HEAD(, USBPort) free;
                    352:     QTAILQ_HEAD(, USBPort) used;
                    353:     QTAILQ_ENTRY(USBBus) next;
                    354: };
                    355: 
1.1.1.12! root      356: struct USBBusOps {
        !           357:     int (*register_companion)(USBBus *bus, USBPort *ports[],
        !           358:                               uint32_t portcount, uint32_t firstport);
        !           359: };
        !           360: 
        !           361: void usb_bus_new(USBBus *bus, USBBusOps *ops, DeviceState *host);
1.1.1.9   root      362: USBBus *usb_bus_find(int busnr);
                    363: void usb_qdev_register(USBDeviceInfo *info);
                    364: void usb_qdev_register_many(USBDeviceInfo *info);
                    365: USBDevice *usb_create(USBBus *bus, const char *name);
                    366: USBDevice *usb_create_simple(USBBus *bus, const char *name);
                    367: USBDevice *usbdevice_create(const char *cmdline);
                    368: void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
1.1.1.11  root      369:                        USBPortOps *ops, int speedmask);
1.1.1.12! root      370: int usb_register_companion(const char *masterbus, USBPort *ports[],
        !           371:                            uint32_t portcount, uint32_t firstport,
        !           372:                            void *opaque, USBPortOps *ops, int speedmask);
1.1.1.11  root      373: void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr);
1.1.1.9   root      374: void usb_unregister_port(USBBus *bus, USBPort *port);
                    375: int usb_device_attach(USBDevice *dev);
                    376: int usb_device_detach(USBDevice *dev);
                    377: int usb_device_delete_addr(int busnr, int addr);
                    378: 
                    379: static inline USBBus *usb_bus_from_device(USBDevice *d)
                    380: {
                    381:     return DO_UPCAST(USBBus, qbus, d->qdev.parent_bus);
                    382: }

unix.superglobalmegacorp.com

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