Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  usbip_device_driver.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Copyright (C) 2015 Karol Kosik <karo9@interia.eu>
 *  2015 Samsung Electronics
 * Author:  Igor Kotrasinski <i.kotrasinsk@samsung.com>
 *
 * Based on tools/usb/usbip/libsrc/usbip_host_driver.c, which is:
 * Copyright (C) 2011 matt mooney <mfm@muteddisk.com>
 *               2005-2007 Takahiro Hirofuchi
 */


#include <fcntl.h>
#include <string.h>
#include <linux/usb/ch9.h>

#include <unistd.h>

#include "usbip_host_common.h"
#include "usbip_device_driver.h"

#undef  PROGNAME
#define PROGNAME "libusbip"

#define copy_descr_attr16(dev, descr, attr)   \
  ((dev)->attr = le16toh((descr)->attr))  \

#define copy_descr_attr(dev, descr, attr)   \
  ((dev)->attr = (descr)->attr)   \

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

static struct {
 enum usb_device_speed speed;
 const char *name;
} speed_names[] = {
 {
  .speed = USB_SPEED_UNKNOWN,
  .name = "UNKNOWN",
 },
 {
  .speed = USB_SPEED_LOW,
  .name = "low-speed",
 },
 {
  .speed = USB_SPEED_FULL,
  .name = "full-speed",
 },
 {
  .speed = USB_SPEED_HIGH,
  .name = "high-speed",
 },
 {
  .speed = USB_SPEED_WIRELESS,
  .name = "wireless",
 },
 {
  .speed = USB_SPEED_SUPER,
  .name = "super-speed",
 },
};

static
int read_usb_vudc_device(struct udev_device *sdev, struct usbip_usb_device *dev)
{
 const char *path, *name;
 char filepath[SYSFS_PATH_MAX];
 struct usb_device_descriptor descr;
 unsigned int i;
 FILE *fd = NULL;
 struct udev_device *plat;
 const char *speed;
 size_t ret;

 plat = udev_device_get_parent(sdev);
 path = udev_device_get_syspath(plat);
 snprintf(filepath, SYSFS_PATH_MAX, "%s/%s",
   path, VUDC_DEVICE_DESCR_FILE);
 fd = fopen(filepath, "r");
 if (!fd)
  return -1;
 ret = fread((char *) &descr, sizeof(descr), 1, fd);
 if (ret != 1) {
  err("Cannot read vudc device descr file: %s", strerror(errno));
  goto err;
 }
 fclose(fd);

 copy_descr_attr(dev, &descr, bDeviceClass);
 copy_descr_attr(dev, &descr, bDeviceSubClass);
 copy_descr_attr(dev, &descr, bDeviceProtocol);
 copy_descr_attr(dev, &descr, bNumConfigurations);
 copy_descr_attr16(dev, &descr, idVendor);
 copy_descr_attr16(dev, &descr, idProduct);
 copy_descr_attr16(dev, &descr, bcdDevice);

 strncpy(dev->path, path, SYSFS_PATH_MAX - 1);
 dev->path[SYSFS_PATH_MAX - 1] = '\0';

 dev->speed = USB_SPEED_UNKNOWN;
 speed = udev_device_get_sysattr_value(sdev, "current_speed");
 if (speed) {
  for (i = 0; i < ARRAY_SIZE(speed_names); i++) {
   if (!strcmp(speed_names[i].name, speed)) {
    dev->speed = speed_names[i].speed;
    break;
   }
  }
 }

 /* Only used for user output, little sense to output them in general */
 dev->bNumInterfaces = 0;
 dev->bConfigurationValue = 0;
 dev->busnum = 0;

 name = udev_device_get_sysname(plat);
 strncpy(dev->busid, name, SYSFS_BUS_ID_SIZE - 1);
 dev->busid[SYSFS_BUS_ID_SIZE - 1] = '\0';
 return 0;
err:
 fclose(fd);
 return -1;
}

static int is_my_device(struct udev_device *dev)
{
 const char *driver;

 driver = udev_device_get_property_value(dev, "USB_UDC_NAME");
 return driver != NULL && !strcmp(driver, USBIP_DEVICE_DRV_NAME);
}

static int usbip_device_driver_open(struct usbip_host_driver *hdriver)
{
 int ret;

 hdriver->ndevs = 0;
 INIT_LIST_HEAD(&hdriver->edev_list);

 ret = usbip_generic_driver_open(hdriver);
 if (ret)
  err("please load " USBIP_CORE_MOD_NAME ".ko and "
      USBIP_DEVICE_DRV_NAME ".ko!");

 return ret;
}

struct usbip_host_driver device_driver = {
 .edev_list = LIST_HEAD_INIT(device_driver.edev_list),
 .udev_subsystem = "udc",
 .ops = {
  .open = usbip_device_driver_open,
  .close = usbip_generic_driver_close,
  .refresh_device_list = usbip_generic_refresh_device_list,
  .get_device = usbip_generic_get_device,
  .read_device = read_usb_vudc_device,
  .is_my_device = is_my_device,
 },
};

Messung V0.5
C=99 H=92 G=95

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge