|
|
1.1 ! root 1: /* ! 2: * QEMU USB API ! 3: * ! 4: * Copyright (c) 2005 Fabrice Bellard ! 5: * ! 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: */ ! 24: #define USB_TOKEN_SETUP 0x2d ! 25: #define USB_TOKEN_IN 0x69 /* device -> host */ ! 26: #define USB_TOKEN_OUT 0xe1 /* host -> device */ ! 27: ! 28: /* specific usb messages, also sent in the 'pid' parameter */ ! 29: #define USB_MSG_ATTACH 0x100 ! 30: #define USB_MSG_DETACH 0x101 ! 31: #define USB_MSG_RESET 0x102 ! 32: ! 33: #define USB_RET_NODEV (-1) ! 34: #define USB_RET_NAK (-2) ! 35: #define USB_RET_STALL (-3) ! 36: #define USB_RET_BABBLE (-4) ! 37: ! 38: #define USB_SPEED_LOW 0 ! 39: #define USB_SPEED_FULL 1 ! 40: #define USB_SPEED_HIGH 2 ! 41: ! 42: #define USB_STATE_NOTATTACHED 0 ! 43: #define USB_STATE_ATTACHED 1 ! 44: //#define USB_STATE_POWERED 2 ! 45: #define USB_STATE_DEFAULT 3 ! 46: //#define USB_STATE_ADDRESS 4 ! 47: //#define USB_STATE_CONFIGURED 5 ! 48: #define USB_STATE_SUSPENDED 6 ! 49: ! 50: #define USB_CLASS_AUDIO 1 ! 51: #define USB_CLASS_COMM 2 ! 52: #define USB_CLASS_HID 3 ! 53: #define USB_CLASS_PHYSICAL 5 ! 54: #define USB_CLASS_STILL_IMAGE 6 ! 55: #define USB_CLASS_PRINTER 7 ! 56: #define USB_CLASS_MASS_STORAGE 8 ! 57: #define USB_CLASS_HUB 9 ! 58: #define USB_CLASS_CDC_DATA 0x0a ! 59: #define USB_CLASS_CSCID 0x0b ! 60: #define USB_CLASS_CONTENT_SEC 0x0d ! 61: #define USB_CLASS_APP_SPEC 0xfe ! 62: #define USB_CLASS_VENDOR_SPEC 0xff ! 63: ! 64: #define USB_DIR_OUT 0 ! 65: #define USB_DIR_IN 0x80 ! 66: ! 67: #define USB_TYPE_MASK (0x03 << 5) ! 68: #define USB_TYPE_STANDARD (0x00 << 5) ! 69: #define USB_TYPE_CLASS (0x01 << 5) ! 70: #define USB_TYPE_VENDOR (0x02 << 5) ! 71: #define USB_TYPE_RESERVED (0x03 << 5) ! 72: ! 73: #define USB_RECIP_MASK 0x1f ! 74: #define USB_RECIP_DEVICE 0x00 ! 75: #define USB_RECIP_INTERFACE 0x01 ! 76: #define USB_RECIP_ENDPOINT 0x02 ! 77: #define USB_RECIP_OTHER 0x03 ! 78: ! 79: #define DeviceRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) ! 80: #define DeviceOutRequest ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) ! 81: #define InterfaceRequest \ ! 82: ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) ! 83: #define InterfaceOutRequest \ ! 84: ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) ! 85: #define EndpointRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8) ! 86: #define EndpointOutRequest \ ! 87: ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8) ! 88: ! 89: #define USB_REQ_GET_STATUS 0x00 ! 90: #define USB_REQ_CLEAR_FEATURE 0x01 ! 91: #define USB_REQ_SET_FEATURE 0x03 ! 92: #define USB_REQ_SET_ADDRESS 0x05 ! 93: #define USB_REQ_GET_DESCRIPTOR 0x06 ! 94: #define USB_REQ_SET_DESCRIPTOR 0x07 ! 95: #define USB_REQ_GET_CONFIGURATION 0x08 ! 96: #define USB_REQ_SET_CONFIGURATION 0x09 ! 97: #define USB_REQ_GET_INTERFACE 0x0A ! 98: #define USB_REQ_SET_INTERFACE 0x0B ! 99: #define USB_REQ_SYNCH_FRAME 0x0C ! 100: ! 101: #define USB_DEVICE_SELF_POWERED 0 ! 102: #define USB_DEVICE_REMOTE_WAKEUP 1 ! 103: ! 104: #define USB_DT_DEVICE 0x01 ! 105: #define USB_DT_CONFIG 0x02 ! 106: #define USB_DT_STRING 0x03 ! 107: #define USB_DT_INTERFACE 0x04 ! 108: #define USB_DT_ENDPOINT 0x05 ! 109: ! 110: typedef struct USBPort USBPort; ! 111: typedef struct USBDevice USBDevice; ! 112: ! 113: /* definition of a USB device */ ! 114: struct USBDevice { ! 115: void *opaque; ! 116: int (*handle_packet)(USBDevice *dev, int pid, ! 117: uint8_t devaddr, uint8_t devep, ! 118: uint8_t *data, int len); ! 119: int speed; ! 120: ! 121: /* The following fields are used by the generic USB device ! 122: layer. They are here just to avoid creating a new structure for ! 123: them. */ ! 124: void (*handle_reset)(USBDevice *dev); ! 125: int (*handle_control)(USBDevice *dev, int request, int value, ! 126: int index, int length, uint8_t *data); ! 127: int (*handle_data)(USBDevice *dev, int pid, uint8_t devep, ! 128: uint8_t *data, int len); ! 129: uint8_t addr; ! 130: ! 131: int state; ! 132: uint8_t setup_buf[8]; ! 133: uint8_t data_buf[1024]; ! 134: int remote_wakeup; ! 135: int setup_state; ! 136: int setup_len; ! 137: int setup_index; ! 138: }; ! 139: ! 140: /* USB port on which a device can be connected */ ! 141: struct USBPort { ! 142: USBDevice *dev; ! 143: void (*attach)(USBPort *port, USBDevice *dev); ! 144: void *opaque; ! 145: int index; /* internal port index, may be used with the opaque */ ! 146: }; ! 147: ! 148: void usb_attach(USBPort *port, USBDevice *dev); ! 149: int usb_generic_handle_packet(USBDevice *s, int pid, ! 150: uint8_t devaddr, uint8_t devep, ! 151: uint8_t *data, int len); ! 152: int set_usb_string(uint8_t *buf, const char *str); ! 153: ! 154: /* usb hub */ ! 155: USBDevice *usb_hub_init(USBPort **usb_ports, int nb_ports); ! 156: ! 157: /* usb-uhci.c */ ! 158: void usb_uhci_init(PCIBus *bus, USBPort **usb_ports); ! 159: ! 160: /* usb-linux.c */ ! 161: USBDevice *usb_host_device_open(const char *devname); ! 162: void usb_host_info(void); ! 163: ! 164: /* usb-hid.c */ ! 165: USBDevice *usb_mouse_init(void);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.