xref: /nrf52832-nimble/nordic/nrfx/hal/nrf_pdm.h (revision 150812a83cab50279bd772ef6db1bfaf255f2c5b)
1*150812a8SEvalZero /*
2*150812a8SEvalZero  * Copyright (c) 2015 - 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 #ifndef NRF_PDM_H_
32*150812a8SEvalZero #define NRF_PDM_H_
33*150812a8SEvalZero 
34*150812a8SEvalZero #include <nrfx.h>
35*150812a8SEvalZero 
36*150812a8SEvalZero #ifdef __cplusplus
37*150812a8SEvalZero extern "C" {
38*150812a8SEvalZero #endif
39*150812a8SEvalZero 
40*150812a8SEvalZero /**
41*150812a8SEvalZero  * @defgroup nrf_pdm_hal PDM HAL
42*150812a8SEvalZero  * @{
43*150812a8SEvalZero  * @ingroup nrf_pdm
44*150812a8SEvalZero  * @brief   Hardware access layer for managing the Pulse Density Modulation (PDM) peripheral.
45*150812a8SEvalZero  */
46*150812a8SEvalZero 
47*150812a8SEvalZero #define NRF_PDM_GAIN_MINIMUM  0x00
48*150812a8SEvalZero #define NRF_PDM_GAIN_DEFAULT  0x28
49*150812a8SEvalZero #define NRF_PDM_GAIN_MAXIMUM  0x50
50*150812a8SEvalZero 
51*150812a8SEvalZero typedef uint8_t nrf_pdm_gain_t;
52*150812a8SEvalZero 
53*150812a8SEvalZero 
54*150812a8SEvalZero /**
55*150812a8SEvalZero  * @brief PDM tasks.
56*150812a8SEvalZero  */
57*150812a8SEvalZero typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */
58*150812a8SEvalZero {
59*150812a8SEvalZero     NRF_PDM_TASK_START           = offsetof(NRF_PDM_Type, TASKS_START),           ///< Starts continuous PDM transfer.
60*150812a8SEvalZero     NRF_PDM_TASK_STOP            = offsetof(NRF_PDM_Type, TASKS_STOP)             ///< Stops PDM transfer.
61*150812a8SEvalZero } nrf_pdm_task_t;
62*150812a8SEvalZero 
63*150812a8SEvalZero 
64*150812a8SEvalZero /**
65*150812a8SEvalZero  * @brief PDM events.
66*150812a8SEvalZero  */
67*150812a8SEvalZero typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */
68*150812a8SEvalZero {
69*150812a8SEvalZero     NRF_PDM_EVENT_STARTED       = offsetof(NRF_PDM_Type, EVENTS_STARTED),       ///< PDM transfer has started.
70*150812a8SEvalZero     NRF_PDM_EVENT_STOPPED       = offsetof(NRF_PDM_Type, EVENTS_STOPPED),       ///< PDM transfer has finished.
71*150812a8SEvalZero     NRF_PDM_EVENT_END           = offsetof(NRF_PDM_Type, EVENTS_END)            ///< The PDM has written the last sample specified by SAMPLE.MAXCNT (or the last sample after a STOP task has been received) to Data RAM.
72*150812a8SEvalZero } nrf_pdm_event_t;
73*150812a8SEvalZero 
74*150812a8SEvalZero 
75*150812a8SEvalZero /**
76*150812a8SEvalZero  * @brief PDM interrupt masks.
77*150812a8SEvalZero  */
78*150812a8SEvalZero typedef enum
79*150812a8SEvalZero {
80*150812a8SEvalZero     NRF_PDM_INT_STARTED = PDM_INTENSET_STARTED_Msk,   ///< Interrupt on EVENTS_STARTED event.
81*150812a8SEvalZero     NRF_PDM_INT_STOPPED = PDM_INTENSET_STOPPED_Msk,   ///< Interrupt on EVENTS_STOPPED event.
82*150812a8SEvalZero     NRF_PDM_INT_END     = PDM_INTENSET_END_Msk        ///< Interrupt on EVENTS_END event.
83*150812a8SEvalZero } nrf_pdm_int_mask_t;
84*150812a8SEvalZero 
85*150812a8SEvalZero /**
86*150812a8SEvalZero  * @brief PDM clock frequency.
87*150812a8SEvalZero  */
88*150812a8SEvalZero typedef enum
89*150812a8SEvalZero {
90*150812a8SEvalZero     NRF_PDM_FREQ_1000K = PDM_PDMCLKCTRL_FREQ_1000K,  ///< PDM_CLK = 1.000 MHz.
91*150812a8SEvalZero     NRF_PDM_FREQ_1032K = PDM_PDMCLKCTRL_FREQ_Default,  ///< PDM_CLK = 1.032 MHz.
92*150812a8SEvalZero     NRF_PDM_FREQ_1067K = PDM_PDMCLKCTRL_FREQ_1067K   ///< PDM_CLK = 1.067 MHz.
93*150812a8SEvalZero } nrf_pdm_freq_t;
94*150812a8SEvalZero 
95*150812a8SEvalZero 
96*150812a8SEvalZero /**
97*150812a8SEvalZero  * @brief PDM operation mode.
98*150812a8SEvalZero  */
99*150812a8SEvalZero typedef enum
100*150812a8SEvalZero {
101*150812a8SEvalZero     NRF_PDM_MODE_STEREO = PDM_MODE_OPERATION_Stereo,  ///< Sample and store one pair (Left + Right) of 16-bit samples per RAM word.
102*150812a8SEvalZero     NRF_PDM_MODE_MONO   = PDM_MODE_OPERATION_Mono     ///< Sample and store two successive Left samples (16 bit each) per RAM word.
103*150812a8SEvalZero } nrf_pdm_mode_t;
104*150812a8SEvalZero 
105*150812a8SEvalZero 
106*150812a8SEvalZero /**
107*150812a8SEvalZero  * @brief PDM sampling mode.
108*150812a8SEvalZero  */
109*150812a8SEvalZero typedef enum
110*150812a8SEvalZero {
111*150812a8SEvalZero     NRF_PDM_EDGE_LEFTFALLING = PDM_MODE_EDGE_LeftFalling,  ///< Left (or mono) is sampled on falling edge of PDM_CLK.
112*150812a8SEvalZero     NRF_PDM_EDGE_LEFTRISING  = PDM_MODE_EDGE_LeftRising    ///< Left (or mono) is sampled on rising edge of PDM_CLK.
113*150812a8SEvalZero } nrf_pdm_edge_t;
114*150812a8SEvalZero 
115*150812a8SEvalZero 
116*150812a8SEvalZero /**
117*150812a8SEvalZero  * @brief Function for triggering a PDM task.
118*150812a8SEvalZero  *
119*150812a8SEvalZero  * @param[in] pdm_task PDM task.
120*150812a8SEvalZero  */
121*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_task_trigger(nrf_pdm_task_t pdm_task);
122*150812a8SEvalZero 
123*150812a8SEvalZero /**
124*150812a8SEvalZero  * @brief Function for getting the address of a PDM task register.
125*150812a8SEvalZero  *
126*150812a8SEvalZero  * @param[in] pdm_task PDM task.
127*150812a8SEvalZero  *
128*150812a8SEvalZero  * @return Address of the specified PDM task.
129*150812a8SEvalZero  */
130*150812a8SEvalZero __STATIC_INLINE uint32_t nrf_pdm_task_address_get(nrf_pdm_task_t pdm_task);
131*150812a8SEvalZero 
132*150812a8SEvalZero /**
133*150812a8SEvalZero  * @brief Function for getting the state of a PDM event.
134*150812a8SEvalZero  *
135*150812a8SEvalZero  * @param[in] pdm_event PDM event.
136*150812a8SEvalZero  *
137*150812a8SEvalZero  * @return State of the specified PDM event.
138*150812a8SEvalZero  */
139*150812a8SEvalZero __STATIC_INLINE bool nrf_pdm_event_check(nrf_pdm_event_t pdm_event);
140*150812a8SEvalZero 
141*150812a8SEvalZero /**
142*150812a8SEvalZero  * @brief Function for clearing a PDM event.
143*150812a8SEvalZero  *
144*150812a8SEvalZero  * @param[in] pdm_event PDM event.
145*150812a8SEvalZero  */
146*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_event_clear(nrf_pdm_event_t pdm_event);
147*150812a8SEvalZero 
148*150812a8SEvalZero /**
149*150812a8SEvalZero  * @brief Function for getting the address of a PDM event register.
150*150812a8SEvalZero  *
151*150812a8SEvalZero  * @param[in] pdm_event PDM event.
152*150812a8SEvalZero  *
153*150812a8SEvalZero  * @return Address of the specified PDM event.
154*150812a8SEvalZero  */
155*150812a8SEvalZero __STATIC_INLINE volatile uint32_t * nrf_pdm_event_address_get(nrf_pdm_event_t pdm_event);
156*150812a8SEvalZero 
157*150812a8SEvalZero /**
158*150812a8SEvalZero  * @brief Function for enabling PDM interrupts.
159*150812a8SEvalZero  *
160*150812a8SEvalZero  * @param[in] pdm_int_mask Interrupts to enable.
161*150812a8SEvalZero  */
162*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_int_enable(uint32_t pdm_int_mask);
163*150812a8SEvalZero 
164*150812a8SEvalZero /**
165*150812a8SEvalZero  * @brief Function for retrieving the state of PDM interrupts.
166*150812a8SEvalZero  *
167*150812a8SEvalZero  * @param[in] pdm_int_mask Interrupts to check.
168*150812a8SEvalZero  *
169*150812a8SEvalZero  * @retval true  If all specified interrupts are enabled.
170*150812a8SEvalZero  * @retval false If at least one of the given interrupts is not enabled.
171*150812a8SEvalZero  */
172*150812a8SEvalZero __STATIC_INLINE bool nrf_pdm_int_enable_check(uint32_t pdm_int_mask);
173*150812a8SEvalZero 
174*150812a8SEvalZero /**
175*150812a8SEvalZero  * @brief Function for disabling interrupts.
176*150812a8SEvalZero  *
177*150812a8SEvalZero  * @param pdm_int_mask Interrupts to disable.
178*150812a8SEvalZero  */
179*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_int_disable(uint32_t pdm_int_mask);
180*150812a8SEvalZero 
181*150812a8SEvalZero #if defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
182*150812a8SEvalZero /**
183*150812a8SEvalZero  * @brief Function for setting the subscribe configuration for a given
184*150812a8SEvalZero  *        PDM task.
185*150812a8SEvalZero  *
186*150812a8SEvalZero  * @param[in] task    Task for which to set the configuration.
187*150812a8SEvalZero  * @param[in] channel Channel through which to subscribe events.
188*150812a8SEvalZero  */
189*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_subscribe_set(nrf_pdm_task_t task,
190*150812a8SEvalZero                                            uint8_t        channel);
191*150812a8SEvalZero 
192*150812a8SEvalZero /**
193*150812a8SEvalZero  * @brief Function for clearing the subscribe configuration for a given
194*150812a8SEvalZero  *        PDM task.
195*150812a8SEvalZero  *
196*150812a8SEvalZero  * @param[in] task  Task for which to clear the configuration.
197*150812a8SEvalZero  */
198*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_subscribe_clear(nrf_pdm_task_t task);
199*150812a8SEvalZero 
200*150812a8SEvalZero /**
201*150812a8SEvalZero  * @brief Function for setting the publish configuration for a given
202*150812a8SEvalZero  *        PDM event.
203*150812a8SEvalZero  *
204*150812a8SEvalZero  * @param[in] event   Event for which to set the configuration.
205*150812a8SEvalZero  * @param[in] channel Channel through which to publish the event.
206*150812a8SEvalZero  */
207*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_publish_set(nrf_pdm_event_t event,
208*150812a8SEvalZero                                          uint8_t         channel);
209*150812a8SEvalZero 
210*150812a8SEvalZero /**
211*150812a8SEvalZero  * @brief Function for clearing the publish configuration for a given
212*150812a8SEvalZero  *        PDM event.
213*150812a8SEvalZero  *
214*150812a8SEvalZero  * @param[in] event Event for which to clear the configuration.
215*150812a8SEvalZero  */
216*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_publish_clear(nrf_pdm_event_t event);
217*150812a8SEvalZero #endif // defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
218*150812a8SEvalZero 
219*150812a8SEvalZero /**
220*150812a8SEvalZero  * @brief Function for enabling the PDM peripheral.
221*150812a8SEvalZero  *
222*150812a8SEvalZero  * The PDM peripheral must be enabled before use.
223*150812a8SEvalZero  */
224*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_enable(void);
225*150812a8SEvalZero 
226*150812a8SEvalZero /**
227*150812a8SEvalZero  * @brief Function for disabling the PDM peripheral.
228*150812a8SEvalZero  */
229*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_disable(void);
230*150812a8SEvalZero 
231*150812a8SEvalZero /**
232*150812a8SEvalZero  * @brief Function for checking if the PDM peripheral is enabled.
233*150812a8SEvalZero  *
234*150812a8SEvalZero  * @retval true  If the PDM peripheral is enabled.
235*150812a8SEvalZero  * @retval false If the PDM peripheral is not enabled.
236*150812a8SEvalZero  */
237*150812a8SEvalZero __STATIC_INLINE bool nrf_pdm_enable_check(void);
238*150812a8SEvalZero 
239*150812a8SEvalZero /**
240*150812a8SEvalZero  * @brief Function for setting the PDM operation mode.
241*150812a8SEvalZero  *
242*150812a8SEvalZero  * @param[in] pdm_mode PDM operation mode.
243*150812a8SEvalZero  * @param[in] pdm_edge PDM sampling mode.
244*150812a8SEvalZero  */
245*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_mode_set(nrf_pdm_mode_t pdm_mode, nrf_pdm_edge_t pdm_edge);
246*150812a8SEvalZero 
247*150812a8SEvalZero /**
248*150812a8SEvalZero  * @brief Function for getting the PDM operation mode.
249*150812a8SEvalZero  *
250*150812a8SEvalZero  * @param[out] p_pdm_mode PDM operation mode.
251*150812a8SEvalZero  * @param[out] p_pdm_edge PDM sampling mode.
252*150812a8SEvalZero  */
253*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_mode_get(nrf_pdm_mode_t * p_pdm_mode, nrf_pdm_edge_t * p_pdm_edge);
254*150812a8SEvalZero 
255*150812a8SEvalZero /**
256*150812a8SEvalZero  * @brief Function for setting the PDM clock frequency.
257*150812a8SEvalZero  *
258*150812a8SEvalZero  * @param[in] pdm_freq PDM clock frequency.
259*150812a8SEvalZero  */
260*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_clock_set(nrf_pdm_freq_t pdm_freq);
261*150812a8SEvalZero 
262*150812a8SEvalZero /**
263*150812a8SEvalZero  * @brief Function for getting the PDM clock frequency.
264*150812a8SEvalZero  */
265*150812a8SEvalZero __STATIC_INLINE nrf_pdm_freq_t nrf_pdm_clock_get(void);
266*150812a8SEvalZero 
267*150812a8SEvalZero /**
268*150812a8SEvalZero  * @brief Function for setting up the PDM pins.
269*150812a8SEvalZero  *
270*150812a8SEvalZero  * @param[in] psel_clk CLK pin number.
271*150812a8SEvalZero  * @param[in] psel_din DIN pin number.
272*150812a8SEvalZero  */
273*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_psel_connect(uint32_t psel_clk, uint32_t psel_din);
274*150812a8SEvalZero 
275*150812a8SEvalZero /**
276*150812a8SEvalZero  * @brief Function for disconnecting the PDM pins.
277*150812a8SEvalZero  */
278*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_psel_disconnect(void);
279*150812a8SEvalZero 
280*150812a8SEvalZero /**
281*150812a8SEvalZero  * @brief Function for setting the PDM gain.
282*150812a8SEvalZero  *
283*150812a8SEvalZero  * @param[in] gain_l Left channel gain.
284*150812a8SEvalZero  * @param[in] gain_r Right channel gain.
285*150812a8SEvalZero  */
286*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_gain_set(nrf_pdm_gain_t gain_l, nrf_pdm_gain_t gain_r);
287*150812a8SEvalZero 
288*150812a8SEvalZero /**
289*150812a8SEvalZero  * @brief Function for getting the PDM gain.
290*150812a8SEvalZero  *
291*150812a8SEvalZero  * @param[out] p_gain_l Left channel gain.
292*150812a8SEvalZero  * @param[out] p_gain_r Right channel gain.
293*150812a8SEvalZero  */
294*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_gain_get(nrf_pdm_gain_t * p_gain_l, nrf_pdm_gain_t * p_gain_r);
295*150812a8SEvalZero 
296*150812a8SEvalZero /**
297*150812a8SEvalZero  * @brief Function for setting the PDM sample buffer.
298*150812a8SEvalZero  *
299*150812a8SEvalZero  * @param[in] p_buffer Pointer to the RAM address where samples should be written with EasyDMA.
300*150812a8SEvalZero  * @param[in] num    Number of samples to allocate memory for in EasyDMA mode.
301*150812a8SEvalZero  *
302*150812a8SEvalZero  * The amount of allocated RAM depends on the operation mode.
303*150812a8SEvalZero  * - For stereo mode: N 32-bit words.
304*150812a8SEvalZero  * - For mono mode: Ceil(N/2) 32-bit words.
305*150812a8SEvalZero  */
306*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_buffer_set(uint32_t * p_buffer, uint32_t num);
307*150812a8SEvalZero 
308*150812a8SEvalZero /**
309*150812a8SEvalZero  * @brief Function for getting the current PDM sample buffer address.
310*150812a8SEvalZero  *
311*150812a8SEvalZero  * @return Pointer to the current sample buffer.
312*150812a8SEvalZero  */
313*150812a8SEvalZero __STATIC_INLINE uint32_t * nrf_pdm_buffer_get(void);
314*150812a8SEvalZero 
315*150812a8SEvalZero #ifndef SUPPRESS_INLINE_IMPLEMENTATION
nrf_pdm_task_trigger(nrf_pdm_task_t pdm_task)316*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_task_trigger(nrf_pdm_task_t pdm_task)
317*150812a8SEvalZero {
318*150812a8SEvalZero     *((volatile uint32_t *)((uint8_t *)NRF_PDM + (uint32_t)pdm_task)) = 0x1UL;
319*150812a8SEvalZero }
320*150812a8SEvalZero 
nrf_pdm_task_address_get(nrf_pdm_task_t pdm_task)321*150812a8SEvalZero __STATIC_INLINE uint32_t nrf_pdm_task_address_get(nrf_pdm_task_t pdm_task)
322*150812a8SEvalZero {
323*150812a8SEvalZero     return (uint32_t)((uint8_t *)NRF_PDM + (uint32_t)pdm_task);
324*150812a8SEvalZero }
325*150812a8SEvalZero 
nrf_pdm_event_check(nrf_pdm_event_t pdm_event)326*150812a8SEvalZero __STATIC_INLINE bool nrf_pdm_event_check(nrf_pdm_event_t pdm_event)
327*150812a8SEvalZero {
328*150812a8SEvalZero     return (bool)*(volatile uint32_t *)((uint8_t *)NRF_PDM + (uint32_t)pdm_event);
329*150812a8SEvalZero }
330*150812a8SEvalZero 
nrf_pdm_event_clear(nrf_pdm_event_t pdm_event)331*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_event_clear(nrf_pdm_event_t pdm_event)
332*150812a8SEvalZero {
333*150812a8SEvalZero     *((volatile uint32_t *)((uint8_t *)NRF_PDM + (uint32_t)pdm_event)) = 0x0UL;
334*150812a8SEvalZero #if __CORTEX_M == 0x04
335*150812a8SEvalZero     volatile uint32_t dummy = *((volatile uint32_t *)((uint8_t *)NRF_PDM + (uint32_t)pdm_event));
336*150812a8SEvalZero     (void)dummy;
337*150812a8SEvalZero #endif
338*150812a8SEvalZero }
339*150812a8SEvalZero 
nrf_pdm_event_address_get(nrf_pdm_event_t pdm_event)340*150812a8SEvalZero __STATIC_INLINE volatile uint32_t * nrf_pdm_event_address_get(nrf_pdm_event_t pdm_event)
341*150812a8SEvalZero {
342*150812a8SEvalZero     return (volatile uint32_t *)((uint8_t *)NRF_PDM + (uint32_t)pdm_event);
343*150812a8SEvalZero }
344*150812a8SEvalZero 
nrf_pdm_int_enable(uint32_t pdm_int_mask)345*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_int_enable(uint32_t pdm_int_mask)
346*150812a8SEvalZero {
347*150812a8SEvalZero     NRF_PDM->INTENSET = pdm_int_mask;
348*150812a8SEvalZero }
349*150812a8SEvalZero 
nrf_pdm_int_enable_check(uint32_t pdm_int_mask)350*150812a8SEvalZero __STATIC_INLINE bool nrf_pdm_int_enable_check(uint32_t pdm_int_mask)
351*150812a8SEvalZero {
352*150812a8SEvalZero     return (bool)(NRF_PDM->INTENSET & pdm_int_mask);
353*150812a8SEvalZero }
354*150812a8SEvalZero 
nrf_pdm_int_disable(uint32_t pdm_int_mask)355*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_int_disable(uint32_t pdm_int_mask)
356*150812a8SEvalZero {
357*150812a8SEvalZero     NRF_PDM->INTENCLR = pdm_int_mask;
358*150812a8SEvalZero }
359*150812a8SEvalZero 
360*150812a8SEvalZero #if defined(DPPI_PRESENT)
nrf_pdm_subscribe_set(nrf_pdm_task_t task,uint8_t channel)361*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_subscribe_set(nrf_pdm_task_t task,
362*150812a8SEvalZero                                            uint8_t        channel)
363*150812a8SEvalZero {
364*150812a8SEvalZero     *((volatile uint32_t *) ((uint8_t *) NRF_PDM + (uint32_t) task + 0x80uL)) =
365*150812a8SEvalZero             ((uint32_t)channel | PDM_SUBSCRIBE_START_EN_Msk);
366*150812a8SEvalZero }
367*150812a8SEvalZero 
nrf_pdm_subscribe_clear(nrf_pdm_task_t task)368*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_subscribe_clear(nrf_pdm_task_t task)
369*150812a8SEvalZero {
370*150812a8SEvalZero     *((volatile uint32_t *) ((uint8_t *) NRF_PDM + (uint32_t) task + 0x80uL)) = 0;
371*150812a8SEvalZero }
372*150812a8SEvalZero 
nrf_pdm_publish_set(nrf_pdm_event_t event,uint8_t channel)373*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_publish_set(nrf_pdm_event_t event,
374*150812a8SEvalZero                                          uint8_t         channel)
375*150812a8SEvalZero {
376*150812a8SEvalZero     *((volatile uint32_t *) ((uint8_t *) NRF_PDM + (uint32_t) event + 0x80uL)) =
377*150812a8SEvalZero             ((uint32_t)channel | PDM_PUBLISH_STARTED_EN_Msk);
378*150812a8SEvalZero }
379*150812a8SEvalZero 
nrf_pdm_publish_clear(nrf_pdm_event_t event)380*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_publish_clear(nrf_pdm_event_t event)
381*150812a8SEvalZero {
382*150812a8SEvalZero     *((volatile uint32_t *) ((uint8_t *) NRF_PDM + (uint32_t) event + 0x80uL)) = 0;
383*150812a8SEvalZero }
384*150812a8SEvalZero #endif // defined(DPPI_PRESENT)
385*150812a8SEvalZero 
nrf_pdm_enable(void)386*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_enable(void)
387*150812a8SEvalZero {
388*150812a8SEvalZero     NRF_PDM->ENABLE = (PDM_ENABLE_ENABLE_Enabled << PDM_ENABLE_ENABLE_Pos);
389*150812a8SEvalZero }
390*150812a8SEvalZero 
nrf_pdm_disable(void)391*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_disable(void)
392*150812a8SEvalZero {
393*150812a8SEvalZero     NRF_PDM->ENABLE = (PDM_ENABLE_ENABLE_Disabled << PDM_ENABLE_ENABLE_Pos);
394*150812a8SEvalZero }
395*150812a8SEvalZero 
nrf_pdm_enable_check(void)396*150812a8SEvalZero __STATIC_INLINE bool nrf_pdm_enable_check(void)
397*150812a8SEvalZero {
398*150812a8SEvalZero     return (NRF_PDM->ENABLE == (PDM_ENABLE_ENABLE_Enabled << PDM_ENABLE_ENABLE_Pos));
399*150812a8SEvalZero }
400*150812a8SEvalZero 
nrf_pdm_mode_set(nrf_pdm_mode_t pdm_mode,nrf_pdm_edge_t pdm_edge)401*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_mode_set(nrf_pdm_mode_t pdm_mode, nrf_pdm_edge_t pdm_edge)
402*150812a8SEvalZero {
403*150812a8SEvalZero     NRF_PDM->MODE = ((pdm_mode << PDM_MODE_OPERATION_Pos) & PDM_MODE_OPERATION_Msk)
404*150812a8SEvalZero                     | ((pdm_edge << PDM_MODE_EDGE_Pos) & PDM_MODE_EDGE_Msk);
405*150812a8SEvalZero }
406*150812a8SEvalZero 
nrf_pdm_mode_get(nrf_pdm_mode_t * p_pdm_mode,nrf_pdm_edge_t * p_pdm_edge)407*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_mode_get(nrf_pdm_mode_t * p_pdm_mode, nrf_pdm_edge_t * p_pdm_edge)
408*150812a8SEvalZero {
409*150812a8SEvalZero     uint32_t mode = NRF_PDM->MODE;
410*150812a8SEvalZero     *p_pdm_mode = (nrf_pdm_mode_t)((mode & PDM_MODE_OPERATION_Msk ) >> PDM_MODE_OPERATION_Pos);
411*150812a8SEvalZero     *p_pdm_edge = (nrf_pdm_edge_t)((mode & PDM_MODE_EDGE_Msk ) >> PDM_MODE_EDGE_Pos);
412*150812a8SEvalZero }
413*150812a8SEvalZero 
nrf_pdm_clock_set(nrf_pdm_freq_t pdm_freq)414*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_clock_set(nrf_pdm_freq_t pdm_freq)
415*150812a8SEvalZero {
416*150812a8SEvalZero     NRF_PDM->PDMCLKCTRL = ((pdm_freq << PDM_PDMCLKCTRL_FREQ_Pos) & PDM_PDMCLKCTRL_FREQ_Msk);
417*150812a8SEvalZero }
418*150812a8SEvalZero 
nrf_pdm_clock_get(void)419*150812a8SEvalZero __STATIC_INLINE nrf_pdm_freq_t nrf_pdm_clock_get(void)
420*150812a8SEvalZero {
421*150812a8SEvalZero      return (nrf_pdm_freq_t) ((NRF_PDM->PDMCLKCTRL << PDM_PDMCLKCTRL_FREQ_Pos) & PDM_PDMCLKCTRL_FREQ_Msk);
422*150812a8SEvalZero }
423*150812a8SEvalZero 
nrf_pdm_psel_connect(uint32_t psel_clk,uint32_t psel_din)424*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_psel_connect(uint32_t psel_clk, uint32_t psel_din)
425*150812a8SEvalZero {
426*150812a8SEvalZero     NRF_PDM->PSEL.CLK = psel_clk;
427*150812a8SEvalZero     NRF_PDM->PSEL.DIN = psel_din;
428*150812a8SEvalZero }
429*150812a8SEvalZero 
nrf_pdm_psel_disconnect(void)430*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_psel_disconnect(void)
431*150812a8SEvalZero {
432*150812a8SEvalZero     NRF_PDM->PSEL.CLK = ((PDM_PSEL_CLK_CONNECT_Disconnected << PDM_PSEL_CLK_CONNECT_Pos)
433*150812a8SEvalZero                          & PDM_PSEL_CLK_CONNECT_Msk);
434*150812a8SEvalZero     NRF_PDM->PSEL.DIN = ((PDM_PSEL_DIN_CONNECT_Disconnected << PDM_PSEL_DIN_CONNECT_Pos)
435*150812a8SEvalZero                          & PDM_PSEL_DIN_CONNECT_Msk);
436*150812a8SEvalZero }
437*150812a8SEvalZero 
nrf_pdm_gain_set(nrf_pdm_gain_t gain_l,nrf_pdm_gain_t gain_r)438*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_gain_set(nrf_pdm_gain_t gain_l, nrf_pdm_gain_t gain_r)
439*150812a8SEvalZero {
440*150812a8SEvalZero     NRF_PDM->GAINL = gain_l;
441*150812a8SEvalZero     NRF_PDM->GAINR = gain_r;
442*150812a8SEvalZero }
443*150812a8SEvalZero 
nrf_pdm_gain_get(nrf_pdm_gain_t * p_gain_l,nrf_pdm_gain_t * p_gain_r)444*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_gain_get(nrf_pdm_gain_t * p_gain_l, nrf_pdm_gain_t * p_gain_r)
445*150812a8SEvalZero {
446*150812a8SEvalZero     *p_gain_l = NRF_PDM->GAINL;
447*150812a8SEvalZero     *p_gain_r = NRF_PDM->GAINR;
448*150812a8SEvalZero }
449*150812a8SEvalZero 
nrf_pdm_buffer_set(uint32_t * p_buffer,uint32_t num)450*150812a8SEvalZero __STATIC_INLINE void nrf_pdm_buffer_set(uint32_t * p_buffer, uint32_t num)
451*150812a8SEvalZero {
452*150812a8SEvalZero     NRF_PDM->SAMPLE.PTR = (uint32_t)p_buffer;
453*150812a8SEvalZero     NRF_PDM->SAMPLE.MAXCNT = num;
454*150812a8SEvalZero }
455*150812a8SEvalZero 
nrf_pdm_buffer_get(void)456*150812a8SEvalZero __STATIC_INLINE uint32_t * nrf_pdm_buffer_get(void)
457*150812a8SEvalZero {
458*150812a8SEvalZero     return (uint32_t *)NRF_PDM->SAMPLE.PTR;
459*150812a8SEvalZero }
460*150812a8SEvalZero 
461*150812a8SEvalZero #endif // SUPPRESS_INLINE_IMPLEMENTATION
462*150812a8SEvalZero /** @} */
463*150812a8SEvalZero 
464*150812a8SEvalZero #ifdef __cplusplus
465*150812a8SEvalZero }
466*150812a8SEvalZero #endif
467*150812a8SEvalZero 
468*150812a8SEvalZero #endif // NRF_PDM_H_
469