1beacf11bSopenharmony_ci/************************************************************************************ 2beacf11bSopenharmony_ci * include/nuttx/usb/usbdev.h 3beacf11bSopenharmony_ci * 4beacf11bSopenharmony_ci * Copyright (C) 2008-2010, 2012-2013, 2017 Gregory Nutt. All rights reserved. 5beacf11bSopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2017-2019. All rights reserved. 6beacf11bSopenharmony_ci * Author: Gregory Nutt <gnutt@nuttx.org> 7beacf11bSopenharmony_ci * 8beacf11bSopenharmony_ci * NOTE: This interface was inspired by the Linux gadget interface by 9beacf11bSopenharmony_ci * David Brownell. That work was very helpful in determining a usable 10beacf11bSopenharmony_ci * partitioning of functionality between standard class drivers and various 11beacf11bSopenharmony_ci * implementations of USB controller drivers. This work, however, does 12beacf11bSopenharmony_ci * not derive directly from that work and is licensed differently. 13beacf11bSopenharmony_ci * 14beacf11bSopenharmony_ci * Redistribution and use in source and binary forms, with or without 15beacf11bSopenharmony_ci * modification, are permitted provided that the following conditions 16beacf11bSopenharmony_ci * are met: 17beacf11bSopenharmony_ci * 18beacf11bSopenharmony_ci * 1. Redistributions of source code must retain the above copyright 19beacf11bSopenharmony_ci * notice, this list of conditions and the following disclaimer. 20beacf11bSopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 21beacf11bSopenharmony_ci * notice, this list of conditions and the following disclaimer in 22beacf11bSopenharmony_ci * the documentation and/or other materials provided with the 23beacf11bSopenharmony_ci * distribution. 24beacf11bSopenharmony_ci * 3. Neither the name NuttX nor the names of its contributors may be 25beacf11bSopenharmony_ci * used to endorse or promote products derived from this software 26beacf11bSopenharmony_ci * without specific prior written permission. 27beacf11bSopenharmony_ci * 28beacf11bSopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 29beacf11bSopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 30beacf11bSopenharmony_ci * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 31beacf11bSopenharmony_ci * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 32beacf11bSopenharmony_ci * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 33beacf11bSopenharmony_ci * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 34beacf11bSopenharmony_ci * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 35beacf11bSopenharmony_ci * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 36beacf11bSopenharmony_ci * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37beacf11bSopenharmony_ci * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 38beacf11bSopenharmony_ci * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 39beacf11bSopenharmony_ci * POSSIBILITY OF SUCH DAMAGE. 40beacf11bSopenharmony_ci * 41beacf11bSopenharmony_ci ************************************************************************************/ 42beacf11bSopenharmony_ci/************************************************************************************ 43beacf11bSopenharmony_ci * Notice of Export Control Law 44beacf11bSopenharmony_ci * =============================================== 45beacf11bSopenharmony_ci * Huawei LiteOS may be subject to applicable export control laws and regulations, 46beacf11bSopenharmony_ci * which might include those applicable to Huawei LiteOS of U.S. and the country in 47beacf11bSopenharmony_ci * which you are located. 48beacf11bSopenharmony_ci * Import, export and usage of Huawei LiteOS in any manner by you shall be in 49beacf11bSopenharmony_ci * compliance with such applicable export control laws and regulations. 50beacf11bSopenharmony_ci ************************************************************************************/ 51beacf11bSopenharmony_ci 52beacf11bSopenharmony_ci#ifndef __INCLUDE_NUTTX_USB_USBDEV_H 53beacf11bSopenharmony_ci#define __INCLUDE_NUTTX_USB_USBDEV_H 54beacf11bSopenharmony_ci 55beacf11bSopenharmony_ci/************************************************************************************ 56beacf11bSopenharmony_ci * Included Files 57beacf11bSopenharmony_ci ************************************************************************************/ 58beacf11bSopenharmony_ci 59beacf11bSopenharmony_ci#include "implementation/global_implementation.h" 60beacf11bSopenharmony_ci#include "linux/list.h" 61beacf11bSopenharmony_ci#include "errno.h" 62beacf11bSopenharmony_ci#define CONFIG_USBDEV_COMPOSITE 63beacf11bSopenharmony_ci#define CONFIG_USBDEV_DMA 64beacf11bSopenharmony_ci#define FAR 65beacf11bSopenharmony_ci/************************************************************************************ 66beacf11bSopenharmony_ci * Pre-processor Definitions 67beacf11bSopenharmony_ci ************************************************************************************/ 68beacf11bSopenharmony_ci 69beacf11bSopenharmony_ci/* Endpoint helpers *****************************************************************/ 70beacf11bSopenharmony_ci 71beacf11bSopenharmony_ci/* Configure endpoint, making it usable. The class driver may deallocate or re-use 72beacf11bSopenharmony_ci * the 'desc' structure after returning: 73beacf11bSopenharmony_ci * 74beacf11bSopenharmony_ci * ep - the struct usbdev_ep_s instance obtained from allocep() 75beacf11bSopenharmony_ci * desc - A struct usb_epdesc_s instance describing the endpoint 76beacf11bSopenharmony_ci * last - true if this this last endpoint to be configured. Some hardware needs 77beacf11bSopenharmony_ci * to take special action when all of the endpoints have been configured. 78beacf11bSopenharmony_ci */ 79beacf11bSopenharmony_ci 80beacf11bSopenharmony_ci#define EP_CONFIGURE(ep, desc, last) (ep)->ops->configure(ep, desc, last) 81beacf11bSopenharmony_ci 82beacf11bSopenharmony_ci/* The endpoint will no longer be used */ 83beacf11bSopenharmony_ci 84beacf11bSopenharmony_ci#define EP_DISABLE(ep) (ep)->ops->disable(ep) 85beacf11bSopenharmony_ci 86beacf11bSopenharmony_ci/* Allocate/free I/O requests. Should not be called from interrupt processing! */ 87beacf11bSopenharmony_ci 88beacf11bSopenharmony_ci#define EP_ALLOCREQ(ep) (ep)->ops->allocreq(ep) 89beacf11bSopenharmony_ci#define EP_FREEREQ(ep, req) (ep)->ops->freereq(ep, req) 90beacf11bSopenharmony_ci 91beacf11bSopenharmony_ci/* Allocate/free an I/O buffer. Should not be called from interrupt processing! */ 92beacf11bSopenharmony_ci 93beacf11bSopenharmony_ci#ifdef CONFIG_USBDEV_DMA 94beacf11bSopenharmony_ci# define EP_ALLOCBUFFER(ep, nb) (ep)->ops->allocbuffer(ep, nb) 95beacf11bSopenharmony_ci# define EP_FREEBUFFER(ep, buf) (ep)->ops->freebuffer(ep, buf) 96beacf11bSopenharmony_ci#else 97beacf11bSopenharmony_ci# define EP_ALLOCBUFFER(ep, nb) malloc(nb) 98beacf11bSopenharmony_ci# define EP_FREEBUFFER(ep, buf) free(buf) 99beacf11bSopenharmony_ci#endif 100beacf11bSopenharmony_ci 101beacf11bSopenharmony_ci/* Submit an I/O request to the endpoint */ 102beacf11bSopenharmony_ci 103beacf11bSopenharmony_ci#define EP_SUBMIT(ep, req) (ep)->ops->submit(ep, req) 104beacf11bSopenharmony_ci 105beacf11bSopenharmony_ci/* Cancel an I/O request previously sent to an endpoint */ 106beacf11bSopenharmony_ci 107beacf11bSopenharmony_ci#define EP_CANCEL(ep, req) (ep)->ops->cancel(ep, req) 108beacf11bSopenharmony_ci 109beacf11bSopenharmony_ci/* Stall or resume an endpoint */ 110beacf11bSopenharmony_ci 111beacf11bSopenharmony_ci#define EP_STALL(ep) (ep)->ops->stall(ep, false) 112beacf11bSopenharmony_ci#define EP_RESUME(ep) (ep)->ops->stall(ep, true) 113beacf11bSopenharmony_ci 114beacf11bSopenharmony_ci#define EP_FLUSH(ep) (ep)->ops->flush(ep) 115beacf11bSopenharmony_ci 116beacf11bSopenharmony_ci/* USB Device Driver Helpers ********************************************************/ 117beacf11bSopenharmony_ci 118beacf11bSopenharmony_ci/* Allocate an endpoint: 119beacf11bSopenharmony_ci * 120beacf11bSopenharmony_ci * ep - 7-bit logical endpoint number (direction bit ignored). Zero means 121beacf11bSopenharmony_ci * that any endpoint matching the other requirements will suffice. The 122beacf11bSopenharmony_ci * assigned endpoint can be found in the eplog field. 123beacf11bSopenharmony_ci * in - true: IN (device-to-host) endpoint requested 124beacf11bSopenharmony_ci * eptype - Endpoint type. One of {USB_EP_ATTR_XFER_ISOC, USB_EP_ATTR_XFER_BULK, 125beacf11bSopenharmony_ci * USB_EP_ATTR_XFER_INT} 126beacf11bSopenharmony_ci */ 127beacf11bSopenharmony_ci 128beacf11bSopenharmony_ci#define DEV_ALLOCEP(dev, ep, desc) (dev)->ops->allocep(dev, ep, desc) 129beacf11bSopenharmony_ci 130beacf11bSopenharmony_ci/* Release an endpoint */ 131beacf11bSopenharmony_ci 132beacf11bSopenharmony_ci#define DEV_FREEEP(dev, ep) (dev)->ops->freeep(dev, ep) 133beacf11bSopenharmony_ci 134beacf11bSopenharmony_ci/* Returns the current frame number */ 135beacf11bSopenharmony_ci 136beacf11bSopenharmony_ci#define DEV_GETFRAME(dev) (dev)->ops->getframe(dev) 137beacf11bSopenharmony_ci 138beacf11bSopenharmony_ci/* Tries to wake up the host connected to this device */ 139beacf11bSopenharmony_ci 140beacf11bSopenharmony_ci#define DEV_WAKEUP(dev) (dev)->ops->wakeup(dev) 141beacf11bSopenharmony_ci 142beacf11bSopenharmony_ci/* Sets the device selfpowered feature */ 143beacf11bSopenharmony_ci 144beacf11bSopenharmony_ci#define DEV_SETSELFPOWERED(dev) (dev)->ops->selfpowered(dev, true) 145beacf11bSopenharmony_ci 146beacf11bSopenharmony_ci/* Clears the device selfpowered feature */ 147beacf11bSopenharmony_ci 148beacf11bSopenharmony_ci#define DEV_CLRSELFPOWERED(dev) (dev)->ops->selfpowered(dev, false) 149beacf11bSopenharmony_ci 150beacf11bSopenharmony_ci/* Software-controlled connect to USB host. All USB class drivers need to call 151beacf11bSopenharmony_ci * DEV_CONNECT() when they are ready to be enumerated. That is, (1) initially when 152beacf11bSopenharmony_ci * bound to the USB driver, and (2) after a USB reset. 153beacf11bSopenharmony_ci */ 154beacf11bSopenharmony_ci 155beacf11bSopenharmony_ci#define DEV_CONNECT(dev) (dev)->ops->pullup ? (dev)->ops->pullup(dev, true) : -EOPNOTSUPP 156beacf11bSopenharmony_ci 157beacf11bSopenharmony_ci/* Software-controlled disconnect from USB host */ 158beacf11bSopenharmony_ci 159beacf11bSopenharmony_ci#define DEV_DISCONNECT(dev) (dev)->ops->pullup ? (dev)->ops->pullup(dev, false) : -EOPNOTSUPP 160beacf11bSopenharmony_ci 161beacf11bSopenharmony_ci/* USB Class Driver Helpers *********************************************************/ 162beacf11bSopenharmony_ci/* All may be called from interrupt handling logic except bind() and unbind() */ 163beacf11bSopenharmony_ci 164beacf11bSopenharmony_ci/* Invoked when the driver is bound to a USB device driver. */ 165beacf11bSopenharmony_ci 166beacf11bSopenharmony_ci#define CLASS_BIND(drvr, dev) (drvr)->ops->bind(drvr, dev) 167beacf11bSopenharmony_ci 168beacf11bSopenharmony_ci/* Invoked when the driver is unbound from a USB device driver */ 169beacf11bSopenharmony_ci 170beacf11bSopenharmony_ci#define CLASS_UNBIND(drvr, dev) (drvr)->ops->unbind(drvr, dev) 171beacf11bSopenharmony_ci 172beacf11bSopenharmony_ci/* Invoked after all transfers have been stopped, when the host is disconnected. */ 173beacf11bSopenharmony_ci 174beacf11bSopenharmony_ci#define CLASS_DISCONNECT(drvr, dev) (drvr)->ops->disconnect(drvr, dev) 175beacf11bSopenharmony_ci 176beacf11bSopenharmony_ci/* Invoked for ep0 control requests */ 177beacf11bSopenharmony_ci 178beacf11bSopenharmony_ci#define CLASS_SETUP(drvr, dev, ctrl, dataout, outlen) \ 179beacf11bSopenharmony_ci (drvr)->ops->setup(drvr, dev, ctrl, dataout, outlen) 180beacf11bSopenharmony_ci 181beacf11bSopenharmony_ci/* Invoked on USB suspend. */ 182beacf11bSopenharmony_ci 183beacf11bSopenharmony_ci#define CLASS_SUSPEND(drvr, dev) \ 184beacf11bSopenharmony_ci do { if ((drvr)->ops->suspend) (drvr)->ops->suspend(drvr, dev); } while (0) 185beacf11bSopenharmony_ci 186beacf11bSopenharmony_ci/* Invoked on USB resume */ 187beacf11bSopenharmony_ci 188beacf11bSopenharmony_ci#define CLASS_RESUME(drvr, dev) \ 189beacf11bSopenharmony_ci do { if ((drvr)->ops->resume) (drvr)->ops->resume(drvr, dev); } while (0) 190beacf11bSopenharmony_ci 191beacf11bSopenharmony_ci/* Maximum size of a request buffer */ 192beacf11bSopenharmony_ci 193beacf11bSopenharmony_ci#define USBDEV_MAXREQUEUST UINT16_MAX 194beacf11bSopenharmony_ci 195beacf11bSopenharmony_ci#define USBDEV_MAX_EPNUM 5 196beacf11bSopenharmony_ci 197beacf11bSopenharmony_ci/* Request flags */ 198beacf11bSopenharmony_ci 199beacf11bSopenharmony_ci#define USBDEV_REQFLAGS_NULLPKT 1 /* Bit 0: Terminate w/short packet; null packet if necessary */ 200beacf11bSopenharmony_ci /* Bits 1-7: Available */ 201beacf11bSopenharmony_ci 202beacf11bSopenharmony_ci/* USB directions (in endpoint addresses) */ 203beacf11bSopenharmony_ci 204beacf11bSopenharmony_ci#define USB_EPNO_MASK (0x7f) 205beacf11bSopenharmony_ci#define USB_EPNO(addr) ((addr) & USB_EPNO_MASK) 206beacf11bSopenharmony_ci#define USB_EPOUT(addr) ((addr) | USB_DIR_OUT) 207beacf11bSopenharmony_ci#define USB_EPIN(addr) ((addr) | USB_DIR_IN) 208beacf11bSopenharmony_ci#define USB_ISEPIN(addr) (((addr) & USB_DIR_MASK) == USB_DIR_IN) 209beacf11bSopenharmony_ci#define USB_ISEPOUT(addr) (((addr) & USB_DIR_MASK) == USB_DIR_OUT) 210beacf11bSopenharmony_ci 211beacf11bSopenharmony_ci 212beacf11bSopenharmony_ci/************************************************************************************ 213beacf11bSopenharmony_ci * Public Types 214beacf11bSopenharmony_ci ************************************************************************************/ 215beacf11bSopenharmony_ci 216beacf11bSopenharmony_ci/* USB Controller Structures ********************************************************/ 217beacf11bSopenharmony_ci 218beacf11bSopenharmony_ci/* usbdev_devinfo_s - describes the low level bindings of an usb device */ 219beacf11bSopenharmony_ci 220beacf11bSopenharmony_cistruct usbdev_devinfo_s 221beacf11bSopenharmony_ci{ 222beacf11bSopenharmony_ci int ninterfaces; /* Number of interfaces in the configuration */ 223beacf11bSopenharmony_ci int ifnobase; /* Offset to Interface-IDs */ 224beacf11bSopenharmony_ci 225beacf11bSopenharmony_ci int nstrings; /* Number of Strings */ 226beacf11bSopenharmony_ci int strbase; /* Offset to String Numbers */ 227beacf11bSopenharmony_ci 228beacf11bSopenharmony_ci int nendpoints; /* Number of Endpoints referenced in the following allay */ 229beacf11bSopenharmony_ci int epno[USBDEV_MAX_EPNUM]; /* Array holding the endpoint configuration for this device */ 230beacf11bSopenharmony_ci}; 231beacf11bSopenharmony_ci 232beacf11bSopenharmony_cistruct usbdevclass_driver_s; 233beacf11bSopenharmony_cistruct composite_devdesc_s 234beacf11bSopenharmony_ci{ 235beacf11bSopenharmony_ci void (*mkdevdesc)(uint8_t *buf); 236beacf11bSopenharmony_ci int16_t (*mkconfdesc)(uint8_t *buf, struct usbdev_devinfo_s *devinfo); 237beacf11bSopenharmony_ci int (*mkstrdesc)(uint8_t id, uint8_t *buf); 238beacf11bSopenharmony_ci int (*classobject)(int minor, struct usbdev_devinfo_s *devinfo, struct usbdevclass_driver_s **classdev); 239beacf11bSopenharmony_ci void (*uninitialize)(struct usbdevclass_driver_s *classdev); 240beacf11bSopenharmony_ci 241beacf11bSopenharmony_ci int nconfigs; /* Number of configurations supported */ 242beacf11bSopenharmony_ci int configid; /* The only supported configuration ID */ 243beacf11bSopenharmony_ci 244beacf11bSopenharmony_ci int cfgdescsize; /* The size of the config descriptor */ 245beacf11bSopenharmony_ci int minor; 246beacf11bSopenharmony_ci 247beacf11bSopenharmony_ci struct usbdev_devinfo_s devinfo; 248beacf11bSopenharmony_ci}; 249beacf11bSopenharmony_ci 250beacf11bSopenharmony_ci/* struct usbdev_req_s - describes one i/o request */ 251beacf11bSopenharmony_ci 252beacf11bSopenharmony_cistruct usbdev_ep_s; 253beacf11bSopenharmony_cistruct usbdev_req_s 254beacf11bSopenharmony_ci{ 255beacf11bSopenharmony_ci uint8_t *buf; /* Call: Buffer used for data; Return: Unchanged */ 256beacf11bSopenharmony_ci uint8_t flags; /* See USBDEV_REQFLAGS_* definitions */ 257beacf11bSopenharmony_ci int16_t result; /* Call: zero; Return: Result of transfer (O or -errno) */ 258beacf11bSopenharmony_ci uint32_t len; /* Call: Total length of data in buf; Return: Unchanged */ 259beacf11bSopenharmony_ci uint32_t xfrd; /* Call: zero; Return: Bytes transferred so far */ 260beacf11bSopenharmony_ci 261beacf11bSopenharmony_ci /* Callback when the transfer completes */ 262beacf11bSopenharmony_ci 263beacf11bSopenharmony_ci void (*callback)(struct usbdev_ep_s *ep, struct usbdev_req_s *req); 264beacf11bSopenharmony_ci void *priv; /* Used only by callee */ 265beacf11bSopenharmony_ci int is_complete; 266beacf11bSopenharmony_ci struct list_head list; 267beacf11bSopenharmony_ci 268beacf11bSopenharmony_ci /* Added in device3.0 */ 269beacf11bSopenharmony_ci 270beacf11bSopenharmony_ci#if defined(LOSCFG_DRIVERS_USB3_DEVICE_CONTROLLER) 271beacf11bSopenharmony_ci uintptr_t dma; 272beacf11bSopenharmony_ci uint32_t stream_id; 273beacf11bSopenharmony_ci uint8_t zero; 274beacf11bSopenharmony_ci#endif 275beacf11bSopenharmony_ci}; 276beacf11bSopenharmony_ci 277beacf11bSopenharmony_ci/* Endpoint-specific interface to USB controller hardware. */ 278beacf11bSopenharmony_ci 279beacf11bSopenharmony_cistruct usbdev_epops_s 280beacf11bSopenharmony_ci{ 281beacf11bSopenharmony_ci /* Configure/enable and disable endpoint */ 282beacf11bSopenharmony_ci 283beacf11bSopenharmony_ci int (*configure)(struct usbdev_ep_s *ep, const usb_endpoint_descriptor_t *desc, 284beacf11bSopenharmony_ci bool last); 285beacf11bSopenharmony_ci int (*disable)(struct usbdev_ep_s *ep); 286beacf11bSopenharmony_ci 287beacf11bSopenharmony_ci /* Allocate and free I/O requests */ 288beacf11bSopenharmony_ci 289beacf11bSopenharmony_ci struct usbdev_req_s *(*allocreq)(FAR struct usbdev_ep_s *ep); 290beacf11bSopenharmony_ci void (*freereq)(struct usbdev_ep_s *ep, struct usbdev_req_s *req); 291beacf11bSopenharmony_ci 292beacf11bSopenharmony_ci /* Allocate and free I/O buffers */ 293beacf11bSopenharmony_ci 294beacf11bSopenharmony_ci void *(*allocbuffer)(struct usbdev_ep_s *ep, uint16_t nbytes); 295beacf11bSopenharmony_ci void (*freebuffer)(struct usbdev_ep_s *ep, void *buf); 296beacf11bSopenharmony_ci 297beacf11bSopenharmony_ci /* Submit and cancel I/O requests */ 298beacf11bSopenharmony_ci 299beacf11bSopenharmony_ci int (*submit)(struct usbdev_ep_s *ep, struct usbdev_req_s *req); 300beacf11bSopenharmony_ci int (*cancel)(struct usbdev_ep_s *ep, struct usbdev_req_s *req); 301beacf11bSopenharmony_ci 302beacf11bSopenharmony_ci /* Stall or resume an endpoint */ 303beacf11bSopenharmony_ci 304beacf11bSopenharmony_ci int (*stall)(struct usbdev_ep_s *ep, bool resume); 305beacf11bSopenharmony_ci void (*flush)(struct usbdev_ep_s *ep); 306beacf11bSopenharmony_ci}; 307beacf11bSopenharmony_ci 308beacf11bSopenharmony_ci/* Representation of one USB endpoint */ 309beacf11bSopenharmony_ci 310beacf11bSopenharmony_cistruct usbdev_ep_s 311beacf11bSopenharmony_ci{ 312beacf11bSopenharmony_ci const struct usbdev_epops_s *ops; /* Endpoint operations */ 313beacf11bSopenharmony_ci uint8_t eplog; /* Logical endpoint address */ 314beacf11bSopenharmony_ci uint8_t used; 315beacf11bSopenharmony_ci uint16_t maxpacket; /* Maximum packet size for this endpoint */ 316beacf11bSopenharmony_ci void *priv; /* For use by class driver */ 317beacf11bSopenharmony_ci void *ep_link; 318beacf11bSopenharmony_ci struct usbdev_req_s *handle_req; 319beacf11bSopenharmony_ci 320beacf11bSopenharmony_ci /* Added in device3.0 */ 321beacf11bSopenharmony_ci 322beacf11bSopenharmony_ci#if defined(LOSCFG_DRIVERS_USB3_DEVICE_CONTROLLER) 323beacf11bSopenharmony_ci uint16_t maxpacket_limit:16; 324beacf11bSopenharmony_ci uint16_t max_streams:16; 325beacf11bSopenharmony_ci uint16_t mult:2; 326beacf11bSopenharmony_ci uint16_t maxburst:5; 327beacf11bSopenharmony_ci const struct usb_endpoint_ss_comp_descriptor *comp_desc; 328beacf11bSopenharmony_ci#endif 329beacf11bSopenharmony_ci}; 330beacf11bSopenharmony_ci 331beacf11bSopenharmony_ci/* struct usbdev_s represents a usb device */ 332beacf11bSopenharmony_ci 333beacf11bSopenharmony_cistruct usbdev_s; 334beacf11bSopenharmony_cistruct usbdev_ops_s 335beacf11bSopenharmony_ci{ 336beacf11bSopenharmony_ci /* Allocate and free endpoints */ 337beacf11bSopenharmony_ci 338beacf11bSopenharmony_ci struct usbdev_ep_s *(*allocep)(struct usbdev_s *dev, uint8_t eplog, usb_endpoint_descriptor_t *desc); 339beacf11bSopenharmony_ci void (*freeep)(struct usbdev_s *dev, struct usbdev_ep_s *ep); 340beacf11bSopenharmony_ci 341beacf11bSopenharmony_ci /* Get the frame number from the last SOF */ 342beacf11bSopenharmony_ci 343beacf11bSopenharmony_ci int (*getframe)(struct usbdev_s *dev); 344beacf11bSopenharmony_ci 345beacf11bSopenharmony_ci /* Hardware specific features */ 346beacf11bSopenharmony_ci 347beacf11bSopenharmony_ci int (*wakeup)(struct usbdev_s *dev); 348beacf11bSopenharmony_ci int (*selfpowered)(struct usbdev_s *dev, bool selfpowered); 349beacf11bSopenharmony_ci int (*pullup)(struct usbdev_s *dev, bool enable); 350beacf11bSopenharmony_ci 351beacf11bSopenharmony_ci /* Device-specific I/O command support */ 352beacf11bSopenharmony_ci 353beacf11bSopenharmony_ci int (*ioctl)(struct usbdev_s *dev, unsigned code, unsigned long param); 354beacf11bSopenharmony_ci}; 355beacf11bSopenharmony_ci 356beacf11bSopenharmony_cistruct usbdev_s 357beacf11bSopenharmony_ci{ 358beacf11bSopenharmony_ci const struct usbdev_ops_s *ops; /* Access to hardware specific features */ 359beacf11bSopenharmony_ci struct usbdev_ep_s *ep0; /* Endpoint zero */ 360beacf11bSopenharmony_ci uint8_t speed; /* Current speed of the host connection */ 361beacf11bSopenharmony_ci uint8_t dualspeed:1; /* 1:supports high and full speed operation */ 362beacf11bSopenharmony_ci}; 363beacf11bSopenharmony_ci 364beacf11bSopenharmony_ci/* USB Device Class Implementations *************************************************/ 365beacf11bSopenharmony_ci 366beacf11bSopenharmony_cistruct usbdevclass_driverops_s 367beacf11bSopenharmony_ci{ 368beacf11bSopenharmony_ci int (*bind)(struct usbdevclass_driver_s *driver, struct usbdev_s *dev); 369beacf11bSopenharmony_ci int (*unbind)(struct usbdevclass_driver_s *driver, struct usbdev_s *dev); 370beacf11bSopenharmony_ci int (*setup)(struct usbdevclass_driver_s *driver, struct usbdev_s *dev, 371beacf11bSopenharmony_ci const struct usb_device_request *ctrl, uint8_t *dataout, size_t outlen); 372beacf11bSopenharmony_ci void (*disconnect)(struct usbdevclass_driver_s *driver, 373beacf11bSopenharmony_ci struct usbdev_s *dev); 374beacf11bSopenharmony_ci void (*suspend)(struct usbdevclass_driver_s *driver, struct usbdev_s *dev); 375beacf11bSopenharmony_ci void (*resume)(struct usbdevclass_driver_s *driver, struct usbdev_s *dev); 376beacf11bSopenharmony_ci}; 377beacf11bSopenharmony_ci 378beacf11bSopenharmony_cistruct usbdevclass_driver_s 379beacf11bSopenharmony_ci{ 380beacf11bSopenharmony_ci struct usbdevclass_driverops_s *ops; 381beacf11bSopenharmony_ci uint8_t speed; /* Highest speed that the driver handles */ 382beacf11bSopenharmony_ci}; 383beacf11bSopenharmony_ci 384beacf11bSopenharmony_ci/************************************************************************************ 385beacf11bSopenharmony_ci * Public Data 386beacf11bSopenharmony_ci ************************************************************************************/ 387beacf11bSopenharmony_ci 388beacf11bSopenharmony_ci#undef EXTERN 389beacf11bSopenharmony_ci#if defined(__cplusplus) 390beacf11bSopenharmony_ci# define EXTERN extern "C" 391beacf11bSopenharmony_ciextern "C" 392beacf11bSopenharmony_ci{ 393beacf11bSopenharmony_ci#else 394beacf11bSopenharmony_ci# define EXTERN extern 395beacf11bSopenharmony_ci#endif 396beacf11bSopenharmony_ci 397beacf11bSopenharmony_ci/************************************************************************************ 398beacf11bSopenharmony_ci * Public Functions 399beacf11bSopenharmony_ci ************************************************************************************/ 400beacf11bSopenharmony_ci 401beacf11bSopenharmony_ci/************************************************************************************ 402beacf11bSopenharmony_ci * Name: usbdevclass_register 403beacf11bSopenharmony_ci * 404beacf11bSopenharmony_ci * Description: 405beacf11bSopenharmony_ci * Register a USB device class driver. The class driver's bind() method will be 406beacf11bSopenharmony_ci * called to bind it to a USB device driver. 407beacf11bSopenharmony_ci * 408beacf11bSopenharmony_ci ************************************************************************************/ 409beacf11bSopenharmony_ci 410beacf11bSopenharmony_ciint usbdev_register(struct usbdevclass_driver_s *driver); 411beacf11bSopenharmony_ci 412beacf11bSopenharmony_ci/************************************************************************************ 413beacf11bSopenharmony_ci * Name: usbdev_unregister 414beacf11bSopenharmony_ci * 415beacf11bSopenharmony_ci * Description: 416beacf11bSopenharmony_ci * Un-register usbdev class driver.If the USB device is connected to a USB host, 417beacf11bSopenharmony_ci * it will first disconnect(). The driver is also requested to unbind() and clean 418beacf11bSopenharmony_ci * up any device state, before this procedure finally returns. 419beacf11bSopenharmony_ci * 420beacf11bSopenharmony_ci ************************************************************************************/ 421beacf11bSopenharmony_ci 422beacf11bSopenharmony_ciint usbdev_unregister(struct usbdevclass_driver_s *driver); 423beacf11bSopenharmony_ci 424beacf11bSopenharmony_ci/**************************************************************************** 425beacf11bSopenharmony_ci * Name: usbdev_dma_alloc and usbdev_dma_free 426beacf11bSopenharmony_ci * 427beacf11bSopenharmony_ci * Description: 428beacf11bSopenharmony_ci * The USB class driver allocates packet I/O buffers for data transfer by 429beacf11bSopenharmony_ci * calling the driver allocbuffer() and freebuffer() methods. Those 430beacf11bSopenharmony_ci * methods are only available if CONFIG_USBDEV_DMA is defined in the 431beacf11bSopenharmony_ci * system configuration. 432beacf11bSopenharmony_ci * 433beacf11bSopenharmony_ci * If CONFIG_USBDEV_DMAMEMORY is also defined in the NuttX configuration, 434beacf11bSopenharmony_ci * then the driver implementations of the allocbuffer() and freebuffer() 435beacf11bSopenharmony_ci * methods may use board-specific usbdev_dma_alloc() and usbdev_dma_free(). 436beacf11bSopenharmony_ci * If CONFIG_USBDEV_DMA and CONFIG_USBDEV_DMAMEMORY are both defined, 437beacf11bSopenharmony_ci * then the board-specific logic must provide the functions 438beacf11bSopenharmony_ci * usbdev_dma_alloc() and usbdev_dma_free() as prototyped below: 439beacf11bSopenharmony_ci * usbdev_dma_alloc() will allocate DMA-capable memory of the specified 440beacf11bSopenharmony_ci * size; usbdev_dma_free() is the corresponding function that will be 441beacf11bSopenharmony_ci * called to free the DMA-capable memory. 442beacf11bSopenharmony_ci * 443beacf11bSopenharmony_ci * This functions may be simple wrappers around gran_alloc() and 444beacf11bSopenharmony_ci * gran_free() (See nuttx/mm/gran.h). Note that the gran_free() function 445beacf11bSopenharmony_ci * does require the size of the allocation to be freed; that would need 446beacf11bSopenharmony_ci * to be managed in the board-specific logic. 447beacf11bSopenharmony_ci * 448beacf11bSopenharmony_ci ****************************************************************************/ 449beacf11bSopenharmony_ci 450beacf11bSopenharmony_ci#if defined(CONFIG_USBDEV_DMA) && defined(CONFIG_USBDEV_DMAMEMORY) 451beacf11bSopenharmony_civoid *usbdev_dma_alloc(size_t size); 452beacf11bSopenharmony_civoid usbdev_dma_free(void *memory); 453beacf11bSopenharmony_ci#endif 454beacf11bSopenharmony_ci 455beacf11bSopenharmony_ci#undef EXTERN 456beacf11bSopenharmony_ci#if defined(__cplusplus) 457beacf11bSopenharmony_ci} 458beacf11bSopenharmony_ci#endif 459beacf11bSopenharmony_ci 460beacf11bSopenharmony_ci#endif /* __INCLUDE_NUTTX_USB_USBDEV_H */ 461