1 /* SPDX-License-Identifier: BSD-3-Clause */ 2 3 /* 4 * LPCUSB, an USB device driver for LPC microcontrollers 5 * Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl) 6 * Copyright (c) 2016 Intel Corporation 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 /** 32 * @file 33 * @brief USB device core layer APIs and structures 34 * 35 * This file contains the USB device core layer APIs and structures. 36 */ 37 38 #ifndef ZEPHYR_INCLUDE_USB_USB_DEVICE_H_ 39 #define ZEPHYR_INCLUDE_USB_USB_DEVICE_H_ 40 41 #include <zephyr/drivers/usb/usb_dc.h> 42 #include <zephyr/usb/usb_ch9.h> 43 #include <zephyr/logging/log.h> 44 #include <zephyr/sys/iterable_sections.h> 45 46 #ifdef __cplusplus 47 extern "C" { 48 #endif 49 50 /* 51 * These macros should be used to place the USB descriptors 52 * in predetermined order in the RAM. 53 */ 54 #define USBD_DEVICE_DESCR_DEFINE(p) \ 55 static __in_section(usb, descriptor_##p, 0) __used __aligned(1) 56 #define USBD_CLASS_DESCR_DEFINE(p, instance) \ 57 static __in_section(usb, descriptor_##p.1, instance) __used __aligned(1) 58 #define USBD_MISC_DESCR_DEFINE(p) \ 59 static __in_section(usb, descriptor_##p, 2) __used __aligned(1) 60 #define USBD_USER_DESCR_DEFINE(p) \ 61 static __in_section(usb, descriptor_##p, 3) __used __aligned(1) 62 #define USBD_STRING_DESCR_DEFINE(p) \ 63 static __in_section(usb, descriptor_##p, 4) __used __aligned(1) 64 #define USBD_STRING_DESCR_USER_DEFINE(p) \ 65 static __in_section(usb, descriptor_##p, 5) __used __aligned(1) 66 #define USBD_TERM_DESCR_DEFINE(p) \ 67 static __in_section(usb, descriptor_##p, 6) __used __aligned(1) 68 69 /* 70 * This macro should be used to place the struct usb_cfg_data 71 * inside usb data section in the RAM. 72 */ 73 #define USBD_DEFINE_CFG_DATA(name) \ 74 static STRUCT_SECTION_ITERABLE(usb_cfg_data, name) 75 76 #define USBD_CFG_DATA_DEFINE(p, name) __DEPRECATED_MACRO \ 77 static __in_section(_usb_cfg_data, static, p##_name) __used __aligned(4) 78 79 /************************************************************************* 80 * USB configuration 81 **************************************************************************/ 82 83 #define USB_MAX_CTRL_MPS 64 /**< maximum packet size (MPS) for EP 0 */ 84 #define USB_MAX_FS_BULK_MPS 64 /**< full speed MPS for bulk EP */ 85 #define USB_MAX_FS_INT_MPS 64 /**< full speed MPS for interrupt EP */ 86 #define USB_MAX_FS_ISO_MPS 1023 /**< full speed MPS for isochronous EP */ 87 88 /************************************************************************* 89 * USB application interface 90 **************************************************************************/ 91 92 /** 93 * @brief USB Device Core Layer API 94 * @defgroup _usb_device_core_api USB Device Core API 95 * @since 1.5 96 * @version 1.0.0 97 * @{ 98 */ 99 100 /** 101 * @brief Callback function signature for the USB Endpoint status 102 */ 103 typedef void (*usb_ep_callback)(uint8_t ep, 104 enum usb_dc_ep_cb_status_code cb_status); 105 106 /** 107 * @brief Callback function signature for class specific requests 108 * 109 * Function which handles Class specific requests corresponding to an 110 * interface number specified in the device descriptor table. For host 111 * to device direction the 'len' and 'payload_data' contain the length 112 * of the received data and the pointer to the received data respectively. 113 * For device to host class requests, 'len' and 'payload_data' should be 114 * set by the callback function with the length and the address of the 115 * data to be transmitted buffer respectively. 116 */ 117 typedef int (*usb_request_handler)(struct usb_setup_packet *setup, 118 int32_t *transfer_len, uint8_t **payload_data); 119 120 /** 121 * @brief Function for interface runtime configuration 122 */ 123 typedef void (*usb_interface_config)(struct usb_desc_header *head, 124 uint8_t bInterfaceNumber); 125 126 /** 127 * @brief USB Endpoint Configuration 128 * 129 * This structure contains configuration for the endpoint. 130 */ 131 struct usb_ep_cfg_data { 132 /** 133 * Callback function for notification of data received and 134 * available to application or transmit done, NULL if callback 135 * not required by application code 136 */ 137 usb_ep_callback ep_cb; 138 /** 139 * The number associated with the EP in the device configuration 140 * structure 141 * IN EP = 0x80 | \<endpoint number\> 142 * OUT EP = 0x00 | \<endpoint number\> 143 */ 144 uint8_t ep_addr; 145 }; 146 147 /** 148 * @brief USB Interface Configuration 149 * 150 * This structure contains USB interface configuration. 151 */ 152 struct usb_interface_cfg_data { 153 /** Handler for USB Class specific Control (EP 0) communications */ 154 usb_request_handler class_handler; 155 /** Handler for USB Vendor specific commands */ 156 usb_request_handler vendor_handler; 157 /** 158 * The custom request handler gets a first chance at handling 159 * the request before it is handed over to the 'chapter 9' request 160 * handler. 161 * return 0 on success, -EINVAL if the request has not been handled by 162 * the custom handler and instead needs to be handled by the 163 * core USB stack. Any other error code to denote failure within 164 * the custom handler. 165 */ 166 usb_request_handler custom_handler; 167 }; 168 169 /** 170 * @brief USB device configuration 171 * 172 * The Application instantiates this with given parameters added 173 * using the "usb_set_config" function. Once this function is called 174 * changes to this structure will result in undefined behavior. This structure 175 * may only be updated after calls to usb_deconfig 176 */ 177 struct usb_cfg_data { 178 /** 179 * USB device description, see 180 * http://www.beyondlogic.org/usbnutshell/usb5.shtml#DeviceDescriptors 181 */ 182 const uint8_t *usb_device_description; 183 /** Pointer to interface descriptor */ 184 void *interface_descriptor; 185 /** Function for interface runtime configuration */ 186 usb_interface_config interface_config; 187 /** Callback to be notified on USB connection status change */ 188 void (*cb_usb_status)(struct usb_cfg_data *cfg, 189 enum usb_dc_status_code cb_status, 190 const uint8_t *param); 191 /** USB interface (Class) handler and storage space */ 192 struct usb_interface_cfg_data interface; 193 /** Number of individual endpoints in the device configuration */ 194 uint8_t num_endpoints; 195 /** 196 * Pointer to an array of endpoint structs of length equal to the 197 * number of EP associated with the device description, 198 * not including control endpoints 199 */ 200 struct usb_ep_cfg_data *endpoint; 201 }; 202 203 /** 204 * @brief Configure USB controller 205 * 206 * Function to configure USB controller. 207 * Configuration parameters must be valid or an error is returned 208 * 209 * @param[in] usb_descriptor USB descriptor table 210 * 211 * @return 0 on success, negative errno code on fail 212 */ 213 int usb_set_config(const uint8_t *usb_descriptor); 214 215 /** 216 * @brief Deconfigure USB controller 217 * 218 * This function returns the USB device to it's initial state 219 * 220 * @return 0 on success, negative errno code on fail 221 */ 222 int usb_deconfig(void); 223 224 /** 225 * @brief Enable the USB subsystem and associated hardware 226 * 227 * This function initializes the USB core subsystem and enables the 228 * corresponding hardware so that it can begin transmitting and receiving 229 * on the USB bus, as well as generating interrupts. 230 * 231 * Class-specific initialization and registration must be performed by the user 232 * before invoking this, so that any data or events on the bus are processed 233 * correctly by the associated class handling code. 234 * 235 * @param[in] status_cb Callback registered by user to notify 236 * about USB device controller state. 237 * 238 * @return 0 on success, negative errno code on fail. 239 */ 240 int usb_enable(usb_dc_status_callback status_cb); 241 242 /** 243 * @brief Disable the USB device 244 * 245 * Function to disable the USB device. 246 * Upon success, the specified USB interface is clock gated in hardware, 247 * it is no longer capable of generating interrupts. 248 * 249 * @return 0 on success, negative errno code on fail 250 */ 251 int usb_disable(void); 252 253 /** 254 * @brief Write data to the specified endpoint 255 * 256 * Function to write data to the specified endpoint. The supplied 257 * usb_ep_callback will be called when transmission is done. 258 * 259 * @param[in] ep Endpoint address corresponding to the one listed in the 260 * device configuration table 261 * @param[in] data Pointer to data to write 262 * @param[in] data_len Length of data requested to write. This may be zero for 263 * a zero length status packet. 264 * @param[out] bytes_ret Bytes written to the EP FIFO. This value may be NULL if 265 * the application expects all bytes to be written 266 * 267 * @return 0 on success, negative errno code on fail 268 */ 269 int usb_write(uint8_t ep, const uint8_t *data, uint32_t data_len, uint32_t *bytes_ret); 270 271 /** 272 * @brief Read data from the specified endpoint 273 * 274 * This function is called by the Endpoint handler function, after an 275 * OUT interrupt has been received for that EP. The application must 276 * only call this function through the supplied usb_ep_callback function. 277 * 278 * @param[in] ep Endpoint address corresponding to the one listed in 279 * the device configuration table 280 * @param[in] data Pointer to data buffer to write to 281 * @param[in] max_data_len Max length of data to read 282 * @param[out] ret_bytes Number of bytes read. If data is NULL and 283 * max_data_len is 0 the number of bytes available 284 * for read is returned. 285 * 286 * @return 0 on success, negative errno code on fail 287 */ 288 int usb_read(uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_t *ret_bytes); 289 290 /** 291 * @brief Set STALL condition on the specified endpoint 292 * 293 * This function is called by USB device class handler code to set stall 294 * condition on endpoint. 295 * 296 * @param[in] ep Endpoint address corresponding to the one listed in 297 * the device configuration table 298 * 299 * @return 0 on success, negative errno code on fail 300 */ 301 int usb_ep_set_stall(uint8_t ep); 302 303 /** 304 * @brief Clears STALL condition on the specified endpoint 305 * 306 * This function is called by USB device class handler code to clear stall 307 * condition on endpoint. 308 * 309 * @param[in] ep Endpoint address corresponding to the one listed in 310 * the device configuration table 311 * 312 * @return 0 on success, negative errno code on fail 313 */ 314 int usb_ep_clear_stall(uint8_t ep); 315 316 /** 317 * @brief Read data from the specified endpoint 318 * 319 * This is similar to usb_ep_read, the difference being that, it doesn't 320 * clear the endpoint NAKs so that the consumer is not bogged down by further 321 * upcalls till he is done with the processing of the data. The caller should 322 * reactivate ep by invoking usb_ep_read_continue() do so. 323 * 324 * @param[in] ep Endpoint address corresponding to the one 325 * listed in the device configuration table 326 * @param[in] data pointer to data buffer to write to 327 * @param[in] max_data_len max length of data to read 328 * @param[out] read_bytes Number of bytes read. If data is NULL and 329 * max_data_len is 0 the number of bytes 330 * available for read should be returned. 331 * 332 * @return 0 on success, negative errno code on fail. 333 */ 334 int usb_ep_read_wait(uint8_t ep, uint8_t *data, uint32_t max_data_len, 335 uint32_t *read_bytes); 336 337 338 /** 339 * @brief Continue reading data from the endpoint 340 * 341 * Clear the endpoint NAK and enable the endpoint to accept more data 342 * from the host. Usually called after usb_ep_read_wait() when the consumer 343 * is fine to accept more data. Thus these calls together acts as flow control 344 * mechanism. 345 * 346 * @param[in] ep Endpoint address corresponding to the one 347 * listed in the device configuration table 348 * 349 * @return 0 on success, negative errno code on fail. 350 */ 351 int usb_ep_read_continue(uint8_t ep); 352 353 /** 354 * Callback function signature for transfer completion. 355 */ 356 typedef void (*usb_transfer_callback)(uint8_t ep, int tsize, void *priv); 357 358 /* USB transfer flags */ 359 #define USB_TRANS_READ BIT(0) /** Read transfer flag */ 360 #define USB_TRANS_WRITE BIT(1) /** Write transfer flag */ 361 #define USB_TRANS_NO_ZLP BIT(2) /** No zero-length packet flag */ 362 363 /** 364 * @brief Transfer management endpoint callback 365 * 366 * If a USB class driver wants to use high-level transfer functions, driver 367 * needs to register this callback as usb endpoint callback. 368 */ 369 void usb_transfer_ep_callback(uint8_t ep, enum usb_dc_ep_cb_status_code); 370 371 /** 372 * @brief Start a transfer 373 * 374 * Start a usb transfer to/from the data buffer. This function is asynchronous 375 * and can be executed in IRQ context. The provided callback will be called 376 * on transfer completion (or error) in thread context. 377 * 378 * @param[in] ep Endpoint address corresponding to the one 379 * listed in the device configuration table 380 * @param[in] data Pointer to data buffer to write-to/read-from 381 * @param[in] dlen Size of data buffer 382 * @param[in] flags Transfer flags (USB_TRANS_READ, USB_TRANS_WRITE...) 383 * @param[in] cb Function called on transfer completion/failure 384 * @param[in] priv Data passed back to the transfer completion callback 385 * 386 * @return 0 on success, negative errno code on fail. 387 */ 388 int usb_transfer(uint8_t ep, uint8_t *data, size_t dlen, unsigned int flags, 389 usb_transfer_callback cb, void *priv); 390 391 /** 392 * @brief Start a transfer and block-wait for completion 393 * 394 * Synchronous version of usb_transfer, wait for transfer completion before 395 * returning. 396 * A return value of zero can also mean that transfer was cancelled or that the 397 * endpoint is not ready. This is due to the design of transfers and usb_dc API. 398 * 399 * @param[in] ep Endpoint address corresponding to the one 400 * listed in the device configuration table 401 * @param[in] data Pointer to data buffer to write-to/read-from 402 * @param[in] dlen Size of data buffer 403 * @param[in] flags Transfer flags 404 * 405 * @return number of bytes transferred on success, negative errno code on fail. 406 */ 407 int usb_transfer_sync(uint8_t ep, uint8_t *data, size_t dlen, unsigned int flags); 408 409 /** 410 * @brief Cancel any ongoing transfer on the specified endpoint 411 * 412 * @param[in] ep Endpoint address corresponding to the one 413 * listed in the device configuration table 414 */ 415 void usb_cancel_transfer(uint8_t ep); 416 417 /** 418 * @brief Cancel all ongoing transfers 419 */ 420 void usb_cancel_transfers(void); 421 422 /** 423 * @brief Check that transfer is ongoing for the endpoint 424 * 425 * @param[in] ep Endpoint address corresponding to the one 426 * listed in the device configuration table 427 * 428 * @return true if transfer is ongoing, false otherwise. 429 */ 430 bool usb_transfer_is_busy(uint8_t ep); 431 432 /** 433 * @brief Start the USB remote wakeup procedure 434 * 435 * Function to request a remote wakeup. 436 * This feature must be enabled in configuration, otherwise 437 * it will always return -ENOTSUP error. 438 * 439 * @return 0 on success, negative errno code on fail, 440 * i.e. when the bus is already active. 441 */ 442 int usb_wakeup_request(void); 443 444 /** 445 * @brief Get status of the USB remote wakeup feature 446 * 447 * @return true if remote wakeup has been enabled by the host, false otherwise. 448 */ 449 bool usb_get_remote_wakeup_status(void); 450 451 /** 452 * @brief Helper macro to place the BOS compatibility descriptor 453 * in the right memory section. 454 */ 455 #define USB_DEVICE_BOS_DESC_DEFINE_CAP \ 456 static __in_section(usb, bos_desc_area, 1) __aligned(1) __used 457 458 /** 459 * @brief Register BOS capability descriptor 460 * 461 * This function should be used by the application to register BOS capability 462 * descriptors before the USB device stack is enabled. 463 * 464 * @param[in] hdr Pointer to BOS capability descriptor 465 */ 466 void usb_bos_register_cap(void *hdr); 467 468 /** 469 * @} 470 */ 471 472 #ifdef __cplusplus 473 } 474 #endif 475 476 #endif /* ZEPHYR_INCLUDE_USB_USB_DEVICE_H_ */ 477