Files
99_7018_lmx/cpu/br28/private_iis.c

230 lines
6.0 KiB
C
Raw Normal View History

2025-10-29 13:10:02 +08:00
#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();
}