1*150812a8SEvalZero /* 2*150812a8SEvalZero * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA 3*150812a8SEvalZero * All rights reserved. 4*150812a8SEvalZero * 5*150812a8SEvalZero * Redistribution and use in source and binary forms, with or without 6*150812a8SEvalZero * modification, are permitted provided that the following conditions are met: 7*150812a8SEvalZero * 8*150812a8SEvalZero * 1. Redistributions of source code must retain the above copyright notice, this 9*150812a8SEvalZero * list of conditions and the following disclaimer. 10*150812a8SEvalZero * 11*150812a8SEvalZero * 2. Redistributions in binary form must reproduce the above copyright 12*150812a8SEvalZero * notice, this list of conditions and the following disclaimer in the 13*150812a8SEvalZero * documentation and/or other materials provided with the distribution. 14*150812a8SEvalZero * 15*150812a8SEvalZero * 3. Neither the name of the copyright holder nor the names of its 16*150812a8SEvalZero * contributors may be used to endorse or promote products derived from this 17*150812a8SEvalZero * software without specific prior written permission. 18*150812a8SEvalZero * 19*150812a8SEvalZero * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20*150812a8SEvalZero * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21*150812a8SEvalZero * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22*150812a8SEvalZero * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23*150812a8SEvalZero * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*150812a8SEvalZero * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*150812a8SEvalZero * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*150812a8SEvalZero * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*150812a8SEvalZero * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*150812a8SEvalZero * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*150812a8SEvalZero * POSSIBILITY OF SUCH DAMAGE. 30*150812a8SEvalZero */ 31*150812a8SEvalZero 32*150812a8SEvalZero #ifndef NRFX_USBD_H__ 33*150812a8SEvalZero #define NRFX_USBD_H__ 34*150812a8SEvalZero 35*150812a8SEvalZero #include <nrfx.h> 36*150812a8SEvalZero #include <hal/nrf_usbd.h> 37*150812a8SEvalZero 38*150812a8SEvalZero #ifdef __cplusplus 39*150812a8SEvalZero extern "C" { 40*150812a8SEvalZero #endif 41*150812a8SEvalZero 42*150812a8SEvalZero /** 43*150812a8SEvalZero * @defgroup nrfx_usbd USBD driver 44*150812a8SEvalZero * @{ 45*150812a8SEvalZero * @ingroup nrf_usbd 46*150812a8SEvalZero * @brief Universal Serial Bus Device (USBD) peripheral driver. 47*150812a8SEvalZero */ 48*150812a8SEvalZero 49*150812a8SEvalZero /** 50*150812a8SEvalZero * @brief Number of bytes in the endpoint. 51*150812a8SEvalZero */ 52*150812a8SEvalZero #define NRFX_USBD_EPSIZE 64 53*150812a8SEvalZero 54*150812a8SEvalZero /** 55*150812a8SEvalZero * @brief Number of bytes for isochronous endpoints. 56*150812a8SEvalZero * 57*150812a8SEvalZero * Number of bytes for isochronous endpoints in total. 58*150812a8SEvalZero * This number would be shared between IN and OUT endpoint. 59*150812a8SEvalZero * It may be also assigned totaly to one endpoint. 60*150812a8SEvalZero * @sa nrf_usbd_isosplit_set 61*150812a8SEvalZero * @sa nrf_usbd_isosplit_get 62*150812a8SEvalZero */ 63*150812a8SEvalZero #define NRFX_USBD_ISOSIZE 1024 64*150812a8SEvalZero 65*150812a8SEvalZero /** 66*150812a8SEvalZero * @brief The size of internal feeder buffer. 67*150812a8SEvalZero * 68*150812a8SEvalZero * @sa nrfx_usbd_feeder_buffer_get 69*150812a8SEvalZero */ 70*150812a8SEvalZero #define NRFX_USBD_FEEDER_BUFFER_SIZE NRFX_USBD_EPSIZE 71*150812a8SEvalZero 72*150812a8SEvalZero /** 73*150812a8SEvalZero * @name Macros for creating endpoint identifiers. 74*150812a8SEvalZero * 75*150812a8SEvalZero * Auxiliary macros for creating endpoint identifiers compatible with the USB specification. 76*150812a8SEvalZero * @{ 77*150812a8SEvalZero * @brief Create identifier for IN endpoint. 78*150812a8SEvalZero * 79*150812a8SEvalZero * Simple macro to create IN endpoint identifier for given endpoint number. 80*150812a8SEvalZero * 81*150812a8SEvalZero * @param[in] n Endpoint number. 82*150812a8SEvalZero * 83*150812a8SEvalZero * @return Endpoint identifier that connects endpoint number and endpoint direction. 84*150812a8SEvalZero */ 85*150812a8SEvalZero #define NRFX_USBD_EPIN(n) ((nrfx_usbd_ep_t)NRF_USBD_EPIN(n)) 86*150812a8SEvalZero /** 87*150812a8SEvalZero * @brief Create identifier for OUT endpoint. 88*150812a8SEvalZero * 89*150812a8SEvalZero * Simple macro to create OUT endpoint identifier for given endpoint number. 90*150812a8SEvalZero * 91*150812a8SEvalZero * @param[in] n Endpoint number. 92*150812a8SEvalZero * 93*150812a8SEvalZero * @return Endpoint identifier that connects endpoint number and endpoint direction. 94*150812a8SEvalZero */ 95*150812a8SEvalZero #define NRFX_USBD_EPOUT(n) ((nrfx_usbd_ep_t)NRF_USBD_EPOUT(n)) 96*150812a8SEvalZero /** @} */ 97*150812a8SEvalZero 98*150812a8SEvalZero /** 99*150812a8SEvalZero * @brief Endpoint identifier. 100*150812a8SEvalZero * 101*150812a8SEvalZero * Endpoint identifier used in the driver. 102*150812a8SEvalZero * This endpoint number is consistent with USB 2.0 specification. 103*150812a8SEvalZero */ 104*150812a8SEvalZero typedef enum 105*150812a8SEvalZero { 106*150812a8SEvalZero NRFX_USBD_EPOUT0 = NRF_USBD_EPOUT(0), /**< Endpoint OUT 0 */ 107*150812a8SEvalZero NRFX_USBD_EPOUT1 = NRF_USBD_EPOUT(1), /**< Endpoint OUT 1 */ 108*150812a8SEvalZero NRFX_USBD_EPOUT2 = NRF_USBD_EPOUT(2), /**< Endpoint OUT 2 */ 109*150812a8SEvalZero NRFX_USBD_EPOUT3 = NRF_USBD_EPOUT(3), /**< Endpoint OUT 3 */ 110*150812a8SEvalZero NRFX_USBD_EPOUT4 = NRF_USBD_EPOUT(4), /**< Endpoint OUT 4 */ 111*150812a8SEvalZero NRFX_USBD_EPOUT5 = NRF_USBD_EPOUT(5), /**< Endpoint OUT 5 */ 112*150812a8SEvalZero NRFX_USBD_EPOUT6 = NRF_USBD_EPOUT(6), /**< Endpoint OUT 6 */ 113*150812a8SEvalZero NRFX_USBD_EPOUT7 = NRF_USBD_EPOUT(7), /**< Endpoint OUT 7 */ 114*150812a8SEvalZero NRFX_USBD_EPOUT8 = NRF_USBD_EPOUT(8), /**< Endpoint OUT 8 */ 115*150812a8SEvalZero 116*150812a8SEvalZero NRFX_USBD_EPIN0 = NRF_USBD_EPIN(0), /**< Endpoint IN 0 */ 117*150812a8SEvalZero NRFX_USBD_EPIN1 = NRF_USBD_EPIN(1), /**< Endpoint IN 1 */ 118*150812a8SEvalZero NRFX_USBD_EPIN2 = NRF_USBD_EPIN(2), /**< Endpoint IN 2 */ 119*150812a8SEvalZero NRFX_USBD_EPIN3 = NRF_USBD_EPIN(3), /**< Endpoint IN 3 */ 120*150812a8SEvalZero NRFX_USBD_EPIN4 = NRF_USBD_EPIN(4), /**< Endpoint IN 4 */ 121*150812a8SEvalZero NRFX_USBD_EPIN5 = NRF_USBD_EPIN(5), /**< Endpoint IN 5 */ 122*150812a8SEvalZero NRFX_USBD_EPIN6 = NRF_USBD_EPIN(6), /**< Endpoint IN 6 */ 123*150812a8SEvalZero NRFX_USBD_EPIN7 = NRF_USBD_EPIN(7), /**< Endpoint IN 7 */ 124*150812a8SEvalZero NRFX_USBD_EPIN8 = NRF_USBD_EPIN(8), /**< Endpoint IN 8 */ 125*150812a8SEvalZero } nrfx_usbd_ep_t; 126*150812a8SEvalZero 127*150812a8SEvalZero /** 128*150812a8SEvalZero * @brief Events generated by the driver. 129*150812a8SEvalZero * 130*150812a8SEvalZero * Enumeration of possible events that may be generated by the driver. 131*150812a8SEvalZero */ 132*150812a8SEvalZero typedef enum 133*150812a8SEvalZero { 134*150812a8SEvalZero NRFX_USBD_EVT_SOF, /**< Start Of Frame event on USB bus detected. */ 135*150812a8SEvalZero NRFX_USBD_EVT_RESET, /**< Reset condition on USB bus detected. */ 136*150812a8SEvalZero NRFX_USBD_EVT_SUSPEND, /**< This device should go to suspend mode now. */ 137*150812a8SEvalZero NRFX_USBD_EVT_RESUME, /**< This device should resume from suspend now. */ 138*150812a8SEvalZero NRFX_USBD_EVT_WUREQ, /**< Wakeup request - the USBD peripheral is ready to generate 139*150812a8SEvalZero WAKEUP signal after exiting low power mode. */ 140*150812a8SEvalZero NRFX_USBD_EVT_SETUP, /**< Setup frame received and decoded. */ 141*150812a8SEvalZero NRFX_USBD_EVT_EPTRANSFER, /**< For Rx (OUT: Host->Device): 142*150812a8SEvalZero * 1. The packet has been received but there is no buffer prepared for transfer already. 143*150812a8SEvalZero * 2. Whole transfer has been finished. 144*150812a8SEvalZero * 145*150812a8SEvalZero * For Tx (IN: Device->Host): 146*150812a8SEvalZero * The last packet from requested transfer has been transfered over USB bus and acknowledged. 147*150812a8SEvalZero */ 148*150812a8SEvalZero NRFX_USBD_EVT_CNT /**< Number of defined events. */ 149*150812a8SEvalZero } nrfx_usbd_event_type_t; 150*150812a8SEvalZero 151*150812a8SEvalZero /** 152*150812a8SEvalZero * @brief Endpoint status codes. 153*150812a8SEvalZero * 154*150812a8SEvalZero * Status codes that may be returned by @ref nrfx_usbd_ep_status_get or, except for 155*150812a8SEvalZero * @ref NRFX_USBD_EP_BUSY, reported together with @ref NRFX_USBD_EVT_EPTRANSFER. 156*150812a8SEvalZero */ 157*150812a8SEvalZero typedef enum 158*150812a8SEvalZero { 159*150812a8SEvalZero NRFX_USBD_EP_OK, /**< No error occured. */ 160*150812a8SEvalZero NRFX_USBD_EP_WAITING, /**< Data received, no buffer prepared already - waiting for configured transfer. */ 161*150812a8SEvalZero NRFX_USBD_EP_OVERLOAD, /**< Received number of bytes cannot fit given buffer. 162*150812a8SEvalZero * This error would also be returned when next_transfer function has been defined 163*150812a8SEvalZero * but currently received data cannot fit completely in current buffer. 164*150812a8SEvalZero * No data split from single endpoint transmission is supported. 165*150812a8SEvalZero * 166*150812a8SEvalZero * When this error is reported - data is left inside endpoint buffer. 167*150812a8SEvalZero * Clear endpoint or prepare new buffer and read it. 168*150812a8SEvalZero */ 169*150812a8SEvalZero NRFX_USBD_EP_ABORTED, /**< EP0 transfer can be aborted when new setup comes. 170*150812a8SEvalZero * Any other transfer can be aborted by USB reset or driver stopping. 171*150812a8SEvalZero */ 172*150812a8SEvalZero NRFX_USBD_EP_BUSY, /**< A transfer is in progress. */ 173*150812a8SEvalZero } nrfx_usbd_ep_status_t; 174*150812a8SEvalZero 175*150812a8SEvalZero /** 176*150812a8SEvalZero * @brief Event structure. 177*150812a8SEvalZero * 178*150812a8SEvalZero * Structure passed to event handler. 179*150812a8SEvalZero */ 180*150812a8SEvalZero typedef struct 181*150812a8SEvalZero { 182*150812a8SEvalZero nrfx_usbd_event_type_t type; 183*150812a8SEvalZero union 184*150812a8SEvalZero { 185*150812a8SEvalZero struct { 186*150812a8SEvalZero uint16_t framecnt; /**< Current value of frame counter. */ 187*150812a8SEvalZero } sof; /**< Data available for @ref NRFX_USBD_EVT_SOF. */ 188*150812a8SEvalZero struct { 189*150812a8SEvalZero nrfx_usbd_ep_t ep; /**< Endpoint number. */ 190*150812a8SEvalZero } isocrc; 191*150812a8SEvalZero struct { 192*150812a8SEvalZero nrfx_usbd_ep_t ep; /**< Endpoint number. */ 193*150812a8SEvalZero nrfx_usbd_ep_status_t status; /**< Status for the endpoint. */ 194*150812a8SEvalZero } eptransfer; 195*150812a8SEvalZero } data; 196*150812a8SEvalZero } nrfx_usbd_evt_t; 197*150812a8SEvalZero 198*150812a8SEvalZero /** 199*150812a8SEvalZero * @brief USBD event callback function type. 200*150812a8SEvalZero * 201*150812a8SEvalZero * @param[in] p_event Event information structure. 202*150812a8SEvalZero */ 203*150812a8SEvalZero typedef void (*nrfx_usbd_event_handler_t)(nrfx_usbd_evt_t const * p_event); 204*150812a8SEvalZero 205*150812a8SEvalZero /** 206*150812a8SEvalZero * @brief Universal data pointer. 207*150812a8SEvalZero * 208*150812a8SEvalZero * Universal data pointer that can be used for any type of transfer. 209*150812a8SEvalZero */ 210*150812a8SEvalZero typedef union 211*150812a8SEvalZero { 212*150812a8SEvalZero void const * tx; //!< Constant TX buffer pointer. 213*150812a8SEvalZero void * rx; //!< Writable RX buffer pointer. 214*150812a8SEvalZero uint32_t addr; //!< Numeric value used internally by the driver. 215*150812a8SEvalZero } nrfx_usbd_data_ptr_t; 216*150812a8SEvalZero 217*150812a8SEvalZero /** 218*150812a8SEvalZero * @brief Structure to be filled with information about the next transfer. 219*150812a8SEvalZero * 220*150812a8SEvalZero * This is used mainly for transfer feeders and consumers. 221*150812a8SEvalZero * It describes a single endpoint transfer and therefore the size of the buffer 222*150812a8SEvalZero * can never be higher than the endpoint size. 223*150812a8SEvalZero */ 224*150812a8SEvalZero typedef struct 225*150812a8SEvalZero { 226*150812a8SEvalZero nrfx_usbd_data_ptr_t p_data; //!< Union with available data pointers used by the driver. 227*150812a8SEvalZero size_t size; //!< Size of the requested transfer. 228*150812a8SEvalZero } nrfx_usbd_ep_transfer_t; 229*150812a8SEvalZero 230*150812a8SEvalZero /** 231*150812a8SEvalZero * @brief Flags for the current transfer. 232*150812a8SEvalZero * 233*150812a8SEvalZero * Flags configured for the transfer that can be merged using the bitwise 'or' operator (|). 234*150812a8SEvalZero */ 235*150812a8SEvalZero typedef enum 236*150812a8SEvalZero { 237*150812a8SEvalZero NRFX_USBD_TRANSFER_ZLP_FLAG = 1U << 0, //!< Add a zero-length packet. 238*150812a8SEvalZero } nrfx_usbd_transfer_flags_t; 239*150812a8SEvalZero 240*150812a8SEvalZero /** 241*150812a8SEvalZero * @brief Total transfer configuration. 242*150812a8SEvalZero * 243*150812a8SEvalZero * This structure is used to configure total transfer information. 244*150812a8SEvalZero * It is used by internal built-in feeders and consumers. 245*150812a8SEvalZero */ 246*150812a8SEvalZero typedef struct 247*150812a8SEvalZero { 248*150812a8SEvalZero nrfx_usbd_data_ptr_t p_data; //!< Union with available data pointers used by the driver. 249*150812a8SEvalZero size_t size; //!< Total size of the requested transfer. 250*150812a8SEvalZero uint32_t flags; //!< Transfer flags. 251*150812a8SEvalZero /**< Use the @ref nrfx_usbd_transfer_flags_t values. */ 252*150812a8SEvalZero } nrfx_usbd_transfer_t; 253*150812a8SEvalZero 254*150812a8SEvalZero /** 255*150812a8SEvalZero * @brief Auxiliary macro for declaring IN transfer description with optional flags. 256*150812a8SEvalZero * 257*150812a8SEvalZero * The base macro for creating transfers with any configuration option. 258*150812a8SEvalZero * 259*150812a8SEvalZero * @param name Instance name. 260*150812a8SEvalZero * @param tx_buff Buffer to transfer. 261*150812a8SEvalZero * @param tx_size Transfer size. 262*150812a8SEvalZero * @param tx_flags Flags for the transfer (see @ref nrfx_usbd_transfer_flags_t). 263*150812a8SEvalZero * 264*150812a8SEvalZero * @return Configured variable with total transfer description. 265*150812a8SEvalZero */ 266*150812a8SEvalZero #define NRFX_USBD_TRANSFER_IN(name, tx_buff, tx_size, tx_flags) \ 267*150812a8SEvalZero const nrfx_usbd_transfer_t name = { \ 268*150812a8SEvalZero .p_data = { .tx = (tx_buff) }, \ 269*150812a8SEvalZero .size = (tx_size), \ 270*150812a8SEvalZero .flags = (tx_flags) \ 271*150812a8SEvalZero } 272*150812a8SEvalZero 273*150812a8SEvalZero /** 274*150812a8SEvalZero * @brief Helper macro for declaring OUT transfer item (@ref nrfx_usbd_transfer_t). 275*150812a8SEvalZero * 276*150812a8SEvalZero * @param name Instance name. 277*150812a8SEvalZero * @param rx_buff Buffer to transfer. 278*150812a8SEvalZero * @param rx_size Transfer size. 279*150812a8SEvalZero * */ 280*150812a8SEvalZero #define NRFX_USBD_TRANSFER_OUT(name, rx_buff, rx_size) \ 281*150812a8SEvalZero const nrfx_usbd_transfer_t name = { \ 282*150812a8SEvalZero .p_data = { .rx = (rx_buff) }, \ 283*150812a8SEvalZero .size = (rx_size), \ 284*150812a8SEvalZero .flags = 0 \ 285*150812a8SEvalZero } 286*150812a8SEvalZero 287*150812a8SEvalZero /** 288*150812a8SEvalZero * @brief USBD transfer feeder. 289*150812a8SEvalZero * 290*150812a8SEvalZero * Pointer for a transfer feeder. 291*150812a8SEvalZero * Transfer feeder is a feedback function used to prepare a single 292*150812a8SEvalZero * TX (Device->Host) endpoint transfer. 293*150812a8SEvalZero * 294*150812a8SEvalZero * The transfers provided by the feeder must be simple: 295*150812a8SEvalZero * - The size of the transfer provided by this function is limited to a single endpoint buffer. 296*150812a8SEvalZero * Bigger transfers are not handled automatically in this case. 297*150812a8SEvalZero * - Flash transfers are not automatically supported- you must copy them to the RAM buffer before. 298*150812a8SEvalZero * 299*150812a8SEvalZero * @note 300*150812a8SEvalZero * This function may use @ref nrfx_usbd_feeder_buffer_get to gain a temporary buffer 301*150812a8SEvalZero * that can be used to prepare transfer. 302*150812a8SEvalZero * 303*150812a8SEvalZero * @param[out] p_next Structure with the data for the next transfer to be filled. 304*150812a8SEvalZero * Required only if the function returns true. 305*150812a8SEvalZero * @param[in,out] p_context Context variable configured with the transfer. 306*150812a8SEvalZero * @param[in] ep_size The endpoint size. 307*150812a8SEvalZero * 308*150812a8SEvalZero * @retval false The current transfer is the last one - you do not need to call 309*150812a8SEvalZero * the function again. 310*150812a8SEvalZero * @retval true There is more data to be prepared and when the current transfer 311*150812a8SEvalZero * finishes, the feeder function is expected to be called again. 312*150812a8SEvalZero */ 313*150812a8SEvalZero typedef bool (*nrfx_usbd_feeder_t)(nrfx_usbd_ep_transfer_t * p_next, 314*150812a8SEvalZero void * p_context, 315*150812a8SEvalZero size_t ep_size); 316*150812a8SEvalZero 317*150812a8SEvalZero /** 318*150812a8SEvalZero * @brief USBD transfer consumer. 319*150812a8SEvalZero * 320*150812a8SEvalZero * Pointer for a transfer consumer. 321*150812a8SEvalZero * Transfer consumer is a feedback function used to prepare a single 322*150812a8SEvalZero * RX (Host->Device) endpoint transfer. 323*150812a8SEvalZero * 324*150812a8SEvalZero * The transfer must provide a buffer big enough to fit the whole data from the endpoint. 325*150812a8SEvalZero * Otherwise, the NRFX_USBD_EP_OVERLOAD event is generated. 326*150812a8SEvalZero * 327*150812a8SEvalZero * @param[out] p_next Structure with the data for the next transfer to be filled. 328*150812a8SEvalZero * Required only if the function returns true. 329*150812a8SEvalZero * @param[in,out] p_context Context variable configured with the transfer. 330*150812a8SEvalZero * @param[in] ep_size The endpoint size. 331*150812a8SEvalZero * @param[in] data_size Number of received bytes in the endpoint buffer. 332*150812a8SEvalZero * 333*150812a8SEvalZero * @retval false Current transfer is the last one - you do not need to call 334*150812a8SEvalZero * the function again. 335*150812a8SEvalZero * @retval true There is more data to be prepared and when current transfer 336*150812a8SEvalZero * finishes, the feeder function is expected to be called again. 337*150812a8SEvalZero */ 338*150812a8SEvalZero typedef bool (*nrfx_usbd_consumer_t)(nrfx_usbd_ep_transfer_t * p_next, 339*150812a8SEvalZero void * p_context, 340*150812a8SEvalZero size_t ep_size, 341*150812a8SEvalZero size_t data_size); 342*150812a8SEvalZero 343*150812a8SEvalZero /** 344*150812a8SEvalZero * @brief Universal transfer handler. 345*150812a8SEvalZero * 346*150812a8SEvalZero * Union with feeder and consumer function pointer. 347*150812a8SEvalZero */ 348*150812a8SEvalZero typedef union 349*150812a8SEvalZero { 350*150812a8SEvalZero nrfx_usbd_feeder_t feeder; //!< Feeder function pointer. 351*150812a8SEvalZero nrfx_usbd_consumer_t consumer; //!< Consumer function pointer. 352*150812a8SEvalZero } nrfx_usbd_handler_t; 353*150812a8SEvalZero 354*150812a8SEvalZero /** 355*150812a8SEvalZero * @brief USBD transfer descriptor. 356*150812a8SEvalZero * 357*150812a8SEvalZero * Universal structure that may hold the setup for callback configuration for 358*150812a8SEvalZero * IN or OUT type of the transfer. 359*150812a8SEvalZero */ 360*150812a8SEvalZero typedef struct 361*150812a8SEvalZero { 362*150812a8SEvalZero nrfx_usbd_handler_t handler; //!< Handler for the current transfer, function pointer. 363*150812a8SEvalZero void * p_context; //!< Context for the transfer handler. 364*150812a8SEvalZero } nrfx_usbd_handler_desc_t; 365*150812a8SEvalZero 366*150812a8SEvalZero /** 367*150812a8SEvalZero * @brief Setup packet structure. 368*150812a8SEvalZero * 369*150812a8SEvalZero * Structure that contains interpreted SETUP packet as described in USB specification. 370*150812a8SEvalZero */ 371*150812a8SEvalZero typedef struct 372*150812a8SEvalZero { 373*150812a8SEvalZero uint8_t bmRequestType; //!< byte 0 374*150812a8SEvalZero uint8_t bRequest; //!< byte 1 375*150812a8SEvalZero uint16_t wValue; //!< byte 2, 3 376*150812a8SEvalZero uint16_t wIndex; //!< byte 4, 5 377*150812a8SEvalZero uint16_t wLength; //!< byte 6, 7 378*150812a8SEvalZero } nrfx_usbd_setup_t; 379*150812a8SEvalZero 380*150812a8SEvalZero /** 381*150812a8SEvalZero * @brief Driver initialization. 382*150812a8SEvalZero * 383*150812a8SEvalZero * @param[in] event_handler Event handler provided by the user. Cannot be null. 384*150812a8SEvalZero * 385*150812a8SEvalZero * @retval NRFX_SUCCESS Initialization successful. 386*150812a8SEvalZero * @retval NRFX_ERROR_INVALID_STATE Driver was already initialized. 387*150812a8SEvalZero */ 388*150812a8SEvalZero nrfx_err_t nrfx_usbd_init(nrfx_usbd_event_handler_t event_handler); 389*150812a8SEvalZero 390*150812a8SEvalZero /** 391*150812a8SEvalZero * @brief Driver deinitialization. 392*150812a8SEvalZero */ 393*150812a8SEvalZero void nrfx_usbd_uninit(void); 394*150812a8SEvalZero 395*150812a8SEvalZero /** 396*150812a8SEvalZero * @brief Enable the USBD port. 397*150812a8SEvalZero * 398*150812a8SEvalZero * After calling this function USBD peripheral would be enabled. 399*150812a8SEvalZero * The USB LDO would be enabled. 400*150812a8SEvalZero * Enabled USBD peripheral would request HFCLK. 401*150812a8SEvalZero * This function does not enable external oscillator, so if it is not enabled by other part of the 402*150812a8SEvalZero * program after enabling USBD driver HFINT would be used for the USBD peripheral. 403*150812a8SEvalZero * It is perfectly fine until USBD is started. See @ref nrfx_usbd_start. 404*150812a8SEvalZero * 405*150812a8SEvalZero * In normal situation this function should be called in reaction to USBDETECTED 406*150812a8SEvalZero * event from POWER peripheral. 407*150812a8SEvalZero * 408*150812a8SEvalZero * Interrupts and USB pins pull-up would stay disabled until @ref nrfx_usbd_start 409*150812a8SEvalZero * function is called. 410*150812a8SEvalZero */ 411*150812a8SEvalZero void nrfx_usbd_enable(void); 412*150812a8SEvalZero 413*150812a8SEvalZero /** 414*150812a8SEvalZero * @brief Disable the USBD port. 415*150812a8SEvalZero * 416*150812a8SEvalZero * After calling this function USBD peripheral would be disabled. 417*150812a8SEvalZero * No events would be detected or processed by the driver. 418*150812a8SEvalZero * Clock for the peripheral would be disconnected. 419*150812a8SEvalZero */ 420*150812a8SEvalZero void nrfx_usbd_disable(void); 421*150812a8SEvalZero 422*150812a8SEvalZero /** 423*150812a8SEvalZero * @brief Start USB functionality. 424*150812a8SEvalZero * 425*150812a8SEvalZero * After calling this function USBD peripheral should be fully functional 426*150812a8SEvalZero * and all new incoming events / interrupts would be processed by the driver. 427*150812a8SEvalZero * 428*150812a8SEvalZero * Also only after calling this function host sees new connected device. 429*150812a8SEvalZero * 430*150812a8SEvalZero * Call this function when USBD power LDO regulator is ready - on USBPWRRDY event 431*150812a8SEvalZero * from POWER peripheral. 432*150812a8SEvalZero * 433*150812a8SEvalZero * Before USBD interrupts are enabled, external HFXO is requested. 434*150812a8SEvalZero * 435*150812a8SEvalZero * @param enable_sof The flag that is used to enable SOF processing. 436*150812a8SEvalZero * If it is false, SOF interrupt is left disabled and will not be generated. 437*150812a8SEvalZero * This improves power saving if SOF is not required. 438*150812a8SEvalZero * 439*150812a8SEvalZero * @note If the isochronous endpoints are going to be used, 440*150812a8SEvalZero * it is required to enable the SOF. 441*150812a8SEvalZero * In other case any isochronous endpoint would stay busy 442*150812a8SEvalZero * after first transmission. 443*150812a8SEvalZero */ 444*150812a8SEvalZero void nrfx_usbd_start(bool enable_sof); 445*150812a8SEvalZero 446*150812a8SEvalZero /** 447*150812a8SEvalZero * @brief Stop USB functionality. 448*150812a8SEvalZero * 449*150812a8SEvalZero * This function disables USBD pull-up and interrupts. 450*150812a8SEvalZero * 451*150812a8SEvalZero * The HFXO request is released in this function. 452*150812a8SEvalZero * 453*150812a8SEvalZero * @note 454*150812a8SEvalZero * This function can also be used to logically disconnect USB from the HOST that 455*150812a8SEvalZero * would force it to enumerate device after calling @ref nrfx_usbd_start. 456*150812a8SEvalZero */ 457*150812a8SEvalZero void nrfx_usbd_stop(void); 458*150812a8SEvalZero 459*150812a8SEvalZero /** 460*150812a8SEvalZero * @brief Check if driver is initialized. 461*150812a8SEvalZero * 462*150812a8SEvalZero * @retval false Driver is not initialized. 463*150812a8SEvalZero * @retval true Driver is initialized. 464*150812a8SEvalZero */ 465*150812a8SEvalZero bool nrfx_usbd_is_initialized(void); 466*150812a8SEvalZero 467*150812a8SEvalZero /** 468*150812a8SEvalZero * @brief Check if driver is enabled. 469*150812a8SEvalZero * 470*150812a8SEvalZero * @retval false Driver is disabled. 471*150812a8SEvalZero * @retval true Driver is enabled. 472*150812a8SEvalZero */ 473*150812a8SEvalZero bool nrfx_usbd_is_enabled(void); 474*150812a8SEvalZero 475*150812a8SEvalZero /** 476*150812a8SEvalZero * @brief Check if driver is started. 477*150812a8SEvalZero * 478*150812a8SEvalZero * @retval false Driver is not started. 479*150812a8SEvalZero * @retval true Driver is started (fully functional). 480*150812a8SEvalZero * @note The USBD peripheral interrupt state is checked. 481*150812a8SEvalZero */ 482*150812a8SEvalZero bool nrfx_usbd_is_started(void); 483*150812a8SEvalZero 484*150812a8SEvalZero /** 485*150812a8SEvalZero * @brief Suspend USBD operation. 486*150812a8SEvalZero * 487*150812a8SEvalZero * The USBD peripheral is forced to go into the low power mode. 488*150812a8SEvalZero * The function has to be called in the reaction to @ref NRFX_USBD_EVT_SUSPEND event 489*150812a8SEvalZero * when the firmware is ready. 490*150812a8SEvalZero * 491*150812a8SEvalZero * After successful call of this function most of the USBD registers would be unavailable. 492*150812a8SEvalZero * 493*150812a8SEvalZero * @note Check returned value for the feedback if suspending was successful. 494*150812a8SEvalZero * 495*150812a8SEvalZero * @retval true USBD peripheral successfully suspended. 496*150812a8SEvalZero * @retval false USBD peripheral was not suspended due to resume detection. 497*150812a8SEvalZero */ 498*150812a8SEvalZero bool nrfx_usbd_suspend(void); 499*150812a8SEvalZero 500*150812a8SEvalZero /** 501*150812a8SEvalZero * @brief Start wake up procedure. 502*150812a8SEvalZero * 503*150812a8SEvalZero * The USBD peripheral is forced to quit the low power mode. 504*150812a8SEvalZero * After calling this function all the USBD registers would be available. 505*150812a8SEvalZero * 506*150812a8SEvalZero * The hardware starts measuring time when wake up is possible. 507*150812a8SEvalZero * This may take 0-5 ms depending on how long the SUSPEND state was kept on the USB line. 508*150812a8SEvalZero 509*150812a8SEvalZero * When NRFX_USBD_EVT_WUREQ event is generated it means that Wake Up signaling has just been 510*150812a8SEvalZero * started on the USB lines. 511*150812a8SEvalZero * 512*150812a8SEvalZero * @note Do not expect only @ref NRFX_USBD_EVT_WUREQ event. 513*150812a8SEvalZero * There always may appear @ref NRFX_USBD_EVT_RESUME event. 514*150812a8SEvalZero * @note NRFX_USBD_EVT_WUREQ event means that Remote WakeUp signal 515*150812a8SEvalZero * has just begun to be generated. 516*150812a8SEvalZero * This may take up to 20 ms for the bus to become active. 517*150812a8SEvalZero * 518*150812a8SEvalZero * @retval true WakeUp procedure started. 519*150812a8SEvalZero * @retval false No WakeUp procedure started - bus is already active. 520*150812a8SEvalZero */ 521*150812a8SEvalZero bool nrfx_usbd_wakeup_req(void); 522*150812a8SEvalZero 523*150812a8SEvalZero /** 524*150812a8SEvalZero * @brief Check if USBD is in SUSPEND mode. 525*150812a8SEvalZero * 526*150812a8SEvalZero * @note This is the information about peripheral itself, not about the bus state. 527*150812a8SEvalZero * 528*150812a8SEvalZero * @retval true USBD peripheral is suspended. 529*150812a8SEvalZero * @retval false USBD peripheral is active. 530*150812a8SEvalZero */ 531*150812a8SEvalZero bool nrfx_usbd_suspend_check(void); 532*150812a8SEvalZero 533*150812a8SEvalZero /** 534*150812a8SEvalZero * @brief Enable only interrupts that should be processed in SUSPEND mode. 535*150812a8SEvalZero * 536*150812a8SEvalZero * Auxiliary function to help with SUSPEND mode integration. 537*150812a8SEvalZero * It enables only the interrupts that can be properly processed without stable HFCLK. 538*150812a8SEvalZero * 539*150812a8SEvalZero * Normally all the interrupts are enabled. 540*150812a8SEvalZero * Use this function to suspend interrupt processing that may require stable HFCLK until the 541*150812a8SEvalZero * clock is enabled. 542*150812a8SEvalZero * 543*150812a8SEvalZero * @sa nrfx_usbd_active_irq_config 544*150812a8SEvalZero */ 545*150812a8SEvalZero void nrfx_usbd_suspend_irq_config(void); 546*150812a8SEvalZero 547*150812a8SEvalZero /** 548*150812a8SEvalZero * @brief Default active interrupt configuration. 549*150812a8SEvalZero * 550*150812a8SEvalZero * Default interrupt configuration. 551*150812a8SEvalZero * Use in a pair with @ref nrfx_usbd_active_irq_config. 552*150812a8SEvalZero * 553*150812a8SEvalZero * @sa nrfx_usbd_suspend_irq_config 554*150812a8SEvalZero */ 555*150812a8SEvalZero void nrfx_usbd_active_irq_config(void); 556*150812a8SEvalZero 557*150812a8SEvalZero /** 558*150812a8SEvalZero * @brief Check the bus state. 559*150812a8SEvalZero * 560*150812a8SEvalZero * This function checks if the bus state is suspended. 561*150812a8SEvalZero * 562*150812a8SEvalZero * @note The value returned by this function changes on SUSPEND and RESUME event processing. 563*150812a8SEvalZero * 564*150812a8SEvalZero * @retval true USBD bus is suspended. 565*150812a8SEvalZero * @retval false USBD bus is active. 566*150812a8SEvalZero */ 567*150812a8SEvalZero bool nrfx_usbd_bus_suspend_check(void); 568*150812a8SEvalZero 569*150812a8SEvalZero /** 570*150812a8SEvalZero * @brief Force the bus state to active 571*150812a8SEvalZero */ 572*150812a8SEvalZero void nrfx_usbd_force_bus_wakeup(void); 573*150812a8SEvalZero 574*150812a8SEvalZero /** 575*150812a8SEvalZero * @brief Configure packet size that should be supported by the endpoint. 576*150812a8SEvalZero * 577*150812a8SEvalZero * The real endpoint buffer size is always the same. 578*150812a8SEvalZero * This value sets max packet size that would be transmitted over the endpoint. 579*150812a8SEvalZero * This is required by the driver. 580*150812a8SEvalZero * 581*150812a8SEvalZero * @param[in] ep Endpoint number. 582*150812a8SEvalZero * @param[in] size Required maximum packet size. 583*150812a8SEvalZero * 584*150812a8SEvalZero * @note Endpoint size is always set to @ref NRFX_USBD_EPSIZE or @ref NRFX_USBD_ISOSIZE / 2 585*150812a8SEvalZero * when @ref nrfx_usbd_ep_enable function is called. 586*150812a8SEvalZero */ 587*150812a8SEvalZero void nrfx_usbd_ep_max_packet_size_set(nrfx_usbd_ep_t ep, uint16_t size); 588*150812a8SEvalZero 589*150812a8SEvalZero /** 590*150812a8SEvalZero * @brief Get configured endpoint packet size. 591*150812a8SEvalZero * 592*150812a8SEvalZero * Function to get configured endpoint size on the buffer. 593*150812a8SEvalZero * 594*150812a8SEvalZero * @param[in] ep Endpoint number. 595*150812a8SEvalZero * 596*150812a8SEvalZero * @return Maximum pocket size configured on selected endpoint. 597*150812a8SEvalZero */ 598*150812a8SEvalZero uint16_t nrfx_usbd_ep_max_packet_size_get(nrfx_usbd_ep_t ep); 599*150812a8SEvalZero 600*150812a8SEvalZero /** 601*150812a8SEvalZero * @brief Check if the selected endpoint is enabled. 602*150812a8SEvalZero * 603*150812a8SEvalZero * @param[in] ep Endpoint number to check. 604*150812a8SEvalZero * 605*150812a8SEvalZero * @retval true Endpoint is enabled. 606*150812a8SEvalZero * @retval false Endpoint is disabled. 607*150812a8SEvalZero */ 608*150812a8SEvalZero bool nrfx_usbd_ep_enable_check(nrfx_usbd_ep_t ep); 609*150812a8SEvalZero 610*150812a8SEvalZero /** 611*150812a8SEvalZero * @brief Enable selected endpoint. 612*150812a8SEvalZero * 613*150812a8SEvalZero * This function enables endpoint itself and its interrupts. 614*150812a8SEvalZero * 615*150812a8SEvalZero * @param[in] ep Endpoint number to enable. 616*150812a8SEvalZero * 617*150812a8SEvalZero * @note 618*150812a8SEvalZero * Max packet size is set to endpoint default maximum value. 619*150812a8SEvalZero * 620*150812a8SEvalZero * @sa nrfx_usbd_ep_max_packet_size_set 621*150812a8SEvalZero */ 622*150812a8SEvalZero void nrfx_usbd_ep_enable(nrfx_usbd_ep_t ep); 623*150812a8SEvalZero 624*150812a8SEvalZero /** 625*150812a8SEvalZero * @brief Disable selected endpoint. 626*150812a8SEvalZero * 627*150812a8SEvalZero * This function disables endpoint itself and its interrupts. 628*150812a8SEvalZero * 629*150812a8SEvalZero * @param[in] ep Endpoint number to disable. 630*150812a8SEvalZero */ 631*150812a8SEvalZero void nrfx_usbd_ep_disable(nrfx_usbd_ep_t ep); 632*150812a8SEvalZero 633*150812a8SEvalZero /** 634*150812a8SEvalZero * @brief Disable all endpoints except for EP0. 635*150812a8SEvalZero * 636*150812a8SEvalZero * Disable all endpoints that can be disabled in USB device while it is still active. 637*150812a8SEvalZero */ 638*150812a8SEvalZero void nrfx_usbd_ep_default_config(void); 639*150812a8SEvalZero 640*150812a8SEvalZero /** 641*150812a8SEvalZero * @brief Start sending data over endpoint. 642*150812a8SEvalZero * 643*150812a8SEvalZero * Function initializes endpoint transmission. 644*150812a8SEvalZero * This is asynchronous function - it finishes immediately after configuration 645*150812a8SEvalZero * for transmission is prepared. 646*150812a8SEvalZero * 647*150812a8SEvalZero * @note Data buffer pointed by p_data have to be kept active till 648*150812a8SEvalZero * @ref NRFX_USBD_EVT_EPTRANSFER event is generated. 649*150812a8SEvalZero * 650*150812a8SEvalZero * @param[in] ep Endpoint number. 651*150812a8SEvalZero * For IN endpoint sending would be initiated. 652*150812a8SEvalZero * For OUT endpoint receiving would be initiated. 653*150812a8SEvalZero * @param[in] p_transfer Transfer parameters. 654*150812a8SEvalZero * 655*150812a8SEvalZero * @retval NRFX_SUCCESS Transfer queued or started. 656*150812a8SEvalZero * @retval NRFX_ERROR_BUSY Selected endpoint is pending. 657*150812a8SEvalZero * @retval NRFX_ERROR_INVALID_ADDR Unexpected transfer on EPIN0 or EPOUT0. 658*150812a8SEvalZero */ 659*150812a8SEvalZero nrfx_err_t nrfx_usbd_ep_transfer(nrfx_usbd_ep_t ep, 660*150812a8SEvalZero nrfx_usbd_transfer_t const * p_transfer); 661*150812a8SEvalZero 662*150812a8SEvalZero /** 663*150812a8SEvalZero * @brief Start sending data over the endpoint using the transfer handler function. 664*150812a8SEvalZero * 665*150812a8SEvalZero * This function initializes an endpoint transmission. 666*150812a8SEvalZero * Just before data is transmitted, the transfer handler 667*150812a8SEvalZero * is called and it prepares a data chunk. 668*150812a8SEvalZero * 669*150812a8SEvalZero * @param[in] ep Endpoint number. 670*150812a8SEvalZero * For an IN endpoint, sending is initiated. 671*150812a8SEvalZero * For an OUT endpoint, receiving is initiated. 672*150812a8SEvalZero * @param[in] p_handler Transfer handler - feeder for IN direction and consumer for 673*150812a8SEvalZero * OUT direction. 674*150812a8SEvalZero * 675*150812a8SEvalZero * @retval NRFX_SUCCESS Transfer queued or started. 676*150812a8SEvalZero * @retval NRFX_ERROR_BUSY Selected endpoint is pending. 677*150812a8SEvalZero * @retval NRFX_ERROR_INVALID_ADDR Unexpected transfer on EPIN0 or EPOUT0. 678*150812a8SEvalZero */ 679*150812a8SEvalZero nrfx_err_t nrfx_usbd_ep_handled_transfer(nrfx_usbd_ep_t ep, 680*150812a8SEvalZero nrfx_usbd_handler_desc_t const * p_handler); 681*150812a8SEvalZero 682*150812a8SEvalZero /** 683*150812a8SEvalZero * @brief Get the temporary buffer to be used by the feeder. 684*150812a8SEvalZero * 685*150812a8SEvalZero * This buffer is used for TX transfers and it can be reused automatically 686*150812a8SEvalZero * when the transfer is finished. 687*150812a8SEvalZero * Use it for transfer preparation. 688*150812a8SEvalZero * 689*150812a8SEvalZero * May be used inside the feeder configured in @ref nrfx_usbd_ep_handled_transfer. 690*150812a8SEvalZero * 691*150812a8SEvalZero * @return Pointer to the buffer that can be used temporarily. 692*150812a8SEvalZero * 693*150812a8SEvalZero * @sa NRFX_USBD_FEEDER_BUFFER_SIZE 694*150812a8SEvalZero */ 695*150812a8SEvalZero void * nrfx_usbd_feeder_buffer_get(void); 696*150812a8SEvalZero 697*150812a8SEvalZero /** 698*150812a8SEvalZero * @brief Get the information about last finished or current transfer. 699*150812a8SEvalZero * 700*150812a8SEvalZero * Function returns the status of the last buffer set for transfer on selected endpoint. 701*150812a8SEvalZero * The status considers last buffer set by @ref nrfx_usbd_ep_transfer function or 702*150812a8SEvalZero * by transfer callback function. 703*150812a8SEvalZero * 704*150812a8SEvalZero * @param[in] ep Endpoint number. 705*150812a8SEvalZero * @param[out] p_size Information about the current/last transfer size. 706*150812a8SEvalZero * 707*150812a8SEvalZero * @return Endpoint status. 708*150812a8SEvalZero * 709*150812a8SEvalZero * @sa nrfx_usbd_ep_status_t 710*150812a8SEvalZero */ 711*150812a8SEvalZero nrfx_usbd_ep_status_t nrfx_usbd_ep_status_get(nrfx_usbd_ep_t ep, size_t * p_size); 712*150812a8SEvalZero 713*150812a8SEvalZero /** 714*150812a8SEvalZero * @brief Get number of received bytes. 715*150812a8SEvalZero * 716*150812a8SEvalZero * Get the number of received bytes. 717*150812a8SEvalZero * The function behavior is undefined when called on IN endpoint. 718*150812a8SEvalZero * 719*150812a8SEvalZero * @param[in] ep Endpoint number. 720*150812a8SEvalZero * 721*150812a8SEvalZero * @return Number of received bytes. 722*150812a8SEvalZero */ 723*150812a8SEvalZero size_t nrfx_usbd_epout_size_get(nrfx_usbd_ep_t ep); 724*150812a8SEvalZero 725*150812a8SEvalZero /** 726*150812a8SEvalZero * @brief Check if endpoint buffer is ready or is under USB IP control. 727*150812a8SEvalZero * 728*150812a8SEvalZero * Function to test if endpoint is busy. 729*150812a8SEvalZero * Endpoint that is busy cannot be accessed by MCU. 730*150812a8SEvalZero * It means that: 731*150812a8SEvalZero * - OUT (TX) endpoint: Last uploaded data is still in endpoint and is waiting 732*150812a8SEvalZero * to be received by the host. 733*150812a8SEvalZero * - IN (RX) endpoint: Endpoint is ready to receive data from the host 734*150812a8SEvalZero * and the endpoint does not have any data. 735*150812a8SEvalZero * When endpoint is not busy: 736*150812a8SEvalZero * - OUT (TX) endpoint: New data can be uploaded. 737*150812a8SEvalZero * - IN (RX) endpoint: New data can be downloaded using @ref nrfx_usbd_ep_transfer 738*150812a8SEvalZero * function. 739*150812a8SEvalZero * 740*150812a8SEvalZero * @param[in] ep Endpoint number. 741*150812a8SEvalZero * 742*150812a8SEvalZero * @retval false Endpoint is not busy. 743*150812a8SEvalZero * @retval true Endpoint is busy. 744*150812a8SEvalZero */ 745*150812a8SEvalZero bool nrfx_usbd_ep_is_busy(nrfx_usbd_ep_t ep); 746*150812a8SEvalZero 747*150812a8SEvalZero /** 748*150812a8SEvalZero * @brief Stall endpoint 749*150812a8SEvalZero * 750*150812a8SEvalZero * Stall endpoit to send error information during next transfer request from 751*150812a8SEvalZero * the host. 752*150812a8SEvalZero * 753*150812a8SEvalZero * @note To stall endpoint it is safer to use @ref nrfx_usbd_setup_stall 754*150812a8SEvalZero * @note Stalled endpoint would not be cleared when DMA transfer finishes. 755*150812a8SEvalZero * 756*150812a8SEvalZero * @param[in] ep Endpoint number to stall. 757*150812a8SEvalZero */ 758*150812a8SEvalZero void nrfx_usbd_ep_stall(nrfx_usbd_ep_t ep); 759*150812a8SEvalZero 760*150812a8SEvalZero /** 761*150812a8SEvalZero * @brief Clear stall flag on endpoint. 762*150812a8SEvalZero * 763*150812a8SEvalZero * This function clears endpoint that is stalled. 764*150812a8SEvalZero * @note 765*150812a8SEvalZero * If it is OUT endpoint (receiving) it would be also prepared for reception. 766*150812a8SEvalZero * It means that busy flag would be set. 767*150812a8SEvalZero * @note 768*150812a8SEvalZero * In endpoint (transmitting) would not be cleared - it gives possibility to 769*150812a8SEvalZero * write new data before transmitting. 770*150812a8SEvalZero * 771*150812a8SEvalZero * @param[in] ep Endpoint number. 772*150812a8SEvalZero */ 773*150812a8SEvalZero void nrfx_usbd_ep_stall_clear(nrfx_usbd_ep_t ep); 774*150812a8SEvalZero 775*150812a8SEvalZero /** 776*150812a8SEvalZero * @brief Check if endpoint is stalled. 777*150812a8SEvalZero * 778*150812a8SEvalZero * This function gets stall state of selected endpoint. 779*150812a8SEvalZero * 780*150812a8SEvalZero * @param[in] ep Endpoint number to check. 781*150812a8SEvalZero * 782*150812a8SEvalZero * @retval false Endpoint is not stalled. 783*150812a8SEvalZero * @retval true Endpoint is stalled. 784*150812a8SEvalZero */ 785*150812a8SEvalZero bool nrfx_usbd_ep_stall_check(nrfx_usbd_ep_t ep); 786*150812a8SEvalZero 787*150812a8SEvalZero /** 788*150812a8SEvalZero * @brief Clear current endpoint data toggle. 789*150812a8SEvalZero * 790*150812a8SEvalZero * @param[in] ep Endpoint number to clear. 791*150812a8SEvalZero */ 792*150812a8SEvalZero void nrfx_usbd_ep_dtoggle_clear(nrfx_usbd_ep_t ep); 793*150812a8SEvalZero 794*150812a8SEvalZero /** 795*150812a8SEvalZero * @brief Get parsed setup data. 796*150812a8SEvalZero * 797*150812a8SEvalZero * Function fills the parsed setup data structure. 798*150812a8SEvalZero * 799*150812a8SEvalZero * @param[out] p_setup Pointer to data structure that would be filled by 800*150812a8SEvalZero * parsed data. 801*150812a8SEvalZero */ 802*150812a8SEvalZero void nrfx_usbd_setup_get(nrfx_usbd_setup_t * p_setup); 803*150812a8SEvalZero 804*150812a8SEvalZero /** 805*150812a8SEvalZero * @brief Clear the control endpoint for packet reception during DATA stage. 806*150812a8SEvalZero * 807*150812a8SEvalZero * This function may be called if any more data in control write transfer is expected. 808*150812a8SEvalZero * Clears only OUT endpoint to be able to take another OUT data token. 809*150812a8SEvalZero * It does not allow STATUS stage. 810*150812a8SEvalZero * @sa nrfx_usbd_setup_clear 811*150812a8SEvalZero */ 812*150812a8SEvalZero void nrfx_usbd_setup_data_clear(void); 813*150812a8SEvalZero 814*150812a8SEvalZero /** 815*150812a8SEvalZero * @brief Clear setup endpoint. 816*150812a8SEvalZero * 817*150812a8SEvalZero * This function acknowledges setup when SETUP command was received and processed. 818*150812a8SEvalZero * It has to be called if no data respond for the SETUP command is sent. 819*150812a8SEvalZero */ 820*150812a8SEvalZero void nrfx_usbd_setup_clear(void); 821*150812a8SEvalZero 822*150812a8SEvalZero /** 823*150812a8SEvalZero * @brief Stall setup endpoint. 824*150812a8SEvalZero * 825*150812a8SEvalZero * Mark an error on setup endpoint. 826*150812a8SEvalZero */ 827*150812a8SEvalZero void nrfx_usbd_setup_stall(void); 828*150812a8SEvalZero 829*150812a8SEvalZero /** 830*150812a8SEvalZero * @brief Abort pending transfer on selected endpoint. 831*150812a8SEvalZero * 832*150812a8SEvalZero * @param[in] ep Endpoint number. 833*150812a8SEvalZero */ 834*150812a8SEvalZero void nrfx_usbd_ep_abort(nrfx_usbd_ep_t ep); 835*150812a8SEvalZero 836*150812a8SEvalZero /** 837*150812a8SEvalZero * @brief Get the information about expected transfer SETUP data direction. 838*150812a8SEvalZero * 839*150812a8SEvalZero * Function returns the information about last expected transfer direction. 840*150812a8SEvalZero * 841*150812a8SEvalZero * @retval NRFX_USBD_EPOUT0 Expecting OUT (Host->Device) direction or no data. 842*150812a8SEvalZero * @retval NRFX_USBD_EPIN0 Expecting IN (Device->Host) direction. 843*150812a8SEvalZero */ 844*150812a8SEvalZero nrfx_usbd_ep_t nrfx_usbd_last_setup_dir_get(void); 845*150812a8SEvalZero 846*150812a8SEvalZero /** 847*150812a8SEvalZero * @brief Drop transfer on OUT endpoint. 848*150812a8SEvalZero * 849*150812a8SEvalZero * @param[in] ep OUT endpoint ID. 850*150812a8SEvalZero */ 851*150812a8SEvalZero void nrfx_usbd_transfer_out_drop(nrfx_usbd_ep_t ep); 852*150812a8SEvalZero 853*150812a8SEvalZero 854*150812a8SEvalZero void nrfx_usbd_irq_handler(void); 855*150812a8SEvalZero 856*150812a8SEvalZero 857*150812a8SEvalZero /** @} */ 858*150812a8SEvalZero 859*150812a8SEvalZero #ifdef __cplusplus 860*150812a8SEvalZero } 861*150812a8SEvalZero #endif 862*150812a8SEvalZero 863*150812a8SEvalZero #endif // NRFX_USBD_H__ 864