#include "app_config.h" #ifdef CONFIG_BOARD_JL7018F_DEMO #include "system/includes.h" #include "media/includes.h" #include "asm/sdmmc.h" #include "asm/chargestore.h" #include "asm/umidigi_chargestore.h" #include "asm/charge.h" #include "asm/pwm_led.h" #include "tone_player.h" #include "audio_config.h" #include "gSensor/gSensor_manage.h" #include "key_event_deal.h" #include "asm/lp_touch_key_api.h" #include "user_cfg.h" #include "norflash_sfc.h" #include "asm/power/power_port.h" #include "app_umidigi_chargestore.h" #include "app_main.h" #include "audio_link.h" #if TCFG_AUDIO_ANC_ENABLE #include "audio_anc.h" #endif/*TCFG_AUDIO_ANC_ENABLE*/ #define LOG_TAG_CONST BOARD #define LOG_TAG "[BOARD]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define LOG_INFO_ENABLE /* #define LOG_DUMP_ENABLE */ #define LOG_CLI_ENABLE #include "debug.h" void board_power_init(void); /*各个状态下默认的闪灯方式和提示音设置,如果USER_CFG中设置了USE_CONFIG_STATUS_SETTING为1,则会从配置文件读取对应的配置来填充改结构体*/ STATUS_CONFIG status_config = { //灯状态设置 .led = { .charge_start = PWM_LED1_ON, .charge_full = PWM_LED0_ON, .power_on = PWM_LED0_ON, .power_off = PWM_LED1_FLASH_THREE, .lowpower = PWM_LED1_SLOW_FLASH, .max_vol = PWM_LED_NULL, .phone_in = PWM_LED_NULL, .phone_out = PWM_LED_NULL, .phone_activ = PWM_LED_NULL, .bt_init_ok = PWM_LED0_LED1_SLOW_FLASH, .bt_connect_ok = PWM_LED0_ONE_FLASH_5S, .bt_disconnect = PWM_LED0_LED1_FAST_FLASH, .tws_connect_ok = PWM_LED0_LED1_FAST_FLASH, .tws_disconnect = PWM_LED0_LED1_SLOW_FLASH, }, //提示音设置 .tone = { .charge_start = IDEX_TONE_NONE, .charge_full = IDEX_TONE_NONE, .power_on = IDEX_TONE_POWER_ON, .power_off = IDEX_TONE_POWER_OFF, .lowpower = IDEX_TONE_LOW_POWER, .max_vol = IDEX_TONE_MAX_VOL, .phone_in = IDEX_TONE_NONE, .phone_out = IDEX_TONE_NONE, .phone_activ = IDEX_TONE_NONE, .bt_init_ok = IDEX_TONE_BT_MODE, .bt_connect_ok = IDEX_TONE_BT_CONN, .bt_disconnect = IDEX_TONE_BT_DISCONN, .tws_connect_ok = IDEX_TONE_TWS_CONN, .tws_disconnect = IDEX_TONE_TWS_DISCONN, } }; #define __this (&status_config) /************************** KEY MSG****************************/ /*各个按键的消息设置,如果USER_CFG中设置了USE_CONFIG_KEY_SETTING为1,则会从配置文件读取对应的配置来填充改结构体*/ u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX] = { // SHORT LONG HOLD UP DOUBLE TRIPLE {KEY_MUSIC_PP, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_NULL, KEY_NULL}, //KEY_0 {KEY_ANC_SWITCH, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL}, //KEY_1 {KEY_MUSIC_PREV, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL}, //KEY_2 {KEY_MUSIC_NEXT, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL}, //KEY_3 {KEY_CALL_LAST_NO, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL}, //KEY_4 }; // *INDENT-OFF* /************************** UART config****************************/ #if TCFG_UART0_ENABLE UART0_PLATFORM_DATA_BEGIN(uart0_data) .tx_pin = TCFG_UART0_TX_PORT, //串口打印TX引脚选择 .rx_pin = TCFG_UART0_RX_PORT, //串口打印RX引脚选择 .baudrate = TCFG_UART0_BAUDRATE, //串口波特率 .flags = UART_DEBUG, //串口用来打印需要把改参数设置为UART_DEBUG UART0_PLATFORM_DATA_END() #endif //TCFG_UART0_ENABLE /************************** CHARGE config****************************/ #if TCFG_CHARGE_ENABLE CHARGE_PLATFORM_DATA_BEGIN(charge_data) .charge_en = TCFG_CHARGE_ENABLE, //内置充电使能 .charge_poweron_en = TCFG_CHARGE_POWERON_ENABLE, //是否支持充电开机 .charge_full_V = TCFG_CHARGE_FULL_V, //充电截止电压 .charge_full_mA = TCFG_CHARGE_FULL_MA, //充电截止电流 .charge_mA = TCFG_CHARGE_MA, //恒流充电电流 .charge_trickle_mA = TCFG_CHARGE_TRICKLE_MA, //涓流充电电流 /*ldo5v拔出过滤值,过滤时间 = (filter*2 + 20)ms,ldoin<0.6V且时间大于过滤时间才认为拔出 对于充满直接从5V掉到0V的充电仓,该值必须设置成0,对于充满由5V先掉到0V之后再升压到xV的 充电仓,需要根据实际情况设置该值大小*/ .ldo5v_off_filter = 100, .ldo5v_on_filter = 50, .ldo5v_keep_filter = 220, .ldo5v_pulldown_lvl = CHARGE_PULLDOWN_200K, //下拉电阻档位选择 .ldo5v_pulldown_keep = 0, //1、对于自动升压充电舱,若充电舱需要更大的负载才能检测到插入时,请将该变量置1,并且根据需求配置下拉电阻档位 //2、对于按键升压,并且是通过上拉电阻去提供维持电压的舱,请将该变量设置1,并且根据舱的上拉配置下拉需要的电阻挡位 //3、对于常5V的舱,可将改变量设为0,省功耗 //4、为LDOIN防止被误触发唤醒,可设置为200k下拉 .ldo5v_pulldown_en = 1, CHARGE_PLATFORM_DATA_END() #endif//TCFG_CHARGE_ENABLE /************************** chargestore config****************************/ #if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE CHARGESTORE_PLATFORM_DATA_BEGIN(chargestore_data) .io_port = TCFG_CHARGESTORE_PORT, CHARGESTORE_PLATFORM_DATA_END() #endif /************************** DAC ****************************/ #if TCFG_AUDIO_DAC_ENABLE struct dac_platform_data dac_data = { .mode = TCFG_AUDIO_DAC_MODE, //dac输出模式 .ldo_id = TCFG_AUDIO_DAC_LDO_SEL, //保留位 .pa_mute_port = TCFG_AUDIO_DAC_PA_PORT, //暂时无作用 .vcmo_en = 0, //是否打开VCOMO .pa_mute_value = 1, //暂时无作用 .output = TCFG_AUDIO_DAC_CONNECT_MODE, //DAC输出配置,和具体硬件连接有关,需根据硬件来设置 .lpf_isel = 0xf, .sys_vol_type = SYS_VOL_TYPE, //系统音量选择:模拟音量/数字音量,调节时调节对应的音量 .max_ana_vol = MAX_ANA_VOL, //模拟音量最大等级 .max_dig_vol = MAX_DIG_VOL, //数字音量最大等级 /* .dig_vol_tab = (s16 *)dig_vol_table, //数字音量表 */ .vcm_cap_en = 1, //配1代表走外部通路,vcm上有电容时,可以提升电路抑制电源噪声能力,提高ADC的性能,配0相当于vcm上无电容,抑制电源噪声能力下降,ADC性能下降 #if (SYS_VOL_TYPE == VOL_TYPE_AD) .digital_gain_limit = 16384, #endif // #if (SYS_VOL_TYPE == VOL_TYPE_AD) .power_on_mode = 0, }; #endif /************************** ADC ****************************/ #if TCFG_AUDIO_ADC_ENABLE #ifndef TCFG_AUDIO_MIC0_BIAS_EN #define TCFG_AUDIO_MIC0_BIAS_EN 0 #endif/*TCFG_AUDIO_MIC0_BIAS_EN*/ #ifndef TCFG_AUDIO_MIC1_BIAS_EN #define TCFG_AUDIO_MIC1_BIAS_EN 0 #endif/*TCFG_AUDIO_MIC1_BIAS_EN*/ #ifndef TCFG_AUDIO_MIC2_BIAS_EN #define TCFG_AUDIO_MIC2_BIAS_EN 0 #endif/*TCFG_AUDIO_MIC2_BIAS_EN*/ #ifndef TCFG_AUDIO_MIC3_BIAS_EN #define TCFG_AUDIO_MIC3_BIAS_EN 0 #endif/*TCFG_AUDIO_MIC3_BIAS_EN*/ #ifndef TCFG_AUDIO_MIC_LDO_EN #define TCFG_AUDIO_MIC_LDO_EN 0 #endif/*TCFG_AUDIO_MIC_LDO_EN*/ struct adc_platform_data adc_data = { /*MIC LDO电流档位设置: 0:0.625ua 1:1.25ua 2:1.875ua 3:2.5ua*/ .mic_ldo_isel = TCFG_AUDIO_ADC_LD0_SEL, /*mic_mode 工作模式定义 #define AUDIO_MIC_CAP_MODE 0 //单端隔直电容模式 #define AUDIO_MIC_CAP_DIFF_MODE 1 //差分隔直电容模式 #define AUDIO_MIC_CAPLESS_MODE 2 //单端省电容模式 */ .mic_mode = TCFG_AUDIO_MIC_MODE, .mic1_mode = TCFG_AUDIO_MIC1_MODE, .mic2_mode = TCFG_AUDIO_MIC2_MODE, .mic3_mode = TCFG_AUDIO_MIC3_MODE, .mic_bias_inside = TCFG_AUDIO_MIC0_BIAS_EN, .mic1_bias_inside = TCFG_AUDIO_MIC1_BIAS_EN, .mic2_bias_inside = TCFG_AUDIO_MIC2_BIAS_EN, .mic3_bias_inside = TCFG_AUDIO_MIC3_BIAS_EN, /*MICLDO供电输出到PAD(PA0)控制使能*/ .mic_ldo_pwr = TCFG_AUDIO_MIC_LDO_EN, // MIC LDO 输出到 PA0 /*MIC免电容方案需要设置,影响MIC的偏置电压 0b0001~0b1001 : 0.5k ~ 4.5k step = 0.5k 0b1010~0b1111 : 5k ~ 10k step = 1k */ .mic_bias_res = 4, .mic1_bias_res = 4, .mic2_bias_res = 4, .mic3_bias_res = 4, /*MIC LDO电压档位设置,也会影响MIC的偏置电压 0:1.3v 1:1.4v 2:1.5v 3:2.0v 4:2.2v 5:2.4v 6:2.6v 7:2.8v */ .mic_ldo_vsel = 5, //mic的去直流dcc寄存器配置值,可配0到15,数值越大,其高通转折点越低 .mic_dcc = 8, }; #endif #if TCFG_SMART_VOICE_ENABLE const struct vad_mic_platform_data vad_mic_data = { .mic_data = { // .mic_mode = TCFG_AUDIO_MIC_MODE, .mic_ldo_isel = 2, .mic_ldo_vsel = 5, .mic_ldo2PAD_en = 1, .mic_bias_en = 0, .mic_bias_res = 0, .mic_bias_inside = TCFG_AUDIO_MIC0_BIAS_EN, /* ADC偏置电阻配置*/ .adc_rbs = 3, /* ADC输入电阻配置*/ .adc_rin = 3, /*.adc_test = 1,*/ }, .power_data = { /*VADLDO电压档位:0~7*/ .ldo_vs = 3, /*VADLDO误差运放电流档位:0~3*/ #if TCFG_VAD_LOWPOWER_CLOCK == VAD_CLOCK_USE_PMU_STD12M .ldo_is = 1, #else .ldo_is = 2, #endif .clock = TCFG_VAD_LOWPOWER_CLOCK, /*VAD时钟选项*/ .acm_select = 8, }, }; #endif /* struct audio_pf_data audio_pf_d = { */ /* #if TCFG_AUDIO_DAC_ENABLE */ /* .adc_pf_data = &adc_data, */ /* #endif */ /* #if TCFG_AUDIO_ADC_ENABLE */ /* .dac_pf_data = &dac_data, */ /* #endif */ /* }; */ /* struct audio_platform_data audio_data = { */ /* .private_data = (void *) &audio_pf_d, */ /* }; */ /************************** IO KEY ****************************/ #if TCFG_IOKEY_ENABLE const struct iokey_port iokey_list[] = { { .connect_way = TCFG_IOKEY_POWER_CONNECT_WAY, //IO按键的连接方式 .key_type.one_io.port = TCFG_IOKEY_POWER_ONE_PORT, //IO按键对应的引脚 .key_value = 0, //按键值 }, #if CLIENT_BOARD == HEAD_FB || \ CLIENT_BOARD == HEAD_HYBRID { .connect_way = TCFG_IOKEY_MFB_CONNECT_WAY, //IO按键的连接方式 .key_type.one_io.port = TCFG_IOKEY_MFB_ONE_PORT, //IO按键对应的引脚 .key_value = 1, //按键值 }, { .connect_way = TCFG_IOKEY_PREV_CONNECT_WAY, //IO按键的连接方式 .key_type.one_io.port = TCFG_IOKEY_PREV_ONE_PORT, //IO按键对应的引脚 .key_value = 2, //按键值 }, { .connect_way = TCFG_IOKEY_NEXT_CONNECT_WAY, //IO按键的连接方式 .key_type.one_io.port = TCFG_IOKEY_NEXT_ONE_PORT, //IO按键对应的引脚 .key_value = 3, //按键值 }, { .connect_way = TCFG_IOKEY_CALL_CONNECT_WAY, //IO按键的连接方式 .key_type.one_io.port = TCFG_IOKEY_CALL_ONE_PORT, //IO按键对应的引脚 .key_value = 4, //按键值 }, #endif }; const struct iokey_platform_data iokey_data = { .enable = TCFG_IOKEY_ENABLE, //是否使能IO按键 .num = ARRAY_SIZE(iokey_list), //IO按键的个数 .port = iokey_list, //IO按键参数表 }; #if MULT_KEY_ENABLE //组合按键消息映射表 //配置注意事项:单个按键按键值需要按照顺序编号,如power:0, prev:1, next:2 //bit_value = BIT(0) | BIT(1) 指按键值为0和按键值为1的两个按键被同时按下, //remap_value = 3指当这两个按键被同时按下后重新映射的按键值; const struct key_remap iokey_remap_table[] = { {.bit_value = BIT(0) | BIT(1), .remap_value = 3}, {.bit_value = BIT(0) | BIT(2), .remap_value = 4}, {.bit_value = BIT(1) | BIT(2), .remap_value = 5}, }; const struct key_remap_data iokey_remap_data = { .remap_num = ARRAY_SIZE(iokey_remap_table), .table = iokey_remap_table, }; #endif #endif /*********************** LP TOUCH KEY ****************************/ #if TCFG_LP_TOUCH_KEY_ENABLE const struct lp_touch_key_platform_data lp_touch_key_config = { /*触摸按键*/ .ch[0].enable = TCFG_LP_TOUCH_KEY0_EN, .ch[0].wakeup_enable = TCFG_LP_TOUCH_KEY0_WAKEUP_EN, .ch[0].port = IO_PORTB_00, .ch[0].sensitivity = TCFG_LP_TOUCH_KEY0_SENSITIVITY, .ch[0].key_value = 0, .ch[1].enable = TCFG_LP_TOUCH_KEY1_EN, .ch[1].wakeup_enable = TCFG_LP_TOUCH_KEY1_WAKEUP_EN, .ch[1].port = IO_PORTB_01, .ch[1].sensitivity = TCFG_LP_TOUCH_KEY1_SENSITIVITY, .ch[1].key_value = 0, .ch[2].enable = TCFG_LP_TOUCH_KEY2_EN, .ch[2].wakeup_enable = TCFG_LP_TOUCH_KEY2_WAKEUP_EN, .ch[2].port = IO_PORTB_02, .ch[2].sensitivity = TCFG_LP_TOUCH_KEY2_SENSITIVITY, .ch[2].key_value = 1, .ch[3].enable = TCFG_LP_TOUCH_KEY3_EN, .ch[3].wakeup_enable = TCFG_LP_TOUCH_KEY3_WAKEUP_EN, .ch[3].port = IO_PORTB_04, .ch[3].sensitivity = TCFG_LP_TOUCH_KEY3_SENSITIVITY, .ch[3].key_value = 2, .ch[4].enable = TCFG_LP_TOUCH_KEY4_EN, .ch[4].wakeup_enable = TCFG_LP_TOUCH_KEY4_WAKEUP_EN, .ch[4].port = IO_PORTB_05, .ch[4].sensitivity = TCFG_LP_TOUCH_KEY4_SENSITIVITY, .ch[4].key_value = 3, //把触摸按键之间的滑动也当做按键处理,有上滑,下滑,左滑,右滑 .slide_mode_en = TCFG_LP_SLIDE_KEY_ENABLE, .slide_mode_key_value = 3, //入耳检测相关的配置 .eartch_en = TCFG_LP_EARTCH_KEY_ENABLE, .eartch_ch = TCFG_LP_EARTCH_KEY_CH, .eartch_ref_ch = TCFG_LP_EARTCH_KEY_REF_CH, .eartch_soft_inear_val = TCFG_LP_EARTCH_SOFT_INEAR_VAL, .eartch_soft_outear_val = TCFG_LP_EARTCH_SOFT_OUTEAR_VAL, }; #endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */ /************************** PLCNT TOUCH_KEY ****************************/ #if TCFG_TOUCH_KEY_ENABLE const const struct touch_key_port touch_key_list[] = { { .press_delta = TCFG_TOUCH_KEY0_PRESS_DELTA, .port = TCFG_TOUCH_KEY0_PORT, .key_value = TCFG_TOUCH_KEY0_VALUE, }, { .press_delta = TCFG_TOUCH_KEY1_PRESS_DELTA, .port = TCFG_TOUCH_KEY1_PORT, .key_value = TCFG_TOUCH_KEY1_VALUE, }, }; const struct touch_key_platform_data touch_key_data = { .num = ARRAY_SIZE(touch_key_list), .port_list = touch_key_list, }; #endif /* #if TCFG_TOUCH_KEY_ENABLE */ /************************** AD KEY ****************************/ #if TCFG_ADKEY_ENABLE const struct adkey_platform_data adkey_data = { .enable = TCFG_ADKEY_ENABLE, //AD按键使能 .adkey_pin = TCFG_ADKEY_PORT, //AD按键对应引脚 .ad_channel = TCFG_ADKEY_AD_CHANNEL, //AD通道值 .extern_up_en = TCFG_ADKEY_EXTERN_UP_ENABLE, //是否使用外接上拉电阻 .ad_value = { //根据电阻算出来的电压值 TCFG_ADKEY_VOLTAGE0, TCFG_ADKEY_VOLTAGE1, TCFG_ADKEY_VOLTAGE2, TCFG_ADKEY_VOLTAGE3, TCFG_ADKEY_VOLTAGE4, TCFG_ADKEY_VOLTAGE5, TCFG_ADKEY_VOLTAGE6, TCFG_ADKEY_VOLTAGE7, TCFG_ADKEY_VOLTAGE8, TCFG_ADKEY_VOLTAGE9, }, .key_value = { //AD按键各个按键的键值 TCFG_ADKEY_VALUE0, TCFG_ADKEY_VALUE1, TCFG_ADKEY_VALUE2, TCFG_ADKEY_VALUE3, TCFG_ADKEY_VALUE4, TCFG_ADKEY_VALUE5, TCFG_ADKEY_VALUE6, TCFG_ADKEY_VALUE7, TCFG_ADKEY_VALUE8, TCFG_ADKEY_VALUE9, }, }; #endif /************************** RDEC_KEY ****************************/ #if TCFG_RDEC_KEY_ENABLE const struct rdec_device rdeckey_list[] = { { .index = RDEC0 , .sin_port0 = TCFG_RDEC0_ECODE1_PORT, .sin_port1 = TCFG_RDEC0_ECODE2_PORT, .key_value0 = TCFG_RDEC0_KEY0_VALUE | BIT(7), .key_value1 = TCFG_RDEC0_KEY1_VALUE | BIT(7), }, { .index = RDEC1 , .sin_port0 = TCFG_RDEC1_ECODE1_PORT, .sin_port1 = TCFG_RDEC1_ECODE2_PORT, .key_value0 = TCFG_RDEC1_KEY0_VALUE | BIT(7), .key_value1 = TCFG_RDEC1_KEY1_VALUE | BIT(7), }, { .index = RDEC2 , .sin_port0 = TCFG_RDEC2_ECODE1_PORT, .sin_port1 = TCFG_RDEC2_ECODE2_PORT, .key_value0 = TCFG_RDEC2_KEY0_VALUE | BIT(7), .key_value1 = TCFG_RDEC2_KEY1_VALUE | BIT(7), }, }; const struct rdec_platform_data rdec_key_data = { .enable = 1, //TCFG_RDEC_KEY_ENABLE, //是否使能RDEC按键 .num = ARRAY_SIZE(rdeckey_list), //RDEC按键的个数 .rdec = rdeckey_list, //RDEC按键参数表 }; #endif /************************** IIS config ****************************/ #if (TCFG_AUDIO_INPUT_IIS || TCFG_AUDIO_OUTPUT_IIS) ALINK_PARM alink0_platform_data = { .module = ALINK0, .mclk_io = TCFG_IIS_MCLK_IO, .sclk_io = TCFG_SCLK_IO, .lrclk_io = TCFG_LRCLK_IO, .ch_cfg[0].data_io = TCFG_DATA0_IO, .ch_cfg[1].data_io = TCFG_DATA1_IO, .ch_cfg[2].data_io = TCFG_DATA2_IO, .ch_cfg[3].data_io = TCFG_DATA3_IO, .mode = ALINK_MD_IIS, #if TCFG_IIS_MODE .role = ALINK_ROLE_SLAVE, #else .role = ALINK_ROLE_MASTER, #endif /*TCFG_IIS_MODE*/ .clk_mode = ALINK_CLK_FALL_UPDATE_RAISE_SAMPLE, .bitwide = ALINK_LEN_16BIT, .sclk_per_frame = ALINK_FRAME_32SCLK, .dma_len = 4 * 1024, .sample_rate = TCFG_IIS_SR, .buf_mode = ALINK_BUF_CIRCLE, /*.iperiod = 64, //配置该项可以控制输入的延时*/ }; #endif /************************** PWM_LED ****************************/ #if TCFG_PWMLED_ENABLE LED_PLATFORM_DATA_BEGIN(pwm_led_data) .io_mode = TCFG_PWMLED_IOMODE, //推灯模式设置:支持单个IO推两个灯和两个IO推两个灯 .io_cfg.one_io.pin = TCFG_PWMLED_PIN, //单个IO推两个灯的IO口配置 LED_PLATFORM_DATA_END() #endif #if 0 const struct soft_iic_config soft_iic_cfg[] = { //iic0 data { .scl = TCFG_SW_I2C0_CLK_PORT, //IIC CLK脚 .sda = TCFG_SW_I2C0_DAT_PORT, //IIC DAT脚 .delay = TCFG_SW_I2C0_DELAY_CNT, //软件IIC延时参数,影响通讯时钟频率 .io_pu = 1, //是否打开上拉电阻,如果外部电路没有焊接上拉电阻需要置1 }, #if 0 //iic1 data { .scl = IO_PORTA_05, .sda = IO_PORTA_06, .delay = 50, .io_pu = 1, }, #endif }; const struct hw_iic_config hw_iic_cfg[] = { //iic0 data { /*硬件IIC端口下选择 SCL SDA {IO_PORT_DP, IO_PORT_DM}, //group a {IO_PORTC_04, IO_PORTC_05}, //group b {IO_PORTC_02, IO_PORTC_03}, //group c {IO_PORTA_05, IO_PORTA_06}, //group d */ .port = TCFG_HW_I2C0_PORTS, .baudrate = TCFG_HW_I2C0_CLK, //IIC通讯波特率 .hdrive = 0, //是否打开IO口强驱 .io_filter = 1, //是否打开滤波器(去纹波) .io_pu = 1, //是否打开上拉电阻,如果外部电路没有焊接上拉电阻需要置1 }, }; #endif #if TCFG_SD0_ENABLE SD0_PLATFORM_DATA_BEGIN(sd0_data) .port = { TCFG_SD0_PORT_CMD, TCFG_SD0_PORT_CLK, TCFG_SD0_PORT_DA0, TCFG_SD0_PORT_DA1, TCFG_SD0_PORT_DA2, TCFG_SD0_PORT_DA3, }, .data_width = TCFG_SD0_DAT_MODE, .speed = TCFG_SD0_CLK, .detect_mode = TCFG_SD0_DET_MODE, .priority = 3, #if (TCFG_SD0_DET_MODE == SD_IO_DECT) .detect_io = TCFG_SD0_DET_IO, .detect_io_level = TCFG_SD0_DET_IO_LEVEL, .detect_func = sdmmc_0_io_detect, .power = sd_set_power, /* .power = NULL, */ #elif (TCFG_SD0_DET_MODE == SD_CLK_DECT) .detect_io_level = TCFG_SD0_DET_IO_LEVEL, .detect_func = sdmmc_0_clk_detect, .power = sd_set_power, /* .power = NULL, */ #else .detect_func = sdmmc_cmd_detect, .power = NULL, #endif SD0_PLATFORM_DATA_END() #endif /* #if TCFG_SD0_ENABLE */ REGISTER_DEVICES(device_table) = { /* { "audio", &audio_dev_ops, (void *) &audio_data }, */ #if TCFG_CHARGE_ENABLE { "charge", &charge_dev_ops, (void *)&charge_data }, #endif #if TCFG_SD0_ENABLE { "sd0", &sd_dev_ops, (void *) &sd0_data}, #endif }; /************************** power_param ****************************/ const struct low_power_param power_param = { .config = TCFG_LOWPOWER_LOWPOWER_SEL, //低功耗使能,蓝牙&&系统空闲可进入低功耗 .btosc_hz = TCFG_CLOCK_OSC_HZ, //蓝牙晶振频率 .delay_us = TCFG_CLOCK_SYS_HZ / 1000000L, //提供给低功耗模块的延时(不需要需修改) .vddiom_lev = TCFG_LOWPOWER_VDDIOM_LEVEL, //vddiom等级 .osc_type = TCFG_LOWPOWER_OSC_TYPE, //低功耗晶振类型,btosc/lrc #if (TCFG_LOWPOWER_RAM_SIZE) .mem_init_con = MEM_PWR_RAM_SET(TCFG_LOWPOWER_RAM_SIZE), #else .mem_init_con = 0, #endif #if (TCFG_LP_TOUCH_KEY_ENABLE && \ (TCFG_LP_TOUCH_KEY0_WAKEUP_EN || \ TCFG_LP_TOUCH_KEY1_WAKEUP_EN || \ TCFG_LP_TOUCH_KEY2_WAKEUP_EN || \ TCFG_LP_TOUCH_KEY3_WAKEUP_EN || \ TCFG_LP_TOUCH_KEY4_WAKEUP_EN )) .lpctmu_en = 1, #else .lpctmu_en = 0, #endif }; /************************** wk_param ****************************/ struct port_wakeup port0 = { .pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能 .edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿 .filter = PORT_FLT_8ms, .iomap = TCFG_IOKEY_POWER_ONE_PORT, //唤醒口选择 }; #if CLIENT_BOARD == HEAD_FB || \ CLIENT_BOARD == HEAD_HYBRID struct port_wakeup port2 = { .pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能 .edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿 .filter = PORT_FLT_8ms, .iomap = TCFG_IOKEY_MFB_ONE_PORT, //唤醒口选择 }; struct port_wakeup port3 = { .pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能 .edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿 .filter = PORT_FLT_8ms, .iomap = TCFG_IOKEY_PREV_ONE_PORT, //唤醒口选择 }; struct port_wakeup port4 = { .pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能 .edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿 .filter = PORT_FLT_8ms, .iomap = TCFG_IOKEY_NEXT_ONE_PORT, //唤醒口选择 }; struct port_wakeup port5 = { .pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能 .edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿 .filter = PORT_FLT_8ms, .iomap = TCFG_IOKEY_CALL_ONE_PORT, //唤醒口选择 }; #endif #if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE || TCFG_UMIDIGI_BOX_ENABLE) struct port_wakeup port1 = { .pullup_down_enable = DISABLE, //配置I/O 内部上下拉是否使能 .edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿 .filter = PORT_FLT_1ms, .iomap = TCFG_CHARGESTORE_PORT, //唤醒口选择 }; #endif #if TCFG_CHARGE_ENABLE struct port_wakeup charge_port = { .edge = RISING_EDGE, //唤醒方式选择,可选:上升沿\下降沿\双边沿 .filter = PORT_FLT_16ms, .iomap = IO_CHGFL_DET, //唤醒口选择 }; struct port_wakeup vbat_port = { .edge = BOTH_EDGE, //唤醒方式选择,可选:上升沿\下降沿\双边沿 .filter = PORT_FLT_16ms, .iomap = IO_VBTCH_DET, //唤醒口选择 }; struct port_wakeup ldoin_port = { .edge = BOTH_EDGE, //唤醒方式选择,可选:上升沿\下降沿\双边沿 .filter = PORT_FLT_16ms, .iomap = IO_LDOIN_DET, //唤醒口选择 }; #if TCFG_EXTERN_CHARGE_ENABLE struct port_wakeup ex_charge_port = { .edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿\双边沿 .filter = PORT_FLT_16ms, .iomap = TCFG_EXTERN_CHARGE_PORT, //唤醒口选择 }; #endif #endif const struct wakeup_param wk_param = { #if (!(TCFG_LP_TOUCH_KEY_ENABLE && TCFG_LP_TOUCH_KEY1_EN)) .port[1] = &port0, #if CLIENT_BOARD == HEAD_FB || \ CLIENT_BOARD == HEAD_HYBRID //头戴式全部按键唤醒增加灵敏度,但会增加少许可忽略功耗。该处定义只会唤醒,按键开机需要在get_power_on_status增加判断 .port[3] = &port2, .port[4] = &port3, .port[5] = &port4, .port[6] = &port5, #endif #endif #if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE || TCFG_UMIDIGI_BOX_ENABLE) /* TCFG_CHARGESTORE_PORT */ .port[2] = &port1, #endif #if TCFG_CHARGE_ENABLE #if TCFG_EXTERN_CHARGE_ENABLE /* TCFG_EXTERN_CHARGE_PORT */ .port[7] = &ex_charge_port, #endif .aport[0] = &charge_port, .aport[1] = &vbat_port, .aport[2] = &ldoin_port, #endif }; void gSensor_wkupup_disable(void) { log_info("gSensor wkup disable\n"); power_wakeup_index_enable(1, 0); } void gSensor_wkupup_enable(void) { log_info("gSensor wkup enable\n"); power_wakeup_index_enable(1, 1); } void debug_uart_init(const struct uart_platform_data *data) { #if TCFG_UART0_ENABLE if (data) { uart_init(data); } else { uart_init(&uart0_data); } #endif } STATUS *get_led_config(void) { return &(__this->led); } STATUS *get_tone_config(void) { return &(__this->tone); } u8 get_sys_default_vol(void) { return 21; } u8 get_power_on_status(void) { #if TCFG_IOKEY_ENABLE struct iokey_port *power_io_list = NULL; power_io_list = iokey_data.port; if (iokey_data.enable) { if (gpio_read(power_io_list->key_type.one_io.port) == power_io_list->connect_way){ return 1; } } #endif #if TCFG_ADKEY_ENABLE if (adkey_data.enable) { return 1; } #endif #if TCFG_LP_TOUCH_KEY_ENABLE return lp_touch_key_power_on_status(); #endif return 0; } static void board_devices_init(void) { #if TCFG_PWMLED_ENABLE pwm_led_init(&pwm_led_data); #endif #if (TCFG_IOKEY_ENABLE || TCFG_ADKEY_ENABLE || TCFG_RDEC_KEY_ENABLE || TCFG_TOUCH_KEY_ENABLE) key_driver_init(); #endif #if TCFG_UART_KEY_ENABLE extern int uart_key_init(void); uart_key_init(); #endif /* #if TCFG_UART_KEY_ENABLE */ #if TCFG_LP_TOUCH_KEY_ENABLE lp_touch_key_init(&lp_touch_key_config); #endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */ #if (!TCFG_CHARGE_ENABLE) CHARGE_EN(0); CHGGO_EN(0); #endif #if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE chargestore_api_init(&chargestore_data); #endif } //*********************************************************************************// // linein配置 // //*********************************************************************************// static int linein_det_timer = 0; static void linein_det(void) { u32 linein_det_voltage = 0; linein_det_voltage = adc_get_voltage(TCFG_LINEIN_AD_CHANNEL); printf("linein_det_voltage = %d mv\n", linein_det_voltage); if(!get_charge_online_flag()){ if(linein_det_voltage > TCFG_LINEIN_PORT_OUT_DET_VOLTAGE && linein_det_voltage < TCFG_LINEIN_PORT_IN_DET_VOLTAGE){ printf(">>>>>>>>>>>>>>>>aux in!\n"); app_var.goto_poweroff_flag = 0; sys_enter_soft_poweroff(NULL); } } } void linein_det_enable(void) { if (linein_det_timer) { linein_det_timer = sys_timer_add(NULL, linein_det, 1000);//1000ms } } void linein_det_disable(void) { if (linein_det_timer) { sys_timer_del(linein_det_timer); } } /* 当插入3.5MM的音频 线时,蓝牙耳机 */ /* 变成普通耳机状态,此时主控需关机,DAC设高阻 ,按键不 */ /* 支持开机和功能操作,需拔掉3.5MM线,需重新开机才恢复 */ static void linein_det_init(void) { adc_add_sample_ch(TCFG_LINEIN_AD_CHANNEL); gpio_set_die(TCFG_LINEIN_CHECK_PORT, 0); gpio_set_direction(TCFG_LINEIN_CHECK_PORT, 1); gpio_set_pull_up(TCFG_LINEIN_CHECK_PORT, 1); gpio_set_pull_down(TCFG_LINEIN_CHECK_PORT, 0); linein_det_timer = sys_timer_add(NULL, linein_det, 1000);//1000ms } //*********************************************************************************// // 外置芯片船运仓储模式配置 // //*********************************************************************************// #if TCFG_EXTERN_STORAGE_MODE_ENABLE void external_storage_io_disable(void) { gpio_set_direction(TCFG_EXTERN_STORAGE_MODE_BOAT_PL_PORT,0); gpio_set_output_value(TCFG_EXTERN_STORAGE_MODE_BOAT_PL_PORT,0); } #endif extern void cfg_file_parse(u8 idx); void board_init() { #if TCFG_AUDIO_HPVDD_ENABLE //HPVDD外接1.85V电源,提升DAC输出 幅度 gpio_set_direction(TCFG_AUDIO_HPVDD_PORT,0); gpio_set_output_value(TCFG_AUDIO_HPVDD_PORT,1); #endif #if TCFG_EXTERN_STORAGE_MODE_ENABLE /* BOAT_PL正常使用时候给高,测试盒进入船运模式后,把BOAT_PLI设置为低电平,vbat彻底切断,整个系统都没电。要插充电主控才跑起来,跑起来后再次使能这个口 */ gpio_set_direction(TCFG_EXTERN_STORAGE_MODE_BOAT_PL_PORT,0); gpio_set_output_value(TCFG_EXTERN_STORAGE_MODE_BOAT_PL_PORT,1); #endif board_power_init(); //adc_vbg_init(); adc_init(); cfg_file_parse(0); devices_init(); #if TCFG_AUDIO_ANC_ENABLE anc_init(); #endif/*TCFG_AUDIO_ANC_ENABLE*/ board_devices_init(); #if TCFG_CHARGE_ENABLE if(get_charge_online_flag()) #else if (0) #endif { power_set_mode(PWR_LDO15); }else{ power_set_mode(TCFG_LOWPOWER_POWER_SEL); } //针对硅mic要输出1给mic供电 /* gpio_set_pull_up(IO_PORTA_04, 0); */ /* gpio_set_pull_down(IO_PORTA_04, 0); */ /* gpio_set_direction(IO_PORTA_04, 0); */ /* gpio_set_output_value(IO_PORTA_04,1); */ #if TCFG_UART0_ENABLE if (uart0_data.rx_pin < IO_MAX_NUM) { gpio_set_die(uart0_data.rx_pin, 1); } #endif #if TCFG_LINEIN_ENABLE linein_det_init(); #endif #if TCFG_SMART_VOICE_ENABLE int audio_smart_voice_detect_init(struct vad_mic_platform_data *mic_data); audio_smart_voice_detect_init((struct vad_mic_platform_data *)&vad_mic_data); #endif /* #if TCFG_SMART_VOICE_ENABLE */ #ifdef CONFIG_BOARD_AISPEECH_VAD_ASR extern int audio_ais_platform_asr_init(struct vad_mic_platform_data *mic_data); audio_ais_platform_asr_init((struct vad_mic_platform_data *)&vad_mic_data); #endif /*CONFIG_BOARD_AISPEECH_VAD_ASR*/ #ifdef AUDIO_PCM_DEBUG extern void uartSendInit(); uartSendInit(); #endif/*AUDIO_PCM_DEBUG*/ } /*进软关机之前默认将IO口都设置成高阻状态,需要保留原来状态的请修改该函数*/ extern void dac_power_off(void); void board_set_soft_poweroff(void) { //power按键 #if TCFG_IOKEY_ENABLE soff_gpio_protect(TCFG_IOKEY_POWER_ONE_PORT); soff_gpio_protect(TCFG_IOKEY_MFB_ONE_PORT); soff_gpio_protect(TCFG_IOKEY_PREV_ONE_PORT); soff_gpio_protect(TCFG_IOKEY_NEXT_ONE_PORT); soff_gpio_protect(TCFG_IOKEY_CALL_ONE_PORT); #endif #if TCFG_EXTERN_STORAGE_MODE_ENABLE soff_gpio_protect(TCFG_EXTERN_STORAGE_MODE_BOAT_PL_PORT); #endif #if (!(TCFG_LP_TOUCH_KEY_ENABLE && TCFG_LP_TOUCH_KEY1_EN)) //默认唤醒io soff_gpio_protect(IO_PORTB_01); #endif #if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE || TCFG_UMIDIGI_BOX_ENABLE) power_wakeup_index_enable(2, 0); #endif board_set_soft_poweroff_common(NULL); dac_power_off(); } void sleep_exit_callback(u32 usec) { sleep_exit_callback_common(NULL); putchar('>'); } void sleep_enter_callback(u8 step) { /* 此函数禁止添加打印 */ if (step == 1) { putchar('<'); } else { sleep_enter_callback_common(NULL); } } static void port_wakeup_callback(u8 index, u8 gpio) { log_info("%s:%d,%d",__FUNCTION__,index,gpio); #if TCFG_UMIDIGI_BOX_ENABLE if (index == 2) { ldo_port_wakeup_to_cmessage(); } #endif switch (index) { #if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE) case 2: extern void chargestore_ldo5v_fall_deal(void); chargestore_ldo5v_fall_deal(); break; #endif #if TCFG_EXTERN_CHARGE_ENABLE //外置充电下降沿触发唤醒 case 7: if (get_charge_online_flag()) { //检测到低电平,已经充满了 charge_event_to_user(CHARGE_EVENT_CHARGE_FULL); } #endif } } static void aport_wakeup_callback(u8 index, u8 gpio, u8 edge) { log_info("%s:%d,%d",__FUNCTION__,index,gpio); #if TCFG_CHARGE_ENABLE switch (gpio) { case IO_CHGFL_DET://charge port charge_wakeup_isr(); break; case IO_VBTCH_DET://vbat port case IO_LDOIN_DET://ldoin port ldoin_wakeup_isr(); break; } #endif } void board_power_init(void) { log_info("Power init : %s", __FILE__); power_init(&power_param); power_set_callback(TCFG_LOWPOWER_LOWPOWER_SEL, sleep_enter_callback, sleep_exit_callback, board_set_soft_poweroff); #if TCFG_UMIDIGI_BOX_ENABLE gpio_set_die(TCFG_CHARGESTORE_PORT, 1); umidigi_chargestore_message_callback(app_umidigi_chargetore_message_deal); #endif power_keep_dacvdd_en(0); power_wakeup_init(&wk_param); /*先关闭外置充电使能,后面检测到充电插入再开启*/ #if TCFG_EXTERN_CHARGE_ENABLE power_wakeup_disable_with_port(TCFG_EXTERN_CHARGE_PORT); #endif power_awakeup_set_callback(aport_wakeup_callback); power_wakeup_set_callback(port_wakeup_callback); } #endif /* #ifdef CONFIG_BOARD_JL7018F_DEMO */