985 lines
23 KiB
C
985 lines
23 KiB
C
|
// Copyright 2020-2021 Beken
|
||
|
//
|
||
|
// 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.
|
||
|
|
||
|
#include "cli.h"
|
||
|
|
||
|
#include <os/os.h>
|
||
|
#include <os/mem.h>
|
||
|
#include <os/str.h>
|
||
|
#include <driver/i2s.h>
|
||
|
#include <driver/i2s_types.h>
|
||
|
#include <driver/dma.h>
|
||
|
#include "i2s_hal.h"
|
||
|
#include "sys_driver.h"
|
||
|
#include "i2s_driver.h"
|
||
|
//#include <driver/aud.h>
|
||
|
//#include <driver/aud_types.h>
|
||
|
#include <driver/dma.h>
|
||
|
//#include "aud_hal.h"
|
||
|
#if CLI_FOR_AUDIO_ATE_TEST
|
||
|
#include <driver/aud_adc_types.h>
|
||
|
#include <driver/aud_adc.h>
|
||
|
#include <driver/aud_dac_types.h>
|
||
|
#include <driver/aud_dac.h>
|
||
|
#endif
|
||
|
|
||
|
//extern void delay(int num);//TODO fix me
|
||
|
static RingBufferContext *ch1_tx_rb;
|
||
|
static RingBufferContext *ch1_rx_rb;
|
||
|
static RingBufferContext *ch2_tx_rb;
|
||
|
static RingBufferContext *ch2_rx_rb;
|
||
|
static RingBufferContext *ch3_tx_rb;
|
||
|
static RingBufferContext *ch3_rx_rb;
|
||
|
|
||
|
static uint8_t *ch1_temp = NULL;
|
||
|
static uint8_t *ch2_temp = NULL;
|
||
|
static uint8_t *ch3_temp = NULL;
|
||
|
|
||
|
|
||
|
static void cli_i2s_help(void)
|
||
|
{
|
||
|
os_printf("i2s_master_test {start|stop} \r\n");
|
||
|
os_printf("i2s_slave_test {start|stop} \r\n");
|
||
|
os_printf("pcm_master_test {start|stop} \r\n");
|
||
|
os_printf("pcm_slave_test {start|stop} \r\n");
|
||
|
os_printf("dtm_master_test {start|stop} \r\n");
|
||
|
os_printf("dtm_slave_test {start|stop} \r\n");
|
||
|
os_printf("2bd_master_test {start|stop} \r\n");
|
||
|
os_printf("2bd_slave_test {start|stop} \r\n");
|
||
|
}
|
||
|
|
||
|
static int ch1_tx_data_handle_cb(uint32_t size)
|
||
|
{
|
||
|
//os_printf("%s, size: %d \n", __func__, size);
|
||
|
ring_buffer_write(ch1_tx_rb, ch1_temp, size);
|
||
|
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
static int ch1_rx_data_handle_cb(uint32_t size)
|
||
|
{
|
||
|
//os_printf("%s, size: %d \n", __func__, size);
|
||
|
ring_buffer_read(ch1_rx_rb, ch1_temp, size);
|
||
|
os_printf("rx ch1_temp[0]: 0x%2x \n", ch1_temp[0]);
|
||
|
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
static int ch2_tx_data_handle_cb(uint32_t size)
|
||
|
{
|
||
|
ring_buffer_write(ch2_tx_rb, ch2_temp, size);
|
||
|
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
static int ch2_rx_data_handle_cb(uint32_t size)
|
||
|
{
|
||
|
ring_buffer_read(ch2_rx_rb, ch2_temp, size);
|
||
|
os_printf("rx ch2_temp[0]: 0x%2x \n", ch2_temp[0]);
|
||
|
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
static int ch3_tx_data_handle_cb(uint32_t size)
|
||
|
{
|
||
|
ring_buffer_write(ch3_tx_rb, ch3_temp, size);
|
||
|
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
static int ch3_rx_data_handle_cb(uint32_t size)
|
||
|
{
|
||
|
ring_buffer_read(ch3_rx_rb, ch3_temp, size);
|
||
|
os_printf("rx ch3_temp[0]: 0x%2x \n", ch3_temp[0]);
|
||
|
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
#if CLI_FOR_AUDIO_ATE_TEST
|
||
|
static void cli_audio_adc_config(uint32_t sample_rate, uint32_t adc_mode)
|
||
|
{
|
||
|
aud_adc_config_t adc_config = DEFAULT_AUD_ADC_CONFIG();
|
||
|
|
||
|
adc_config.adc_chl = AUD_ADC_CHL_LR;
|
||
|
adc_config.clk_src = AUD_CLK_XTAL;
|
||
|
adc_config.adc_mode = adc_mode;
|
||
|
switch (sample_rate) {
|
||
|
case 1:
|
||
|
adc_config.samp_rate = 8000;
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
adc_config.samp_rate = 11025;
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
adc_config.samp_rate = 12000;
|
||
|
break;
|
||
|
|
||
|
case 4:
|
||
|
adc_config.samp_rate = 16000;
|
||
|
break;
|
||
|
|
||
|
case 5:
|
||
|
adc_config.samp_rate = 22050;
|
||
|
break;
|
||
|
|
||
|
case 6:
|
||
|
adc_config.samp_rate = 24000;
|
||
|
break;
|
||
|
|
||
|
case 7:
|
||
|
adc_config.samp_rate = 32000;
|
||
|
break;
|
||
|
|
||
|
case 8:
|
||
|
adc_config.samp_rate = 44100;
|
||
|
break;
|
||
|
|
||
|
case 9:
|
||
|
adc_config.samp_rate = 48000;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
/* audio process test */
|
||
|
sys_drv_aud_mic1_gain_set(0);
|
||
|
sys_drv_aud_mic2_gain_set(0);
|
||
|
|
||
|
bk_aud_adc_init(&adc_config);
|
||
|
|
||
|
//disable audio interrupt when loop test
|
||
|
sys_drv_aud_int_en(0);
|
||
|
bk_aud_adc_disable_int();
|
||
|
|
||
|
//start adc
|
||
|
bk_aud_adc_start();
|
||
|
}
|
||
|
|
||
|
static void cli_audio_adc_deconfig(void)
|
||
|
{
|
||
|
//disable adc
|
||
|
bk_aud_adc_stop();
|
||
|
bk_aud_adc_deinit();
|
||
|
//bk_aud_driver_deinit();
|
||
|
}
|
||
|
|
||
|
static void cli_audio_dac_config(uint32_t sample_rate, uint32_t dac_mode)
|
||
|
{
|
||
|
aud_dac_config_t dac_config = DEFAULT_AUD_DAC_CONFIG();
|
||
|
|
||
|
dac_config.dac_chl = AUD_DAC_CHL_LR;
|
||
|
dac_config.clk_src = AUD_CLK_XTAL;
|
||
|
dac_config.work_mode = dac_mode;
|
||
|
switch (sample_rate) {
|
||
|
case 1:
|
||
|
dac_config.samp_rate = 8000;
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
dac_config.samp_rate = 11025;
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
dac_config.samp_rate = 12000;
|
||
|
break;
|
||
|
|
||
|
case 4:
|
||
|
dac_config.samp_rate = 16000;
|
||
|
break;
|
||
|
|
||
|
case 5:
|
||
|
dac_config.samp_rate = 22050;
|
||
|
break;
|
||
|
|
||
|
case 6:
|
||
|
dac_config.samp_rate = 24000;
|
||
|
break;
|
||
|
|
||
|
case 7:
|
||
|
dac_config.samp_rate = 32000;
|
||
|
break;
|
||
|
|
||
|
case 8:
|
||
|
dac_config.samp_rate = 44100;
|
||
|
break;
|
||
|
|
||
|
case 9:
|
||
|
dac_config.samp_rate = 48000;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
/* audio process test */
|
||
|
sys_drv_aud_dacg_set(0);
|
||
|
|
||
|
bk_aud_dac_init(&dac_config);
|
||
|
|
||
|
//disable audio interrupt when loop test
|
||
|
sys_drv_aud_int_en(0);
|
||
|
bk_aud_adc_disable_int();
|
||
|
|
||
|
//start adc
|
||
|
bk_aud_dac_start();
|
||
|
}
|
||
|
|
||
|
static void cli_audio_dac_deconfig(void)
|
||
|
{
|
||
|
//disable dac
|
||
|
bk_aud_dac_stop();
|
||
|
bk_aud_dac_deinit();
|
||
|
//bk_aud_driver_deinit();
|
||
|
}
|
||
|
|
||
|
static void cli_i2s_config(uint32_t sample_rate, uint8_t aud_mode)
|
||
|
{
|
||
|
i2s_config_t i2s_config = DEFAULT_I2S_CONFIG();
|
||
|
i2s_samp_rate_t samp_rate = I2S_SAMP_RATE_8000;
|
||
|
|
||
|
switch (sample_rate) {
|
||
|
case 1: //8k
|
||
|
samp_rate = I2S_SAMP_RATE_8000;
|
||
|
break;
|
||
|
|
||
|
case 2: //11.025k
|
||
|
samp_rate = I2S_SAMP_RATE_11025;
|
||
|
break;
|
||
|
|
||
|
case 3: //12k
|
||
|
samp_rate = I2S_SAMP_RATE_12000;
|
||
|
break;
|
||
|
|
||
|
case 4: //16k
|
||
|
samp_rate = I2S_SAMP_RATE_16000;
|
||
|
break;
|
||
|
|
||
|
case 5: //22.05k
|
||
|
samp_rate = I2S_SAMP_RATE_22050;
|
||
|
break;
|
||
|
|
||
|
case 6: //24k
|
||
|
samp_rate = I2S_SAMP_RATE_24000;
|
||
|
break;
|
||
|
|
||
|
case 7: //32k
|
||
|
samp_rate = I2S_SAMP_RATE_32000;
|
||
|
break;
|
||
|
|
||
|
case 8: //44.1k
|
||
|
samp_rate = I2S_SAMP_RATE_44100;
|
||
|
break;
|
||
|
|
||
|
case 9: //48k
|
||
|
samp_rate = I2S_SAMP_RATE_48000;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
i2s_config.samp_rate = I2S_SAMP_RATE_8000;
|
||
|
i2s_config.samp_rate = samp_rate;
|
||
|
i2s_config.store_mode = I2S_LRCOM_STORE_16R16L;
|
||
|
|
||
|
/* init i2s */
|
||
|
bk_i2s_driver_init();
|
||
|
|
||
|
/* config i2s */
|
||
|
#if CONFIG_SOC_BK7256XX
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
|
||
|
#endif
|
||
|
#if (CONFIG_SOC_BK7236XX) || (CONFIG_SOC_BK7239XX) || (CONFIG_SOC_BK7286XX)
|
||
|
if (aud_mode == 0) // for adc
|
||
|
{
|
||
|
i2s_config.role = I2S_ROLE_SLAVE; //I2S_ROLE_MASTER;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_1, &i2s_config);
|
||
|
}
|
||
|
else // for dac
|
||
|
{
|
||
|
i2s_config.role = I2S_ROLE_MASTER; // I2S_ROLE_SLAVE;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_2, &i2s_config);
|
||
|
}
|
||
|
|
||
|
// bk_i2s_init(I2S_GPIO_GROUP_2, &i2s_config);
|
||
|
#endif
|
||
|
|
||
|
bk_i2s_enable(I2S_ENABLE);
|
||
|
}
|
||
|
|
||
|
static void cli_i2s_deconfig(void)
|
||
|
{
|
||
|
bk_i2s_enable(I2S_DISABLE);
|
||
|
|
||
|
bk_i2s_deinit();
|
||
|
|
||
|
bk_i2s_driver_deinit();
|
||
|
}
|
||
|
|
||
|
|
||
|
static dma_id_t cli_aud_i2s_dma_config(uint32_t state)
|
||
|
{
|
||
|
bk_err_t ret = BK_OK;
|
||
|
dma_config_t dma_config = {0};
|
||
|
uint32_t i2s_data_addr;
|
||
|
uint32_t aud_adc_data_addr;
|
||
|
uint32_t aud_dac_data_addr;
|
||
|
|
||
|
os_memset(&dma_config, 0, sizeof(dma_config));
|
||
|
|
||
|
/* init dma driver */
|
||
|
ret = bk_dma_driver_init();
|
||
|
if (ret != BK_OK) {
|
||
|
return DMA_ID_MAX;
|
||
|
}
|
||
|
|
||
|
/* allocate free DMA channel */
|
||
|
dma_id_t dma_id = bk_dma_alloc(DMA_DEV_AUDIO);
|
||
|
if ((dma_id < DMA_ID_0) || (dma_id >= DMA_ID_MAX)) {
|
||
|
return DMA_ID_MAX;
|
||
|
}
|
||
|
|
||
|
dma_config.mode = DMA_WORK_MODE_REPEAT;
|
||
|
dma_config.chan_prio = 1;
|
||
|
dma_config.src.width = DMA_DATA_WIDTH_32BITS;
|
||
|
dma_config.dst.width = DMA_DATA_WIDTH_32BITS;
|
||
|
dma_config.src.addr_inc_en = DMA_ADDR_INC_ENABLE;
|
||
|
dma_config.src.addr_loop_en = DMA_ADDR_LOOP_ENABLE;
|
||
|
dma_config.dst.addr_inc_en = DMA_ADDR_INC_ENABLE;
|
||
|
dma_config.dst.addr_loop_en = DMA_ADDR_LOOP_ENABLE;
|
||
|
|
||
|
/* get audio adc and dac fifo address */
|
||
|
bk_aud_adc_get_fifo_addr(&aud_adc_data_addr);
|
||
|
bk_aud_dac_get_fifo_addr(&aud_dac_data_addr);
|
||
|
|
||
|
/* get i2s address */
|
||
|
bk_i2s_get_data_addr(I2S_CHANNEL_1, &i2s_data_addr);
|
||
|
|
||
|
if (state) {
|
||
|
/* audio adc to i2s by dma */
|
||
|
#if (CONFIG_SOC_BK7236XX) || (CONFIG_SOC_BK7239XX) || (CONFIG_SOC_BK7286XX)
|
||
|
dma_config.src.dev = DMA_DEV_AUDIO_RX;
|
||
|
#else
|
||
|
dma_config.src.dev = DMA_DEV_AUDIO;
|
||
|
#endif
|
||
|
#if CONFIG_SOC_BK7256XX
|
||
|
dma_config.dst.dev = DMA_DEV_I2S;
|
||
|
#endif
|
||
|
#if (CONFIG_SOC_BK7236XX) || (CONFIG_SOC_BK7239XX) || (CONFIG_SOC_BK7286XX)
|
||
|
dma_config.dst.dev = DMA_DEV_I2S1;
|
||
|
#endif
|
||
|
dma_config.dst.start_addr = i2s_data_addr;
|
||
|
dma_config.dst.end_addr = i2s_data_addr + 4;
|
||
|
dma_config.src.start_addr = aud_adc_data_addr;
|
||
|
dma_config.src.end_addr = aud_adc_data_addr + 4;
|
||
|
} else {
|
||
|
/* audio i2s to dac by dma */
|
||
|
#if CONFIG_SOC_BK7256XX
|
||
|
dma_config.src.dev = DMA_DEV_I2S_RX;
|
||
|
#endif
|
||
|
#if (CONFIG_SOC_BK7236XX) || (CONFIG_SOC_BK7239XX) || (CONFIG_SOC_BK7286XX)
|
||
|
dma_config.src.dev = DMA_DEV_I2S2_RX;
|
||
|
#endif
|
||
|
dma_config.dst.dev = DMA_DEV_AUDIO;
|
||
|
dma_config.src.start_addr = i2s_data_addr;
|
||
|
dma_config.src.end_addr = i2s_data_addr + 4;
|
||
|
dma_config.dst.start_addr = aud_dac_data_addr;
|
||
|
dma_config.dst.end_addr = aud_dac_data_addr + 4;
|
||
|
}
|
||
|
dma_config.trans_type = DMA_TRANS_DEFAULT;
|
||
|
/* init dma channel */
|
||
|
ret = bk_dma_init(dma_id, &dma_config);
|
||
|
if (ret != BK_OK) {
|
||
|
return DMA_ID_MAX;
|
||
|
}
|
||
|
|
||
|
/* set dma transfer length */
|
||
|
bk_dma_set_transfer_len(dma_id, 4);
|
||
|
|
||
|
#if (CONFIG_SPE)
|
||
|
bk_dma_set_dest_sec_attr(dma_id, DMA_ATTR_SEC);
|
||
|
bk_dma_set_src_sec_attr(dma_id, DMA_ATTR_SEC);
|
||
|
#endif
|
||
|
|
||
|
return dma_id;
|
||
|
}
|
||
|
|
||
|
static void cli_aud_i2s_dma_deconfig(void)
|
||
|
{
|
||
|
for (uint8_t i = 0; i < DMA_ID_MAX; i++) {
|
||
|
if (bk_dma_user(i) == DMA_DEV_AUDIO) {
|
||
|
bk_dma_stop(i);
|
||
|
bk_dma_deinit(i);
|
||
|
bk_dma_free(DMA_DEV_AUDIO, i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bk_dma_driver_deinit();
|
||
|
}
|
||
|
|
||
|
static void cli_aud_i2s_dma_ctrl(uint32_t state, dma_id_t adc_dma_id, dma_id_t dac_dma_id)
|
||
|
{
|
||
|
uint32_t temp_data = 0xF0F0F0F0;
|
||
|
|
||
|
if (state) {
|
||
|
/* start dma */
|
||
|
if (adc_dma_id != DMA_ID_MAX) {
|
||
|
bk_dma_start(adc_dma_id);
|
||
|
}
|
||
|
|
||
|
if (dac_dma_id != DMA_ID_MAX) {
|
||
|
bk_dma_start(dac_dma_id);
|
||
|
}
|
||
|
|
||
|
bk_i2s_write_data(0, &temp_data, 1);
|
||
|
bk_i2s_write_data(1, &temp_data, 1);
|
||
|
bk_i2s_write_data(2, &temp_data, 1);
|
||
|
// bk_i2s_write_data(3, &temp_data, 1);
|
||
|
} else {
|
||
|
/* stop dma */
|
||
|
if (adc_dma_id != DMA_ID_MAX) {
|
||
|
bk_dma_stop(adc_dma_id);
|
||
|
}
|
||
|
|
||
|
if (dac_dma_id != DMA_ID_MAX) {
|
||
|
bk_dma_stop(dac_dma_id);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
void cli_i2s_master_test_cmd(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv)
|
||
|
{
|
||
|
i2s_config_t i2s_config = DEFAULT_I2S_CONFIG();
|
||
|
bk_err_t ret = BK_OK;
|
||
|
uint32_t size = 0;
|
||
|
|
||
|
if (argc != 2) {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (os_strcmp(argv[1], "start") == 0) {
|
||
|
os_printf("i2s master test start \r\n");
|
||
|
|
||
|
ch1_temp = os_malloc(320);
|
||
|
os_memset(ch1_temp, 0xF1, 320);
|
||
|
|
||
|
//init i2s driver
|
||
|
bk_i2s_driver_init();
|
||
|
|
||
|
//init i2s configure
|
||
|
i2s_config.samp_rate = I2S_SAMP_RATE_48000;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_2, &i2s_config);
|
||
|
os_printf("init i2s driver and config successful \r\n");
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_TX, 640, ch1_tx_data_handle_cb, &ch1_tx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
uint8_t *temp_data = (uint8_t *)os_malloc(640);
|
||
|
os_memset(temp_data, 0x00, 640);
|
||
|
size = ring_buffer_write(ch1_tx_rb, temp_data, 640);
|
||
|
os_printf("ring_buffer_write, size: %d \n", size);
|
||
|
os_free(temp_data);
|
||
|
bk_i2s_start();
|
||
|
|
||
|
os_printf("i2s master test complete \r\n");
|
||
|
} else if (os_strcmp(argv[1], "stop") == 0) {
|
||
|
os_printf("i2s master test stop \r\n");
|
||
|
bk_i2s_stop();
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_1, I2S_TXRX_TYPE_TX);
|
||
|
bk_i2s_deinit();
|
||
|
bk_i2s_driver_deinit();
|
||
|
|
||
|
os_free(ch1_temp);
|
||
|
ch1_temp = NULL;
|
||
|
os_printf("i2s master test stop successful \r\n");
|
||
|
}
|
||
|
#if CLI_FOR_AUDIO_ATE_TEST
|
||
|
/*
|
||
|
Hardware connect:
|
||
|
P44 -> P40
|
||
|
P45 -> P41
|
||
|
P46 -> P43
|
||
|
P47 -> P42
|
||
|
*/
|
||
|
else if(os_strcmp(argv[1], "adc") == 0){ // mic -> I2S1
|
||
|
dma_id_t cli_adc_dma_id = DMA_ID_MAX;
|
||
|
cli_audio_adc_config(1, 0);
|
||
|
uint32_t mic1_config = 0;
|
||
|
mic1_config = sys_ll_get_ana_reg19_value();
|
||
|
os_printf("mic1_config: %x\n\r", mic1_config);
|
||
|
sys_hal_set_ana_reg27_value(mic1_config);
|
||
|
cli_i2s_config(1, 0);
|
||
|
cli_adc_dma_id = cli_aud_i2s_dma_config(1);
|
||
|
bk_i2s_enable(I2S_ENABLE);
|
||
|
cli_aud_i2s_dma_ctrl(1, cli_adc_dma_id, cli_adc_dma_id);
|
||
|
}
|
||
|
else if(os_strcmp(argv[1], "dac") == 0) // I2S2 -> DAC
|
||
|
{
|
||
|
dma_id_t cli_dac_dma_id = DMA_ID_MAX;
|
||
|
dma_id_t cli_adc_dma_id = DMA_ID_MAX;
|
||
|
cli_audio_dac_config(1, 0);
|
||
|
cli_i2s_config(1, 1);
|
||
|
bk_i2s_enable(I2S_ENABLE);
|
||
|
cli_dac_dma_id = cli_aud_i2s_dma_config(0);
|
||
|
cli_aud_i2s_dma_ctrl(1, cli_adc_dma_id, cli_dac_dma_id);
|
||
|
|
||
|
os_printf("init i2s driver and config successful \r\n");
|
||
|
}
|
||
|
else if (os_strcmp(argv[1], "mic_conf") == 0)
|
||
|
{
|
||
|
uint32_t mic1_config = 0;
|
||
|
mic1_config = sys_ll_get_ana_reg27_value();
|
||
|
os_printf("mic1_config: %x\n\r", mic1_config);
|
||
|
}
|
||
|
#endif
|
||
|
else {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void cli_i2s_slave_test_cmd(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv)
|
||
|
{
|
||
|
i2s_config_t i2s_config = DEFAULT_I2S_CONFIG();
|
||
|
bk_err_t ret = BK_OK;
|
||
|
|
||
|
if (argc != 2) {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (os_strcmp(argv[1], "start") == 0) {
|
||
|
os_printf("i2s slave test start \r\n");
|
||
|
|
||
|
ch1_temp = os_malloc(320);
|
||
|
|
||
|
//init i2s driver
|
||
|
bk_i2s_driver_init();
|
||
|
|
||
|
//init i2s configure
|
||
|
i2s_config.role = I2S_ROLE_SLAVE;
|
||
|
i2s_config.samp_rate = I2S_SAMP_RATE_48000;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
|
||
|
os_printf("init i2s driver and config successful \r\n");
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX, 640, ch1_rx_data_handle_cb, &ch1_rx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
bk_i2s_start();
|
||
|
|
||
|
os_printf("i2s slave test complete \r\n");
|
||
|
} else if (os_strcmp(argv[1], "stop") == 0) {
|
||
|
os_printf("i2s slave test stop \r\n");
|
||
|
bk_i2s_stop();
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX);
|
||
|
bk_i2s_deinit();
|
||
|
bk_i2s_driver_deinit();
|
||
|
|
||
|
os_free(ch1_temp);
|
||
|
ch1_temp = NULL;
|
||
|
os_printf("i2s slave test stop successful \r\n");
|
||
|
} else {
|
||
|
//bk_i2s_start_test();
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void cli_pcm_master_test_cmd(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv)
|
||
|
{
|
||
|
i2s_config_t i2s_config = DEFAULT_PCM_CONFIG();
|
||
|
bk_err_t ret = BK_OK;
|
||
|
uint32_t size = 0;
|
||
|
|
||
|
if (argc != 2) {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (os_strcmp(argv[1], "start") == 0) {
|
||
|
os_printf("pcm master test start \r\n");
|
||
|
|
||
|
ch1_temp = os_malloc(320);
|
||
|
os_memset(ch1_temp, 0xF1, 320);
|
||
|
|
||
|
//init i2s driver
|
||
|
bk_i2s_driver_init();
|
||
|
|
||
|
//init i2s configure
|
||
|
i2s_config.samp_rate = I2S_SAMP_RATE_48000;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
|
||
|
os_printf("init i2s driver and config successful \r\n");
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_TX, 640, ch1_tx_data_handle_cb, &ch1_tx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
uint8_t *temp_data = (uint8_t *)os_malloc(640);
|
||
|
os_memset(temp_data, 0xF1, 640);
|
||
|
size = ring_buffer_write(ch1_tx_rb, temp_data, 640);
|
||
|
os_printf("ring_buffer_write, size: %d \n", size);
|
||
|
os_free(temp_data);
|
||
|
bk_i2s_start();
|
||
|
|
||
|
os_printf("pcm master test complete \r\n");
|
||
|
} else if (os_strcmp(argv[1], "stop") == 0) {
|
||
|
os_printf("pcm master test stop \r\n");
|
||
|
bk_i2s_stop();
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_1, I2S_TXRX_TYPE_TX);
|
||
|
bk_i2s_deinit();
|
||
|
bk_i2s_driver_deinit();
|
||
|
|
||
|
os_free(ch1_temp);
|
||
|
ch1_temp = NULL;
|
||
|
os_printf("pcm master test stop successful \r\n");
|
||
|
} else {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cli_pcm_slave_test_cmd(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv)
|
||
|
{
|
||
|
i2s_config_t i2s_config = DEFAULT_PCM_CONFIG();
|
||
|
bk_err_t ret = BK_OK;
|
||
|
|
||
|
if (argc != 2) {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (os_strcmp(argv[1], "start") == 0) {
|
||
|
os_printf("pcm slave test start \r\n");
|
||
|
|
||
|
ch1_temp = os_malloc(320);
|
||
|
|
||
|
//init i2s driver
|
||
|
bk_i2s_driver_init();
|
||
|
|
||
|
//init i2s configure
|
||
|
i2s_config.samp_rate = I2S_SAMP_RATE_48000;
|
||
|
i2s_config.role = I2S_ROLE_SLAVE;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
|
||
|
os_printf("init i2s driver and config successful \r\n");
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX, 640, ch1_rx_data_handle_cb, &ch1_rx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
bk_i2s_start();
|
||
|
os_printf("pcm slave test complete \r\n");
|
||
|
} else if (os_strcmp(argv[1], "stop") == 0) {
|
||
|
os_printf("pcm slave test stop \r\n");
|
||
|
bk_i2s_stop();
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX);
|
||
|
bk_i2s_deinit();
|
||
|
bk_i2s_driver_deinit();
|
||
|
|
||
|
os_free(ch1_temp);
|
||
|
ch1_temp = NULL;
|
||
|
os_printf("pcm slave test stop successful \r\n");
|
||
|
} else {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void cli_dtm_master_test_cmd(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv)
|
||
|
{
|
||
|
i2s_config_t i2s_config = DEFAULT_TDM_CONFIG();
|
||
|
bk_err_t ret = BK_OK;
|
||
|
|
||
|
if (argc != 2) {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (os_strcmp(argv[1], "start") == 0) {
|
||
|
os_printf("pcm master test start \r\n");
|
||
|
|
||
|
ch1_temp = os_malloc(320);
|
||
|
os_memset(ch1_temp, 0xF1, 320);
|
||
|
ch2_temp = os_malloc(320);
|
||
|
os_memset(ch2_temp, 0xF2, 320);
|
||
|
ch3_temp = os_malloc(320);
|
||
|
os_memset(ch3_temp, 0xF3, 320);
|
||
|
|
||
|
//init i2s driver
|
||
|
bk_i2s_driver_init();
|
||
|
|
||
|
//init i2s configure
|
||
|
//i2s_config.samp_rate = I2S_SAMP_RATE_16000;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
|
||
|
os_printf("init i2s driver and config successful \r\n");
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_TX, 640, ch1_tx_data_handle_cb, &ch1_tx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_2, I2S_TXRX_TYPE_TX, 640, ch2_tx_data_handle_cb, &ch2_tx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_3, I2S_TXRX_TYPE_TX, 640, ch3_tx_data_handle_cb, &ch3_tx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
uint8_t *temp_data = (uint8_t *)os_malloc(640);
|
||
|
os_memset(temp_data, 0xF1, 640);
|
||
|
ring_buffer_write(ch1_tx_rb, temp_data, 640);
|
||
|
os_memset(temp_data, 0xF1, 640);
|
||
|
ring_buffer_write(ch2_tx_rb, temp_data, 640);
|
||
|
os_memset(temp_data, 0xF1, 640);
|
||
|
ring_buffer_write(ch3_tx_rb, temp_data, 640);
|
||
|
os_free(temp_data);
|
||
|
os_printf("write data ok \r\n");
|
||
|
bk_i2s_start();
|
||
|
|
||
|
os_printf("pcm master test complete \r\n");
|
||
|
} else if (os_strcmp(argv[1], "stop") == 0) {
|
||
|
os_printf("pcm master test stop \r\n");
|
||
|
bk_i2s_stop();
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_1, I2S_TXRX_TYPE_TX);
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_2, I2S_TXRX_TYPE_TX);
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_3, I2S_TXRX_TYPE_TX);
|
||
|
bk_i2s_deinit();
|
||
|
bk_i2s_driver_deinit();
|
||
|
|
||
|
os_free(ch1_temp);
|
||
|
ch1_temp = NULL;
|
||
|
os_free(ch2_temp);
|
||
|
ch2_temp = NULL;
|
||
|
os_free(ch3_temp);
|
||
|
ch3_temp = NULL;
|
||
|
os_printf("pcm master test stop successful \r\n");
|
||
|
} else {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cli_dtm_slave_test_cmd(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv)
|
||
|
{
|
||
|
i2s_config_t i2s_config = DEFAULT_TDM_CONFIG();
|
||
|
bk_err_t ret = BK_OK;
|
||
|
|
||
|
if (argc != 2) {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (os_strcmp(argv[1], "start") == 0) {
|
||
|
os_printf("dtm slave test start \r\n");
|
||
|
|
||
|
ch1_temp = os_malloc(320);
|
||
|
ch2_temp = os_malloc(320);
|
||
|
ch3_temp = os_malloc(320);
|
||
|
|
||
|
//init i2s driver
|
||
|
bk_i2s_driver_init();
|
||
|
|
||
|
//init i2s configure
|
||
|
//i2s_config.samp_rate = I2S_SAMP_RATE_48000;
|
||
|
i2s_config.role = I2S_ROLE_SLAVE;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
|
||
|
os_printf("init i2s driver and config successful \r\n");
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX, 640, ch1_rx_data_handle_cb, &ch1_rx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_2, I2S_TXRX_TYPE_RX, 640, ch2_rx_data_handle_cb, &ch2_rx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_3, I2S_TXRX_TYPE_RX, 640, ch3_rx_data_handle_cb, &ch3_rx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
bk_i2s_start();
|
||
|
os_printf("dtm slave test complete \r\n");
|
||
|
} else if (os_strcmp(argv[1], "stop") == 0) {
|
||
|
os_printf("dtm slave test stop \r\n");
|
||
|
bk_i2s_stop();
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX);
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_2, I2S_TXRX_TYPE_RX);
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_3, I2S_TXRX_TYPE_RX);
|
||
|
bk_i2s_deinit();
|
||
|
bk_i2s_driver_deinit();
|
||
|
|
||
|
os_free(ch1_temp);
|
||
|
ch1_temp = NULL;
|
||
|
os_free(ch2_temp);
|
||
|
ch2_temp = NULL;
|
||
|
os_free(ch3_temp);
|
||
|
ch3_temp = NULL;
|
||
|
os_printf("pcm slave test stop successful \r\n");
|
||
|
} else {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cli_2bd_master_test_cmd(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv)
|
||
|
{
|
||
|
i2s_config_t i2s_config = DEFAULT_2BD_CONFIG();
|
||
|
bk_err_t ret = BK_OK;
|
||
|
uint32_t size = 0;
|
||
|
|
||
|
if (argc != 2) {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (os_strcmp(argv[1], "start") == 0) {
|
||
|
os_printf("2B+D master test start \r\n");
|
||
|
|
||
|
ch1_temp = os_malloc(320);
|
||
|
os_memset(ch1_temp, 0xF1, 320);
|
||
|
|
||
|
//init i2s driver
|
||
|
bk_i2s_driver_init();
|
||
|
|
||
|
//init i2s configure
|
||
|
i2s_config.samp_rate = I2S_SAMP_RATE_48000;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
|
||
|
os_printf("init i2s driver and config successful \r\n");
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_TX, 640, ch1_tx_data_handle_cb, &ch1_tx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
uint8_t *temp_data = (uint8_t *)os_malloc(640);
|
||
|
os_memset(temp_data, 0xF1, 640);
|
||
|
size = ring_buffer_write(ch1_tx_rb, temp_data, 640);
|
||
|
os_printf("ring_buffer_write, size: %d \n", size);
|
||
|
os_free(temp_data);
|
||
|
bk_i2s_start();
|
||
|
|
||
|
os_printf("2B+D master test complete \r\n");
|
||
|
} else if (os_strcmp(argv[1], "stop") == 0) {
|
||
|
os_printf("2B+D master test stop \r\n");
|
||
|
bk_i2s_stop();
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_1, I2S_TXRX_TYPE_TX);
|
||
|
bk_i2s_deinit();
|
||
|
bk_i2s_driver_deinit();
|
||
|
|
||
|
os_free(ch1_temp);
|
||
|
ch1_temp = NULL;
|
||
|
os_printf("2B+D master test stop successful \r\n");
|
||
|
} else {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cli_2bd_slave_test_cmd(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv)
|
||
|
{
|
||
|
i2s_config_t i2s_config = DEFAULT_2BD_CONFIG();
|
||
|
bk_err_t ret = BK_OK;
|
||
|
|
||
|
if (argc != 2) {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (os_strcmp(argv[1], "start") == 0) {
|
||
|
os_printf("2B+D slave test start \r\n");
|
||
|
|
||
|
ch1_temp = os_malloc(320);
|
||
|
|
||
|
//init i2s driver
|
||
|
bk_i2s_driver_init();
|
||
|
|
||
|
//init i2s configure
|
||
|
i2s_config.role = I2S_ROLE_SLAVE;
|
||
|
i2s_config.samp_rate = I2S_SAMP_RATE_48000;
|
||
|
bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
|
||
|
os_printf("init i2s driver and config successful \r\n");
|
||
|
|
||
|
ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX, 640, ch1_rx_data_handle_cb, &ch1_rx_rb);
|
||
|
if (ret != BK_OK) {
|
||
|
os_printf("bk_i2s_chl_init fail \n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
bk_i2s_start();
|
||
|
|
||
|
os_printf("2B+D slave test complete \r\n");
|
||
|
} else if (os_strcmp(argv[1], "stop") == 0) {
|
||
|
os_printf("2B+D slave test stop \r\n");
|
||
|
bk_i2s_stop();
|
||
|
bk_i2s_chl_deinit(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX);
|
||
|
bk_i2s_deinit();
|
||
|
bk_i2s_driver_deinit();
|
||
|
|
||
|
os_free(ch1_temp);
|
||
|
ch1_temp = NULL;
|
||
|
os_printf("2B+D slave test stop successful \r\n");
|
||
|
} else {
|
||
|
cli_i2s_help();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
#define I2S_CMD_CNT (sizeof(s_i2s_commands) / sizeof(struct cli_command))
|
||
|
static const struct cli_command s_i2s_commands[] = {
|
||
|
{"i2s_master_test", "i2s_master_test {start|stop}", cli_i2s_master_test_cmd},
|
||
|
{"i2s_slave_test", "i2s_slave_test {start|stop}", cli_i2s_slave_test_cmd},
|
||
|
{"pcm_master_test", "pcm_master_test {start|stop}", cli_pcm_master_test_cmd},
|
||
|
{"pcm_slave_test", "pcm_slave_test {start|stop}", cli_pcm_slave_test_cmd},
|
||
|
{"dtm_master_test", "dtm_master_test {start|stop}", cli_dtm_master_test_cmd},
|
||
|
{"dtm_slave_test", "dtm_slave_test {start|stop}", cli_dtm_slave_test_cmd},
|
||
|
{"2bd_master_test", "2bd_master_test {start|stop}", cli_2bd_master_test_cmd},
|
||
|
{"2bd_slave_test", "2bd_slave_test {start|stop}", cli_2bd_slave_test_cmd},
|
||
|
};
|
||
|
|
||
|
int cli_i2s_init(void)
|
||
|
{
|
||
|
return cli_register_commands(s_i2s_commands, I2S_CMD_CNT);
|
||
|
}
|
||
|
|