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