/******************************************************************************* @file voice.h @brief Contains all functions support for voice driver @version 0.0 @date 18. Jun. 2018 @author qing.han SDK_LICENSE *******************************************************************************/ #ifndef __VOICE__H__ #define __VOICE__H__ #ifdef __cplusplus extern "C" { #endif #include "types.h" #include "gpio.h" #define MAX_VOICE_SAMPLE_SIZE 512 #define MAX_VOICE_SAMPLE_ID (MAX_VOICE_SAMPLE_SIZE-1) #define HALF_VOICE_SAMPLE_SIZE 256 #define HALF_VOICE_SAMPLE_ID (HALF_VOICE_SAMPLE_SIZE-1) #define MAX_VOICE_WORD_SIZE 256 #define HALF_VOICE_WORD_SIZE 128 //#define BELOW_1V 0 //#define UP_1V 1 //#define ADC_INPUT_LEVEL BELOW_1V //#define ADC_INPUT_LEVEL UP_1V #define VOICE_BASE (0x40050800UL) #define VOICE_MID_BASE (0x40050a00UL) #define VOICE_SAMPLE_AUTO 0 #define VOICE_SAMPLE_MANNUAL 1 #define VOICE_SAMPLE_MODE SAMPLE_MANNUAL //#define ADC_SAMPLE_MODE SAMPLE_AUTO #define ENABLE_VOICE_INT *(volatile unsigned int *)0x40050034 |= 0x00000300 //#define ENABLE_VOICE_INT *(volatile unsigned int *)0x40050034 &= 0xfffffcff #define MASK_VOICE_INT *(volatile unsigned int *)0x40050034 &= 0xfffffcff //#define MASK_VOICE_INT *(volatile unsigned int *)0x40050034 |= 0x00000300 /* #define ADC_IRQ_ENABLE *(volatile unsigned int *) 0xe000e100 = BIT(29) #define ADC_IRQ_DISABLE *(volatile unsigned int *) 0xe000e100 = BIT(29) #define CLEAR_ADC_INT_CH0 *(volatile unsigned int *)0x40050038 |= BIT(0) #define CLEAR_ADC_INT_CH1 *(volatile unsigned int *)0x40050038 |= BIT(1) #define CLEAR_ADC_INT_CH2 *(volatile unsigned int *)0x40050038 |= BIT(2) #define CLEAR_ADC_INT_CH3 *(volatile unsigned int *)0x40050038 |= BIT(3) #define CLEAR_ADC_INT_CH4 *(volatile unsigned int *)0x40050038 |= BIT(4) #define CLEAR_ADC_INT_CH5 *(volatile unsigned int *)0x40050038 |= BIT(5) #define CLEAR_ADC_INT_CH6 *(volatile unsigned int *)0x40050038 |= BIT(6) #define CLEAR_ADC_INT_CH7 *(volatile unsigned int *)0x40050038 |= BIT(7)*/ #define CLEAR_VOICE_HALF_INT *(volatile unsigned int *)0x40050038 |= BIT(8) #define CLEAR_VOICE_FULL_INT *(volatile unsigned int *)0x40050038 |= BIT(9) /* #define CLEAR_ADC_INT(n) *(volatile unsigned int *)0x40050038 |= BIT(n) #define IS_CLAER_ADC_INT_CH0 (*(volatile unsigned int *)0x4005003c) & BIT(0) #define IS_CLAER_ADC_INT_CH1 (*(volatile unsigned int *)0x4005003c) & BIT(1) #define IS_CLAER_ADC_INT_CH2 (*(volatile unsigned int *)0x4005003c) & BIT(2) #define IS_CLAER_ADC_INT_CH3 (*(volatile unsigned int *)0x4005003c) & BIT(3) #define IS_CLAER_ADC_INT_CH4 (*(volatile unsigned int *)0x4005003c) & BIT(4) #define IS_CLAER_ADC_INT_CH5 (*(volatile unsigned int *)0x4005003c) & BIT(5) #define IS_CLAER_ADC_INT_CH6 (*(volatile unsigned int *)0x4005003c) & BIT(6) #define IS_CLAER_ADC_INT_CH7 (*(volatile unsigned int *)0x4005003c) & BIT(7)*/ #define IS_CLAER_VOICE_HALF_INT (*(volatile unsigned int *)0x4005003c) & BIT(8) #define IS_CLAER_VOICE_FULL_INT (*(volatile unsigned int *)0x4005003c) & BIT(9) //#define IS_CLAER_ADC_INT(n) (*(volatile unsigned int *)0x4005003c) & BIT(n) #ifndef GET_IRQ_STATUS #define GET_IRQ_STATUS (AP_ADCC->intr_status & 0x3ff) #endif #ifndef ENABLE_ADC #define ENABLE_ADC (AP_PCRM->ANA_CTL |= BIT(3)) #endif #ifndef DISABLE_ADC #define DISABLE_ADC (AP_PCRM->ANA_CTL &= ~BIT(3)) #endif #ifndef ADC_CLOCK_ENABLE #define ADC_CLOCK_ENABLE (AP_PCRM->CLKHF_CTL1 |= BIT(13)) #endif #define ADC_DBLE_CLOCK_DISABLE (*(volatile unsigned int *)0x4000f044 &= ~BIT(21)) #define POWER_DOWN_ADC (*(volatile unsigned int *)0x4000f048 &= ~BIT(3)) #define POWER_UP_TEMPSENSOR (*(volatile unsigned int *)0x4000f048 |= BIT(29)) #define REG_IO_CONTROL ((volatile unsigned int *)0x4000f020) #define ADCC_REG_BASE (0x4000F000) // Voice encode mode typedef enum { VOICE_ENCODE_PCMA = 0, VOICE_ENCODE_PCMU = 1, VOICE_ENCODE_CVSD = 2, VOICE_ENCODE_BYP = 3 } VOICE_ENCODE_t; // Voice sample rate typedef enum { VOICE_RATE_64K = 0, VOICE_RATE_32K = 1, VOICE_RATE_16K = 2, VOICE_RATE_8K = 3 } VOICE_RATE_t; // Voice notch filter configuration typedef enum { VOICE_NOTCH_BYP = 0, VOICE_NOTCH_1 = 1, VOICE_NOTCH_2 = 2, VOICE_NOTCH_3 = 3 } VOICE_NOTCH_t; // Voice polarity selection typedef enum { VOICE_POLARITY_POS = 0, VOICE_POLARITY_NEG = 1 } VOICE_POLARITY_t; enum { HAL_VOICE_EVT_DATA = 1, HAL_VOICE_EVT_FAIL = 0xff }; // Voice configuration structure typedef struct _voice_Cfg_t { bool voiceSelAmicDmic; gpio_pin_e dmicDataPin; gpio_pin_e dmicClkPin; uint8_t amicGain; uint8_t voiceGain; VOICE_ENCODE_t voiceEncodeMode; VOICE_RATE_t voiceRate; bool voiceAutoMuteOnOff; } voice_Cfg_t; // Voice event structure typedef struct _voice_Evt_t { int type; uint32_t* data; uint32_t size; } voice_Evt_t; typedef void (*voice_Hdl_t)(voice_Evt_t* pev); // Voice context structure typedef struct _voice_Contex_t { bool enable; voice_Cfg_t cfg; voice_Hdl_t evt_handler; } voice_Ctx_t; // Enable voice core void hal_voice_enable(void); // Disable voice core void hal_voice_disable(void); // Select DMIC void hal_voice_dmic_mode(void); // Select AMIC void hal_voice_amic_mode(void); // Open a GPIO pin for DMIC void hal_voice_dmic_open(gpio_pin_e dmicDataPin, gpio_pin_e dmicClkPin); // Set PGA gain for AMIC void hal_voice_amic_gain(uint8_t amicGain); // Set voice process gain void hal_voice_gain(uint8_t voiceGain); // Set voice encoding mode void hal_voice_encode(VOICE_ENCODE_t voiceEncodeMode); // Set voice data rate void hal_voice_rate(VOICE_RATE_t voiceRate); // Enable voice auto-mute void hal_voice_amute_on(void); // Disable voice auto-mute void hal_voice_amute_off(void); /************************************************************************************** @fn hal_VOICE_IRQHandler @brief This function process for adc interrupt input parameters @param None. output parameters @param None. @return None. **************************************************************************************/ // Voice interrupt handler void __attribute__((weak)) hal_ADC_IRQHandler(void); /************************************************************************************** @fn hal_voice_init @brief This function process for adc initial input parameters @param ADC_MODE_e mode: adc sample mode select;1:SAM_MANNUAL(mannual mode),0:SAM_AUTO(auto mode) ADC_CH_e adc_pin: adc pin select;ADC_CH0~ADC_CH7 and ADC_CH_VOICE ADC_SEMODE_e semode: signle-ended mode negative side enable; 1:SINGLE_END(single-ended mode) 0:DIFF(Differentail mode) IO_CONTROL_e amplitude: input signal amplitude, 0:BELOW_1V,1:UP_1V output parameters @param None. @return None. **************************************************************************************/ // Allocate memory and power manager for voice void hal_voice_init(void); // Configure voice capture int hal_voice_config(voice_Cfg_t cfg, voice_Hdl_t evt_handler); // Start voice capture int hal_voice_start(void); // Stop voice capture int hal_voice_stop(void); // Clear memory and power manager for voice int hal_voice_clear(void); #ifdef __cplusplus } #endif #endif