GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)

This commit is contained in:
lai
2026-09-06 03:52:57 +08:00
commit b1928b41c0
21813 changed files with 4413081 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
ifeq ($(CFG_XMEDIA_EXPORT_FLAG),)
SDK_DIR := $(shell cd $(CURDIR)/../../.. && /bin/pwd)
endif
include $(SDK_DIR)/build/base.mk
include $(SAMPLE_DIR)/sample_base.mk
LIBS := $(SAMPLE_LIBS) $(SAMPLE_COMMON_LIB)
SAMPLE_AUDIO_AI_TARGET := ./sample_record_board_record
SAMPLE_AUDIO_DETECT_TARGET := ./sample_record_board_detect
INCLUDES += -I$(SDK_DIR)/sample/common
INCLUDES += -I$(SDK_DIR)/source/gmp/include
INCLUDES += -I$(SDK_DIR)/sample/audio/record_board/drv
SDK_USR_CFLAGS += $(SAMPLE_CFLAGS) $(LIBS) $(INCLUDES)
SAMPLE_AUDIO_AI_SRCS := ./sample_record_board_record.c
SAMPLE_AUDIO_AI_SRCS += ./drv/drv_i2c.c
SAMPLE_AUDIO_AI_SRCS += ./drv/drv_codec_es7210.c
SAMPLE_AUDIO_AI_OBJS := $(patsubst %.c, %.o, $(SAMPLE_AUDIO_AI_SRCS))
SAMPLE_AUDIO_DETECT_SRCS := ./sample_record_board_detect.c
SAMPLE_AUDIO_DETECT_SRCS += ./drv/drv_i2c.c
SAMPLE_AUDIO_DETECT_SRCS += ./drv/drv_codec_es7210.c
SAMPLE_AUDIO_DETECT_OBJS := $(patsubst %.c, %.o, $(SAMPLE_AUDIO_DETECT_SRCS))
.PHONY: all clean
all: sample_record_board_record sample_record_board_detect
sample_record_board_record: $(SAMPLE_AUDIO_AI_OBJS)
$(AT)$(CONFIG_XMEDIA_USR_ARM_TOOLCHAINS)-gcc -o $(SAMPLE_AUDIO_AI_TARGET) $^ $(SDK_USR_CFLAGS)
sample_record_board_detect: $(SAMPLE_AUDIO_DETECT_OBJS)
$(AT)$(CONFIG_XMEDIA_USR_ARM_TOOLCHAINS)-gcc -o $(SAMPLE_AUDIO_DETECT_TARGET) $^ $(SDK_USR_CFLAGS)
%.o : %.c
$(AT)$(CONFIG_XMEDIA_USR_ARM_TOOLCHAINS)-gcc -c -o $@ $< $(SDK_USR_CFLAGS)
clean:
$(AT)rm -rf $(SAMPLE_AUDIO_AI_OBJS) $(SAMPLE_AUDIO_AI_TARGET)
$(AT)rm -rf $(SAMPLE_AUDIO_DETECT_OBJS) $(SAMPLE_AUDIO_DETECT_TARGET)
+27
View File
@@ -0,0 +1,27 @@
GK7206V100 EVB 单板接线:
I2C使用I2C2,GPIO需要复用为I2C功能,代码已默认配置。
I2S使用J2座子引出的。
I2C:
麦克风采集板 RBB单板
J1座子 J6座子
=========================================================
GND ---------------------------------------- J6-20脚
SCL ---------------------------------------- 需要飞线
SDA ---------------------------------------- 需要飞线
PWR ---------------------------------------- J6-1脚
I2S:
麦克风采集板 RBB单板
J2座子 J2座子
=========================================================
BCLK ---- JTAG_TCK ---- SDIO1_CDATA1 ---- 3
WS ---- JTAG_TMS ---- SDIO1_CDATA0 ---- 5
RX ---- JTAG_TDO ---- SDIO1_CCMD ---- 7
TX ---- JATG_TDI ---- SDIO1_CCLK ---- 8
MCLK ---- JTAG_TRSTN ---- SDIO1_CDATA3 ---- 1
注意:I2S所有的地线必须接,否则有概率出现杂音。
@@ -0,0 +1,549 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include "drv_codec_es7210.h"
#include "drv_i2c.h"
/** 寄存器 */
#define RESET_CONTROL 0x00
#define CLOCK_CONTROL 0x01
#define MAIN_CLOCK_CONTROL 0x02
#define MASTER_CLOCK_CONTROL 0x03
#define MASTER_LRCK_DIV1 0x04
#define MASTER_LRCK_DIV0 0x05
#define POWER 0x06
#define ADC_OSR_CFG 0x07
#define MODE_CFG 0x08
#define CHIP_INIT_TIME_CONTROL0 0x09
#define CHIP_INIT_TIME_CONTROL1 0x0A
#define CHIP_STATUS 0x0B
#define CHIP_INTERRUPT_CONTROL 0x0C
#define MISR_CONTROL 0x0D
#define DMIC_CONTROL 0x10
#define SDP_INTERFACE_CFG1 0x11
#define SDP_INTERFACE_CFG2 0x12
#define ADC12_CONTROL 0x15
#define ADC34_CONTROL 0x14
#define ALC_SELECT 0x16
#define ALC_COMMON_CFG1 0x17
#define ALC_COMMON_CFG2 0x1A
#define ADC34_ALC_LEVEL 0x18
#define ADC12_ALC_LEVEL 0x19
#define ADC4_MAX_GAIN 0x1B
#define ADC3_MAX_GAIN 0x1C
#define ADC2_MAX_GAIN 0x1D
#define ADC1_MAX_GAIN 0x1E
#define ADC34_HPF2 0x20
#define ADC34_HPF1 0x21
#define ADC12_HPF1 0x22
#define ADC12_HPF2 0x23
#define CHIP_ID1 0x3D
#define CHIP_ID0 0x3E
#define CHIP_VERSION 0x3F
#define CHIP_ANALOG_SYSTEM 0x40
#define MIC12_BIAS 0x41
#define MIC34_BIAS 0x42
#define MIC1_GAIN 0x43
#define MIC2_GAIN 0x44
#define MIC3_GAIN 0x45
#define MIC4_GAIN 0x46
#define MIC1_LP 0x47
#define MIC2_LP 0x48
#define MIC3_LP 0x49
#define MIC4_LP 0x4A
#define MIC12_PD 0x4B
#define MIC34_PD 0x4C
typedef enum MIC_GAIN {
GAIN_0_DB = 0,
GAIN_3_DB,
GAIN_6_DB,
GAIN_9_DB,
GAIN_12_DB,
GAIN_15_DB,
GAIN_18_DB,
GAIN_21_DB,
GAIN_24_DB,
GAIN_27_DB,
GAIN_30_DB,
GAIN_33_DB,
GAIN_34_5_DB,
GAIN_36_DB,
GAIN_37_5_DB,
} MIC_GAIN_E;
typedef struct {
unsigned int ratio;
unsigned char main_clock_control_value;
unsigned char main_clock_control_double_speed_value;
unsigned char adc_osr_cfg_value;
} ES7210_MCLKFS_RATIO_CFG_S;
static const ES7210_MCLKFS_RATIO_CFG_S es7210_mclkfs_ratio_cfg[] = {
//Ratio main_clock_control_v main_clock_control_ds_v adc_osr_cfg_v
{64, 0x41, 0x01, 0x20}, // 512fs
{128, 0x01, 0xC1, 0x20},
{192, 0x43, 0x03, 0x20},
{256, 0xC1, 0x81, 0x20},
{384, 0x03, 0xC3, 0x20},
{400, 0xC1, 0x81, 0x32}, // 800fs
{512, 0x81, 0x82, 0x20},
{600, 0x05, 0xC5, 0x1E}, // 480fs
{768, 0xC3, 0x83, 0x20},
{800, 0x81, 0x82, 0x32},
{1024, 0x82, 0x84, 0x20},
{1200, 0xC5, 0x85, 0x1E},
{1500, 0x4F, 0x0F, 0x32},
{1600, 0x82, 0x84, 0x32},
{2048, 0x84, 0x88, 0x20},
{2400, 0x85, 0x8A, 0x1E},
{3000, 0x0F, 0xCF, 0x32},
};
typedef struct {
int i2c_fd;
ES7210_CHIP_NUMBER_E chip_number;
} codec_state_s;
#define ES7210_MAX_GAIN (68)
#define BCLK_DIV(mclk, sr, ch, bw) (mclk / sr / ch / bw)
static int open_i2c_fd(ES7210_I2C_CFG_S i2c_cfg)
{
int ret;
int i2c_fd;
i2c_fd = open(i2c_cfg.dev_node, O_RDWR);
if (i2c_fd < 0) {
printf("open %s failed\n", i2c_cfg.dev_node);
return -1;
}
ret = ioctl(i2c_fd, I2C_SLAVE, i2c_cfg.addr);
if (ret != 0) {
printf("set i2c slave addr(0x%x) failed\n", i2c_cfg.addr);
return -1;
}
return i2c_fd;
}
static int es7210_i2c_write(codec_handle *h_codec, unsigned int addr, unsigned int data)
{
int ret;
unsigned char buf[2];
codec_state_s *state = (codec_state_s*)h_codec;
if (state->i2c_fd < 0) {
printf("not init i2c fd\n");
return -1;
}
buf[0] = addr;
buf[1] = data;
ret = write(state->i2c_fd, buf, 2);
if (ret < 0) {
printf("i2c fd: %d write addr 0x%x data 0x%x failed\n", state->i2c_fd, addr, data);
return -1;
}
// printf("i2c fd: %d write addr 0x%x data 0x%x\n", state->i2c_fd, addr, data);
return 0;
}
static void close_i2c_fd(int fd)
{
if (fd) {
close(fd);
}
}
static int get_mclkfs_ratio_cfg(int ratio)
{
for (int i = 0; i < sizeof(es7210_mclkfs_ratio_cfg); i++) {
if (es7210_mclkfs_ratio_cfg[i].ratio == ratio) {
return i;
}
}
return -1;
}
static unsigned int get_bit_width(ES7210_BIT_WIDTH_E bit_width)
{
unsigned int cur_bit_width;
switch (bit_width) {
case ES7210_BIT_WIDTH_16:
cur_bit_width = 16;
break;
case ES7210_BIT_WIDTH_18:
cur_bit_width = 18;
break;
case ES7210_BIT_WIDTH_20:
cur_bit_width = 20;
break;
case ES7210_BIT_WIDTH_24:
cur_bit_width = 24;
break;
case ES7210_BIT_WIDTH_32:
cur_bit_width = 32;
break;
default:
cur_bit_width = 16;
break;
}
return cur_bit_width;
}
static int es7210_master_clk_ctl(codec_handle *handle, int mclk, unsigned int samplerate, unsigned int double_speed)
{
int index;
unsigned int ratio = 0;
ratio = mclk / samplerate;
es7210_i2c_write(handle, MASTER_LRCK_DIV1, ((ratio >> 8) & 0xFF));
es7210_i2c_write(handle, MASTER_LRCK_DIV0, (ratio & 0xFF));
index = get_mclkfs_ratio_cfg(ratio);
if (index == -1) {
printf("get mclkfs ratio failed\n");
return -1;
}
es7210_i2c_write(handle, MAIN_CLOCK_CONTROL, es7210_mclkfs_ratio_cfg[index].main_clock_control_value);
if (double_speed) {
es7210_i2c_write(handle, MAIN_CLOCK_CONTROL, es7210_mclkfs_ratio_cfg[index].main_clock_control_double_speed_value);
}
es7210_i2c_write(handle, ADC_OSR_CFG, es7210_mclkfs_ratio_cfg[index].adc_osr_cfg_value);
return 0;
}
static int check_parameters(ES7210_CODEC_CFG_S cfg)
{
if (cfg.vdda < ES7210_VDDA_1V8 && cfg.vdda > ES7210_VDDA_3V3) {
printf("check para vdda config error\n");
return -1;
}
if (cfg.micbias < ES7210_MICBIAS_2V18 && cfg.micbias > ES7210_MICBIAS_2V87) {
printf("check para micbiad config error\n");
return -1;
}
if (cfg.chip_number < ES7210_CHIP_NUMBER_0 && cfg.chip_number > ES7210_CHIP_NUMBER_3) {
printf("check para chip_number config error\n");
return -1;
}
if (cfg.chip_flag < ES7210_LAST && cfg.chip_flag > ES7210_NO_LAST) {
printf("check para chip_flag config error\n");
return -1;
}
if (cfg.i2s_cfg.mode != ES7210_SLAVER && cfg.i2s_cfg.mode != ES7210_MASTER) {
printf("check para i2s_cfg.mode config error\n");
return -1;
}
if (cfg.i2s_cfg.format < ES7210_I2S_STD && cfg.i2s_cfg.format > ES7210_TDM_NLRCK_DSPB) {
printf("check para i2s_cfg.format config error\n");
return -1;
}
if (cfg.i2s_cfg.mclk_source < ES7210_MCLK_SOURCE_DEFAULT && cfg.i2s_cfg.mclk_source > ES7210_MCLK_SOURCE_BCLK) {
printf("check para i2s_cfg.mclk_source config error\n");
return -1;
}
if (cfg.i2s_cfg.bclk_inv_mode < ES7210_BCLK_NORMAL && cfg.i2s_cfg.bclk_inv_mode > ES7210_BCLK_INV) {
printf("check para i2s_cfg.bclk_inv_mode config error\n");
return -1;
}
if (cfg.channels < ES7210_CHANNELS_2 && cfg.channels > ES7210_CHANNELS_16) {
printf("check para channels config error\n");
return -1;
}
if (cfg.samplerate < ES7210_SAMPLE_RATE_8000 && cfg.samplerate > ES7210_SAMPLE_RATE_96000) {
printf("check para samplerate config error\n");
return -1;
}
if (cfg.bitwidth < ES7210_BIT_WIDTH_24 && cfg.bitwidth > ES7210_BIT_WIDTH_32) {
printf("check para bitwidth config error\n");
return -1;
}
return 0;
}
int es7210_init(codec_handle *h_codec, ES7210_CODEC_CFG_S *cfg)
{
int ret = -1;
int fd = -1;
unsigned int max_channel = 2;
unsigned int double_speed = 0;
unsigned int temp_value = 0x00;
codec_state_s *state = NULL;
ES7210_CODEC_CFG_S *init_cfg = cfg;
ret = check_parameters(*init_cfg);
if (ret < 0) {
printf("check parameters failed\n");
return ret;
}
init_cfg->i2c_cfg.i2c_gpio_map_cb();
init_cfg->i2s_cfg.i2s_gpio_map_cb();
fd = open_i2c_fd(init_cfg->i2c_cfg);
if (fd < 0) {
printf("open i2c failed. fd=%d\n", fd);
return -1;
}
printf("get i2c fd: %d, success.\n", fd);
state = (codec_state_s*)malloc(sizeof(codec_state_s));
if (state == NULL) {
printf("malloc codec_state_s handle failed\n");
return -1;
}
memset(state, 0x00, sizeof(codec_state_s));
state->i2c_fd = fd;
state->chip_number = init_cfg->chip_flag;
*h_codec = state;
/* reset adc and power down */
es7210_i2c_write(*h_codec, RESET_CONTROL, 0xff);
/* reset adc and digital */
es7210_i2c_write(*h_codec, RESET_CONTROL, 0x32);
/* chip init period control */
es7210_i2c_write(*h_codec, CHIP_INIT_TIME_CONTROL0, 0x20);
es7210_i2c_write(*h_codec, CHIP_INIT_TIME_CONTROL1, 0x10);
/* adc12 hpf */
es7210_i2c_write(*h_codec, ADC12_HPF2, 0x2A);
es7210_i2c_write(*h_codec, ADC12_HPF1, 0x0A | (init_cfg->track_mode.adc12 << 6));
/* adc34 hpf */
es7210_i2c_write(*h_codec, ADC34_HPF1, 0x2A);
es7210_i2c_write(*h_codec, ADC34_HPF2, 0x0A | (init_cfg->track_mode.adc34 << 6));
/* Mode Config */
/** 超过48K采样率,必须使能DoubleSpeed才能工作 */
if (init_cfg->samplerate > ES7210_SAMPLE_RATE_48000) {
double_speed = 1;
}
/** TDM模式下,使用倍频LRCK,才需要配置,其他模式下默认为2即可 */
if (init_cfg->i2s_cfg.format >= ES7210_TDM_NLRCK_I2S) {
max_channel = init_cfg->channels;
}
temp_value = (max_channel << 3) + (init_cfg->i2s_cfg.bclk_inv_mode << 3) + 0x04 + (double_speed << 1) + init_cfg->i2s_cfg.mode;
es7210_i2c_write(*h_codec, MODE_CFG, temp_value);
/* SDP Interface Config */
switch (init_cfg->i2s_cfg.format) {
case ES7210_I2S_STD:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x00);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x00);
break;
case ES7210_I2S_LJ:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x01);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x00);
break;
case ES7210_DSPA:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x03);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x00);
break;
case ES7210_DSPB:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x23);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x00);
break;
case ES7210_TDM_NLRCK_I2S:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x00);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x03);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, (init_cfg->chip_flag << 2) + 0x03);
break;
case ES7210_TDM_NLRCK_LJ:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x01);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x03);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, (init_cfg->chip_flag << 2) + 0x03);
break;
case ES7210_TDM_NLRCK_DSPA:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x03);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x03);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, (init_cfg->chip_flag << 2) + 0x03);
break;
case ES7210_TDM_NLRCK_DSPB:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x23);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x03);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, (init_cfg->chip_flag << 2) + 0x03);
break;
case ES7210_TDM_I2S:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x00);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x02);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, (init_cfg->chip_flag << 2) + 0x02);
break;
case ES7210_TDM_LJ:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x01);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x02);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, (init_cfg->chip_flag << 2) + 0x02);
break;
case ES7210_TDM_DSPA:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x03);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x01);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, (init_cfg->chip_flag << 2) + 0x01);
break;
case ES7210_TDM_DSPB:
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG1, (init_cfg->bitwidth << 5) + 0x23);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, 0x01);
es7210_i2c_write(*h_codec, SDP_INTERFACE_CFG2, (init_cfg->chip_flag << 2) + 0x01);
break;
default:
break;
}
/* analog sysytem */
es7210_i2c_write(*h_codec, CHIP_ANALOG_SYSTEM, 0xC3 - (init_cfg->vdda << 5) + (0x0C * init_cfg->vdda));
/* adc control */
es7210_i2c_write(*h_codec, ADC34_CONTROL, 0x3C);
es7210_i2c_write(*h_codec, ADC12_CONTROL, 0x3C);
/* alc common config 1 */
es7210_i2c_write(*h_codec, ALC_COMMON_CFG1, 0x00); // 0.25dB/2LRCK
/* mic bias config */
es7210_i2c_write(*h_codec, MIC12_BIAS, (init_cfg->micbias << 4));
es7210_i2c_write(*h_codec, MIC34_BIAS, (init_cfg->micbias << 4));
/* mic low power, set PGA low power */
es7210_i2c_write(*h_codec, MIC1_LP, 0x08);
es7210_i2c_write(*h_codec, MIC2_LP, 0x08);
es7210_i2c_write(*h_codec, MIC3_LP, 0x08);
es7210_i2c_write(*h_codec, MIC4_LP, 0x08);
/* default ADC PGA Gain = 10dB */
es7210_i2c_write(*h_codec, MIC1_GAIN, 0x1A);
es7210_i2c_write(*h_codec, MIC2_GAIN, 0x1A);
es7210_i2c_write(*h_codec, MIC3_GAIN, 0x1A);
es7210_i2c_write(*h_codec, MIC4_GAIN, 0x1A);
/* default ADC Gain = 0dB */
es7210_i2c_write(*h_codec, ADC4_MAX_GAIN, 0xBF);
es7210_i2c_write(*h_codec, ADC3_MAX_GAIN, 0xBF);
es7210_i2c_write(*h_codec, ADC2_MAX_GAIN, 0xBF);
es7210_i2c_write(*h_codec, ADC1_MAX_GAIN, 0xBF);
/* BLCK DIV */
temp_value = BCLK_DIV(init_cfg->i2s_cfg.mclk, init_cfg->samplerate, (init_cfg->channels * 2), get_bit_width(init_cfg->bitwidth));
if (temp_value > 127) {
printf("BCLK DIV is too lager. div=%d\n", temp_value);
goto EXIT;
}
printf("mclk: %d, sr: %d, ch: %d, bw: %d, div: %d(0x%x)\n",
init_cfg->i2s_cfg.mclk, init_cfg->samplerate, init_cfg->channels, get_bit_width(init_cfg->bitwidth), temp_value, temp_value);
es7210_i2c_write(*h_codec, MASTER_CLOCK_CONTROL, temp_value);
/* power on */
es7210_i2c_write(*h_codec, POWER, 0x00);
if (init_cfg->i2s_cfg.mode == ES7210_MASTER) {
/* master mode config clk div */
es7210_master_clk_ctl(*h_codec, init_cfg->i2s_cfg.mclk, init_cfg->samplerate, double_speed);
}
// /* mic power down */
es7210_i2c_write(*h_codec, MIC12_PD, 0x0F);
es7210_i2c_write(*h_codec, MIC34_PD, 0x0F);
if (init_cfg->i2s_cfg.mode == ES7210_MASTER) {
es7210_i2c_write(*h_codec, CLOCK_CONTROL, 0x40);
es7210_i2c_write(*h_codec, RESET_CONTROL, 0x71);
es7210_i2c_write(*h_codec, RESET_CONTROL, 0x01);
es7210_i2c_write(*h_codec, MODE_CFG,
(init_cfg->channels << 3) + (init_cfg->i2s_cfg.bclk_inv_mode << 3) + 0x04 + (double_speed << 1) + init_cfg->i2s_cfg.mode);
}
if (init_cfg->i2s_cfg.mode == ES7210_SLAVER) {
es7210_i2c_write(*h_codec, RESET_CONTROL, 0x71);
es7210_i2c_write(*h_codec, RESET_CONTROL, 0x41);
}
return 0;
EXIT:
free(state);
return ret;
}
int es7210_deinit(codec_handle *h_codec)
{
codec_state_s *state = (codec_state_s*)h_codec;
if (state == NULL) {
printf("codec handle is NULL, don't deinit\n");
return -1;
}
close_i2c_fd(state->i2c_fd);
memset(state, 0x00, sizeof(codec_state_s));
free(state);
return 0;
}
int es7210_set_volume(codec_handle *h_codec, unsigned int vol)
{
unsigned int pga_gain = 0;
unsigned int adc_gain = 0;
if (!h_codec) {
printf("handle is not init\n");
return -1;
}
if (vol < 0 && vol > ES7210_MAX_GAIN) {
printf("set volume value error\n");
return -1;
}
#if 1
if (vol > 36) {
pga_gain = 36;
adc_gain = vol - 36;
} else {
pga_gain = vol;
}
#else
if (vol >= 18) {
pga_gain = 18;
adc_gain = vol - 18;
} else {
pga_gain = vol;
}
#endif
es7210_i2c_write(h_codec, MIC1_GAIN, 0x10 + (pga_gain / 3));
es7210_i2c_write(h_codec, MIC2_GAIN, 0x10 + (pga_gain / 3));
es7210_i2c_write(h_codec, MIC3_GAIN, 0x10 + (pga_gain / 3));
es7210_i2c_write(h_codec, MIC4_GAIN, 0x10 + (pga_gain / 3));
/** ADC Gain Step 0.5dB, range: [-95.5, 32]: [0x00, 0xFF], 0xBF=0dB*/
es7210_i2c_write(h_codec, ADC4_MAX_GAIN, 0xBF + (adc_gain << 1));
es7210_i2c_write(h_codec, ADC3_MAX_GAIN, 0xBF + (adc_gain << 1));
es7210_i2c_write(h_codec, ADC2_MAX_GAIN, 0xBF + (adc_gain << 1));
es7210_i2c_write(h_codec, ADC1_MAX_GAIN, 0xBF + (adc_gain << 1));
printf("set es7210 vol(%d) success\n", vol);
return 0;
}
@@ -0,0 +1,158 @@
#ifndef __DRV_CODEC_ES7210_H__
#define __DRV_CODEC_ES7210_H__
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
typedef void *codec_handle;
typedef void (*fn_i2c_gpio_map_cb)(void);
typedef void (*fn_i2s_gpio_map_cb)(void);
typedef enum ES7210_CHANNEL_E {
ES7210_CHANNELS_2 = 2,
ES7210_CHANNELS_4 = 4,
ES7210_CHANNELS_6 = 6,
ES7210_CHANNELS_8 = 8,
ES7210_CHANNELS_10 = 10,
ES7210_CHANNELS_12 = 12,
ES7210_CHANNELS_14 = 14,
ES7210_CHANNELS_16 = 16,
} ES7210_CHANNEL_E;
typedef enum ES7210_TRACK_MODE_E {
ES7210_TRACK_NORMAL = 0,
ES7210_TRACK_BOTH_LEFT,
ES7210_TRACK_BOTH_RIGHT,
ES7210_TRACK_EXCHANGE,
} ES7210_TRACK_MODE_E;
typedef enum ES7210_SAMPLE_RATE_E {
ES7210_SAMPLE_RATE_8000 = 8000,
ES7210_SAMPLE_RATE_12000 = 12000,
ES7210_SAMPLE_RATE_11025 = 11025,
ES7210_SAMPLE_RATE_16000 = 16000,
ES7210_SAMPLE_RATE_22050 = 22050,
ES7210_SAMPLE_RATE_24000 = 24000,
ES7210_SAMPLE_RATE_32000 = 32000,
ES7210_SAMPLE_RATE_44100 = 44100,
ES7210_SAMPLE_RATE_48000 = 48000,
ES7210_SAMPLE_RATE_64000 = 64000,
ES7210_SAMPLE_RATE_96000 = 96000,
} ES7210_SAMPLE_RATE_E;
typedef enum ES7210_BIT_WIDTH_E {
ES7210_BIT_WIDTH_24 = 0,
ES7210_BIT_WIDTH_20 = 1,
ES7210_BIT_WIDTH_18 = 2,
ES7210_BIT_WIDTH_16 = 3,
ES7210_BIT_WIDTH_32 = 4,
} ES7210_BIT_WIDTH_E;
typedef enum ES7210_I2S_MODE_E {
ES7210_SLAVER = 0,
ES7210_MASTER = 1
} ES7210_I2S_MODE_E;
typedef enum ES7210_I2S_FORMAT_E {
ES7210_I2S_STD = 0, /** i2s standard mode, only transfer two channels data */
ES7210_I2S_LJ, /** left justified mode, only transfer two channels data */
ES7210_DSPA, /** pcm mode A */
ES7210_DSPB, /** pcm mode B */
ES7210_TDM_I2S, /** tdm i2s mode */
ES7210_TDM_LJ, /** tdm left justified mode */
ES7210_TDM_DSPA, /** tdm pcm mode A */
ES7210_TDM_DSPB, /** tdm pcm mode B */
ES7210_TDM_NLRCK_I2S,
ES7210_TDM_NLRCK_LJ,
ES7210_TDM_NLRCK_DSPA,
ES7210_TDM_NLRCK_DSPB,
} ES7210_I2S_FORMAT_E;
typedef enum ES7210_CHIPFLAG_E {
ES7210_LAST = 0, /* TMD级联模式,最后一片codec */
ES7210_NO_LAST, /* TMD级联模式,不是最后一片codec */
} ES7210_CHIPFLAG_E;
typedef enum ES7210_CHIP_NUMBER_E {
ES7210_CHIP_NUMBER_0 = 0,
ES7210_CHIP_NUMBER_1,
ES7210_CHIP_NUMBER_2,
ES7210_CHIP_NUMBER_3,
} ES7210_CHIP_NUMBER_E;
typedef enum ES7210_VDDA_E {
ES7210_VDDA_3V3 = 0x00,
ES7210_VDDA_1V8 = 0x01,
} ES7210_VDDA_E;
typedef enum ES7210_VOL_TYPE_E {
ES7210_PGA_VOL = 0,
ES7210_ADC_VOL,
} ES7210_VOL_TYPE_E;
typedef enum ES7210_MCLK_SOURCE_E {
ES7210_MCLK_SOURCE_DEFAULT = 0,
ES7210_MCLK_SOURCE_BCLK = 1,
} ES7210_MCLK_SOURCE_E;
typedef enum ES7210_BCLK_INV_MODE_E {
ES7210_BCLK_NORMAL = 0,
ES7210_BCLK_INV = 1,
} ES7210_BCLK_INV_MODE_E;
typedef enum ES7210_MICBIAS_E {
ES7210_MICBIAS_2V18 = 0,
ES7210_MICBIAS_2V26,
ES7210_MICBIAS_2V36,
ES7210_MICBIAS_2V45,
ES7210_MICBIAS_2V55,
ES7210_MICBIAS_2V66,
ES7210_MICBIAS_2V78,
ES7210_MICBIAS_2V87,
} ES7210_MICBIAS_E;
typedef struct {
ES7210_TRACK_MODE_E adc12;
ES7210_TRACK_MODE_E adc34;
} ES7210_TRACK_MODE_S;
typedef struct {
char dev_node[128]; /** i2c驱动节点描述符 */
unsigned int addr; /** i2c地址 */
fn_i2c_gpio_map_cb i2c_gpio_map_cb; /** i2c管脚映射回调函数 */
} ES7210_I2C_CFG_S;
typedef struct {
unsigned int mclk;
ES7210_I2S_MODE_E mode; /** 主从模式配置 */
ES7210_I2S_FORMAT_E format; /** 数据传输格式配置 */
ES7210_MCLK_SOURCE_E mclk_source; /** MCLK时钟源 */
ES7210_BCLK_INV_MODE_E bclk_inv_mode; /** BCLK极性是否反转 */
fn_i2s_gpio_map_cb i2s_gpio_map_cb; /** i2s管脚映射回调函数 */
} ES7210_I2S_CFG_S;
typedef struct {
ES7210_VDDA_E vdda; /** vdda必须配置和io电压相等,否则会出现i2s读数据出错 */
ES7210_MICBIAS_E micbias; /** 硅麦保持默认即可,驻极体麦克风根据硬件配置 */
ES7210_CHIP_NUMBER_E chip_number; /** 芯片级联时配置芯片编号 */
ES7210_CHIPFLAG_E chip_flag; /** 芯片级联时是否为最后一片 */
ES7210_I2C_CFG_S i2c_cfg; /** i2c 配置 */
ES7210_I2S_CFG_S i2s_cfg; /** i2s 配置 */
ES7210_CHANNEL_E channels; /** 声道 */
ES7210_SAMPLE_RATE_E samplerate; /** 采样率 */
ES7210_BIT_WIDTH_E bitwidth; /** 位宽 */
ES7210_TRACK_MODE_S track_mode; /** 声道模式 */
} ES7210_CODEC_CFG_S;
int es7210_init(codec_handle *h_codec, ES7210_CODEC_CFG_S *cfg);
int es7210_deinit(codec_handle *h_codec);
int es7210_set_volume(codec_handle *h_codec, unsigned int vol);
#endif
+67
View File
@@ -0,0 +1,67 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include "drv_i2c.h"
int i2c_write(int fd, unsigned int dev_addr, unsigned int reg_addr, unsigned char *data, int len)
{
int ret;
unsigned char *wr_data = NULL;
ret = ioctl(fd, I2C_SLAVE, dev_addr);
if (ret < 0) {
printf("set i2c slave addr failed\n");
return ret;
}
wr_data = malloc(len + 1);
if (!wr_data) {
printf("malloc failed\n");
return -1;
}
wr_data[0] = reg_addr;
memcpy(&wr_data[1], data, len);
ret = write(fd, wr_data, len+1);
if (ret < 0) {
printf("i2c write addr 0x%x failed\n", reg_addr);
}
free(wr_data);
return ret;
}
int i2c_read(int fd, unsigned int dev_addr, unsigned int reg_addr, unsigned char *val, int len)
{
int ret;
unsigned char buf[1];
ret = ioctl(fd, I2C_SLAVE, dev_addr);
if (ret < 0) {
printf("set i2c slave addr failed\n");
return -1;
}
buf[0] = reg_addr;
ret = write(fd, buf, 1);
if (ret < 0) {
printf("write addr failed\n");
return ret;
}
ret = read(fd, val, len);
if (ret < 0) {
printf("read value failed\n");
}
return ret;
}
+10
View File
@@ -0,0 +1,10 @@
#ifndef __DRV_I2C_H__
#define __DRV_I2C_H__
#include <stdio.h>
#include <unistd.h>
int i2c_write(int fd, unsigned int dev_addr, unsigned int reg_addr, unsigned char *data, int len);
int i2c_read(int fd, unsigned int dev_addr, unsigned int reg_addr, unsigned char *val, int len);
#endif
@@ -0,0 +1,95 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include "drv_led_ctl.h"
#include "drv_i2c.h"
#define LP5864_DEV_I2C_NODE "/dev/i2c-0"
static int lp5864_i2c_write(unsigned int dev_addr, unsigned int reg_addr, unsigned int data)
{
int fd;
int ret;
unsigned char buf[1] = { 0 };
fd = open(LP5864_DEV_I2C_NODE, O_RDWR);
if (fd < 0) {
printf("open %s failed\n", LP5864_DEV_I2C_NODE);
return -1;
}
buf[0] = data;
ret = i2c_write(fd, dev_addr, reg_addr, buf, 1);
close(fd);
return ret;
}
static int lp5864_i2c_read(unsigned int dev_addr, unsigned int reg_addr, unsigned char *value)
{
int fd;
int ret;
fd = open(LP5864_DEV_I2C_NODE, O_RDWR);
if (fd < 0) {
printf("open %s failed\n", LP5864_DEV_I2C_NODE);
return -1;
}
ret = i2c_read(fd, dev_addr, reg_addr, value, 1);
close(fd);
return ret;
}
int lp5864_power(LP5864_POWER_E power)
{
return lp5864_i2c_write(LP5864_SLAVE_ADDR, LP5864_REG_CHIP_EN, power);
}
int lp5864_set_mode(LP5864_MODE_E mode)
{
unsigned char value;
lp5864_i2c_read(LP5864_SLAVE_ADDR, LP5864_REG_DEV_INIT, &value);
value = value & (mode << 1);
return lp5864_i2c_write(LP5864_SLAVE_ADDR, LP5864_REG_DEV_INIT, value);
}
int lp5864_mode1_update_led(unsigned int led_number)
{
int i;
unsigned int onoff_reg;
for (i = 0; i < LP5864_MAX_LEDS; i++) {
lp5864_i2c_write(LP5864_SLAVE_ADDR_PWM, i, 0x00);
}
onoff_reg = 71 - (0x12 * (led_number % 4) + (led_number / 4));
printf("lp5864 open led number: %d\n", onoff_reg);
return lp5864_i2c_write(LP5864_SLAVE_ADDR_PWM, onoff_reg, 0xff);
}
void lp5864_model1_led_test(void)
{
int i;
// one by one open led.
for (i = 0; i < LP5864_MAX_LEDS; i++) {
lp5864_i2c_write(LP5864_SLAVE_ADDR_PWM, i, 0xff);
usleep(10000);
}
// close all leds.
for (i = 0; i < LP5864_MAX_LEDS; i++) {
lp5864_i2c_write(LP5864_SLAVE_ADDR_PWM, i, 0x00);
}
}
@@ -0,0 +1,43 @@
#ifndef __DRV_LED_CTL_H__
#define __DRV_LED_CTL_H__
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
typedef enum LP5864_POWER {
POWER_UP = 0x01,
POWER_DOWN = 0x00
} LP5864_POWER_E;
typedef enum LP5864_MODE {
LP5864_MODE_1 = 0,
LP5864_MODE_2 = 1,
LP5864_MODE_3 = 2,
} LP5864_MODE_E;
#define LP5864_MAX_LEDS 72
/** lp5864 I2C addr */
#define LP5864_SLAVE_ADDR 0x48
#define LP5864_SLAVE_ADDR_PWM 0x4a
/** lp5864 reg */
#define LP5864_REG_CHIP_EN 0x00
#define LP5864_REG_DEV_INIT 0x01
#define LP5864_REG_DEV_CONFIG1 0x02
#define LP5864_REG_DEV_CONFIG2 0x03
#define LP5864_REG_DEV_CONFIG3 0x04
#define LP5864_REG_GLOBAL_BRI 0x05
#define LP5864_REG_GROUP0_BRI 0x06
#define LP5864_REG_GPOUP1_BRI 0x07
#define LP5864_REG_GROUP2_BRI 0x08
#define LP5864_REG_RESET 0x9A
int lp5864_power(LP5864_POWER_E power);
int lp5864_set_mode(LP5864_MODE_E mode);
int lp5864_mode1_update_led(unsigned int led_number);
void lp5864_model1_led_test(void);
#endif
@@ -0,0 +1,477 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <pthread.h>
//#include "sample_comm.h"
#include "xmedia_audio_common.h"
#include "xmedia_audio_ai.h"
#include "xmedia_audio_vqe.h"
#include "xmedia_audio_vqe_detect.h"
#include "sample_comm_audio.h"
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include "drv_codec_es7210.h"
#include "drv_i2c.h"
#define ES7210_CODEC_I2C_NODE "/dev/i2c-2"
#define ES7210_CODEC_I2C_ADDR 0x40
#define ES7210B_CODEC_I2C_ADDR 0x41
static codec_handle g_h_codec;
static xmedia_u32 mic_distance = 50;
#define SAMPLE_AUDIO_DBG printf
#define MAX_FILE_NAME_LEN 128
#define FRAME_TIME 10 //ms
#define CRY_ALARMLIMIT 80 // probability greater than which to count as one cry frame
#define CRY_TIMELIMITCNT 3 // number of cry frame count as one cry event
#define CRY_TIMELIMIT 5 // time interval to report cry event
#define CRY_ALARMINTERVAL 3 // alarm interval time to unfreeze
#define GBD_TIMELIMIT 100 // time interval to report gbd event
#define GBD_TIMELIMITCNT 1 // number of gbd frame count as one gbd event
#define GBD_ALARMLIMIT 70 // probability greater than which to count as one gbd frame
#define GBD_ALARMINTERVAL 3 // alarm interval time to unfreeze
typedef struct user_input_args {
xmedia_char* sample;
audio_sample_rate sample_rate;
audio_sample_rate usr_sample_rate;
audio_channel channels;
xmedia_s32 codec_input_vol;
char output_file_name[MAX_FILE_NAME_LEN];
FILE *output_fd[2];
} user_input_args;
static user_input_args g_user_input_args;
static sample_ai_config g_ai_config;
static ai_vqe_attr_detect ai_detect_attr;
static xmedia_u32 g_vqe_type;
static xmedia_void gpio_map_to_i2s(xmedia_void)
{
char cmds[128];
sprintf(cmds, "xmmm 0x100c0010 0x100b"); // I2S_MCLK
system(cmds);
sprintf(cmds, "xmmm 0x100c0000 0x100b"); // I2S_BCLK_TX
system(cmds);
sprintf(cmds, "xmmm 0x100c0004 0x100b"); // I2S_WS_TX
system(cmds);
sprintf(cmds, "xmmm 0x100c000c 0x100b"); // I2S_DATA_RX
system(cmds);
}
void gpio_map_to_i2c(void)
{
char cmds[128];
sprintf(cmds, "xmmm 0x11980014 0x1002");//I2C2_SCL
system(cmds);
sprintf(cmds, "xmmm 0x11980018 0x1002");//I2C2_SDA
system(cmds);
}
static xmedia_void es7210_config(xmedia_void)
{
ES7210_CODEC_CFG_S codec_cfg = {0};
strcpy(codec_cfg.i2c_cfg.dev_node, ES7210_CODEC_I2C_NODE);
codec_cfg.i2c_cfg.addr = ES7210_CODEC_I2C_ADDR;
codec_cfg.i2c_cfg.i2c_gpio_map_cb = (fn_i2c_gpio_map_cb)gpio_map_to_i2c;
codec_cfg.micbias = ES7210_MICBIAS_2V87;
codec_cfg.vdda = ES7210_VDDA_3V3;
codec_cfg.chip_flag = ES7210_LAST;
codec_cfg.chip_flag = ES7210_CHIP_NUMBER_0;
codec_cfg.channels = ES7210_CHANNELS_2;
codec_cfg.samplerate = g_user_input_args.sample_rate;
codec_cfg.bitwidth = ES7210_BIT_WIDTH_16;
codec_cfg.track_mode.adc12 = ES7210_TRACK_NORMAL;
codec_cfg.track_mode.adc34 = ES7210_TRACK_NORMAL;
codec_cfg.i2s_cfg.mode = ES7210_SLAVER;
codec_cfg.i2s_cfg.format = ES7210_I2S_STD;
codec_cfg.i2s_cfg.bclk_inv_mode = ES7210_BCLK_NORMAL;
codec_cfg.i2s_cfg.mclk_source = ES7210_MCLK_SOURCE_DEFAULT;
codec_cfg.i2s_cfg.i2s_gpio_map_cb = (fn_i2s_gpio_map_cb)gpio_map_to_i2s;
switch (g_user_input_args.sample_rate) {
case 8000:
codec_cfg.i2s_cfg.mclk = 2048000;
break;
case 16000:
codec_cfg.i2s_cfg.mclk = 4096000;
break;
case 32000:
codec_cfg.i2s_cfg.mclk = 8192000;
break;
case 64000:
codec_cfg.i2s_cfg.mclk = 8192000;
break;
case 48000:
codec_cfg.i2s_cfg.mclk = 12288000;
break;
case 44100:
codec_cfg.i2s_cfg.mclk = 11289600;
break;
default:
break;
}
es7210_init(&g_h_codec, &codec_cfg);
es7210_set_volume(g_h_codec, 50);
}
xmedia_void es7210_destroy(xmedia_void)
{
es7210_deinit(g_h_codec);
}
static xmedia_s32 cry_callback(xmedia_void *attr)
{
static xmedia_s32 count = 0;
printf("cry callback count(%d)\n" ,count++);
return XMEDIA_SUCCESS;
}
static xmedia_s32 gbd_callback(xmedia_void *attr)
{
static xmedia_s32 count = 0;
printf("gbd callback count(%d)\n" ,count++);
return XMEDIA_SUCCESS;
}
static xmedia_s32 ssl_callback(xmedia_void* attr, xmedia_s32 out)
{
static xmedia_s32 ssl_out = 0;
static xmedia_s32 call_times = 0;
call_times++;
if (ssl_out != out) {
printf("attr(0x%x), call_times(%d), out_angle(%d)\n", (xmedia_u32)attr, call_times, out);
}
ssl_out = out;
return XMEDIA_SUCCESS;
}
static xmedia_s32 ved_callback(xmedia_void* private, xmedia_bool is_event, xmedia_bool is_mutation, xmedia_s32 out_db)
{
if (is_event) {
printf("volume event detect out_db = %d\n",out_db);
}
if (is_mutation) {
printf("volume mutation detect out_db = %d\n", out_db);
}
return XMEDIA_SUCCESS;
}
static xmedia_void load_ai_detect_attr(ai_vqe_attr* attr, xmedia_u32 sample_rate)
{
ai_vqe_attr_detect* detect_attr = &ai_detect_attr;
attr->version = AI_VQE_DETECT_ATTR_VERSION_1;
attr->work_sample_rate = sample_rate;
attr->in_channels = g_ai_config.dev_attr.channels;
if (g_vqe_type == 1) {
detect_attr->mask =VQE_DETECT_MASK_BCD;
} else if (g_vqe_type == 2) {
if (attr->work_sample_rate == AUDIO_SAMPLE_RATE_16000) {
g_ai_config.res_enable = XMEDIA_TRUE;
}
detect_attr->mask = VQE_DETECT_MASK_GBD;
} else if (g_vqe_type == 3) {
detect_attr->mask = VQE_DETECT_MASK_SSL;
} else if (g_vqe_type == 4) {
detect_attr->mask = VQE_DETECT_MASK_VED;
} else if (g_vqe_type == 5) {
detect_attr->mask = VQE_DETECT_MASK_BCD | VQE_DETECT_MASK_HPF | VQE_DETECT_MASK_VED | VQE_DETECT_MASK_SSL;
}
detect_attr->hpf_attr.mode = VQE_DET_USR_MODE_AUTO;
detect_attr->hpf_attr.freq = VQE_DETECT_HPF_FREQ_80;
detect_attr->bcd_attr.usr_mode = XMEDIA_TRUE;
detect_attr->bcd_attr.bypass = XMEDIA_FALSE;
detect_attr->bcd_attr.alarm_threshold = CRY_ALARMLIMIT;
detect_attr->bcd_attr.time_limit = CRY_TIMELIMIT;
detect_attr->bcd_attr.time_limit_threshold_count = CRY_TIMELIMITCNT;
detect_attr->bcd_attr.interval_time = CRY_ALARMINTERVAL;
/*just for npu bcd lib*/
detect_attr->bcd_attr.bcd_model.load_type = XMEDIA_CL_LOAD_FILE;
detect_attr->bcd_attr.bcd_model.model_info.file.pathname = "../audio_xmm/bcd_neuron_network.xmm";
detect_attr->bcd_attr.callback = (fn_bcd_callback)cry_callback;
detect_attr->ssl_attr.mic_distance = mic_distance;
detect_attr->ssl_attr.shape = 0;
detect_attr->ssl_attr.sensitivity_level = 5;
detect_attr->ssl_attr.callback = (fn_detect_ssl_callback)ssl_callback;
detect_attr->ssl_attr.private_data = (xmedia_void*)0x12345678;
detect_attr->ved_attr.mode = VQE_DET_USR_MODE_AUTO;
detect_attr->ved_attr.volume_threshold = -15;
detect_attr->ved_attr.mutation_flag = 1;
detect_attr->ved_attr.fast_change_threshold = 15;
detect_attr->ved_attr.slow_change_threshold = 8;
detect_attr->ved_attr.callback = (fn_detect_ved_callback)ved_callback;
detect_attr->gbd_attr.usr_mode = XMEDIA_TRUE;
detect_attr->gbd_attr.bypass = XMEDIA_FALSE;
detect_attr->gbd_attr.alarm_threshold = GBD_ALARMLIMIT;
detect_attr->gbd_attr.time_limit = GBD_TIMELIMIT;
detect_attr->gbd_attr.time_limit_threshold_count = GBD_TIMELIMITCNT;
detect_attr->gbd_attr.interval_time = GBD_ALARMINTERVAL;
/*just for npu gbd lib*/
detect_attr->gbd_attr.gbd_model.load_type = XMEDIA_CL_LOAD_FILE;
detect_attr->gbd_attr.gbd_model.model_info.file.pathname = "../audio_xmm/gbd_neuron_network.xmm";
detect_attr->gbd_attr.callback = (fn_detect_gbd_callback)gbd_callback;
attr->attr = (xmedia_void*)&ai_detect_attr;
}
static xmedia_s32 sample_ai_config_init(xmedia_void)
{
g_ai_config.dev = XMEDIA_AI_DEV_I2S0;
sample_comm_ai_get_default_attr(g_ai_config.dev, &g_ai_config.dev_attr);
g_ai_config.dev_attr.channels = g_user_input_args.channels;
g_ai_config.dev_attr.sample_rate = g_user_input_args.sample_rate;
g_ai_config.dev_attr.pcm_samples_per_frame = FRAME_TIME * g_user_input_args.sample_rate / 1000;
g_ai_config.dev_attr.mode = AUDIO_DEV_WORK_MODE_QUEUE;
g_ai_config.chn_attr.sample_rate = g_user_input_args.usr_sample_rate;
g_ai_config.chn_attr.interleaved = XMEDIA_TRUE;
g_ai_config.source = AI_EC_SOURCE_AO_DAC0;
g_ai_config.ec_chn_id = 0;
g_ai_config.vqe_enable = XMEDIA_FALSE;
g_ai_config.res_enable = XMEDIA_FALSE;
g_ai_config.dev_attr.un_attr.i2s_attr.master = XMEDIA_TRUE;
g_ai_config.dev_attr.un_attr.i2s_attr.i2s_mode = AUDIO_I2S_STD_MODE;
g_ai_config.dev_attr.un_attr.i2s_attr.mclk_sel = AUDIO_I2S_MCLK_256_FS;
g_ai_config.dev_attr.un_attr.i2s_attr.bclk_sel = AUDIO_I2S_BCLK_4_DIV;
g_ai_config.dev_attr.un_attr.i2s_attr.pcm_sample_rise_edge = XMEDIA_TRUE;
g_ai_config.dev_attr.un_attr.i2s_attr.pcm_delay_cycle = AUDIO_I2S_PCM_1_DELAY;
return XMEDIA_SUCCESS;
}
static xmedia_s32 sample_init_audio()
{
return sample_comm_audio_init();
}
static xmedia_s32 sample_start_ai()
{
xmedia_s32 ret;
ai_vqe_attr vqe_detect_attr;
ret = sample_ai_config_init();
CHECK_RET(ret, "sample_ai_config_init");
ret = sample_comm_ai_start(&g_ai_config);
CHECK_RET(ret, "sample_comm_ai_start");
//开启检测算法
if (g_vqe_type != 0) {
load_ai_detect_attr(&vqe_detect_attr, g_user_input_args.sample_rate);
ret = sample_comm_ai_register(ai_detect_attr.mask, vqe_detect_attr.version, g_ai_config.res_enable);
CHECK_RET(ret, "sample_comm_ai_register");
ret = sample_comm_detect_open(g_ai_config.dev, &vqe_detect_attr);
if (ret != XMEDIA_SUCCESS) {
sample_comm_ai_stop(&g_ai_config);
CHECK_RET(ret, "sample_comm_bcd_open");
}
}
ret = sample_comm_ai_create_output_thread_to_file(&g_ai_config, g_user_input_args.output_fd);
CHECK_RET(ret, "sample_comm_ai_create_output_thread_to_file");
if (g_ai_config.dev == XMEDIA_AI_DEV_ADC0) {
ret = sample_comm_ai_set_dev_param(&g_ai_config, AI_PARAM_SET_CODEC_ADC_GAIN, (xmedia_void*)&g_user_input_args.codec_input_vol);
CHECK_RET(ret, "sample_comm_ai_set_dev_param");
}
return ret;
}
static xmedia_s32 sample_deinit_audio()
{
return sample_comm_audio_exit();
}
static xmedia_s32 sample_stop_ai()
{
xmedia_s32 ret;
ret = sample_comm_ai_destroy_output_thread_to_file(&g_ai_config);
CHECK_RET(ret, "sample_comm_ai_destroy_output_thread_to_file");
ret = sample_comm_ai_stop(&g_ai_config);
CHECK_RET(ret, "sample_comm_ai_stop");
return ret;
}
xmedia_s32 sample_audio_record_detect(xmedia_void)
{
xmedia_s32 ret;
ret = sample_init_audio();
if (ret != XMEDIA_SUCCESS) {
goto ERR_INIT_AUDIO;
}
ret = sample_start_ai();
if (ret != XMEDIA_SUCCESS) {
goto ERR_START_AI;
}
while(1) {
xmedia_s32 val;
xmedia_char input_cmd[32];
SAMPLE_AUDIO_DBG("\nInput 'q' ENTER to exit\n");
SAMPLE_AUDIO_DBG("Input 'svXX' to set ai vol to xx dB\n");
SAMPLE_AUDIO_DBG("Input 'gv' to get ai vol\n");
SAMPLE_AUDIO_DBG("Input 'saXX' to set adc gain to xx dB\n");
fgets(input_cmd, (sizeof(input_cmd) - 1), stdin);
if (input_cmd[0] == 's' && input_cmd[1] == 'v' ) {
val = atoi(input_cmd + 2);
ret = sample_comm_ai_set_volume(&g_ai_config, val);
SAMPLE_AUDIO_DBG("\nSet ai volume %d return 0x%x\n", val, ret);
} else if (input_cmd[0] == 'g' && input_cmd[1] == 'v') {
ret = sample_comm_ai_get_volume(&g_ai_config, &val);
SAMPLE_AUDIO_DBG("\nGet ai volume %d return 0x%x\n", val, ret);
} else if (input_cmd[0] == 's' && input_cmd[1] == 'a') {
val = atoi(input_cmd + 2);
ret = sample_comm_ai_set_dev_param(&g_ai_config, AI_PARAM_SET_CODEC_ADC_GAIN, (xmedia_void*)&val);
SAMPLE_AUDIO_DBG("\nSet adc gain %d return 0x%x\n", val, ret);
} else if (input_cmd[0] == 'g' && input_cmd[1] == 'a') {
ret = sample_comm_ai_set_dev_param(&g_ai_config, AI_PARAM_GET_CODEC_ADC_GAIN, (xmedia_void*)&val);
SAMPLE_AUDIO_DBG("\nGet adc gain %d return 0x%x\n", val, ret);
} else if ((input_cmd[0] == 'q') || (input_cmd[0] == 'Q')) {
SAMPLE_AUDIO_DBG("Ready to exit\n");
break;
}
}
sample_stop_ai();
ERR_START_AI:
ERR_INIT_AUDIO:
sample_deinit_audio();
return ret;
}
static xmedia_void user_args_usage(user_input_args* args)
{
SAMPLE_AUDIO_DBG("usage: %s [samplerate] [usr_samplerate] [channels] [codec_input_vol] [outfile] [vqe_type] [mic_distance]\n", args->sample);
SAMPLE_AUDIO_DBG("dev_rate: dev samplerate(8000/16000/32000/48000)\n");
SAMPLE_AUDIO_DBG("usr_rate: out file samplerate(8000/16000/32000/48000)\n");
SAMPLE_AUDIO_DBG("dev_chn: dev chn cnt(1/2/8)\n");
SAMPLE_AUDIO_DBG("out_file: pcm out file(.pcm)\n");
SAMPLE_AUDIO_DBG("vqe_type: 0:not open detect, 1:open bcd, 2:open gbd, 3:open ssl, 4:open ved, 5:open bcd + ssl + ved\n");
SAMPLE_AUDIO_DBG("examples:\n");
SAMPLE_AUDIO_DBG(" %s 8000 8000 1 20 out.pcm 0\n", args->sample);
SAMPLE_AUDIO_DBG(" %s 16000 16000 1 20 out.pcm 1\n", args->sample);
SAMPLE_AUDIO_DBG(" %s 8000 8000 1 20 out.pcm 2\n", args->sample);
SAMPLE_AUDIO_DBG(" %s 16000 16000 2 20 out.pcm 3 50\n", args->sample);
SAMPLE_AUDIO_DBG(" %s 16000 16000 2 20 out.pcm 4\n", args->sample);
SAMPLE_AUDIO_DBG(" %s 16000 16000 2 20 out.pcm 5\n", args->sample);
}
static xmedia_s32 user_args_init(int argc, char* argv[], user_input_args* user_in_args)
{
user_in_args->sample = argv[0];
if ((argc >= 2) && (strcmp(argv[1], "-h")) == 0) {
user_args_usage(user_in_args);
return XMEDIA_FAILURE;
}
if (argc < 7) {
printf("Invalid argc:%d\n", argc);
user_args_usage(user_in_args);
return XMEDIA_FAILURE;
}
user_in_args->sample_rate = atoi(argv[1]);
user_in_args->usr_sample_rate = atoi(argv[2]);
user_in_args->channels = atoi(argv[3]);
user_in_args->codec_input_vol = atoi(argv[4]);
memcpy(user_in_args->output_file_name, argv[5], strlen(argv[5]));
if (strcmp(user_in_args->output_file_name, "null")) {
user_in_args->output_fd[0] = fopen(user_in_args->output_file_name, "w+");
if (user_in_args->output_fd[0] == NULL) {
printf("Open %s failed\n", user_in_args->output_file_name);
return XMEDIA_FAILURE;
}
}
g_vqe_type = atoi(argv[6]);
if (g_vqe_type < 0 || g_vqe_type > 5) {
printf("Invalid det_type:%d\n", g_vqe_type);
user_args_usage(user_in_args);
return XMEDIA_FAILURE;
}
mic_distance = atoi(argv[7]);
SAMPLE_AUDIO_DBG("get user args: \n");
SAMPLE_AUDIO_DBG(" samplerate: %d\n", user_in_args->sample_rate);
SAMPLE_AUDIO_DBG(" user samplerate: %d\n", user_in_args->usr_sample_rate);
SAMPLE_AUDIO_DBG(" chnnels: %d\n", user_in_args->channels);
SAMPLE_AUDIO_DBG(" codec_input_vol: %d\n", user_in_args->codec_input_vol);
if (user_in_args->output_fd[0] != NULL) {
SAMPLE_AUDIO_DBG(" mic0_file_name:%s\n", user_in_args->output_file_name);
}
return XMEDIA_SUCCESS;
}
static xmedia_void user_args_deinit(user_input_args* user_in_args)
{
if (user_in_args->output_fd[1] != NULL) {
fclose(user_in_args->output_fd[1]);
user_in_args->output_fd[1] = NULL;
}
if (user_in_args->output_fd[0] != NULL) {
fclose(user_in_args->output_fd[0]);
user_in_args->output_fd[0] = NULL;
}
}
xmedia_s32 main(int argc, char* argv[])
{
xmedia_s32 ret;
ret = user_args_init(argc, argv, &g_user_input_args);
if (ret != XMEDIA_SUCCESS) {
printf("user_args_init failed(0x%x)\n\n", ret);
return ret;
}
SAMPLE_AUDIO_DBG("user_args_init ok\n");
es7210_config();
ret = sample_audio_record_detect();
if (ret != XMEDIA_SUCCESS) {
printf("sample_audio_record_vqev1 failed(0x%x)\n", ret);
}
es7210_destroy();
user_args_deinit(&g_user_input_args);
SAMPLE_AUDIO_DBG("exit %s\n", g_user_input_args.sample);
return ret;
}
@@ -0,0 +1,408 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <pthread.h>
#include "xmedia_audio_common.h"
#include "xmedia_audio_ai.h"
#include "sample_comm_audio.h"
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include "drv_codec_es7210.h"
#include "drv_i2c.h"
#include "drv_led_ctl.h"
#define ES7210_CODEC_I2C_NODE "/dev/i2c-2"
#define ES7210_CODEC_I2C_ADDR 0x40
#define ES7210B_CODEC_I2C_ADDR 0x41
static codec_handle g_h_codec;
#define SAMPLE_AUDIO_DBG printf
#define MAX_FILE_NAME_LEN 128
#define FRAME_TIME 10 //ms
typedef struct user_input_args {
xmedia_char* sample;
ai_dev dev;
audio_sample_rate sample_rate;
audio_sample_rate usr_sample_rate;
audio_bit_depth bit_depth;
audio_channel channels;
xmedia_s32 workmode;
xmedia_u32 samples_per_frm;
char output_file_name[MAX_FILE_NAME_LEN];
FILE *output_fd[2];
} user_input_args;
static user_input_args g_user_input_args;
static sample_ai_config g_ai_config;
static xmedia_s32 g_volume;
static xmedia_void gpio_map_to_i2s(xmedia_void)
{
char cmds[128];
sprintf(cmds, "xmmm 0x100c0010 0x100b"); // I2S_MCLK
system(cmds);
sprintf(cmds, "xmmm 0x100c0000 0x100b"); // I2S_BCLK_TX
system(cmds);
sprintf(cmds, "xmmm 0x100c0004 0x100b"); // I2S_WS_TX
system(cmds);
sprintf(cmds, "xmmm 0x100c000c 0x100b"); // I2S_DATA_RX
system(cmds);
}
void gpio_map_to_i2c(void)
{
char cmds[128];
sprintf(cmds, "xmmm 0x11980014 0x1002");//I2C2_SCL
system(cmds);
sprintf(cmds, "xmmm 0x11980018 0x1002");//I2C2_SDA
system(cmds);
}
xmedia_void es7210b_config(xmedia_void)
{
ES7210_CODEC_CFG_S codec_cfg = {0};
strcpy(codec_cfg.i2c_cfg.dev_node, ES7210_CODEC_I2C_NODE);
codec_cfg.i2c_cfg.addr = ES7210B_CODEC_I2C_ADDR;
codec_cfg.i2c_cfg.i2c_gpio_map_cb = (fn_i2c_gpio_map_cb)gpio_map_to_i2c;
codec_cfg.micbias = ES7210_MICBIAS_2V87;
codec_cfg.vdda = ES7210_VDDA_3V3;
codec_cfg.chip_flag = ES7210_LAST;
codec_cfg.chip_number = ES7210_CHIP_NUMBER_1;
codec_cfg.channels = ES7210_CHANNELS_4;
codec_cfg.samplerate = g_user_input_args.sample_rate;
codec_cfg.bitwidth = ES7210_BIT_WIDTH_16;
codec_cfg.track_mode.adc12 = ES7210_TRACK_NORMAL;
codec_cfg.track_mode.adc34 = ES7210_TRACK_NORMAL;
codec_cfg.i2s_cfg.mode = ES7210_SLAVER;
codec_cfg.i2s_cfg.format = ES7210_TDM_DSPA;
codec_cfg.i2s_cfg.bclk_inv_mode = ES7210_BCLK_NORMAL;
codec_cfg.i2s_cfg.mclk_source = ES7210_MCLK_SOURCE_DEFAULT;
codec_cfg.i2s_cfg.i2s_gpio_map_cb = (fn_i2s_gpio_map_cb)gpio_map_to_i2s;
switch (g_user_input_args.sample_rate) {
case 8000:
codec_cfg.i2s_cfg.mclk = 2048000;
break;
case 16000:
codec_cfg.i2s_cfg.mclk = 4096000;
break;
case 32000:
codec_cfg.i2s_cfg.mclk = 8192000;
break;
case 64000:
codec_cfg.i2s_cfg.mclk = 8192000;
break;
case 48000:
codec_cfg.i2s_cfg.mclk = 12288000;
break;
case 44100:
codec_cfg.i2s_cfg.mclk = 11289600;
break;
default:
break;
}
es7210_init(&g_h_codec, &codec_cfg);
es7210_set_volume(g_h_codec, g_volume);
}
xmedia_void es7210_config(xmedia_void)
{
ES7210_CODEC_CFG_S codec_cfg = {0};
strcpy(codec_cfg.i2c_cfg.dev_node, ES7210_CODEC_I2C_NODE);
codec_cfg.i2c_cfg.addr = ES7210_CODEC_I2C_ADDR;
codec_cfg.i2c_cfg.i2c_gpio_map_cb = (fn_i2c_gpio_map_cb)gpio_map_to_i2c;
codec_cfg.micbias = ES7210_MICBIAS_2V87;
codec_cfg.vdda = ES7210_VDDA_3V3;
codec_cfg.chip_flag = ES7210_LAST;
codec_cfg.chip_number = ES7210_CHIP_NUMBER_0;
codec_cfg.channels = ES7210_CHANNELS_2;
codec_cfg.samplerate = g_user_input_args.sample_rate;
codec_cfg.bitwidth = ES7210_BIT_WIDTH_16;
codec_cfg.track_mode.adc12 = ES7210_TRACK_NORMAL;
codec_cfg.track_mode.adc34 = ES7210_TRACK_NORMAL;
codec_cfg.i2s_cfg.mode = ES7210_SLAVER;
codec_cfg.i2s_cfg.format = ES7210_I2S_STD;
codec_cfg.i2s_cfg.bclk_inv_mode = ES7210_BCLK_NORMAL;
codec_cfg.i2s_cfg.mclk_source = ES7210_MCLK_SOURCE_DEFAULT;
codec_cfg.i2s_cfg.i2s_gpio_map_cb = (fn_i2s_gpio_map_cb)gpio_map_to_i2s;
switch (g_user_input_args.sample_rate) {
case 8000:
codec_cfg.i2s_cfg.mclk = 2048000;
break;
case 16000:
codec_cfg.i2s_cfg.mclk = 4096000;
break;
case 32000:
codec_cfg.i2s_cfg.mclk = 8192000;
break;
case 64000:
codec_cfg.i2s_cfg.mclk = 8192000;
break;
case 48000:
codec_cfg.i2s_cfg.mclk = 12288000;
break;
case 44100:
codec_cfg.i2s_cfg.mclk = 11289600;
break;
default:
break;
}
es7210_init(&g_h_codec, &codec_cfg);
es7210_set_volume(g_h_codec, g_volume);
}
xmedia_void es7210_destroy(xmedia_void)
{
es7210_deinit(g_h_codec);
}
static xmedia_s32 sample_ai_config_init(xmedia_void)
{
g_ai_config.dev = g_user_input_args.dev;
sample_comm_ai_get_default_attr(g_ai_config.dev, &g_ai_config.dev_attr);
g_ai_config.dev_attr.channels = g_user_input_args.channels;
g_ai_config.dev_attr.sample_rate = g_user_input_args.sample_rate;
g_ai_config.dev_attr.bit_depth = g_user_input_args.bit_depth;
g_ai_config.dev_attr.pcm_samples_per_frame = g_user_input_args.samples_per_frm;
g_ai_config.dev_attr.pcm_frame_num = 200;
g_ai_config.dev_attr.mode = g_user_input_args.workmode;
g_ai_config.chn_attr.sample_rate = g_user_input_args.usr_sample_rate;
g_ai_config.chn_attr.interleaved = XMEDIA_TRUE;
g_ai_config.source = AI_EC_SOURCE_AO_DAC0;
g_ai_config.ec_chn_id = 0;
g_ai_config.vqe_enable = XMEDIA_FALSE;
g_ai_config.dev_attr.un_attr.i2s_attr.master = XMEDIA_TRUE;
g_ai_config.dev_attr.un_attr.i2s_attr.i2s_mode = AUDIO_I2S_STD_MODE;
g_ai_config.dev_attr.un_attr.i2s_attr.mclk_sel = AUDIO_I2S_MCLK_256_FS;
g_ai_config.dev_attr.un_attr.i2s_attr.bclk_sel = AUDIO_I2S_BCLK_4_DIV;
g_ai_config.dev_attr.un_attr.i2s_attr.pcm_sample_rise_edge = XMEDIA_TRUE;
g_ai_config.dev_attr.un_attr.i2s_attr.pcm_delay_cycle = AUDIO_I2S_PCM_1_DELAY;
return XMEDIA_SUCCESS;
}
static xmedia_s32 sample_start_ai()
{
xmedia_s32 ret;
ret = sample_ai_config_init();
CHECK_RET(ret, "sample_ai_config_init");
ret = sample_comm_ai_start(&g_ai_config);
CHECK_RET(ret, "sample_comm_ai_start");
ret = sample_comm_ai_create_output_thread_to_file(&g_ai_config, g_user_input_args.output_fd);
CHECK_RET(ret, "sample_comm_ai_create_output_thread_to_file");
return ret;
}
static xmedia_s32 sample_stop_ai()
{
xmedia_s32 ret;
ret = sample_comm_ai_destroy_output_thread_to_file(&g_ai_config);
CHECK_RET(ret, "sample_comm_ai_destroy_output_thread_to_file");
ret = sample_comm_ai_stop(&g_ai_config);
CHECK_RET(ret, "sample_comm_ai_stop");
return ret;
}
xmedia_s32 sample_audio_ai(xmedia_void)
{
xmedia_s32 ret;
ret = xmedia_ai_init();
CHECK_RET(ret, "xmedia_ai_init");
ret = sample_start_ai();
if (ret != XMEDIA_SUCCESS) {
goto ERR_START_AI;
}
while(1) {
xmedia_s32 val;
xmedia_char input_cmd[32];
SAMPLE_AUDIO_DBG("\nInput 'q' ENTER to exit\n");
SAMPLE_AUDIO_DBG("Input 'svXX' to set ai vol to xx dB\n");
SAMPLE_AUDIO_DBG("Input 'gv' to get ai vol\n");
SAMPLE_AUDIO_DBG("Input 'dso' to dump stream open\n");
SAMPLE_AUDIO_DBG("Input 'dsc' to dump stream close\n");
fgets(input_cmd, (sizeof(input_cmd) - 1), stdin);
if (input_cmd[0] == 's' && input_cmd[1] == 'v') {
val = atoi(input_cmd + 2);
ret = sample_comm_ai_set_volume(&g_ai_config, val);
SAMPLE_AUDIO_DBG("\nSet ai volume %d return 0x%x\n", val, ret);
} else if (input_cmd[0] == 'g' && input_cmd[1] == 'v') {
ret = sample_comm_ai_get_volume(&g_ai_config, &val);
SAMPLE_AUDIO_DBG("\nGet ai volume %d return 0x%x\n", val, ret);
} else if (input_cmd[0] == 'd' && input_cmd[1] == 's' && input_cmd[2] == 'o') {
system("echo setnode 1 > /proc/umap/ai");
system("echo dump start > /proc/umap/ai");
SAMPLE_AUDIO_DBG("\nSet dump orgin and ai post stream start\n");
} else if (input_cmd[0] == 'd' && input_cmd[1] == 's' && input_cmd[2] == 'c') {
system("echo dump stop > /proc/umap/ai");
SAMPLE_AUDIO_DBG("\nSet dump stream stop \n");
} else if ((input_cmd[0] == 'q') || (input_cmd[0] == 'Q')) {
SAMPLE_AUDIO_DBG("Ready to exit\n");
break;
}
}
ERR_START_AI:
sample_stop_ai();
xmedia_ai_exit();
CHECK_RET(ret, "xmedia_ai_exit");
return ret;
}
static xmedia_void user_args_usage(user_input_args* args)
{
SAMPLE_AUDIO_DBG("usage: %s [dev] [samplerate] [bit_depth] [channels] [outfile] [volume]\n", args->sample);
SAMPLE_AUDIO_DBG("dev: dev id\n");
SAMPLE_AUDIO_DBG("samplerate: dev samplerate\n");
SAMPLE_AUDIO_DBG("channels: dev chn cnt\n");
SAMPLE_AUDIO_DBG("outfile: save file path\n");
SAMPLE_AUDIO_DBG("volume: [0,68]\n");
SAMPLE_AUDIO_DBG("examples:\n");
SAMPLE_AUDIO_DBG(" %s 0 8000 16 2 out.pcm 40\n", args->sample);
SAMPLE_AUDIO_DBG(" %s 1 8000 16 4 out.pcm 40\n", args->sample);
SAMPLE_AUDIO_DBG(" %s 1 16000 16 4 out.pcm 40\n", args->sample);
}
static xmedia_s32 user_args_init(int argc, char* argv[], user_input_args* user_in_args)
{
char file_name[128] = {0};
xmedia_s32 i = 0;
user_in_args->sample = argv[0];
if ((argc >= 2) && (strcmp(argv[1], "-h")) == 0) {
user_args_usage(user_in_args);
return XMEDIA_FAILURE;
}
if (argc != 7) {
printf("Invalid argc:%d\n", argc);
user_args_usage(user_in_args);
return XMEDIA_FAILURE;
}
user_in_args->dev = atoi(argv[1]);
user_in_args->sample_rate = atoi(argv[2]);
user_in_args->usr_sample_rate = user_in_args->sample_rate;
user_in_args->bit_depth = atoi(argv[3]);
user_in_args->channels = atoi(argv[4]);
user_in_args->workmode = 1;
user_in_args->samples_per_frm = user_in_args->sample_rate / 100;
g_volume = atoi(argv[6]);
memcpy(user_in_args->output_file_name, argv[5], strlen(argv[5]));
if (strcmp(user_in_args->output_file_name, "null") == 0) {
while (1) {
memset(file_name, 0 , sizeof(file_name));
if (user_in_args->sample_rate == 16000) {
sprintf((void *)file_name,"audio_8ch_16k_file%d.pcm", i++);
} else {
sprintf((void *)file_name,"audio_8ch_8k_file%d.pcm", i++);
}
if (access(file_name, F_OK) == -1) {
break;
}
}
user_in_args->output_fd[0] = fopen(file_name, "w+");
if (user_in_args->output_fd[0] == NULL) {
printf("Open %s failed\n", user_in_args->output_file_name);
return XMEDIA_FAILURE;
}
} else {
user_in_args->output_fd[0] = fopen(user_in_args->output_file_name, "w+");
if (user_in_args->output_fd[0] == NULL) {
printf("Open %s failed\n", user_in_args->output_file_name);
return XMEDIA_FAILURE;
}
}
SAMPLE_AUDIO_DBG("get user args: \n");
SAMPLE_AUDIO_DBG(" samplerate: %d\n", user_in_args->sample_rate);
SAMPLE_AUDIO_DBG(" bit_depth: %d\n", user_in_args->bit_depth);
SAMPLE_AUDIO_DBG(" chnnels: %d\n", user_in_args->channels);
SAMPLE_AUDIO_DBG(" workmode: %d\n", user_in_args->workmode);
SAMPLE_AUDIO_DBG(" samples_per_frm: %d\n", user_in_args->samples_per_frm);
if (user_in_args->output_fd[0] != NULL) {
SAMPLE_AUDIO_DBG(" mic0_file_name:%s\n", user_in_args->output_file_name);
}
return XMEDIA_SUCCESS;
}
static xmedia_void user_args_deinit(user_input_args* user_in_args)
{
if (user_in_args->output_fd[1] != NULL) {
fclose(user_in_args->output_fd[1]);
user_in_args->output_fd[1] = NULL;
}
if (user_in_args->output_fd[0] != NULL) {
fclose(user_in_args->output_fd[0]);
user_in_args->output_fd[0] = NULL;
}
}
xmedia_s32 main(int argc, char* argv[])
{
xmedia_s32 ret;
ret = user_args_init(argc, argv, &g_user_input_args);
if (ret != XMEDIA_SUCCESS) {
printf("user_args_init failed(0x%x)\n\n", ret);
return ret;
}
SAMPLE_AUDIO_DBG("user_args_init ok\n");
es7210_config();
es7210_destroy();
es7210b_config();
es7210_destroy();
ret = sample_audio_ai();
if (ret != XMEDIA_SUCCESS) {
printf("sample_auido_ai failed(0x%x)\n", ret);
}
user_args_deinit(&g_user_input_args);
printf("exit sample ai\n");
return ret;
}