KT24-1110_65E-HA-651B/apps/soundbox/soundcard/peripheral.c

181 lines
4.7 KiB
C
Raw Permalink Normal View History

2024-11-10 10:44:17 +00:00
#include "soundcard/peripheral.h"
#include "soundcard/soundcard.h"
#include "soundcard/lamp.h"
#include "asm/audio_linein.h"
#include "audio_dec.h"
#include "common/user_msg.h"
#include "os/os_api.h"
#include "app_task.h"
#include "asm/rtc.h"
#include "asm/power/p33.h"
#include "asm/gpio.h"
#include "key_event_deal.h"
#include "application/audio_output_dac.h"
#include "linein/linein.h"
#if SOUNDCARD_ENABLE
typedef enum __VDET_STATUS {
VDET_OFF = 0,
VDET_ON,
NULL_VDET,
} VDET_STATUS;
typedef struct __DEVICE_DET_VAR {
u8 pre_status;
u8 cur_status;
u8 status_cnt;
u8 original_status;
} DEVICE_DET_VAR;
static DEVICE_DET_VAR g_mic1_var = {0};
static DEVICE_DET_VAR g_mic2_var = {0};
static DEVICE_DET_VAR g_aux0_var = {0};
void soundcard_pa_init(void)
{
gpio_set_direction(IO_PORTC_07, 0);
gpio_set_pull_down(IO_PORTC_07, 0);
gpio_set_pull_up(IO_PORTC_07, 1);
gpio_set_output_value(IO_PORTC_07, 0);
}
void soundcard_pa_umute(void)
{
printf("soundcard_pa_umute\n");
gpio_set_output_value(IO_PORTC_07, 1);
audio_dac_vol_set(TYPE_DAC_AGAIN, BIT(0) | BIT(1) | BIT(2) | BIT(3), 30, 1);//模拟音量范围0~30
}
void soundcard_pa_mute(void)
{
gpio_set_output_value(IO_PORTC_07, 0);
}
static VDET_STATUS soundcard_device_check(struct __DEVICE_DET_VAR *var, u8 st, u8 cnt)
{
var->cur_status = st;
if (var->cur_status != var->pre_status) {
var->original_status = var->pre_status;
var->pre_status = var->cur_status;
var->status_cnt = 0;
} else {
if (var->status_cnt < cnt) {
var->status_cnt++;
if (var->status_cnt == cnt) {
if ((VDET_ON == var->cur_status) && (!var->original_status)) {
return VDET_ON;
} else if ((VDET_OFF == var->cur_status) && var->original_status) {
return VDET_OFF;
}
}
}
}
return NULL_VDET;
}
static void soundcard_mic_check_detect(void)
{
VDET_STATUS res;
u32 check_value_cur = 0;
u8 st;
check_value_cur = adc_get_value(AD_CH_PA6);
//y_printf("check_value_cur:%d\n",check_value_cur);
if (check_value_cur > 923) { //2.975V
st = 0;
} else {
st = 1;
}
res = soundcard_device_check(&g_mic1_var, st, 20);
if (VDET_ON == res) {
y_printf("MIC1=============ON\n");
app_task_put_key_msg(KEY_SOUNDCARD_EAR_MIC_STATUS_UPDATE, res);
} else if (VDET_OFF == res) {
y_printf("MIC1=============OFF\n");
app_task_put_key_msg(KEY_SOUNDCARD_EAR_MIC_STATUS_UPDATE, res);
}
//y_printf(":%d %d %d\n",g_mic1_var.cur_status,g_mic1_var.pre_status,g_mic1_var.original_status);
st = !rtc_port_pr_read(0);
res = soundcard_device_check(&g_mic2_var, st, 20);
if (VDET_ON == res) {
y_printf("MIC2=============ON\n");
app_task_put_key_msg(KEY_SOUNDCARD_NORMAL_MIC_STATUS_UPDATE, res);
} else if (VDET_OFF == res) {
y_printf("MIC2=============OFF\n");
app_task_put_key_msg(KEY_SOUNDCARD_NORMAL_MIC_STATUS_UPDATE, res);
}
st = gpio_read(IO_PORTA_02);
res = soundcard_device_check(&g_aux0_var, st, 20);
if (VDET_ON == res) {
y_printf("aux0=============ON\n");
app_task_put_key_msg(KEY_SOUNDCARD_AUX_STATUS_UPDATE, res);
} else if (VDET_OFF == res) {
y_printf("aux0=============OFF\n");
app_task_put_key_msg(KEY_SOUNDCARD_AUX_STATUS_UPDATE, res);
}
}
static void soundcard_mic_detect_init(void)
{
y_printf("%s", __func__);
adc_add_sample_ch(AD_CH_PA6);
gpio_set_die(IO_PORTA_06, 0);
gpio_set_pull_down(IO_PORTA_06, 0);
gpio_set_pull_up(IO_PORTA_06, 0);
gpio_direction_input(IO_PORTA_06);
p33_tx_1byte(R3_OSL_CON, 0);
rtc_port_pr_die(0, 1);
rtc_port_pr_pu(0, 1);
rtc_port_pr_pd(0, 0);
rtc_port_pr_in(0);
gpio_set_die(IO_PORTA_02, 1);
gpio_set_pull_down(IO_PORTA_02, 0);
gpio_set_pull_up(IO_PORTA_02, 1);
gpio_direction_input(IO_PORTA_02);
rtc_port_pr_die(1, 1);
rtc_port_pr_out(1, 1);
sys_hi_timer_add(NULL, soundcard_mic_check_detect, 10);
}
void soundcard_ear_mic_mute(u8 mute)
{
if (mute) {
rtc_port_pr_out(1, 1);
} else {
rtc_port_pr_out(1, 0);
}
}
extern void slidekey_update(void);
static void soundcard_slider_key_update(void *p)
{
slidekey_update();
}
void soundcard_peripheral_init(void)
{
printf("%s", __func__);
soundcard_pa_init();
soundcard_led_init();
soundcard_mic_detect_init();
soundcard_start();
sys_timeout_add(NULL, soundcard_pa_umute, 2000);
sys_timeout_add(NULL, soundcard_slider_key_update, 5000);//防止一开始按键消息更新事件丢失导致的音量不正常
}
#endif//SOUNDCARD_ENABLE