Changeset ad97131 in mainline
- Timestamp:
- 2013-01-26T17:25:28Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8e10ef4
- Parents:
- b6812a1
- Location:
- uspace/lib/usbdev
- Files:
-
- 1 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/Makefile
rb6812a1 rad97131 36 36 SOURCES = \ 37 37 src/altiface.c \ 38 src/driver.c \ 38 39 src/devdrv.c \ 39 40 src/devpoll.c \ -
uspace/lib/usbdev/src/devdrv.c
rb6812a1 rad97131 41 41 #include <assert.h> 42 42 43 static int generic_device_add(ddf_dev_t *);44 static int generic_device_remove(ddf_dev_t *);45 static int generic_device_gone(ddf_dev_t *);46 47 static driver_ops_t generic_driver_ops = {48 .dev_add = generic_device_add,49 .dev_remove = generic_device_remove,50 .dev_gone = generic_device_gone,51 };52 static driver_t generic_driver = {53 .driver_ops = &generic_driver_ops54 };55 56 static const usb_driver_t *driver = NULL;57 58 /** Main routine of USB device driver.59 *60 * Under normal conditions, this function never returns.61 *62 * @param drv USB device driver structure.63 * @return Task exit status.64 */65 int usb_driver_main(const usb_driver_t *drv)66 {67 assert(drv != NULL);68 69 /* Prepare the generic driver. */70 generic_driver.name = drv->name;71 72 driver = drv;73 74 return ddf_driver_main(&generic_driver);75 }76 77 43 /** Count number of pipes the driver expects. 78 44 * … … 86 52 for (count = 0; endpoints != NULL && endpoints[count] != NULL; ++count); 87 53 return count; 88 }89 90 /** Callback when a new device is supposed to be controlled by this driver.91 *92 * This callback is a wrapper for USB specific version of @c device_add.93 *94 * @param gen_dev Device structure as prepared by DDF.95 * @return Error code.96 */97 int generic_device_add(ddf_dev_t *gen_dev)98 {99 assert(driver);100 assert(driver->ops);101 assert(driver->ops->device_add);102 103 /* Get place for driver data. */104 usb_device_t *dev = ddf_dev_data_alloc(gen_dev, sizeof(usb_device_t));105 if (dev == NULL) {106 usb_log_error("USB device `%s' structure allocation failed.\n",107 ddf_dev_get_name(gen_dev));108 return ENOMEM;109 }110 111 /* Initialize generic USB driver data. */112 const char *err_msg = NULL;113 int rc = usb_device_init(dev, gen_dev, driver->endpoints, &err_msg);114 if (rc != EOK) {115 usb_log_error("USB device `%s' init failed (%s): %s.\n",116 ddf_dev_get_name(gen_dev), err_msg, str_error(rc));117 return rc;118 }119 120 /* Start USB driver specific initialization. */121 rc = driver->ops->device_add(dev);122 if (rc != EOK)123 usb_device_deinit(dev);124 return rc;125 }126 127 /** Callback when a device is supposed to be removed from the system.128 *129 * This callback is a wrapper for USB specific version of @c device_remove.130 *131 * @param gen_dev Device structure as prepared by DDF.132 * @return Error code.133 */134 int generic_device_remove(ddf_dev_t *gen_dev)135 {136 assert(driver);137 assert(driver->ops);138 if (driver->ops->device_rem == NULL)139 return ENOTSUP;140 /* Just tell the driver to stop whatever it is doing */141 usb_device_t *usb_dev = ddf_dev_data_get(gen_dev);142 const int ret = driver->ops->device_rem(usb_dev);143 if (ret != EOK)144 return ret;145 usb_device_deinit(usb_dev);146 return EOK;147 }148 149 /** Callback when a device was removed from the system.150 *151 * This callback is a wrapper for USB specific version of @c device_gone.152 *153 * @param gen_dev Device structure as prepared by DDF.154 * @return Error code.155 */156 int generic_device_gone(ddf_dev_t *gen_dev)157 {158 assert(driver);159 assert(driver->ops);160 if (driver->ops->device_gone == NULL)161 return ENOTSUP;162 usb_device_t *usb_dev = ddf_dev_data_get(gen_dev);163 const int ret = driver->ops->device_gone(usb_dev);164 if (ret == EOK)165 usb_device_deinit(usb_dev);166 167 return ret;168 54 } 169 55
Note:
See TracChangeset
for help on using the changeset viewer.