| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560 |
- /* Copyright 2018 Canaan Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #ifndef _apu_H_
- #define _apu_H_
- #if defined(__cplusplus)
- extern "C" {
- #endif
- #define DIRECTION_RES 16
- #define I2S_FS 44100
- #define SOUND_SPEED 340
- typedef enum en_bf_dir
- {
- APU_DIR0 = 0,
- APU_DIR1,
- APU_DIR2,
- APU_DIR3,
- APU_DIR4,
- APU_DIR5,
- APU_DIR6,
- APU_DIR7,
- APU_DIR8,
- APU_DIR9,
- APU_DIR10,
- APU_DIR11,
- APU_DIR12,
- APU_DIR13,
- APU_DIR14,
- APU_DIR15,
- } en_bf_dir_t;
- typedef struct _apu_ch_cfg
- {
- /**
- * BF unit sound channel enable control bits.
- * Bit 'x' corresponds to enable bit for sound channel 'x' (x = 0, 1, 2,
- * . . ., 7). BF sound channels are related with I2S host RX channels.
- * BF sound channel 0/1 correspond to the left/right channel of I2S RX0;
- * BF channel 2/3 correspond to left/right channels of I2S RX1; and
- * things like that. 0x1: writing '1' to enable the corresponding BF
- * sound channel. 0x0: writing '0' to close the corresponding BF sound
- * channel.
- */
- uint32_t bf_sound_ch_en : 8;
- /**
- * Target direction select for valid voice output.
- * When the source voice direaction searching is done, software can use
- * this field to select one from 16 sound directions for the following
- * voice recognition. 0x0: select sound direction 0; 0x1: select sound
- * direction 1; . . . . . . 0xF: select sound direction 15.
- */
- uint32_t bf_target_dir : 4;
- /**
- * This is the audio sample gain factor. Using this gain factor to
- * enhance or reduce the stength of the sum of at most 8 source
- * sound channel outputs. This is a unsigned 11-bit fix-point number,
- * bit 10 is integer part and bit 9~0 are the fractional part.
- */
- uint32_t audio_gain : 11;
- uint32_t reserved1 : 1;
- /**
- * audio data source configure parameter. This parameter controls where
- * the audio data source comes from. 0x0: audio data directly sourcing
- * from apu internal buffer; 0x1: audio data sourcing from
- * FFT result buffer.
- */
- uint32_t data_src_mode : 1;
- uint32_t reserved2 : 3;
- /**
- * write enable for bf_sound_ch_en parameter.
- * 0x1: allowing updates made to 'bf_sound_ch_en'.
- * Access Mode: write only
- */
- uint32_t we_bf_sound_ch_en : 1;
- /**
- * write enable for bf_target_dir parameter.
- * 0x1: allowing updates made to 'bf_target_dir'.
- * Access Mode: write only
- */
- uint32_t we_bf_target_dir : 1;
- /**
- * write enable for audio_gain parameter.
- * 0x1: allowing updates made to 'audio_gain'.
- * Access Mode: write only
- */
- uint32_t we_audio_gain : 1;
- /**
- * write enable for data_out_mode parameter.
- * 0x1: allowing updates made to 'data_src_mode'.
- */
- uint32_t we_data_src_mode : 1;
- } __attribute__((packed, aligned(4))) apu_ch_cfg_t;
- typedef struct _apu_ctl_t
- {
- /**
- * Sound direction searching enable bit.
- * Software writes '1' to start sound direction searching function.
- * When all the sound sample buffers are filled full, this bit is
- * cleared by hardware (this sample buffers are used for direction
- * detect only). 0x1: enable direction searching.
- */
- uint32_t bf_dir_search_en : 1;
- /*
- *use this parameter to reset all the control logic on direction search processing path. This bit is self-clearing.
- * 0x1: apply reset to direction searching control logic;
- * 0x0: No operation.
- */
- uint32_t search_path_reset : 1;
- uint32_t reserved : 2;
- /**
- * Valid voice sample stream generation enable bit.
- * After sound direction searching is done, software can configure this
- * bit to generate a stream of voice samples for voice recognition. 0x1:
- * enable output of voice sample stream. 0x0: stop the voice samlpe
- * stream output.
- */
- uint32_t bf_stream_gen_en : 1;
- /*
- *use this parameter to reset all the control logic on voice stream generating path. This bit is self-clearing.
- * 0x1: apply reset to voice stream generating control logic;
- * 0x0: No operation.
- */
- uint32_t voice_gen_path_reset : 1;
- /*
- *use this parameter to switch to a new voice source direction. Software write '1' here and hardware will automatically clear it.
- * 0x1: write '1' here to request switching to new voice source direction.
- */
- uint32_t update_voice_dir : 1;
- uint32_t reserved1 : 1;
- //write enable for 'bf_dir_search_en' parameter.
- uint32_t we_bf_dir_search_en : 1;
- uint32_t we_search_path_rst : 1;
- uint32_t we_bf_stream_gen : 1;
- uint32_t we_voice_gen_path_rst : 1;
- uint32_t we_update_voice_dir : 1;
- uint32_t reserved2 : 19;
- } __attribute__((packed, aligned(4))) apu_ctl_t;
- typedef struct _apu_dir_bidx
- {
- uint32_t dir_rd_idx0 : 6;
- uint32_t reserved : 2;
- uint32_t dir_rd_idx1 : 6;
- uint32_t reserved1 : 2;
- uint32_t dir_rd_idx2 : 6;
- uint32_t reserved2 : 2;
- uint32_t dir_rd_idx3 : 6;
- uint32_t reserved3 : 2;
- } __attribute__((packed, aligned(4))) apu_dir_bidx_t;
- typedef struct _apu_fir_coef
- {
- uint32_t fir_tap0 : 16;
- uint32_t fir_tap1 : 16;
- } __attribute__((packed, aligned(4))) apu_fir_coef_t;
- typedef struct _apu_dwsz_cfg
- {
- /**
- * The down-sizing ratio used for direction searching.
- * 0x0: no down-sizing;
- * 0x1: 1/2 down sizing;
- * 0x2: 1/3 down sizing;
- * . . . . . .
- * 0xF: 1/16 down sizing.
- */
- uint32_t dir_dwn_siz_rate : 4;
- /**
- * The down-sizing ratio used for voice stream generation.
- * 0x0: no down-sizing;
- * 0x1: 1/2 down sizing;
- * 0x2: 1/3 down sizing;
- * . . . . . .
- * 0xF: 1/16 down sizing.
- */
- uint32_t voc_dwn_siz_rate : 4;
- /**
- * This bit field is used to perform sample precision reduction when
- * the source sound sample (from I2S0 host receiving channels)
- * precision is 20/24/32 bits.
- * 0x0: take bits 15~0 from the source sound sample;
- * 0x1: take bits 16~1 from the source sound sample;
- * 0x2: take bits 17~2 from the source sound sample;
- * . . . . . .
- * 0x10: take bits 31~16 from the source sound sample;
- */
- uint32_t smpl_shift_bits : 5;
- uint32_t reserved : 19;
- } __attribute__((packed, aligned(4))) apu_dwsz_cfg_t;
- /*0x31c*/
- typedef struct _apu_fft_cfg
- {
- uint32_t fft_shift_factor : 9;
- uint32_t reserved1 : 3;
- uint32_t fft_enable : 1;
- uint32_t reserved2 : 19;
- } __attribute__((packed, aligned(4))) apu_fft_cfg_t;
- /*0x328*/
- typedef struct _apu_int_stat
- {
- /**
- * sound direction searching data ready interrupt event.
- * Writing '1' to clear this interrupt event.
- * 0x1: data is ready for sound direction detect;
- * 0x0: no event.
- */
- uint32_t dir_search_data_rdy : 1;
- /**
- * voice output stream buffer data ready interrupt event.
- * When a block of 512 voice samples are collected, this interrupt event
- * is asserted. Writing '1' to clear this interrupt event. 0x1: voice
- * output stream buffer data is ready; 0x0: no event.
- */
- uint32_t voc_buf_data_rdy : 1;
- uint32_t reserved : 30;
- } __attribute__((packed, aligned(4))) apu_int_stat_t;
- /*0x32c*/
- typedef struct _apu_int_mask
- {
- /**
- * This is the interrupt mask to dir searching data ready interrupt.
- * 0x1: mask off this interrupt;
- * 0x0: enable this interrupt.
- */
- uint32_t dir_data_rdy_msk : 1;
- /**
- * This is the interrupt mask to voice output stream buffer ready
- * interrupt. 0x1: mask off this interrupt; 0x0: enable this interrupt.
- */
- uint32_t voc_buf_rdy_msk : 1;
- uint32_t reserved : 30;
- } __attribute__((packed, aligned(4))) apu_int_mask_t;
- typedef struct _apu_reg
- {
- //0x200
- apu_ch_cfg_t bf_ch_cfg_reg;
- //0x204
- apu_ctl_t bf_ctl_reg;
- //0x208
- apu_dir_bidx_t bf_dir_bidx[16][2];
- //0x288
- apu_fir_coef_t bf_pre_fir0_coef[9];
- //0x2ac
- apu_fir_coef_t bf_post_fir0_coef[9];
- //0x2d0
- apu_fir_coef_t bf_pre_fir1_coef[9];
- //0x2f4
- apu_fir_coef_t bf_post_fir1_coef[9];
- //0x318
- apu_dwsz_cfg_t bf_dwsz_cfg_reg;
- //0x31c
- apu_fft_cfg_t bf_fft_cfg_reg;
- // 0x320
- /**
- * This is the read register for system DMA to read data stored in
- * sample out buffers (the sample out buffers are used for sound
- * direction detect). Each data contains two sound samples.
- */
- volatile uint32_t sobuf_dma_rdata;
- // 0x324
- /**
- * This is the read register for system DMA to read data stored in voice
- * out buffers (the voice out buffers are used for voice recognition).
- * Each data contains two sound samples.
- */
- volatile uint32_t vobuf_dma_rdata;
- /*0x328*/
- apu_int_stat_t bf_int_stat_reg;
- /*0x32c*/
- apu_int_mask_t bf_int_mask_reg;
- /*0x330*/
- uint32_t saturation_counter;
- /*0x334*/
- uint32_t saturation_limits;
- } __attribute__((packed, aligned(4))) apu_reg_t;
- extern volatile apu_reg_t *const apu;
- /**
- * @brief Voice strength average value right shift factor. When performing sound direction detect,
- * the average value of samples from different channels is required, this right shift factor
- * is used to perform division.
- *
- * @param[in] gain value of audio gain.
- * 0x0: no right shift;
- * 0x1: right shift by 1-bit;
- * . . . . . .
- * 0xF: right shift by 15-bit.
- *
- */
- void apu_set_audio_gain(uint16_t gain);
- /**
- * @brief Set sampling shift.
- *
- * @param[in] smpl_shift vlaue of sampling shift
- *
- */
- void apu_set_smpl_shift(uint8_t smpl_shift);
- /**
- * @brief Get sampling shift
- *
- * @return vlaue of sampling shift
- */
- uint8_t apu_get_smpl_shift(void);
- /**
- * @brief APU unit sound channel enable control bits. Bit 'x' corresponds to enable bit for sound
- * channel 'x' (x = 0, 1, 2, . . ., 7). APU sound channels are related with I2S host RX channels.
- * APU sound channel 0/1 correspond to the left/right channel of I2S RX0; APU channel 2/3 correspond
- * to left/right channels of I2S RX1; and things like that. Software write '1' to enable a sound
- * channel and hardware automatically clear the bit after the sample buffers used for direction
- * searching is filled full.
- *
- *
- * @param[in] channel_bit APU sound channel.0x1: writing
- * '1' to enable the corresponding APU sound channel.
- *
- */
- void apu_set_channel_enabled(uint8_t channel_bit);
- /**
- * @brief I2S host beam-forming direction sample ibuffer read index configure register
- *
- * @param[in] dir_num the direction of index
- * @param[in] dir_bidx
- *
- */
- void apu_set_direction_delay(uint8_t dir_num, uint8_t *dir_bidx);
- /**
- * @brief I2S host beam-forming direction sample ibuffer read index configure register
- *
- * @param[in] radius radius
- * @param[in] mic_num_a_circle the num of mic per circle
- * @param[in] center 0: no center mic, 1:have center mic
- *
- */
- void apu_set_delay(float radius, uint8_t mic_num_a_circle, uint8_t center);
- /**
- * @brief Set ffp shift factor
- *
- * @param[in] enable_flag enable fft
- * @param[in] shift_factor shift factor
- *
- */
- void apu_set_fft_shift_factor(uint8_t enable_flag, uint16_t shift_factor);
- /**
- * @brief Set down-sizing ratio used for voice direction searching and voice stream generation.
- *
- * @param[in] dir_dwn_siz down-sizing ratio used for voice direction searching
- * 0x0: no down-sizing
- * 0x1: 1/2 down sizing
- * 0x2: 1/3 down sizing
- * . . . . . .
- * 0xF: 1/16 down sizing
- * @param[in] voc_dwn_siz down-sizing ratio used for voice stream generation
- * 0x0: no down-sizing
- * 0x1: 1/2 down sizing
- * 0x2: 1/3 down sizing
- * . . . . . .
- * 0xF: 1/16 down sizing
- */
- void apu_set_down_size(uint8_t dir_dwn_siz, uint8_t voc_dwn_siz);
- /**
- * @brief Set direction and voice interrupt mask
- *
- * @param[in] dir_int_mask direction interrupt mask
- * @param[in] voc_int_mask voice interrupt mask
- *
- */
- void apu_set_interrupt_mask(uint8_t dir_int_mask, uint8_t voc_int_mask);
- /**
- * @brief Enable direction searching.
- *
- */
- void apu_dir_enable(void);
- /**
- * @brief Reset direction searching.
- *
- */
- void apu_dir_reset(void);
- /**
- * @brief I2S host beam-forming Filter FIR16 Coefficient Register
- *
- * @param[in] fir_coef direction prev FIR
- *
- */
- void apu_dir_set_prev_fir(uint16_t *fir_coef);
- /**
- * @brief I2S host beam-forming Filter FIR16 Coefficient Register
- *
- * @param[in] fir_coef direction post FIR
- *
- */
- void apu_dir_set_post_fir(uint16_t *fir_coef);
- /**
- * @brief Set down-sizing ratio used for voice direction searching
- *
- * @param[in] dir_dwn_siz down-sizing ratio used for voice direction searching
- * 0x0: no down-sizing
- * 0x1: 1/2 down sizing
- * 0x2: 1/3 down sizing
- * . . . . . .
- * 0xF: 1/16 down sizing
- */
- void apu_dir_set_down_size(uint8_t dir_dwn_size);
- /**
- * @brief Set direction searching interrupt mask
- *
- * @param[in] dir_int_mask direction interrupt mask
- *
- */
- void apu_dir_set_interrupt_mask(uint8_t dir_int_mask);
- /**
- * @brief Clear direction interrupt
- *
- */
- void apu_dir_clear_int_state(void);
- /**
- * @brief Valid voice sample stream generation enable bit. After sound direction searching is done, software can
- * configure this bit to generate a stream of voice samples for voice recognition.
- *
- * @param[in] enable_flag 0x1: enable output of voice sample stream. 0x0: stop the voice samlpe stream output.
- *
- */
- void apu_voc_enable(uint8_t enable_flag);
- /**
- * @brief Reset voice sample
- *
- */
- void apu_voc_reset(void);
- /**
- * @brief Target direction select for valid voice output. When the source voice direaction searching
- * is done, software can use this field to select one from 16 sound directions for the following
- * voice recognition
- *
- * @param[in] direction 0x0: select sound direction 0;
- * 0x1: select sound direction 1;
- * . . . . . .
- * 0xF: select sound direction 15.
- */
- void apu_voc_set_direction(en_bf_dir_t direction);
- /**
- * @brief I2S host beam-forming Filter FIR16 Coefficient Register
- *
- * @param[in] fir_coef voice prev FIR
- *
- */
- void apu_voc_set_prev_fir(uint16_t *fir_coef);
- /**
- * @brief I2S host beam-forming Filter FIR16 Coefficient Register
- *
- * @param[in] fir_coef voice post FIR
- *
- */
- void apu_voc_set_post_fir(uint16_t *fir_coef);
- /**
- * @brief Set down-sizing ratio used for voice stream generation.
- *
- * @param[in] voc_dwn_siz down-sizing ratio used for voice stream generation
- * 0x0: no down-sizing
- * 0x1: 1/2 down sizing
- * 0x2: 1/3 down sizing
- * . . . . . .
- * 0xF: 1/16 down sizing
- */
- void apu_voc_set_down_size(uint8_t voc_dwn_size);
- /**
- * @brief Set voice stream generation interrupt mask
- *
- * @param[in] voc_int_mask voice interrupt mask
- *
- */
- void apu_voc_set_interrupt_mask(uint8_t voc_int_mask);
- /**
- * @brief Clear voice interrupt
- *
- */
- void apu_voc_clear_int_state(void);
- /**
- * @brief Reset saturation_counter
- *
- */
- void apu_voc_reset_saturation_counter(void);
- /**
- * @brief Get saturation counter
- *
- * @return vlaue of saturation counter.heigh 16 bit is counter, low 16 bit is total
- */
- uint32_t apu_voc_get_saturation_counter(void);
- /**
- * @brief set saturation limit
- *
- * @param[in] upper heigh 16 bit is counter
- * @param[in] bottom low 16 bit is total
- *
- */
- void apu_voc_set_saturation_limit(uint16_t upper, uint16_t bottom);
- /**
- * @brief Get saturation limit
- *
- * @return vlaue of saturation limit.heigh 16 bit is counter, low 16 bit is total
- */
- uint32_t apu_voc_get_saturation_limit(void);
- /**
- * @brief Print apu setting for debug
- *
- */
- void apu_print_setting(void);
- #if defined(__cplusplus)
- }
- #endif
- #endif
|