static void tusb6010_reset(DeviceState *dev) { TUSBState *s = TUSB(dev); int i; s->test_reset = TUSB_PROD_TEST_RESET_VAL; s->host_mode = 0; s->dev_config = 0; s->otg_status = 0; /* !TUSB_DEV_OTG_STAT_ID_STATUS means host mode */ s->power = 0; s->mask = 0xffffffff; s->intr = 0x00000000; s->otg_timer_val = 0; s->scratch = 0; s->prcm_config = 0; s->prcm_mngmt = 0; s->intr_ok = 0; s->usbip_intr = 0; s->usbip_mask = 0; s->gpio_intr = 0; s->gpio_mask = 0; s->gpio_config = 0; s->dma_intr = 0; s->dma_mask = 0; s->dma_map = 0; s->dma_config = 0; s->ep0_config = 0; s->wkup_mask = 0; s->pullup[0] = s->pullup[1] = 0; s->control_config = 0; for (i = 0; i < 15; i++) { s->rx_config[i] = s->tx_config[i] = 0; } musb_reset(s->musb); }
struct MUSBState *musb_init(DeviceState *parent_device, int gpio_base) { MUSBState *s = g_malloc0(sizeof(*s)); int i; for (i = 0; i < musb_irq_max; i++) { s->irqs[i] = qdev_get_gpio_in(parent_device, gpio_base + i); } musb_reset(s); usb_bus_new(&s->bus, sizeof(s->bus), &musb_bus_ops, parent_device); usb_register_port(&s->bus, &s->port, s, 0, &musb_port_ops, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); return s; }
int musb_close(MUSB_INTERFACE *musb_interface) { #if defined(HAVE_LIBUSB) int status; status = usb_release_interface(musb_interface->dev, musb_interface->usb_interface); if (status < 0) fprintf(stderr, "musb_close: usb_release_interface() error %d\n", status); #ifdef OS_LINUX // linux wants a reset, otherwise the device cannot be accessed next time musb_reset(musb_interface); #endif status = usb_close(musb_interface->dev); if (status < 0) fprintf(stderr, "musb_close: usb_close() error %d\n", status); #elif defined(HAVE_LIBUSB10) int status; status = libusb_release_interface(musb_interface->dev, musb_interface->usb_interface); if (status < 0) fprintf(stderr, "musb_close: libusb_release_interface() error %d\n", status); #ifdef OS_LINUX // linux wants a reset, otherwise the device cannot be accessed next time musb_reset(musb_interface); #endif libusb_close(musb_interface->dev); #elif defined(OS_DARWIN) IOReturn status; IOUSBInterfaceInterface **interface = (IOUSBInterfaceInterface **)musb_interface->interface; status = (*interface)->USBInterfaceClose(interface); if (status != kIOReturnSuccess) fprintf(stderr, "musb_close: USBInterfaceClose() status %d 0x%x\n", status, status); status = (*interface)->Release(interface); if (status != kIOReturnSuccess) fprintf(stderr, "musb_close: USB Interface Release() status %d 0x%x\n", status, status); IOUSBDeviceInterface **device = (IOUSBDeviceInterface**)musb_interface->device; status = (*device)->USBDeviceClose(device); if (status != kIOReturnSuccess) fprintf(stderr, "musb_close: USBDeviceClose() status %d 0x%x\n", status, status); status = (*device)->Release(device); if (status != kIOReturnSuccess) fprintf(stderr, "musb_close: USB Device Release() status %d 0x%x\n", status, status); #elif defined(_MSC_VER) CloseHandle(musb_interface->rhandle); CloseHandle(musb_interface->whandle); #else assert(!"musb_close() is not implemented"); #endif /* free memory allocated in musb_open() */ free(musb_interface); return 0; }