150 lines
5.2 KiB
C
150 lines
5.2 KiB
C
/*
|
|
******************************************************************************
|
|
* @file driver_sbc_enc.c
|
|
* @author FreqChip Firmware Team
|
|
* @version V1.0.0
|
|
* @date 2021
|
|
* @brief SBC ENCODER module driver.
|
|
* This file provides firmware functions to manage the
|
|
* SBC ENCODER peripheral
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* Copyright (c) 2021 FreqChip.
|
|
* All rights reserved.
|
|
******************************************************************************
|
|
*/
|
|
#include "fr30xx.h"
|
|
|
|
/******************************************************************************
|
|
* @fn sbc_enc_init
|
|
*
|
|
* @brief Initialize the SBC encoder according to the specified parameters
|
|
* in the SBC_ENC_HandleTypeDef
|
|
*
|
|
* @param hSbcEnc : SBC_ENC_HandleTypeDef structure that contains the
|
|
* configuration information for SBC encoder module.
|
|
*/
|
|
void sbc_enc_init(SBC_ENC_HandleTypeDef *hSbcEnc)
|
|
{
|
|
/*sbc encoder init*/
|
|
SBC_ENC->SBCE_CTRL.Bits.ENC_INL_FIFO_RESET = 1;
|
|
SBC_ENC->SBCE_CTRL.Bits.ENC_INR_FIFO_RESET = 1;
|
|
SBC_ENC->SBCE_CTRL.Bits.ENC_OUT_FIFO_RESET = 1;
|
|
SBC_ENC->SBCE_CTRL.Bits.ENC_RESET = 1;
|
|
|
|
/*encode config*/
|
|
SBC_ENC->SBCE_CFG.Bits.CH_MODE = hSbcEnc->SbcEncInit.Bits.ch_mode;
|
|
if(hSbcEnc->SbcEncInit.Bits.ch_mode == SBCE_MONO)
|
|
{
|
|
SBC_ENC->SBCE_CTRL.Bits.ENC_INR_FLOW_CTRL = 1;
|
|
}
|
|
SBC_ENC->SBCE_CFG.Bits.BLK_LEN = hSbcEnc->SbcEncInit.Bits.blk_len;
|
|
SBC_ENC->SBCE_CFG.Bits.SMP_FRQ = hSbcEnc->SbcEncInit.Bits.sample_freq;
|
|
|
|
/*encode fifo level config*/
|
|
SBC_ENC->SBCE_INFIFO_LVL.Bits.INLFIFO_ALEMPTY_LEVEL = hSbcEnc->SbcEncInit.Bits.inlfifo_alempty_lvl;
|
|
SBC_ENC->SBCE_INFIFO_LVL.Bits.INRFIFO_ALEMPTY_LEVEL = hSbcEnc->SbcEncInit.Bits.inrfifo_alempty_lvl;
|
|
SBC_ENC->SBCE_OUTFF_LVL.Bits.OUTFIFO_ALFULL_LEVEL = hSbcEnc->SbcEncInit.Bits.outlfifo_alfull_lvl;
|
|
|
|
/*dma config*/
|
|
if(hSbcEnc->SbcEncInit.Bits.input_dma_en == 1)
|
|
{
|
|
SBC_ENC->SBCE_CTRL.Bits.IN_DMA_EN = 1;
|
|
SBC_ENC->SBCE_CTRL.Bits.INL_FIFO_EN = 1;
|
|
SBC_ENC->SBCE_CTRL.Bits.INR_FIFO_EN = 1;
|
|
}
|
|
if(hSbcEnc->SbcEncInit.Bits.output_dma_en == 1)
|
|
{
|
|
SBC_ENC->SBCE_CTRL.Bits.OUT_DMA_EN = 1;
|
|
}
|
|
|
|
/*sbc encoder start*/
|
|
SBC_ENC->SBCE_CTRL.Bits.ENC_EN = 1;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* @fn sbc_encoder_enc_IT
|
|
*
|
|
* @brief start sbc encoder with isr
|
|
*
|
|
* @param hSbcEnc : sbc encoder handle.
|
|
* fp_Data_In : pcm data in
|
|
* fu32_size : pcm data size
|
|
* fp_Data_Out : sbc encoder packed frame out
|
|
*/
|
|
void sbc_encoder_enc_IT(SBC_ENC_HandleTypeDef *hSbcEnc, uint16_t *fp_Data_In, uint32_t fu32_size, uint8_t *fp_Data_Out)
|
|
{
|
|
|
|
hSbcEnc->OrignlData = fp_Data_In;
|
|
hSbcEnc->EncodedData = fp_Data_Out;
|
|
hSbcEnc->OrignlDataSize = fu32_size;
|
|
hSbcEnc->gDataInIndex = 0;
|
|
hSbcEnc->gDataOutIndex = 0;
|
|
SBC_ENC->SBCE_INTEN.Word |= 0x24;
|
|
return;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* @fn sbcenc_IRQHandler
|
|
*
|
|
* @brief sbc encoder handle function in sbc encoder isr
|
|
*
|
|
* @param hSbcEnc : sbc encoder handle.
|
|
*
|
|
*/
|
|
void sbcenc_IRQHandler(SBC_ENC_HandleTypeDef *hSbcEnc)
|
|
{
|
|
uint32_t isr = __SBCE_GET_ISR_STS();
|
|
if(isr & OUTFF_ALFULL_INT)
|
|
{
|
|
while(!__SBCE_OUTFIFO_IS_EMPTY())
|
|
{
|
|
hSbcEnc->EncodedData[hSbcEnc->gDataOutIndex++] = (uint8_t)__SBCE_GET_OUT_RESULT_WORD();
|
|
}
|
|
}
|
|
if(isr & INLF_EMPTY_INT)
|
|
{
|
|
uint32_t read_size = 0;
|
|
if(SBC_ENC->SBCE_CFG.Bits.CH_MODE == SBCE_STEREO)/*2 channels*/
|
|
{
|
|
read_size = (hSbcEnc->OrignlDataSize - hSbcEnc->gDataInIndex) >= 256 ? 256 : (hSbcEnc->OrignlDataSize - hSbcEnc->gDataInIndex);
|
|
for(uint32_t i = 0; i< read_size/2; i++)
|
|
{
|
|
SBC_ENC->SBCE_INFIFO.Word = *((int32_t *)&hSbcEnc->OrignlData[hSbcEnc->gDataInIndex]);
|
|
hSbcEnc->gDataInIndex += 2;
|
|
}
|
|
}
|
|
else/*1 channel*/
|
|
{
|
|
read_size = (hSbcEnc->OrignlDataSize - hSbcEnc->gDataInIndex) >= 128 ? 128 : (hSbcEnc->OrignlDataSize - hSbcEnc->gDataInIndex);
|
|
for(uint32_t i = 0; i< read_size; i++)
|
|
{
|
|
SBC_ENC->SBCE_INFIFO.Bits.ENC_FFL = hSbcEnc->OrignlData[hSbcEnc->gDataInIndex++];
|
|
}
|
|
}
|
|
if(hSbcEnc->gDataInIndex >= hSbcEnc->OrignlDataSize)
|
|
{
|
|
__SBCE_INLFF_EMPTY_INT_DISABLE();
|
|
}
|
|
|
|
// while(!__SBCE_INLFIFO_IS_FULL())
|
|
// {
|
|
// if(SBC_ENC->SBCE_CFG.Bits.CH_MODE == SBCE_STEREO)/*2 channels*/
|
|
// {
|
|
// SBC_ENC->SBCE_INFIFO.Word = *((int32_t *)&hSbcEnc->OrignlData[hSbcEnc->gDataInIndex]);
|
|
// hSbcEnc->gDataInIndex += 2;
|
|
// }
|
|
// else/*1 channel*/
|
|
// {
|
|
// SBC_ENC->SBCE_INFIFO.Bits.ENC_FFL = hSbcEnc->OrignlData[hSbcEnc->gDataInIndex++];
|
|
// }
|
|
// if(hSbcEnc->gDataInIndex >= hSbcEnc->OrignlDataSize)
|
|
// {
|
|
// __SBCE_INLFF_EMPTY_INT_DISABLE();
|
|
// break;
|
|
// }
|
|
// }
|
|
}
|
|
|
|
} |