xref: /nrf52832-nimble/nordic/nrfx/drivers/include/nrfx_usbd.h (revision 150812a83cab50279bd772ef6db1bfaf255f2c5b)
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&nbsp;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&nbsp;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