📄 bsd.c
字号:
int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout){ int fd, ret, retrieved = 0, one = 1; /* Ensure the endpoint address is correct */ ep |= USB_ENDPOINT_IN; fd = ensure_ep_open(dev, ep, O_RDONLY); if (fd < 0) { if (usb_debug >= 2) {#if __FreeBSD__ fprintf (stderr, "usb_bulk_read: got negative open file descriptor for endpoint %d\n", UE_GET_ADDR(ep));#else fprintf (stderr, "usb_bulk_read: got negative open file descriptor for endpoint %02d\n", UE_GET_ADDR(ep));#endif } return fd; } ret = ioctl(fd, USB_SET_TIMEOUT, &timeout); if (ret < 0) USB_ERROR_STR(-errno, "error setting timeout: %s", strerror(errno)); ret = ioctl(fd, USB_SET_SHORT_XFER, &one); if (ret < 0) USB_ERROR_STR(-errno, "error setting short xfer: %s", strerror(errno)); do { ret = read(fd, bytes+retrieved, size-retrieved); if (ret < 0)#if __FreeBSD__ USB_ERROR_STR(-errno, "error reading from bulk endpoint %s.%d: %s", dev->device->filename, UE_GET_ADDR(ep), strerror(errno));#else USB_ERROR_STR(-errno, "error reading from bulk endpoint %s.%02d: %s", dev->device->filename, UE_GET_ADDR(ep), strerror(errno));#endif retrieved += ret; } while (ret > 0 && retrieved < size); return retrieved;}int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout){ int fd, ret, sent = 0; /* Ensure the endpoint address is correct */ ep &= ~USB_ENDPOINT_IN; fd = ensure_ep_open(dev, ep, O_WRONLY); if (fd < 0) { if (usb_debug >= 2) {#if __FreeBSD__ fprintf (stderr, "usb_interrupt_write: got negative open file descriptor for endpoint %d\n", UE_GET_ADDR(ep));#else fprintf (stderr, "usb_interrupt_write: got negative open file descriptor for endpoint %02d\n", UE_GET_ADDR(ep));#endif } return fd; } ret = ioctl(fd, USB_SET_TIMEOUT, &timeout); if (ret < 0) USB_ERROR_STR(-errno, "error setting timeout: %s", strerror(errno)); do { ret = write(fd, bytes+sent, size-sent); if (ret < 0)#if __FreeBSD__ USB_ERROR_STR(-errno, "error writing to interrupt endpoint %s.%d: %s", dev->device->filename, UE_GET_ADDR(ep), strerror(errno));#else USB_ERROR_STR(-errno, "error writing to interrupt endpoint %s.%02d: %s", dev->device->filename, UE_GET_ADDR(ep), strerror(errno));#endif sent += ret; } while (ret > 0 && sent < size); return sent;}int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout){ int fd, ret, retrieved = 0, one = 1; /* Ensure the endpoint address is correct */ ep |= USB_ENDPOINT_IN; fd = ensure_ep_open(dev, ep, O_RDONLY); if (fd < 0) { if (usb_debug >= 2) {#if __FreeBSD__ fprintf (stderr, "usb_interrupt_read: got negative open file descriptor for endpoint %d\n", UE_GET_ADDR(ep));#else fprintf (stderr, "usb_interrupt_read: got negative open file descriptor for endpoint %02d\n", UE_GET_ADDR(ep));#endif } return fd; } ret = ioctl(fd, USB_SET_TIMEOUT, &timeout); if (ret < 0) USB_ERROR_STR(-errno, "error setting timeout: %s", strerror(errno)); ret = ioctl(fd, USB_SET_SHORT_XFER, &one); if (ret < 0) USB_ERROR_STR(-errno, "error setting short xfer: %s", strerror(errno)); do { ret = read(fd, bytes+retrieved, size-retrieved); if (ret < 0)#if __FreeBSD__ USB_ERROR_STR(-errno, "error reading from interrupt endpoint %s.%d: %s", dev->device->filename, UE_GET_ADDR(ep), strerror(errno));#else USB_ERROR_STR(-errno, "error reading from interrupt endpoint %s.%02d: %s", dev->device->filename, UE_GET_ADDR(ep), strerror(errno));#endif retrieved += ret; } while (ret > 0 && retrieved < size); return retrieved;}int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout){ struct usb_ctl_request req; int ret; if (usb_debug >= 3) fprintf(stderr, "usb_control_msg: %d %d %d %d %p %d %d\n", requesttype, request, value, index, bytes, size, timeout); req.ucr_request.bmRequestType = requesttype; req.ucr_request.bRequest = request; USETW(req.ucr_request.wValue, value); USETW(req.ucr_request.wIndex, index); USETW(req.ucr_request.wLength, size); req.ucr_data = bytes; req.ucr_flags = 0; ret = ioctl(dev->fd, USB_SET_TIMEOUT, &timeout);#if (__NetBSD__ || __OpenBSD__) if (ret < 0 && errno != EINVAL)#else if (ret < 0)#endif USB_ERROR_STR(-errno, "error setting timeout: %s", strerror(errno)); ret = ioctl(dev->fd, USB_DO_REQUEST, &req); if (ret < 0) USB_ERROR_STR(-errno, "error sending control message: %s", strerror(errno)); return UGETW(req.ucr_request.wLength);}int usb_os_find_busses(struct usb_bus **busses){ struct usb_bus *fbus = NULL; int controller; int fd; char buf[20]; for (controller = 0; controller < MAX_CONTROLLERS; controller++) { struct usb_bus *bus; snprintf(buf, sizeof(buf) - 1, "/dev/usb%d", controller); fd = open(buf, O_RDWR); if (fd < 0) { if (usb_debug >= 2) if (errno != ENXIO && errno != ENOENT) fprintf(stderr, "usb_os_find_busses: can't open %s: %s\n", buf, strerror(errno)); continue; } close(fd); bus = malloc(sizeof(*bus)); if (!bus) USB_ERROR(-ENOMEM); memset((void *)bus, 0, sizeof(*bus)); strncpy(bus->dirname, buf, sizeof(bus->dirname) - 1); bus->dirname[sizeof(bus->dirname) - 1] = 0; LIST_ADD(fbus, bus); if (usb_debug >= 2) fprintf(stderr, "usb_os_find_busses: Found %s\n", bus->dirname); } *busses = fbus; return 0;}int usb_os_find_devices(struct usb_bus *bus, struct usb_device **devices){ struct usb_device *fdev = NULL; int cfd, dfd; int device; cfd = open(bus->dirname, O_RDONLY); if (cfd < 0) USB_ERROR_STR(-errno, "couldn't open(%s): %s", bus->dirname, strerror(errno)); for (device = 1; device < USB_MAX_DEVICES; device++) { struct usb_device_info di; struct usb_device *dev; char buf[20]; di.udi_addr = device; if (ioctl(cfd, USB_DEVICEINFO, &di) < 0) continue; /* There's a device; is it one we should mess with? */ if (strncmp(di.udi_devnames[0], "ugen", 4) != 0) /* best not to play with things we don't understand */ continue;#if __FreeBSD__ snprintf(buf, sizeof(buf) - 1, "/dev/%s", di.udi_devnames[0]);#else snprintf(buf, sizeof(buf) - 1, "/dev/%s.00", di.udi_devnames[0]);#endif /* Open its control endpoint */ dfd = open(buf, O_RDONLY); if (dfd < 0) { if (usb_debug >= 2) fprintf(stderr, "usb_os_find_devices: couldn't open device %s: %s\n", buf, strerror(errno)); continue; } dev = malloc(sizeof(*dev)); if (!dev) USB_ERROR(-ENOMEM); memset((void *)dev, 0, sizeof(*dev)); dev->bus = bus; /* we need to report the device name as /dev/ugenx NOT /dev/ugenx.00 * This seemed easier than having 2 variables... */#if (__NetBSD__ || __OpenBSD__) snprintf(buf, sizeof(buf) - 1, "/dev/%s", di.udi_devnames[0]);#endif strncpy(dev->filename, buf, sizeof(dev->filename) - 1); dev->filename[sizeof(dev->filename) - 1] = 0; if (ioctl(dfd, USB_GET_DEVICE_DESC, &dev->descriptor) < 0) USB_ERROR_STR(-errno, "couldn't get device descriptor for %s: %s", buf, strerror(errno)); close(dfd); USB_LE16_TO_CPU(dev->descriptor.bcdUSB); USB_LE16_TO_CPU(dev->descriptor.idVendor); USB_LE16_TO_CPU(dev->descriptor.idProduct); USB_LE16_TO_CPU(dev->descriptor.bcdDevice); LIST_ADD(fdev, dev); if (usb_debug >= 2) fprintf(stderr, "usb_os_find_devices: Found %s on %s\n", dev->filename, bus->dirname); } close(cfd); *devices = fdev; return 0;}void usb_os_init(void){ /* nothing */}int usb_resetep(usb_dev_handle *dev, unsigned int ep){ /* Not yet done, because I haven't needed it. */ USB_ERROR_STR(-ENOSYS, "usb_resetep called, unimplemented on BSD");}int usb_clear_halt(usb_dev_handle *dev, unsigned int ep){ /* Not yet done, because I haven't needed it. */ USB_ERROR_STR(-ENOSYS, "usb_clear_halt called, unimplemented on BSD");}int usb_reset(usb_dev_handle *dev){ /* Not yet done, because I haven't needed it. */ USB_ERROR_STR(-ENOSYS, "usb_reset called, unimplemented on BSD");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -