181 lines
4.7 KiB
C
181 lines
4.7 KiB
C
|
#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
|
||
|
|
||
|
|