openmv/lib/alif/Alif_CMSIS/Include/Driver_PDM.h
iabdalkader daf2bb30da misc: Restructure repo.
Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
2025-04-13 08:28:34 +02:00

150 lines
7.8 KiB
C

/* Copyright (C) 2023 Alif Semiconductor - All Rights Reserved.
* Use, distribution and modification of this code is permitted under the
* terms stated in the Alif Semiconductor Software License Agreement
*
* You should have received a copy of the Alif Semiconductor Software
* License Agreement with this file. If not, please write to:
* contact@alifsemi.com, or visit: https://alifsemi.com/license
*
*/
/**************************************************************************//**
* @file Driver_PDM.h
* @author Nisarga A M
* @email nisarga.am@alifsemi.com
* @version V1.0.0
* @date 15-Jan-2023
* @brief CMSIS-Driver for PDM.
* @bug None.
* @Note None
******************************************************************************/
#ifndef DRIVER_PDM_H_
#define DRIVER_PDM_H_
#include "Driver_Common.h"
#ifdef _cplusplus
extern "c"
{
#endif
#define ARM_PDM_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,0) /* API version */
#define ARM_PDM_MODE 0x00UL
/* Control code for PDM */
#define ARM_PDM_MODE_MICROPHONE_SLEEP 0x00UL
#define ARM_PDM_MODE_AUDIOFREQ_8K_DECM_64 0x01UL
#define ARM_PDM_MODE_AUDIOFREQ_16K_DECM_32 0x02UL
#define ARM_PDM_MODE_AUDIOFREQ_16K_DECM_48 0x03UL
#define ARM_PDM_MODE_AUDIOFREQ_16K_DECM_64 0x04UL
#define ARM_PDM_MODE_AUDIOFREQ_32K_DECM_48 0x05UL
#define ARM_PDM_MODE_AUDIOFREQ_48K_DECM_50 0x06UL
#define ARM_PDM_MODE_AUDIOFREQ_48K_DECM_64 0x07UL
#define ARM_PDM_MODE_AUDIOFREQ_96K_DECM_50 0x08UL
#define ARM_PDM_MODE_AUDIOFREQ_192K_DECM_25 0x09UL
/* Control code for PDM. Old definitions, to be deprecated in future releases */
#define ARM_PDM_MODE_STANDARD_VOICE_512_CLK_FRQ ARM_PDM_MODE_AUDIOFREQ_8K_DECM_64
#define ARM_PDM_MODE_HIGH_QUALITY_512_CLK_FRQ ARM_PDM_MODE_AUDIOFREQ_16K_DECM_32
#define ARM_PDM_MODE_HIGH_QUALITY_768_CLK_FRQ ARM_PDM_MODE_AUDIOFREQ_16K_DECM_48
#define ARM_PDM_MODE_HIGH_QUALITY_1024_CLK_FRQ ARM_PDM_MODE_AUDIOFREQ_16K_DECM_64
#define ARM_PDM_MODE_WIDE_BANDWIDTH_AUDIO_1536_CLK_FRQ ARM_PDM_MODE_AUDIOFREQ_32K_DECM_48
#define ARM_PDM_MODE_FULL_BANDWIDTH_AUDIO_2400_CLK_FRQ ARM_PDM_MODE_AUDIOFREQ_48K_DECM_50
/* Typo in macro name, should be '3072' KHz instead of '3071' */
#define ARM_PDM_MODE_FULL_BANDWIDTH_AUDIO_3071_CLK_FRQ ARM_PDM_MODE_AUDIOFREQ_48K_DECM_64
#define ARM_PDM_MODE_ULTRASOUND_4800_CLOCK_FRQ ARM_PDM_MODE_AUDIOFREQ_96K_DECM_50
#define ARM_PDM_MODE_ULTRASOUND_96_SAMPLING_RATE ARM_PDM_MODE_AUDIOFREQ_192K_DECM_25
#define ARM_PDM_BYPASS_IIR_FILTER 0x0AUL
#define ARM_PDM_BYPASS_FIR_FILTER 0x0BUL
#define ARM_PDM_PEAK_DETECTION_NODE 0x0CUL
#define ARM_PDM_SAMPLE_ADVANCE 0x0DUL
#define ARM_PDM_CHANNEL_PHASE 0x0EUL
#define ARM_PDM_CHANNEL_GAIN 0x0FUL
#define ARM_PDM_CHANNEL_PEAK_DETECT_TH 0x10UL
#define ARM_PDM_CHANNEL_PEAK_DETECT_ITV 0x11UL
/* PDM event */
#define ARM_PDM_EVENT_ERROR (1UL << 0)
#define ARM_PDM_EVENT_CAPTURE_COMPLETE (1UL << 1)
#define ARM_PDM_EVENT_AUDIO_DETECTION (1UL << 2)
#define ARM_PDM_SELECT_RESOLUTION (1UL << 3)
#define ARM_PDM_16BIT_RESOLUTION (1UL << 4)
#define ARM_PDM_32BIT_RESOLUTION (1UL << 5)
/* PDM channel FIR length */
#define PDM_MAX_FIR_COEFFICIENT 18
#define ARM_PDM_SELECT_CHANNEL 0x01UL
/* PDM channels */
#define ARM_PDM_AUDIO_CHANNEL_0 (0x00)
#define ARM_PDM_AUDIO_CHANNEL_1 (0x01)
#define ARM_PDM_AUDIO_CHANNEL_2 (0x02)
#define ARM_PDM_AUDIO_CHANNEL_3 (0x03)
#define ARM_PDM_AUDIO_CHANNEL_4 (0x04)
#define ARM_PDM_AUDIO_CHANNEL_5 (0x05)
#define ARM_PDM_AUDIO_CHANNEL_6 (0x06)
#define ARM_PDM_AUDIO_CHANNEL_7 (0x07)
/* PDM mask channels */
#define ARM_PDM_MASK_CHANNEL_0 (1 << ARM_PDM_AUDIO_CHANNEL_0)
#define ARM_PDM_MASK_CHANNEL_1 (1 << ARM_PDM_AUDIO_CHANNEL_1)
#define ARM_PDM_MASK_CHANNEL_2 (1 << ARM_PDM_AUDIO_CHANNEL_2)
#define ARM_PDM_MASK_CHANNEL_3 (1 << ARM_PDM_AUDIO_CHANNEL_3)
#define ARM_PDM_MASK_CHANNEL_4 (1 << ARM_PDM_AUDIO_CHANNEL_4)
#define ARM_PDM_MASK_CHANNEL_5 (1 << ARM_PDM_AUDIO_CHANNEL_5)
#define ARM_PDM_MASK_CHANNEL_6 (1 << ARM_PDM_AUDIO_CHANNEL_6)
#define ARM_PDM_MASK_CHANNEL_7 (1 << ARM_PDM_AUDIO_CHANNEL_7)
typedef void (*ARM_PDM_SignalEvent_t) (uint32_t event); /*Pointer to \ref PDM_SignalEvent : Signal PDM Event*/
/**
@brief: These channel configurations are specific to each channels
*/
typedef struct _PDM_CH_CONFIG {
uint8_t ch_num; /* Channel number */
uint32_t ch_fir_coef[PDM_MAX_FIR_COEFFICIENT]; /* Channel FIR filter Coefficient */
uint32_t ch_iir_coef; /* Channel IIR Filter Coefficient */
}PDM_CH_CONFIG;
/**
* @brief: PDM Status
*/
typedef struct _ARM_PDM_STATUS {
uint32_t rx_busy : 1; /* Receiver busy flag */
uint32_t rx_overflow : 1; /* Receive data overflow detected */
uint32_t reserved : 30; /* Reserved (must be Zero) */
}ARM_PDM_STATUS;
/**
@brief : PDM Driver Capabilities
*/
typedef struct _ARM_PDM_CAPABILITIES{
uint32_t mono_mode :1; /* supports Mono mode */
uint32_t synchronous :1; /* supports synchronous Receive */
uint32_t reserved :29; /* Reserved (must be Zero) */
}ARM_PDM_CAPABILITIES;
/**
@brief Access Structure of PDM Driver
*/
typedef struct ARM_DRIVER_PDM{
ARM_DRIVER_VERSION (*GetVersion) (void); /* pointer is pointing to PDM_GetVersion : used to get the driver version */
ARM_PDM_CAPABILITIES (*GetCapabilities) (void); /* pointer is pointing to PDM_Capabilities : used to get the driver capabilities */
int32_t (*Initialize) (ARM_PDM_SignalEvent_t cb_event); /* Pointer pointing to \ref PDM_intialize */
int32_t (*Uninitialize) (void); /* Pointer to PDM_Uninitialize : Un-initialize comparator Interface */
int32_t (*PowerControl) (ARM_POWER_STATE state); /* Pointer to PDM_PowerControl : Control Comparator Interface Power */
int32_t (*Control) (uint32_t control, uint32_t arg1, uint32_t arg2); /* Pointer to PDM_Control : Control Comparator Interface */
int32_t (*Config) (PDM_CH_CONFIG *cnfg); /* Pointer to PDM Config: Channel configurations specific to each channel */
int32_t (*Receive) (void *data, uint32_t num); /* Pointer to Receive : PDM Receive Configuration */
ARM_PDM_STATUS (*GetStatus) (void); /* Pointer to GetStatus: Get the PDM status */
}const ARM_DRIVER_PDM;
#endif /* DRIVER_PDM_H_ */