Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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
18#ifndef ZEPHYR_INCLUDE_AUDIO_DMIC_H_
19#define ZEPHYR_INCLUDE_AUDIO_DMIC_H_
20
21
29
39
40#include <zephyr/kernel.h>
41#include <zephyr/device.h>
42#include <zephyr/devicetree.h>
43
44#ifdef __cplusplus
45extern "C" {
46#endif
47
59
70
78
113
119#define PDM_DT_IO_CFG_GET(node_id) \
120 { \
121 .min_pdm_clk_freq = DT_PROP(node_id, clk_frequency_min), \
122 .max_pdm_clk_freq = DT_PROP(node_id, clk_frequency_max), \
123 .min_pdm_clk_dc = DT_PROP(node_id, clk_duty_cycle_min), \
124 .max_pdm_clk_dc = DT_PROP(node_id, clk_duty_cycle_max), \
125 }
126
132#define PDM_DT_HAS_LEFT_CHANNEL(node_id) DT_PROP(node_id, channel_left)
133
139#define PDM_DT_HAS_RIGHT_CHANNEL(node_id) DT_PROP(node_id, channel_right)
140
159
207
222
227
232typedef int (*dmic_configure_t)(const struct device *dev, struct dmic_cfg *config);
233
238typedef int (*dmic_trigger_t)(const struct device *dev, enum dmic_trigger cmd);
239
244typedef int (*dmic_read_t)(const struct device *dev, uint8_t stream, void **buffer,
245 size_t *size, int32_t timeout);
246
253#define _dmic_ops dmic_driver_api __DEPRECATED_MACRO
254
272
276
290 enum pdm_lr lr)
291{
292 return ((((pdm & BIT_MASK(3)) << 1) | lr) <<
293 ((channel & BIT_MASK(3)) * 4U));
294}
295
308static inline void dmic_parse_channel_map(uint32_t channel_map_lo,
309 uint32_t channel_map_hi, uint8_t channel, uint8_t *pdm, enum pdm_lr *lr)
310{
311 uint32_t channel_map;
312
313 channel_map = (channel < 8) ? channel_map_lo : channel_map_hi;
314 channel_map >>= ((channel & BIT_MASK(3)) * 4U);
315
316 *pdm = (channel_map >> 1) & BIT_MASK(3);
317 *lr = (enum pdm_lr) (channel_map & BIT(0));
318}
319
332{
333 return ((skew & BIT_MASK(4)) << ((pdm & BIT_MASK(3)) * 4U));
334}
335
347static inline int dmic_configure(const struct device *dev,
348 struct dmic_cfg *cfg)
349{
350 return DEVICE_API_GET(dmic, dev)->configure(dev, cfg);
351}
352
363static inline int dmic_trigger(const struct device *dev,
364 enum dmic_trigger cmd)
365{
366 return DEVICE_API_GET(dmic, dev)->trigger(dev, cmd);
367}
368
384static inline int dmic_read(const struct device *dev, uint8_t stream,
385 void **buffer,
386 size_t *size, int32_t timeout)
387{
388 return DEVICE_API_GET(dmic, dev)->read(dev, stream, buffer, size, timeout);
389}
390
391#ifdef __cplusplus
392}
393#endif
394
398
399#endif /* ZEPHYR_INCLUDE_AUDIO_DMIC_H_ */
#define DEVICE_API_GET(_class, _dev)
Expands to the pointer of a device's API for a given class.
Definition device.h:1449
Devicetree main header.
static int dmic_configure(const struct device *dev, struct dmic_cfg *cfg)
Configure the DMIC driver and controller(s).
Definition dmic.h:347
dmic_trigger
DMIC driver trigger commands.
Definition dmic.h:63
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:289
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:384
int(* dmic_trigger_t)(const struct device *dev, enum dmic_trigger cmd)
Callback API to send a command to a DMIC device.
Definition dmic.h:238
pdm_lr
PDM Channels LEFT / RIGHT.
Definition dmic.h:74
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:308
int(* dmic_read_t)(const struct device *dev, uint8_t stream, void **buffer, size_t *size, int32_t timeout)
Callback API to read PCM data from a DMIC device.
Definition dmic.h:244
dmic_state
DMIC driver states.
Definition dmic.h:51
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:331
int(* dmic_configure_t)(const struct device *dev, struct dmic_cfg *config)
@def_driverbackendgroup{Digital Microphone,audio_dmic_interface}
Definition dmic.h:232
@ DMIC_TRIGGER_START
Start stream.
Definition dmic.h:65
@ DMIC_TRIGGER_PAUSE
Pause stream.
Definition dmic.h:66
@ DMIC_TRIGGER_RELEASE
Release paused stream.
Definition dmic.h:67
@ DMIC_TRIGGER_RESET
Reset stream.
Definition dmic.h:68
@ DMIC_TRIGGER_STOP
Stop stream.
Definition dmic.h:64
@ PDM_CHAN_RIGHT
Right channel.
Definition dmic.h:76
@ PDM_CHAN_LEFT
Left channel.
Definition dmic.h:75
@ DMIC_STATE_PAUSED
Paused.
Definition dmic.h:56
@ DMIC_STATE_UNINIT
Uninitialized.
Definition dmic.h:52
@ DMIC_STATE_CONFIGURED
Configured.
Definition dmic.h:54
@ DMIC_STATE_INITIALIZED
Initialized.
Definition dmic.h:53
@ DMIC_STATE_ERROR
Error.
Definition dmic.h:57
@ DMIC_STATE_ACTIVE
Active.
Definition dmic.h:55
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
#define BIT_MASK(n)
Bit mask with bits 0 through n-1 (inclusive) set, or 0 if n is 0.
Definition util_macro.h:74
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
__INT8_TYPE__ int8_t
Definition stdint.h:72
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
Input configuration structure for the DMIC configuration API.
Definition dmic.h:211
struct pcm_stream_cfg * streams
Array of pcm_stream_cfg for application to provide configuration for each stream.
Definition dmic.h:218
struct pdm_chan_cfg channel
PDM channel configuration.
Definition dmic.h:220
struct pdm_io_cfg io
PDM interface configuration.
Definition dmic.h:213
@driver_ops{Digital Microphone}
Definition dmic.h:258
dmic_configure_t configure
@driver_ops_mandatory Configure the DMIC driver and controller(s).
Definition dmic.h:262
dmic_read_t read
@driver_ops_mandatory Read received decimated PCM data stream.
Definition dmic.h:270
dmic_trigger_t trigger
@driver_ops_mandatory DMIC driver trigger commands.
Definition dmic.h:266
Configuration of the PCM streams to be output by the PDM hardware.
Definition dmic.h:147
uint16_t block_size
PCM sample block size per transfer.
Definition dmic.h:153
int8_t gain_db
Gain to apply to the channel (dB).
Definition dmic.h:155
uint8_t pcm_width
PCM sample width of stream.
Definition dmic.h:151
struct k_mem_slab * mem_slab
SLAB for DMIC driver to allocate buffers for stream.
Definition dmic.h:157
uint32_t pcm_rate
PCM sample rate of stream.
Definition dmic.h:149
Mapping/ordering of the PDM channels to logical PCM output channel.
Definition dmic.h:181
uint32_t req_chan_map_lo
Channels 0 to 7.
Definition dmic.h:186
uint32_t req_chan_map_hi
Channels 8 to 15.
Definition dmic.h:187
uint8_t act_num_chan
Actual number of channels that the driver could configure.
Definition dmic.h:201
uint32_t act_chan_map_lo
Channels 0 to 7.
Definition dmic.h:194
uint8_t act_num_streams
Actual number of streams that the driver could configure.
Definition dmic.h:205
uint32_t act_chan_map_hi
Channels 8 to 15.
Definition dmic.h:195
uint8_t req_num_chan
Requested number of channels.
Definition dmic.h:199
uint8_t req_num_streams
Requested number of streams for each channel.
Definition dmic.h:203
PDM Input/Output signal configuration.
Definition dmic.h:82
uint8_t min_pdm_clk_dc
Minimum duty cycle in % supported by the mic.
Definition dmic.h:92
uint8_t pdm_clk_pol
Bit mask to optionally invert PDM clock.
Definition dmic.h:104
uint32_t max_pdm_clk_freq
Maximum clock frequency supported by the mic.
Definition dmic.h:90
uint32_t pdm_clk_skew
Collection of clock skew values for each PDM port.
Definition dmic.h:108
uint8_t max_pdm_clk_dc
Maximum duty cycle in % supported by the mic.
Definition dmic.h:94
uint8_t pdm_data_pol
Bit mask to optionally invert mic data.
Definition dmic.h:106
uint32_t min_pdm_clk_freq
Minimum clock frequency supported by the mic.
Definition dmic.h:88