⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsd.c

📁 usb user mode lib
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -