diff --git a/drivers/usbhost/usbhost_storage.c b/drivers/usbhost/usbhost_storage.c index 064cc7de0d780804b80b7b6b8723e74f2d1aae78..05739e350429e7ca22b301d5daf3935efa7731e0 100644 --- a/drivers/usbhost/usbhost_storage.c +++ b/drivers/usbhost/usbhost_storage.c @@ -164,6 +164,8 @@ static struct usbhost_class_s *usbhost_create(FAR struct usbhost_driver_s *drvr, static int usbhost_configdesc(FAR struct usbhost_class_s *class, FAR const uint8_t *configdesc, int desclen); +static int usbhost_complete(FAR struct usbhost_class_s *class, + FAR const uint8_t *response, int resplen); static int usbhost_disconnected(FAR struct usbhost_class_s *class); /* struct block_operations methods */ @@ -585,6 +587,7 @@ static FAR struct usbhost_class_s *usbhost_create(FAR struct usbhost_driver_s *d if (usbhost_allocdevno(priv) == OK) { priv->class.configdesc = usbhost_configdesc; + priv->class.complete = usbhost_complete; priv->class.disconnected = usbhost_disconnected; priv->crefs = 1; @@ -773,6 +776,41 @@ static int usbhost_configdesc(FAR struct usbhost_class_s *class, return OK; } +/**************************************************************************** + * Name: usbhost_complete + * + * Description: + * This function implements will the complete() method of struct + * usbhost_class_s. In the interface with the USB host drivers, the class + * will queue USB IN/OUT transactions. The enqueuing function will return + * and the transactions will be performed asynchrounously. When the + * transaction completes, the USB host driver will call this function in + * order to inform the class that the transaction has completed and to + * provide any response data. + * + * Input Parameters: + * class - The USB host class entry previously obtained from a call to + * create(). + * response - Response data buffer + * resplen - Number of bytes of data in the response data buffer. + * + * Returned Values: + * On success, zero (OK) is returned. On a failure, a negated errno value is + * returned indicating the nature of the failure + * + * Assumptions: + * This function may be called from an interrupt handler. + * + ****************************************************************************/ + +static int usbhost_complete(FAR struct usbhost_class_s *class, + FAR const uint8_t *response, int resplen) +{ + FAR struct usbhost_state_s *priv = (FAR struct usbhost_state_s *)class; +#warning "Not implemented" + return -ENOSYS; +} + /**************************************************************************** * Name: usbhost_disconnected * diff --git a/include/nuttx/usb/usbhost.h b/include/nuttx/usb/usbhost.h index 3dc5311aefa50a8b196cce6af02effe2cf44fb1d..d60d2b82726a915b5925239f4bcd82dc7bac7032 100644 --- a/include/nuttx/usb/usbhost.h +++ b/include/nuttx/usb/usbhost.h @@ -83,6 +83,11 @@ * the drvr input parameter is NULL or if there are insufficient resources to * create another USB host class instance. * + * Assumptions: + * If this function is called from an interrupt handler, it will be unable to + * allocate memory and CONFIG_USBHOST_NPREALLOC should be defined to be a value + * greater than zero specify a number of pre-allocated class structures. + * ************************************************************************************/ #define CLASS_CREATE(reg, drvr, id) ((reg)->create(drvr)) @@ -105,9 +110,39 @@ * On success, zero (OK) is returned. On a failure, a negated errno value is * returned indicating the nature of the failure * + * Assumptions: + * This function may be called from an interrupt handler. + * + ************************************************************************************/ + +#define CLASS_CONFIGDESC(class,configdesc,desclen) ((class)->configdesc(class,configdesc,desclen)) + +/************************************************************************************ + * Name: CLASS_COMPLETE + * + * Description: + * This macro will call the complete() method of struct usbhost_class_s. In the + * interface with the USB host drivers, the class will queue USB IN/OUT + * transactions. The enqueuing function will return and the transactions will be + * performed asynchrounously. When the transaction completes, the USB host driver + * will call this function in order to inform the class that the transaction has + * completed and to provide any response data. + * + * Input Parameters: + * class - The USB host class entry previously obtained from a call to create(). + * response - Response data buffer + * resplen - Number of bytes of data in the response data buffer. + * + * Returned Values: + * On success, zero (OK) is returned. On a failure, a negated errno value is + * returned indicating the nature of the failure + * + * Assumptions: + * This function may be called from an interrupt handler. + * ************************************************************************************/ -#define CLASS_CONFIGDESC(class, configdesc, desclen) ((class)->configdesc(class, configdesc, desclen)) +#define CLASS_COMPLETE(class,response,resplen) (class)->complete(class,response,resplen)) /************************************************************************************ * Name: CLASS_DISCONNECTED @@ -124,6 +159,9 @@ * On success, zero (OK) is returned. On a failure, a negated errno value is * returned indicating the nature of the failure * + * Assumptions: + * This function may be called from an interrupt handler. + * ************************************************************************************/ #define CLASS_DISCONNECTED(class) ((class)->disconnected(class)) @@ -191,31 +229,51 @@ struct usbhost_class_s * initialize properly (such as endpoint selections). */ - int (*configdesc)(FAR struct usbhost_class_s *class, FAR const uint8_t *confidesc, int desclen); + int (*configdesc)(FAR struct usbhost_class_s *class, FAR const uint8_t *configdesc, int desclen); + + /* This method must be called by the USB host driver whenever a transfer + * completes. + */ + + int (*complete)(FAR struct usbhost_class_s *class, FAR const uint8_t *response, int resplen); /* This method informs the class that the USB device has been disconnected. */ int (*disconnected)(FAR struct usbhost_class_s *class); }; -/* struct usbhost_driver_s provides access to the USB host driver from the USB host - * class implementation. +/* struct usbhost_driver_s provides access to the USB host driver from the + * USB host class implementation. */ struct usbhost_epdesc_s; struct usbhost_driver_s { - /* Receive a process a transfer descriptor */ + /* Enumerate the connected device. This function will enqueue the + * enumeration process. As part of this enumeration process, the driver + * will (1) get the device's configuration descriptor, (2) extract the class + * ID info from the configuration descriptor, (3) call usbhost_findclass() + * to find the class that supports this device, (4) call the create() + * method on the struct usbhost_registry_s interface to get a class + * instance, and finally (5) call the configdesc() method of the struct + * usbhost_class_s interface. After that, the class is in charge of the + * sequence of operations. + */ - int (*transfer)(FAR struct usbhost_epdesc_s *ed); + int (*enumerate)(FAR struct usbhost_driver_s *drvr, FAR struct usbhost_epdesc_s *ed); - /* Enumerate the connected device */ + /* Enqueue a request to process a transfer descriptor. This method will + * enqueue the transfer request and return immediately. The transfer will + * be performed asynchronously. When the transfer completes, the USB host + * driver will call he complete() method of the struct usbhost_class_s + * interface. + */ - int (*enumerate)(FAR struct usbhost_epdesc_s *ed); + int (*transfer)(FAR struct usbhost_driver_s *drvr, FAR struct usbhost_epdesc_s *ed); /* Receive control information */ - int (*rcvctrl)(FAR struct usbhost_epdesc_s *ed); + int (*rcvctrl)(FAR struct usbhost_driver_s *drvr, FAR struct usbhost_epdesc_s *ed); }; /* This structure describes one endpoint */