Zephyr API Documentation  3.6.0
A Scalable Open Source RTOS
3.6.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
dmic.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018, Intel Corporation
3 *
4 * Author: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
5 * Sathish Kuttan <sathish.k.kuttan@intel.com>
6 *
7 * SPDX-License-Identifier: Apache-2.0
8 */
9
17#ifndef ZEPHYR_INCLUDE_AUDIO_DMIC_H_
18#define ZEPHYR_INCLUDE_AUDIO_DMIC_H_
19
20
35#include <zephyr/kernel.h>
36#include <zephyr/device.h>
37
38#ifdef __cplusplus
39extern "C" {
40#endif
41
52};
53
63};
64
68enum pdm_lr {
71};
72
76struct pdm_io_cfg {
106};
107
122 struct k_mem_slab *mem_slab;
123};
124
171};
172
176struct dmic_cfg {
184};
185
189struct _dmic_ops {
190 int (*configure)(const struct device *dev, struct dmic_cfg *config);
191 int (*trigger)(const struct device *dev, enum dmic_trigger cmd);
192 int (*read)(const struct device *dev, uint8_t stream, void **buffer,
193 size_t *size, int32_t timeout);
194};
195
209 enum pdm_lr lr)
210{
211 return ((((pdm & BIT_MASK(3)) << 1) | lr) <<
212 ((channel & BIT_MASK(3)) * 4U));
213}
214
227static inline void dmic_parse_channel_map(uint32_t channel_map_lo,
228 uint32_t channel_map_hi, uint8_t channel, uint8_t *pdm, enum pdm_lr *lr)
229{
230 uint32_t channel_map;
231
232 channel_map = (channel < 8) ? channel_map_lo : channel_map_hi;
233 channel_map >>= ((channel & BIT_MASK(3)) * 4U);
234
235 *pdm = (channel_map >> 1) & BIT_MASK(3);
236 *lr = (enum pdm_lr) (channel_map & BIT(0));
237}
238
251{
252 return ((skew & BIT_MASK(4)) << ((pdm & BIT_MASK(3)) * 4U));
253}
254
266static inline int dmic_configure(const struct device *dev,
267 struct dmic_cfg *cfg)
268{
269 const struct _dmic_ops *api =
270 (const struct _dmic_ops *)dev->api;
271
272 return api->configure(dev, cfg);
273}
274
285static inline int dmic_trigger(const struct device *dev,
286 enum dmic_trigger cmd)
287{
288 const struct _dmic_ops *api =
289 (const struct _dmic_ops *)dev->api;
290
291 return api->trigger(dev, cmd);
292}
293
309static inline int dmic_read(const struct device *dev, uint8_t stream,
310 void **buffer,
311 size_t *size, int32_t timeout)
312{
313 const struct _dmic_ops *api =
314 (const struct _dmic_ops *)dev->api;
315
316 return api->read(dev, stream, buffer, size, timeout);
317}
318
319#ifdef __cplusplus
320}
321#endif
322
327#endif /* ZEPHYR_INCLUDE_AUDIO_DMIC_H_ */
#define BIT_MASK(n)
Definition: adc.h:14
static int dmic_configure(const struct device *dev, struct dmic_cfg *cfg)
Configure the DMIC driver and controller(s)
Definition: dmic.h:266
dmic_trigger
DMIC driver trigger commands.
Definition: dmic.h:57
static uint32_t dmic_build_channel_map(uint8_t channel, uint8_t pdm, enum pdm_lr lr)
Build the channel map to populate struct pdm_chan_cfg.
Definition: dmic.h:208
static int dmic_read(const struct device *dev, uint8_t stream, void **buffer, size_t *size, int32_t timeout)
Read received decimated PCM data stream.
Definition: dmic.h:309
pdm_lr
PDM Channels LEFT / RIGHT.
Definition: dmic.h:68
static void dmic_parse_channel_map(uint32_t channel_map_lo, uint32_t channel_map_hi, uint8_t channel, uint8_t *pdm, enum pdm_lr *lr)
Helper function to parse the channel map in pdm_chan_cfg.
Definition: dmic.h:227
dmic_state
DMIC driver states.
Definition: dmic.h:45
static uint32_t dmic_build_clk_skew_map(uint8_t pdm, uint8_t skew)
Build a bit map of clock skew values for each PDM channel.
Definition: dmic.h:250
@ DMIC_TRIGGER_START
Start stream.
Definition: dmic.h:59
@ DMIC_TRIGGER_PAUSE
Pause stream.
Definition: dmic.h:60
@ DMIC_TRIGGER_RELEASE
Release paused stream.
Definition: dmic.h:61
@ DMIC_TRIGGER_RESET
Reset stream.
Definition: dmic.h:62
@ DMIC_TRIGGER_STOP
Stop stream.
Definition: dmic.h:58
@ PDM_CHAN_RIGHT
Right channel.
Definition: dmic.h:70
@ PDM_CHAN_LEFT
Left channel.
Definition: dmic.h:69
@ DMIC_STATE_PAUSED
Paused.
Definition: dmic.h:50
@ DMIC_STATE_UNINIT
Uninitialized.
Definition: dmic.h:46
@ DMIC_STATE_CONFIGURED
Configured.
Definition: dmic.h:48
@ DMIC_STATE_INITIALIZED
Initialized.
Definition: dmic.h:47
@ DMIC_STATE_ERROR
Error.
Definition: dmic.h:51
@ DMIC_STATE_ACTIVE
Active.
Definition: dmic.h:49
static void cmd(uint32_t command)
Execute a display list command by co-processor engine.
Definition: ft8xx_reference_api.h:153
#define BIT(n)
Unsigned integer with bit position n set (signed in assembly language).
Definition: util_macro.h:44
Public kernel APIs.
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__INT32_TYPE__ int32_t
Definition: stdint.h:74
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition: device.h:387
const void * api
Address of the API structure exposed by the device instance.
Definition: device.h:393
Input configuration structure for the DMIC configuration API.
Definition: dmic.h:176
struct pcm_stream_cfg * streams
Array of pcm_stream_cfg for application to provide configuration for each stream.
Definition: dmic.h:182
struct pdm_chan_cfg channel
Definition: dmic.h:183
struct pdm_io_cfg io
Definition: dmic.h:177
Configuration of the PCM streams to be output by the PDM hardware.
Definition: dmic.h:114
uint16_t block_size
PCM sample block size per transfer.
Definition: dmic.h:120
uint8_t pcm_width
PCM sample width of stream.
Definition: dmic.h:118
struct k_mem_slab * mem_slab
SLAB for DMIC driver to allocate buffers for stream.
Definition: dmic.h:122
uint32_t pcm_rate
PCM sample rate of stream.
Definition: dmic.h:116
Mapping/ordering of the PDM channels to logical PCM output channel.
Definition: dmic.h:146
uint32_t req_chan_map_lo
Channels 0 to 7.
Definition: dmic.h:151
uint32_t req_chan_map_hi
Channels 8 to 15.
Definition: dmic.h:152
uint8_t act_num_chan
Actual number of channels that the driver could configure.
Definition: dmic.h:166
uint32_t act_chan_map_lo
Channels 0 to 7.
Definition: dmic.h:159
uint8_t act_num_streams
Actual number of streams that the driver could configure.
Definition: dmic.h:170
uint32_t act_chan_map_hi
Channels 8 to 15.
Definition: dmic.h:160
uint8_t req_num_chan
Requested number of channels.
Definition: dmic.h:164
uint8_t req_num_streams
Requested number of streams for each channel.
Definition: dmic.h:168
PDM Input/Output signal configuration.
Definition: dmic.h:76
uint8_t min_pdm_clk_dc
Minimum duty cycle in % supported by the mic.
Definition: dmic.h:86
uint8_t pdm_clk_pol
Bit mask to optionally invert PDM clock.
Definition: dmic.h:98
uint32_t max_pdm_clk_freq
Maximum clock frequency supported by the mic.
Definition: dmic.h:84
uint32_t pdm_clk_skew
Collection of clock skew values for each PDM port.
Definition: dmic.h:102
uint8_t max_pdm_clk_dc
Maximum duty cycle in % supported by the mic.
Definition: dmic.h:88
uint8_t pdm_data_pol
Bit mask to optionally invert mic data.
Definition: dmic.h:100
uint32_t min_pdm_clk_freq
Minimum clock frequency supported by the mic.
Definition: dmic.h:82