230 lines
6.0 KiB
C
230 lines
6.0 KiB
C
#include "private_iis.h"
|
||
#include "app_config.h"
|
||
#include "audio_decoder.h"
|
||
#include "media/includes.h"
|
||
#include "audio_config.h"
|
||
#include "system/includes.h"
|
||
#include "audio_enc.h"
|
||
#include "application/audio_eq.h"
|
||
#include "application/audio_drc.h"
|
||
#include "app_config.h"
|
||
#include "audio_config.h"
|
||
#include "audio_dec.h"
|
||
#include "app_main.h"
|
||
#include "clock_cfg.h"
|
||
#include "audio_dec_eff.h"
|
||
#include "audio_codec_clock.h"
|
||
#include "audio_dvol.h"
|
||
#include "audio_link.h"
|
||
#include "circular_buf.h"
|
||
#include "sound_device.h"
|
||
|
||
#define PRIVATE_IIS_MSG_CHECK_EN 1 //使能格式检查
|
||
|
||
struct __private_iis_data {
|
||
u32 msg[CMD_LEN / 4];
|
||
u8 get_msg_flag;
|
||
u8 msg_len;
|
||
};
|
||
static struct __private_iis_data private_iis_data = {0};
|
||
|
||
struct private_iis_hdl {
|
||
OS_SEM sem;
|
||
/* s16 *store_pcm_buf; */
|
||
/* cbuffer_t cbuf; */
|
||
int sample_rate;
|
||
void *hw_alink;
|
||
void *alink_ch;
|
||
u32 cmd; //要求发送或者接收到的cmd
|
||
};
|
||
static struct private_iis_hdl *private_iis = NULL;
|
||
|
||
extern ALINK_PARM alink0_platform_data;
|
||
|
||
/********************************* private iis Rx *********************************/
|
||
// 这个格式检查需要根据具体消息自己定义!!, 也可以不做检查
|
||
static u8 private_iis_check_msg(void)
|
||
{
|
||
#if PRIVATE_IIS_MSG_CHECK_EN
|
||
if (private_iis_data.msg[0] == PRIVATE_IIS_CMD && private_iis_data.msg[1] != private_iis_data.msg[0]) {
|
||
return 1;
|
||
}
|
||
return 0; //格式检查不过
|
||
#else
|
||
return 1;
|
||
#endif
|
||
}
|
||
|
||
|
||
// 接收消息
|
||
static void private_iis_in_data_handler(void *priv, void *_data, int len)
|
||
{
|
||
s16 *data = (s16 *)_data;
|
||
/* memcpy(private_iis_data.msg, data, len); */
|
||
u8 *temp = memchr(data, private_iis->cmd, len);
|
||
if (temp && private_iis_data.get_msg_flag == 0) {
|
||
memcpy(private_iis_data.msg, temp, CMD_LEN);
|
||
if (private_iis_check_msg()) {
|
||
private_iis_data.get_msg_flag = 1;
|
||
private_iis_data.msg_len = CMD_LEN;
|
||
}
|
||
}
|
||
alink_set_shn(&alink0_platform_data.ch_cfg[1], len / 4);
|
||
}
|
||
|
||
/*
|
||
* 打开iis接收,用来接收私有数据
|
||
*/
|
||
void private_iis_rx_open(void)
|
||
{
|
||
if (private_iis) {
|
||
printf("private iis is running!\n");
|
||
return;
|
||
}
|
||
struct private_iis_hdl *iis_in = NULL;
|
||
iis_in = zalloc(sizeof(struct private_iis_hdl));
|
||
if (!iis_in) {
|
||
return;
|
||
}
|
||
|
||
private_iis = iis_in;
|
||
|
||
iis_in->cmd = PRIVATE_IIS_CMD;
|
||
/* iis_in->store_pcm_buf = malloc(IIS_IN_STORE_PCM_SIZE); */
|
||
/* if (!iis_in->store_pcm_buf) { */
|
||
/* free(iis_in); */
|
||
/* return; */
|
||
/* } */
|
||
/* cbuf_init(&iis_in->cbuf, iis_in->store_pcm_buf, IIS_IN_STORE_PCM_SIZE); */
|
||
iis_in->hw_alink = (ALINK_PARM *)get_iis_alink_param();
|
||
if (iis_in->hw_alink == NULL) {
|
||
iis_in->hw_alink = alink_init(&alink0_platform_data);
|
||
}
|
||
iis_in->alink_ch = alink_channel_init(iis_in->hw_alink, 1, ALINK_DIR_RX, (void *)iis_in, private_iis_in_data_handler);
|
||
alink_start(iis_in->hw_alink);
|
||
iis_in->sample_rate = TCFG_IIS_SR;
|
||
}
|
||
|
||
|
||
u8 get_private_iis_get_msg_flag(void)
|
||
{
|
||
return private_iis_data.get_msg_flag;
|
||
}
|
||
|
||
void show_private_msg(void)
|
||
{
|
||
if (private_iis_data.get_msg_flag) {
|
||
for (int i = 0; i < private_iis_data.msg_len / 4; i++) {
|
||
y_printf(">>>msg[%d] = %d\n", i, private_iis_data.msg[i]);
|
||
}
|
||
} else {
|
||
r_printf(">>>>> Show private msg failed!\n");
|
||
}
|
||
}
|
||
|
||
|
||
void private_iis_rx_close(void)
|
||
{
|
||
if (private_iis) {
|
||
void *alink_param = (ALINK_PARM *)get_iis_alink_param();
|
||
if (!alink_param) {
|
||
//如果 alink_param 为NULL,则说明还没打开 iis tx
|
||
alink_uninit(private_iis->hw_alink);
|
||
} else {
|
||
alink_channel_close(private_iis->alink_ch);
|
||
}
|
||
|
||
free(private_iis);
|
||
private_iis = NULL;
|
||
}
|
||
}
|
||
|
||
|
||
/********************************* private iis Tx *********************************/
|
||
|
||
// 发送消息
|
||
static void private_iis_out_data_handler(void *priv, void *_data, int len)
|
||
{
|
||
u32 *buf_u32 = (u32 *)_data;
|
||
buf_u32[0] = private_iis->cmd;
|
||
buf_u32[1] = TCFG_IIS_SR;
|
||
buf_u32[2] = PRIVATE_IIS_TX_LINEIN_CH_IDX;
|
||
buf_u32[3] = PRIVATE_IIS_TX_LINEIN_GAIN;
|
||
alink_set_shn(&alink0_platform_data.ch_cfg[0], len / 4);
|
||
}
|
||
|
||
void private_iis_tx_open(void)
|
||
{
|
||
if (private_iis) {
|
||
printf("private iis is running!\n");
|
||
return;
|
||
}
|
||
struct private_iis_hdl *iis_out = NULL;
|
||
iis_out = zalloc(sizeof(struct private_iis_hdl));
|
||
if (!iis_out) {
|
||
return;
|
||
}
|
||
|
||
private_iis = iis_out;
|
||
|
||
iis_out->cmd = PRIVATE_IIS_CMD;
|
||
|
||
iis_out->hw_alink = (ALINK_PARM *)get_iis_alink_param();
|
||
if (iis_out->hw_alink == NULL) {
|
||
iis_out->hw_alink = alink_init(&alink0_platform_data);
|
||
}
|
||
iis_out->alink_ch = alink_channel_init(iis_out->hw_alink, 0, ALINK_DIR_TX, (void *)iis_out, private_iis_out_data_handler);
|
||
alink_start(iis_out->hw_alink);
|
||
iis_out->sample_rate = TCFG_IIS_SR;
|
||
}
|
||
|
||
void private_iis_tx_close(void)
|
||
{
|
||
if (private_iis) {
|
||
void *alink_param = (ALINK_PARM *)get_iis_alink_param();
|
||
if (!alink_param) {
|
||
//如果 alink_param 为NULL,则说明还没打开 iis tx
|
||
alink_uninit(private_iis->hw_alink);
|
||
} else {
|
||
alink_channel_close(private_iis->alink_ch);
|
||
}
|
||
|
||
free(private_iis);
|
||
private_iis = NULL;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
// ************* test ************
|
||
static void private_iis_test_timer_cb(void *p)
|
||
{
|
||
static u32 tick = 0;
|
||
tick++;
|
||
printf(">>>>>>>>>>>>>>> tick : %d\n", tick);
|
||
if (get_private_iis_get_msg_flag()) {
|
||
y_printf("(test) >>>>>>> GET MSG!\n");
|
||
show_private_msg();
|
||
private_iis_rx_close();
|
||
}
|
||
}
|
||
void private_iis_rx_test(void)
|
||
{
|
||
y_printf("-------------------- Enter %s !", __func__);
|
||
private_iis_rx_open();
|
||
sys_timer_add(NULL, private_iis_test_timer_cb, 1000);
|
||
}
|
||
|
||
|
||
void private_iis_tx_test(void)
|
||
{
|
||
y_printf("-------------------- Enter %s !", __func__);
|
||
private_iis_tx_open();
|
||
os_time_dly(10);
|
||
private_iis_tx_close();
|
||
extern int iis_in_dec_open(void);
|
||
iis_in_dec_open();
|
||
}
|
||
|
||
|