Revision a594cfbf vl.c

b/vl.c
154 154
int win2k_install_hack = 0;
155 155
#endif
156 156
int usb_enabled = 0;
157
USBPort *vm_usb_ports[MAX_VM_USB_PORTS];
158
USBDevice *vm_usb_hub;
157 159

  
158 160
/***********************************************************/
159 161
/* x86 ISA bus support */
......
1738 1740
#endif /* !_WIN32 */
1739 1741

  
1740 1742
/***********************************************************/
1743
/* USB devices */
1744

  
1745
static int usb_device_add(const char *devname)
1746
{
1747
    const char *p;
1748
    USBDevice *dev;
1749
    int i;
1750

  
1751
    if (!vm_usb_hub)
1752
        return -1;
1753
    for(i = 0;i < MAX_VM_USB_PORTS; i++) {
1754
        if (!vm_usb_ports[i]->dev)
1755
            break;
1756
    }
1757
    if (i == MAX_VM_USB_PORTS)
1758
        return -1;
1759

  
1760
    if (strstart(devname, "host:", &p)) {
1761
        dev = usb_host_device_open(p);
1762
        if (!dev)
1763
            return -1;
1764
    } else if (!strcmp(devname, "mouse")) {
1765
        dev = usb_mouse_init();
1766
        if (!dev)
1767
            return -1;
1768
    } else {
1769
        return -1;
1770
    }
1771
    usb_attach(vm_usb_ports[i], dev);
1772
    return 0;
1773
}
1774

  
1775
static int usb_device_del(const char *devname)
1776
{
1777
    USBDevice *dev;
1778
    int bus_num, addr, i;
1779
    const char *p;
1780

  
1781
    if (!vm_usb_hub)
1782
        return -1;
1783

  
1784
    p = strchr(devname, '.');
1785
    if (!p) 
1786
        return -1;
1787
    bus_num = strtoul(devname, NULL, 0);
1788
    addr = strtoul(p + 1, NULL, 0);
1789
    if (bus_num != 0)
1790
        return -1;
1791
    for(i = 0;i < MAX_VM_USB_PORTS; i++) {
1792
        dev = vm_usb_ports[i]->dev;
1793
        if (dev && dev->addr == addr)
1794
            break;
1795
    }
1796
    if (i == MAX_VM_USB_PORTS)
1797
        return -1;
1798
    usb_attach(vm_usb_ports[i], NULL);
1799
    return 0;
1800
}
1801

  
1802
void do_usb_add(const char *devname)
1803
{
1804
    int ret;
1805
    ret = usb_device_add(devname);
1806
    if (ret < 0) 
1807
        term_printf("Could not add USB device '%s'\n", devname);
1808
}
1809

  
1810
void do_usb_del(const char *devname)
1811
{
1812
    int ret;
1813
    ret = usb_device_del(devname);
1814
    if (ret < 0) 
1815
        term_printf("Could not remove USB device '%s'\n", devname);
1816
}
1817

  
1818
void usb_info(void)
1819
{
1820
    USBDevice *dev;
1821
    int i;
1822
    const char *speed_str;
1823

  
1824
    if (!vm_usb_hub) {
1825
        term_printf("USB support not enabled\n");
1826
        return;
1827
    }
1828

  
1829
    for(i = 0; i < MAX_VM_USB_PORTS; i++) {
1830
        dev = vm_usb_ports[i]->dev;
1831
        if (dev) {
1832
            term_printf("Hub port %d:\n", i);
1833
            switch(dev->speed) {
1834
            case USB_SPEED_LOW: 
1835
                speed_str = "1.5"; 
1836
                break;
1837
            case USB_SPEED_FULL: 
1838
                speed_str = "12"; 
1839
                break;
1840
            case USB_SPEED_HIGH: 
1841
                speed_str = "480"; 
1842
                break;
1843
            default:
1844
                speed_str = "?"; 
1845
                break;
1846
            }
1847
            term_printf("  Device %d.%d, speed %s Mb/s\n", 
1848
                        0, dev->addr, speed_str);
1849
        }
1850
    }
1851
}
1852

  
1853
/***********************************************************/
1741 1854
/* pid file */
1742 1855

  
1743 1856
static char *pid_filename;
......
2989 3102
    QEMU_OPTION_no_kqemu,
2990 3103
    QEMU_OPTION_win2k_hack,
2991 3104
    QEMU_OPTION_usb,
3105
    QEMU_OPTION_usbdevice,
2992 3106
};
2993 3107

  
2994 3108
typedef struct QEMUOption {
......
3063 3177
    { "full-screen", 0, QEMU_OPTION_full_screen },
3064 3178
    { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
3065 3179
    { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
3066
    { "usb", 0, QEMU_OPTION_usb },
3180
    { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
3067 3181
    
3068 3182
    /* temporary options */
3183
    { "usb", 0, QEMU_OPTION_usb },
3069 3184
    { "pci", 0, QEMU_OPTION_pci },
3070 3185
    { "cirrusvga", 0, QEMU_OPTION_cirrusvga },
3071 3186
    { NULL },
......
3239 3354
    int parallel_device_index;
3240 3355
    const char *loadvm = NULL;
3241 3356
    QEMUMachine *machine;
3242

  
3357
    char usb_devices[MAX_VM_USB_PORTS][128];
3358
    int usb_devices_index;
3359
    
3243 3360
#if !defined(CONFIG_SOFTMMU)
3244 3361
    /* we never want that malloc() uses mmap() */
3245 3362
    mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
......
3282 3399
        parallel_devices[i][0] = '\0';
3283 3400
    parallel_device_index = 0;
3284 3401
    
3402
    usb_devices_index = 0;
3403
    
3285 3404
    nb_tun_fds = 0;
3286 3405
    net_if_type = -1;
3287 3406
    nb_nics = 1;
......
3653 3772
            case QEMU_OPTION_usb:
3654 3773
                usb_enabled = 1;
3655 3774
                break;
3775
            case QEMU_OPTION_usbdevice:
3776
                usb_enabled = 1;
3777
                if (usb_devices_index >= MAX_VM_USB_PORTS) {
3778
                    fprintf(stderr, "Too many USB devices\n");
3779
                    exit(1);
3780
                }
3781
                pstrcpy(usb_devices[usb_devices_index],
3782
                        sizeof(usb_devices[usb_devices_index]),
3783
                        optarg);
3784
                usb_devices_index++;
3785
                break;
3656 3786
            }
3657 3787
        }
3658 3788
    }
......
3818 3948
        }
3819 3949
    }
3820 3950

  
3951
    /* init USB devices */
3952
    if (usb_enabled) {
3953
        vm_usb_hub = usb_hub_init(vm_usb_ports, MAX_VM_USB_PORTS);
3954
        for(i = 0; i < usb_devices_index; i++) {
3955
            if (usb_device_add(usb_devices[i]) < 0) {
3956
                fprintf(stderr, "Warning: could not add USB device %s\n",
3957
                        usb_devices[i]);
3958
            }
3959
        }
3960
    }
3961

  
3821 3962
    /* init CPU state */
3822 3963
    env = cpu_init();
3823 3964
    global_env = env;

Also available in: Unified diff