AC695N-SoundBox-SDK/apps/soundbox/board/br23/board_ac6083a/board_ac6083a.c
2026-08-09 00:00:00 +00:00

1348 lines
39 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "app_config.h"
#ifdef CONFIG_BOARD_AC6083A
#include "system/includes.h"
#include "media/includes.h"
#include "asm/sdmmc.h"
#include "asm/chargestore.h"
#include "asm/charge.h"
#include "asm/pwm_led.h"
#include "asm/rtc.h"
#include "tone_player.h"
#include "audio_config.h"
#include "asm/iic_hw.h"
#include "asm/iic_soft.h"
#include "gSensor/gSensor_manage.h"
#include "key_event_deal.h"
#include "user_cfg.h"
#include "linein/linein_dev.h"
#include "usb/otg.h"
#include "ui/ui_api.h"
#include "dev_manager.h"
#include "fm/fm_manage.h"
#include "asm/power/p33.h"
#include "norflash.h"
#include "asm/spi.h"
#include "ui_manage.h"
#include "spi/nor_fs.h"
#include "user_api/app_status_api.h"
#include "app_main.h"
#include "app_task.h"
#include "app_power_manage.h"
#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 = {
//提示音设置
.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)
// *INDENT-OFF*
/************************** UART config****************************/
#if TCFG_UART0_ENABLE
UART0_PLATFORM_DATA_BEGIN(uart0_data)
.tx_pin = TCFG_UART0_TX_PORT,
.rx_pin = TCFG_UART0_RX_PORT,
.baudrate = TCFG_UART0_BAUDRATE,
.flags = UART_DEBUG,
UART0_PLATFORM_DATA_END()
#endif //TCFG_UART0_ENABLE
/************************** SD config ****************************/
#if TCFG_SD0_ENABLE
/* int sdmmc_0_io_detect(const struct sdmmc_platform_data *data) */
/* { */
/* return 1; */
/* } */
/* void sd_set_power(u8 enable) */
/* { */
/* static u8 old_enable = 0xff; */
/* */
/* if(old_enable == enable){ */
/* return; */
/* } */
/* if(enable){ */
/* sdpg_config(1); */
/* }else{ */
/* sdpg_config(0); */
/* } */
/* old_enable = enable; */
/* } */
SD0_PLATFORM_DATA_BEGIN(sd0_data)
// .port = 'B', //sd0 support port 'A' and port 'B'
// .data_width = 1,
// .speed = 3000000,
// .detect_mode = SD_CMD_DECT,
.port = TCFG_SD0_PORTS, //sd0 support port 'A' and port 'B'
.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,//当检测模式为io口检测是有效
.detect_io_level = TCFG_SD0_DET_IO_LEVEL,//0低电平检测到卡。 1高电平检测到卡
.detect_func = sdmmc_0_io_detect,//库函数需要detect_io和detect_io_level两个元素作为参数。可以自行重写一个检测函数在线返回1不在线返回0即可。
.power = sd_set_power,//库函数使用SDPG引脚。可以自行重写其他的SD卡电源控制函数传入0关电源。传入1开电源。如果电源硬件已固定不可控则该函数无效可以填NULL
/* .power = NULL, */
#elif (TCFG_SD0_DET_MODE == SD_CLK_DECT)
.detect_io_level = TCFG_SD0_DET_IO_LEVEL,//0低电平检测到卡。 1高电平检测到卡
.detect_func = sdmmc_0_clk_detect,//库函数需要detect_io_level元素作为参数。可以自行重写一个检测函数在线返回1不在线返回0即可。
.power = sd_set_power,//库函数使用SDPG引脚。可以自行重写其他的SD卡电源控制函数传入0关电源。传入1开电源。如果电源硬件已固定不可控则该函数无效可以填NULL
/* .power = NULL, */
#else
.detect_func = sdmmc_cmd_detect,
.power = NULL,//cmd检测需要全程供电建议用硬件固定电源。当然可以自行写其他的SD卡电源控制函数传入0关电源。传入1开电源。
/* .power = sd_set_power, */
#endif
SD0_PLATFORM_DATA_END()
#endif
#if TCFG_SD1_ENABLE
SD1_PLATFORM_DATA_BEGIN(sd1_data)
// .port = 'A', //sd1 only support port 'A'
// .data_width = 1,
// .speed = 3000000,
// .detect_mode = SD_CMD_DECT,
.port = TCFG_SD1_PORTS, //sd1 only support port 'A'
.data_width = TCFG_SD1_DAT_MODE,
.speed = TCFG_SD1_CLK,
.detect_mode = TCFG_SD1_DET_MODE,
.priority = 3,
#if (TCFG_SD1_DET_MODE == SD_IO_DECT)
.detect_io = TCFG_SD1_DET_IO,//当检测模式为io口检测是有效
.detect_io_level = TCFG_SD1_DET_IO_LEVEL,//0低电平检测到卡。 1高电平检测到卡
.detect_func = sdmmc_1_io_detect,//库函数需要detect_io和detect_io_level两个元素作为参数。可以自行重写一个检测函数在线返回1不在线返回0即可。
.power = sd_set_power,//库函数使用SDPG引脚。可以自行重写其他的SD卡电源控制函数传入0关电源。传入1开电源。如果电源硬件已固定不可控则该函数无效可以填NULL
/* .power = NULL, */
#elif (TCFG_SD1_DET_MODE == SD_CLK_DECT)
.detect_io_level = TCFG_SD1_DET_IO_LEVEL,//0低电平检测到卡。 1高电平检测到卡
.detect_func = sdmmc_1_clk_detect,//库函数需要detect_io_level元素作为参数。可以自行重写一个检测函数在线返回1不在线返回0即可。
.power = sd_set_power,//库函数使用SDPG引脚。可以自行重写其他的SD卡电源控制函数传入0关电源。传入1开电源。如果电源硬件已固定不可控则该函数无效可以填NULL
/* .power = NULL, */
#else
.detect_func = sdmmc_cmd_detect,
.power = NULL,//cmd检测需要全程供电建议用硬件固定电源。当然可以自行写其他的SD卡电源控制函数传入0关电源。传入1开电源。
/* .power = sd_set_power, */
#endif
SD1_PLATFORM_DATA_END()
#endif
/************************** 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, //充电电流
/*ldo5v拔出过滤值过滤时间 = (filter*2 + 20)ms,ldoin<0.6V且时间大于过滤时间才认为拔出
对于充满直接从5V掉到0V的充电仓该值必须设置成0对于充满由5V先掉到0V之后再升压到xV的
充电仓,需要根据实际情况设置该值大小*/
.ldo5v_off_filter = 100,
/*ldo5v的10k下拉电阻使能,若充电舱需要更大的负载才能检测到插入时请将该变量置1,默认值设置为1
对于充电舱需要按键升压,且维持电压是从充电舱经过上拉电阻到充电口的舱请将该值改为0*/
.ldo5v_pulldown_en = 1,
CHARGE_PLATFORM_DATA_END()
#endif//TCFG_CHARGE_ENABLE
/************************** DAC ****************************/
#if TCFG_AUDIO_DAC_ENABLE
struct dac_platform_data dac_data = {
.ldo_volt = TCFG_AUDIO_DAC_LDO_VOLT, //DACVDD等级.需要根据具体硬件来设置(高低压)可选:1.2V/1.3V/2.35V/2.5V/2.65V/2.8V/2.95V/3.1V
#if ((TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR) || (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF))
.vcmo_en = 0, //四声道与双声道差分关闭VCOMO
#else
.vcmo_en = 1, //是否打开VCOMO
#endif
.output = TCFG_AUDIO_DAC_CONNECT_MODE, //DAC输出配置和具体硬件连接有关需根据硬件来设置
.ldo_isel = 3,
.ldo_fb_isel = 2,
.lpf_isel = 0x8,
};
#endif
/************************** ADC ****************************/
#if TCFG_AUDIO_ADC_ENABLE
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_LDO_SEL,
/*MIC 是否省隔直电容:
0: 不省电容 1: 省电容 */
#if ((TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR) || (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF))
.mic_capless = 0,//四声道与双声道差分使用,不省电容接法
#else
.mic_capless = TCFG_MIC_CAPLESS_ENABLE,
#endif
/*MIC内部上拉电阻挡位配置影响MIC的偏置电压
21:1.18K 20:1.42K 19:1.55K 18:1.99K 17:2.2K 16:2.4K 15:2.6K 14:2.91K 13:3.05K 12:3.5K 11:3.73K
10:3.91K 9:4.41K 8:5.0K 7:5.6K 6:6K 5:6.5K 4:7K 3:7.6K 2:8.0K 1:8.5K */
.mic_bias_res = 16,
/*MIC LDO电压档位设置,也会影响MIC的偏置电压
0:2.3v 1:2.5v 2:2.7v 3:3.0v */
.mic_ldo_vsel = 2,
/*MIC电容隔直模式使用内部mic偏置(PC7)*/
.mic_bias_inside = 1,
/*保持内部mic偏置输出*/
.mic_bias_keep = 0,
};
#endif/*TCFG_AUDIO_ADC_ENABLE*/
enum{
TURN_ON,
TURN_OFF,
FAST_BLINK,
SLOW_BLINK,
};
#define LED_CNT_BASE 5//闪灯频率控制
int cur_led_mode=FAST_BLINK;//闪灯状态
static u16 music_turnoff_timer=0;
static u16 led_blink_timer1=0;
static u16 led_blink_timer2=0;
static u16 power_on_timer=0;
static u32 ot;//pc状态区分
static u16 cr_t_id=0;
static u16 led_scan_timer;
static soft_poweroff_timer;
/*******************相关定时处理******************/
static void led_open()
{
static u16 cnt_1=0;
if(cnt_1>10)//变幅
gpio_set_output_value(IO_PORTB_10,1);
else
gpio_set_output_value(IO_PORTB_10,0);
cnt_1++;
if(cnt_1>11)
cnt_1=0;
}
static void led_close()
{
gpio_set_output_value(IO_PORTB_10,0);
}
static void poweron_led_blink()
{
if(cur_led_mode==FAST_BLINK)
cur_led_mode=TURN_ON;
}
static void poweroff_led_blink1()
{
if(get_charge_online_flag()==0)
cur_led_mode=FAST_BLINK;
else
cur_led_mode=TURN_OFF;
}
static void poweroff_led_blink2()
{
cur_led_mode=TURN_OFF;
}
static void music_turnoff()
{
if(get_charge_online_flag()==0){
app_var.goto_poweroff_flag=1;
app_task_switch_to(APP_POWEROFF_TASK);
}
else{
app_task_switch_to(APP_IDLE_TASK);
}
}
static void card_reader_timer()
{
ot--;
if(ot){
cur_led_mode=FAST_BLINK;
}
else{
if(cr_t_id)
sys_timer_del(cr_t_id);
cur_led_mode=TURN_ON;
cr_t_id=0;
}
}
static void pc_led_handler()
{
if(!cr_t_id)
cr_t_id=sys_timer_add(NULL,card_reader_timer,100);
ot=3;
}
static void soft_poweroff()
{
int poweroff_pin_value=gpio_read(IO_PORTA_01);
if(poweroff_pin_value==0){
P33_CON_SET(P3_PINR_CON, 0, 1, 1);
P33_CON_SET(P3_PINR_CON, 2, 1, 1);
app_var.goto_poweroff_flag=1;
app_task_switch_to(APP_POWEROFF_TASK);
}else{
P33_CON_SET(P3_PINR_CON, 0, 1, 1);
P33_CON_SET(P3_PINR_CON, 2, 1, 0);
}
}
/****************led状态处理**************/
void led_scan()
{
/* gpio_set_output_value(IO_PORT_DP,1); */
static u16 cnt;
switch(cur_led_mode){
case TURN_OFF:
led_close();
break;
case TURN_ON:
led_open();
break;
case FAST_BLINK:
if(cnt>LED_CNT_BASE*25/2)//变频
led_open();
else
led_close();
cnt++;
if(cnt>LED_CNT_BASE*25)
cnt=0;
break;
case SLOW_BLINK:
if(cnt>LED_CNT_BASE*250/2){
led_open();
}
else{
led_close();
}
cnt++;
if(cnt>LED_CNT_BASE*250)
cnt=0;
break;
default:
break;
}
/* gpio_set_output_value(IO_PORT_DP,0); */
}
void app_status_6083_handler(enum APP_STATUS status)
{
switch(status){
case APP_STATUS_POWER_ON:
if(cur_led_mode==FAST_BLINK)
cur_led_mode=TURN_ON;
break;
case APP_STATUS_POWER_CLOSE:
cur_led_mode=TURN_OFF;
break;
case APP_STATUS_POWER_OFF:
cur_led_mode=FAST_BLINK;
break;
case APP_STATUS_MUSIC:
cur_led_mode=SLOW_BLINK;
break;
case APP_STATUS_MUSIC_QUIT:
cur_led_mode=TURN_ON;
break;
case APP_STATUS_MUSIC_PP:
cur_led_mode=TURN_ON;
music_turnoff_timer=sys_timeout_add(NULL,music_turnoff,30000);
led_blink_timer1 = sys_timeout_add(NULL,poweroff_led_blink1,28000);
led_blink_timer2 = sys_timeout_add(NULL, poweroff_led_blink2, 29500);
break;
case APP_STATUS_MUSIC_PLAY:
case APP_STATUS_MUSIC_PN:
case APP_STATUS_MUSIC_FFR:
cur_led_mode=SLOW_BLINK;
if(music_turnoff_timer)
sys_timeout_del(music_turnoff_timer);
if(led_blink_timer1)
sys_timeout_del(led_blink_timer1);
if(led_blink_timer2)
sys_timeout_del(led_blink_timer2);
break;
case APP_STATUS_PC:
cur_led_mode=TURN_ON;
if(music_turnoff_timer)
sys_timeout_del(music_turnoff_timer);
if(led_blink_timer1)
sys_timeout_del(led_blink_timer1);
if(led_blink_timer2)
sys_timeout_del(led_blink_timer2);
break;
case APP_STATUS_PC_COPY:
pc_led_handler();
break;
default:
break;
}
}
/************************** IO KEY ****************************/
#if TCFG_IOKEY_ENABLE
const struct iokey_port iokey_list[] = {
{
.connect_way = TCFG_IOKEY_VOLDOWN_CONNECT_WAY, //IO按键的连接方式
.key_type.cust_one_io.port = TCFG_IOKEY_VOLDOWN_ONE_PORT, //IO按键对应的引脚
.key_type.cust_one_io.fun=cust_one_io_get_key_value,
.key_value = 0, //按键值
},
{
.connect_way = TCFG_IOKEY_VOLUP_CONNECT_WAY,
.key_type.one_io.port = TCFG_IOKEY_VOLUP_ONE_PORT,
.key_value = 1,
},
{
.connect_way = TCFG_IOKEY_PREV_CONNECT_WAY,
.key_type.two_io.out_port = TCFG_IOKEY_PREV_OUT_PORT,
.key_type.two_io.in_port = TCFG_IOKEY_PREV_IN_PORT,
.key_value = 2,
}
};
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
/************************** 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,
},
.key_value = { //AD按键各个按键的键值
TCFG_ADKEY_VALUE0,
TCFG_ADKEY_VALUE1,
TCFG_ADKEY_VALUE2,
TCFG_ADKEY_VALUE3,
TCFG_ADKEY_VALUE4,
},
};
#endif
/************************** IR KEY ****************************/
#if TCFG_IRKEY_ENABLE
const struct irkey_platform_data irkey_data = {
.enable = TCFG_IRKEY_ENABLE, //IR按键使能
.port = TCFG_IRKEY_PORT, //IR按键口
};
#endif
/************************** TOUCH_KEY ****************************/
#if TCFG_TOUCH_KEY_ENABLE
const struct touch_key_port touch_key_list[] = {
{
.port = TCFG_TOUCH_KEY0_PORT,
.key_value = TCFG_TOUCH_KEY0_VALUE, //该值由时钟配置和硬件结构决定, 需要调试
},
{
.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),
.clock = TCFG_TOUCH_KEY_CLK,
.change_gain = TCFG_TOUCH_KEY_CHANGE_GAIN,
.press_cfg = TCFG_TOUCH_KEY_PRESS_CFG,
.release_cfg0 = TCFG_TOUCH_KEY_RELEASE_CFG0,
.release_cfg1 = TCFG_TOUCH_KEY_RELEASE_CFG1,
.port_list = touch_key_list,
};
#endif /* #if TCFG_TOUCH_KEY_ENABLE */
/**************************CTMU_TOUCH_KEY ****************************/
#if TCFG_CTMU_TOUCH_KEY_ENABLE
#include "asm/ctmu.h"
static const struct ctmu_key_port touch_ctmu_port[] = {
{
.port = TCFG_CTMU_TOUCH_KEY0_PORT,
.key_value = TCFG_CTMU_TOUCH_KEY0_VALUE,
},
{
.port = TCFG_CTMU_TOUCH_KEY1_PORT,
.key_value = TCFG_CTMU_TOUCH_KEY1_VALUE,
},
};
const struct ctmu_touch_key_platform_data ctmu_touch_key_data = {
.num = ARRAY_SIZE(touch_ctmu_port),
.port_list = touch_ctmu_port,
};
#endif /* #if TCFG_CTMU_TOUCH_KEY_ENABLE */
/************************** linein KEY ****************************/
#if TCFG_LINEIN_ENABLE
struct linein_dev_data linein_data = {
.enable = TCFG_LINEIN_ENABLE,
.port = TCFG_LINEIN_CHECK_PORT,
.up = TCFG_LINEIN_PORT_UP_ENABLE,
.down = TCFG_LINEIN_PORT_DOWN_ENABLE,
.ad_channel = TCFG_LINEIN_AD_CHANNEL,
.ad_vol = TCFG_LINEIN_VOLTAGE,
};
#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 = TCFG_RDEC_KEY_ENABLE, //是否使能RDEC按键
.num = ARRAY_SIZE(rdeckey_list), //RDEC按键的个数
.rdec = rdeckey_list, //RDEC按键参数表
};
#endif
/************************** otg data****************************/
#if TCFG_OTG_MODE
struct otg_dev_data otg_data = {
.usb_dev_en = TCFG_OTG_USB_DEV_EN,
.slave_online_cnt = TCFG_OTG_SLAVE_ONLINE_CNT,
.slave_offline_cnt = TCFG_OTG_SLAVE_OFFLINE_CNT,
.host_online_cnt = TCFG_OTG_HOST_ONLINE_CNT,
.host_offline_cnt = TCFG_OTG_HOST_OFFLINE_CNT,
.detect_mode = TCFG_OTG_MODE,
.detect_time_interval = TCFG_OTG_DET_INTERVAL,
};
#endif
/************************** rtc ****************************/
#if TCFG_RTC_ENABLE
const struct rtc_dev_data rtc_data = {
.port = (u8)-1,
.edge = 0, //0 leading edge, 1 falling edge
.port_en = false,
.rtc_ldo = false,//使用内部ldo 供电
.clk_res = RTC_CLK_RES_SEL,
};
#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 TCFG_UI_LED7_ENABLE
LED7_PLATFORM_DATA_BEGIN(led7_data)
.pin_type = LED7_PIN7,
#if TCFG_SD1_ENABLE
.pin_cfg.pin7.pin[0] = IO_PORTA_02,
.pin_cfg.pin7.pin[1] = IO_PORTA_03,
.pin_cfg.pin7.pin[2] = IO_PORTA_04,
.pin_cfg.pin7.pin[3] = IO_PORTA_06,
.pin_cfg.pin7.pin[4] = IO_PORTA_07,
.pin_cfg.pin7.pin[5] = IO_PORTA_08,
.pin_cfg.pin7.pin[6] = IO_PORTA_09,
#else
.pin_cfg.pin7.pin[0] = IO_PORTC_00,
.pin_cfg.pin7.pin[1] = IO_PORTC_01,
.pin_cfg.pin7.pin[2] = IO_PORTC_02,
.pin_cfg.pin7.pin[3] = IO_PORTC_03,
.pin_cfg.pin7.pin[4] = IO_PORTC_04,
.pin_cfg.pin7.pin[5] = IO_PORTC_05,
.pin_cfg.pin7.pin[6] = IO_PORTB_02,
#endif
LED7_PLATFORM_DATA_END()
const struct ui_devices_cfg ui_cfg_data = {
.type = LED_7,
.private_data = (void *)&led7_data,
};
#endif /* #if TCFG_UI_LED7_ENABLE */
#if TCFG_UI_LED1888_ENABLE
LED7_PLATFORM_DATA_BEGIN(led7_data)
.pin_type = LED7_PIN7,
.pin_cfg.pin7.pin[0] = IO_PORTB_00,
.pin_cfg.pin7.pin[1] = IO_PORTB_01,
.pin_cfg.pin7.pin[2] = IO_PORTB_02,
.pin_cfg.pin7.pin[3] = IO_PORTB_03,
.pin_cfg.pin7.pin[4] = IO_PORTB_04,
.pin_cfg.pin7.pin[5] = IO_PORTB_05,
.pin_cfg.pin7.pin[6] = (u8)-1,//IO_PORTB_06,
LED7_PLATFORM_DATA_END()
const struct ui_devices_cfg ui_cfg_data = {
.type = LED_7,
.private_data = (void *)&led7_data,
};
#endif /* #if TCFG_UI_LED7_ENABLE */
#if TCFG_UI_LCD_SEG3X9_ENABLE
LCD_SEG3X9_PLATFORM_DATA_BEGIN(lcd_seg3x9_data)
.vlcd = LCD_SEG3X9_VOLTAGE_3_3V,
.bias = LCD_SEG3X9_BIAS_1_3,
.pin_cfg.pin_com[0] = IO_PORTC_05,
.pin_cfg.pin_com[1] = IO_PORTC_04,
.pin_cfg.pin_com[2] = IO_PORTC_03,
.pin_cfg.pin_seg[0] = IO_PORTA_00,
.pin_cfg.pin_seg[1] = IO_PORTA_01,
.pin_cfg.pin_seg[2] = IO_PORTA_02,
.pin_cfg.pin_seg[3] = IO_PORTA_03,
.pin_cfg.pin_seg[4] = IO_PORTA_04,
.pin_cfg.pin_seg[5] = IO_PORTA_07,
.pin_cfg.pin_seg[6] = IO_PORTA_12,
.pin_cfg.pin_seg[7] = IO_PORTA_10,
.pin_cfg.pin_seg[8] = IO_PORTA_09,
LCD_SEG3X9_PLATFORM_DATA_END()
const struct ui_devices_cfg ui_cfg_data = {
.type = LCD_SEG3X9,
.private_data = (void *)&lcd_seg3x9_data,
};
#endif /* #if TCFG_UI_LCD_SEG3X9_ENABLE */
#if TCHFG_SOFT_I2C_ENABLE
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
};
#endif
#if TCHFG_HW_I2C_ENABLE
const struct hw_iic_config hw_iic_cfg[] = {
//iic0 data
{
/*硬件IIC端口下选择
SCL SDA
'A': IO_PORT_DP IO_PORT_DM
'B': IO_PORTA_09 IO_PORTA_10
'C': IO_PORTA_07 IO_PORTA_08
'D': IO_PORTA_05 IO_PORTA_06
*/
.port = TCFG_HW_I2C0_PORTS,
.baudrate = TCFG_HW_I2C0_CLK, //IIC通讯波特率
.hdrive = 0, //是否打开IO口强驱
.io_filter = 1, //是否打开滤波器(去纹波)
.io_pu = 1, //是否打开上拉电阻如果外部电路没有焊接上拉电阻需要置1
},
};
#endif
#if TCFG_HW_SPI1_ENABLE
const struct spi_platform_data spi1_p_data = {
.port = TCFG_HW_SPI1_PORT,
.mode = TCFG_HW_SPI1_MODE,
.clk = TCFG_HW_SPI1_BAUD,
.role = TCFG_HW_SPI1_ROLE,
};
#endif
#if TCFG_HW_SPI2_ENABLE
const struct spi_platform_data spi2_p_data = {
.port = TCFG_HW_SPI2_PORT,
.mode = TCFG_HW_SPI2_MODE,
.clk = TCFG_HW_SPI2_BAUD,
.role = TCFG_HW_SPI2_ROLE,
};
#endif
#if TCFG_NOR_FAT
NORFLASH_DEV_PLATFORM_DATA_BEGIN(norflash_fat_dev_data)
.spi_hw_num = TCFG_FLASH_DEV_SPI_HW_NUM,
.spi_cs_port = TCFG_FLASH_DEV_SPI_CS_PORT,
#if (TCFG_FLASH_DEV_SPI_HW_NUM == 1)
.spi_pdata = &spi1_p_data,
#elif (TCFG_FLASH_DEV_SPI_HW_NUM == 2)
.spi_pdata = &spi2_p_data,
#endif
.start_addr = 0,
.size = 1*1024*1024,
NORFLASH_DEV_PLATFORM_DATA_END()
#endif
#if TCFG_NOR_FS
NORFLASH_DEV_PLATFORM_DATA_BEGIN(norflash_norfs_dev_data)
.spi_hw_num = TCFG_FLASH_DEV_SPI_HW_NUM,
.spi_cs_port = TCFG_FLASH_DEV_SPI_CS_PORT,
#if (TCFG_FLASH_DEV_SPI_HW_NUM == 1)
.spi_pdata = &spi1_p_data,
#elif (TCFG_FLASH_DEV_SPI_HW_NUM == 2)
.spi_pdata = &spi2_p_data,
#endif
.start_addr = 1*1024*1024,
.size = 1*1024*1024,
NORFLASH_DEV_PLATFORM_DATA_END()
#endif
#if TCFG_NOR_REC
NORFLASH_DEV_PLATFORM_DATA_BEGIN(norflash_norfs_rec_dev_data)
.spi_hw_num = TCFG_FLASH_DEV_SPI_HW_NUM,
.spi_cs_port = TCFG_FLASH_DEV_SPI_CS_PORT,
#if (TCFG_FLASH_DEV_SPI_HW_NUM == 1)
.spi_pdata = &spi1_p_data,
#elif (TCFG_FLASH_DEV_SPI_HW_NUM == 2)
.spi_pdata = &spi2_p_data,
#endif
.start_addr = 2*1024*1024,
.size = 2*1024*1024,
NORFLASH_DEV_PLATFORM_DATA_END()
#endif
#if TCFG_SPI_LCD_ENABLE
LCD_SPI_PLATFORM_DATA_BEGIN(lcd_spi_data)
.pin_reset = -1,
.pin_cs = IO_PORTA_00,
.pin_rs = IO_PORTA_01,
.pin_bl = IO_PORTA_03,
#if (TCFG_TFT_LCD_DEV_SPI_HW_NUM == 1)
.spi_cfg = SPI1,
.spi_pdata = &spi1_p_data,
#elif (TCFG_TFT_LCD_DEV_SPI_HW_NUM == 2)
.spi_cfg = SPI2,
.spi_pdata = &spi2_p_data,
#endif
LED7_PLATFORM_DATA_END()
const struct ui_devices_cfg ui_cfg_data = {
.type = TFT_LCD,
.private_data = (void *)&lcd_spi_data,
};
#endif
#if TCFG_GSENSOR_ENABLE
#if TCFG_DA230_EN
GSENSOR_PLATFORM_DATA_BEGIN(gSensor_data)
.iic = 0,
.gSensor_name = "da230",
.gSensor_int_io = IO_PORTB_08,
GSENSOR_PLATFORM_DATA_END();
#endif //end if DA230_EN
#endif //end if CONFIG_GSENSOR_ENABLE
#if TCFG_FM_ENABLE
FM_DEV_PLATFORM_DATA_BEGIN(fm_dev_data)
.iic_hdl = 0,
.iic_delay = 50,
FM_DEV_PLATFORM_DATA_END();
#endif
extern const struct device_operations mass_storage_ops;
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
#if TCFG_SD1_ENABLE
{ "sd1", &sd_dev_ops, (void *) &sd1_data},
#endif
#if TCFG_LINEIN_ENABLE
{ "linein", &linein_dev_ops, (void *)&linein_data},
#endif
#if TCFG_OTG_MODE
{ "otg", &usb_dev_ops, (void *) &otg_data},
#endif
#if TCFG_UDISK_ENABLE
{ "udisk0", &mass_storage_ops , NULL},
#endif
#if TCFG_RTC_ENABLE
#if TCFG_USE_VIRTUAL_RTC
{ "rtc", &rtc_simulate_ops , (void *)&rtc_data},
#else
{ "rtc", &rtc_dev_ops , (void *)&rtc_data},
#endif
#endif
#if TCFG_NORFLASH_DEV_ENABLE
#if TCFG_NOR_FAT
{ "fat_nor", &norflash_dev_ops , (void *)&norflash_fat_dev_data},
#endif
#if TCFG_NOR_FS
{ "res_nor", &norfs_dev_ops , (void *)&norflash_norfs_dev_data},
#endif
#if TCFG_NOR_REC
{"rec_nor", &norfs_dev_ops , (void *)&norflash_norfs_rec_dev_data},
#endif
#endif
};
/************************** LOW POWER config ****************************/
const struct low_power_param power_param = {
.config = TCFG_LOWPOWER_LOWPOWER_SEL, //0sniff时芯片不进入低功耗 1sniff时芯片进入powerdown
.btosc_hz = TCFG_CLOCK_OSC_HZ, //外接晶振频率
.delay_us = TCFG_CLOCK_SYS_HZ / 1000000L, //提供给低功耗模块的延时(不需要需修改)
.btosc_disable = TCFG_LOWPOWER_BTOSC_DISABLE, //进入低功耗时BTOSC是否保持
.vddiom_lev = TCFG_LOWPOWER_VDDIOM_LEVEL, //强VDDIO等级,可选2.0V 2.2V 2.4V 2.6V 2.8V 3.0V 3.2V 3.6V
.vddiow_lev = TCFG_LOWPOWER_VDDIOW_LEVEL, //弱VDDIO等级,可选2.1V 2.4V 2.8V 3.2V
.osc_type = OSC_TYPE_BT_OSC ,
#if TCFG_USE_VIRTUAL_RTC
.virtual_rtc = 1,
#endif
};
/************************** PWR config ****************************/
struct port_wakeup port0 = {
.pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
.attribute = BLUETOOTH_RESUME, //保留参数
.iomap = IO_PORTB_01, //唤醒口选择
};
struct port_wakeup port1 = {
.pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
.attribute = BLUETOOTH_RESUME, //保留参数
.iomap = IO_PORTA_01, //唤醒口选择
};
const struct sub_wakeup sub_wkup = {
.attribute = BLUETOOTH_RESUME,
};
const struct charge_wakeup charge_wkup = {
.attribute = BLUETOOTH_RESUME,
};
const struct wakeup_param wk_param = {
.port[1] = &port0,
.port[2] = &port1,
.sub = &sub_wkup,
.charge = &charge_wkup,
};
void gSensor_wkupup_disable(void)
{
log_info("gSensor wkup disable\n");
power_wakeup_index_disable(1);
}
void gSensor_wkupup_enable(void)
{
log_info("gSensor wkup enable\n");
power_wakeup_index_enable(1);
}
static void key_wakeup_disable()
{
power_wakeup_index_disable(1);
}
static void key_wakeup_enable()
{
power_wakeup_index_enable(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) {
if (adc_get_value(adkey_data.ad_channel) < 10) {
return 1;
}
}
#endif
return 0;
}
static void board_devices_init(void)
{
#if TCFG_PWMLED_ENABLE
ui_pwm_led_init(&pwm_led_data);
#endif
#if (TCFG_IOKEY_ENABLE || TCFG_ADKEY_ENABLE || TCFG_IRKEY_ENABLE || TCFG_RDEC_KEY_ENABLE || TCFG_CTMU_TOUCH_KEY_ENABLE || TCFG_6083_ADKEY_ENABLE)
key_driver_init();
#endif
#if TCFG_GSENSOR_ENABLE
gravity_sensor_init(&gSensor_data);
#endif //end if CONFIG_GSENSOR_ENABLE
#if TCFG_UI_ENABLE
UI_INIT(&ui_cfg_data);
#endif /* #if TCFG_UI_ENABLE */
return;
}
void adkey_reuse_exit_callback(u32 ch)//adkey复用把IO设置为led模式
{
#if TCFG_ADKEY_LED_IO_REUSE
if(ch == TCFG_ADKEY_AD_CHANNEL){
gpio_set_pull_up(TCFG_ADKEY_PORT,1);
gpio_set_pull_down(TCFG_ADKEY_PORT,1);
gpio_set_die(TCFG_ADKEY_PORT,1);
gpio_set_output_value(TCFG_ADKEY_PORT,1);
gpio_set_direction(TCFG_ADKEY_PORT,0);
}
#endif
}
void adkey_reuse_enter_callback(u32 ch)//adkey复用把IO设置为adkey模式
{
#if TCFG_ADKEY_LED_IO_REUSE
if(ch == TCFG_ADKEY_AD_CHANNEL){
gpio_set_die(TCFG_ADKEY_PORT, 0);
gpio_set_direction(TCFG_ADKEY_PORT, 1);
gpio_set_pull_down(TCFG_ADKEY_PORT, 0);
if (TCFG_ADKEY_EXTERN_UP_ENABLE) {
gpio_set_pull_up(TCFG_ADKEY_PORT, 0);
} else {
gpio_set_pull_up(TCFG_ADKEY_PORT, 1);
}
}
#endif
}
void uartSendInit();
extern void alarm_init();
extern void cfg_file_parse(u8 idx);
void board_init()
{
board_power_init();
adc_vbg_init();
adc_init();
cfg_file_parse(0);
#if TCFG_CHARGE_ENABLE
extern int charge_init(const struct dev_node *node, void *arg);
charge_init(NULL, (void *)&charge_data);
#endif
if (!get_charge_online_flag()) {
check_power_on_voltage();
}
/* #if (TCFG_SD0_ENABLE || TCFG_SD1_ENABLE) */
/* sdpg_config(1); */
/* #endif */
/* gpio_set_pull_down(IO_PORTB_05, 1); */
/* os_time_dly(10); */
#if TCFG_FM_ENABLE
fm_dev_init(&fm_dev_data);
#endif
#if TCFG_NOR_REC
nor_fs_ops_init();
#endif
#if TCFG_NOR_FS
init_norsdfile_hdl();
#endif
#if FLASH_INSIDE_REC_ENABLE
sdfile_rec_ops_init();
#endif
dev_manager_init();
board_devices_init();
#if TCFG_ADKEY_LED_IO_REUSE
adkey_reuse_set_callback(adkey_reuse_enter_callback,adkey_reuse_exit_callback);
#endif
if(get_charge_online_flag()){
power_set_mode(PWR_LDO15);
}else{
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
}
//针对硅mic要输出1给mic供电(按实际使用情况配置)
/* if(!adc_data.mic_capless){ */
/* 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
#ifdef AUDIO_PCM_DEBUG
uartSendInit();
#endif
#if TCFG_RTC_ENABLE
alarm_init();
#endif
#if USER_UART_UPDATE_ENABLE
{
#include "uart_update.h"
uart_update_cfg update_cfg = {
.rx = IO_PORTA_02,
.tx = IO_PORTA_03,
.output_channel = CH1_UT1_TX,
.input_channel = INPUT_CH0
};
uart_update_init(&update_cfg);
}
#endif
gpio_set_pull_up(IO_PORTA_01, 0);
gpio_set_pull_down(IO_PORTA_01, 0);
gpio_set_die(IO_PORTA_01, 1);
gpio_set_direction(IO_PORTA_01, 1);
gpio_set_pull_up(IO_PORTB_10, 0);
gpio_set_pull_down(IO_PORTB_10, 0);
gpio_set_die(IO_PORTB_10, 1);
gpio_set_direction(IO_PORTB_10, 0);
/* gpio_set_pull_up(IO_PORT_DP, 0); */
/* gpio_set_pull_down(IO_PORT_DP, 0); */
/* gpio_set_die(IO_PORT_DP, 1); */
/* gpio_set_direction(IO_PORT_DP, 0); */
soft_poweroff_timer=sys_timer_add(NULL,soft_poweroff,50);
power_on_timer=sys_timeout_add(NULL,poweron_led_blink,500);
led_scan_timer=sys_hi_timer_add(NULL,led_scan,2);
}
/*进软关机之前默认将IO口都设置成高阻状态需要保留原来状态的请修改该函数*/
extern void dac_power_off(void);
extern void dac_sniff_power_off(void);
void board_set_soft_poweroff(void)
{
u8 mode = (JL_SFC->CON >> 8) & 0x0f;
u32 porta_value = 0xffff;
u32 portb_value = 0xffff;
u32 portc_value = 0xffff;
extern u32 spi_get_port(void);
if (spi_get_port() != 0) {
if ((mode == 0b0101) || (mode == 0b0111)) {
porta_value = 0x1fff;
} else {
porta_value = 0x9fff;
}
}
gpio_write(MIC_HW_IO, 0);
key_wakeup_enable();
gpio_dir(GPIOA, 0, 16, porta_value, GPIO_OR);
gpio_set_pu(GPIOA, 0, 16, ~porta_value, GPIO_AND);
gpio_set_pd(GPIOA, 0, 16, ~porta_value, GPIO_AND);
gpio_die(GPIOA, 0, 16, ~porta_value, GPIO_AND);
gpio_dieh(GPIOA, 0, 16, ~porta_value, GPIO_AND);
//保留长按Reset Pin - PB1
/* portb_value &= ~BIT(1); */
gpio_dir(GPIOB, 0, 16, portb_value, GPIO_OR);
gpio_set_pu(GPIOB, 0, 16, ~portb_value, GPIO_AND);
gpio_set_pd(GPIOB, 0, 16, ~portb_value, GPIO_AND);
gpio_die(GPIOB, 0, 16, ~portb_value, GPIO_AND);
gpio_dieh(GPIOB, 0, 16, ~portb_value, GPIO_AND);
gpio_set_direction(IO_PORTA_01,1);
gpio_set_pull_down(IO_PORTA_01,0);
gpio_set_pull_up(IO_PORTA_01,0);
gpio_set_die(IO_PORTA_01,1);
gpio_dir(GPIOC, 0, 16, portc_value, GPIO_OR);
gpio_set_pu(GPIOC, 0, 16, ~portc_value, GPIO_AND);
gpio_set_pd(GPIOC, 0, 16, ~portc_value, GPIO_AND);
gpio_die(GPIOC, 0, 16, ~portc_value, GPIO_AND);
gpio_dieh(GPIOC, 0, 16, ~portc_value, GPIO_AND);
gpio_set_pull_up(IO_PORT_DP, 0);
gpio_set_pull_down(IO_PORT_DP, 0);
gpio_set_direction(IO_PORT_DP, 1);
gpio_set_die(IO_PORT_DP, 0);
gpio_set_dieh(IO_PORT_DP, 0);
gpio_set_pull_up(IO_PORT_DM, 0);
gpio_set_pull_down(IO_PORT_DM, 0);
gpio_set_direction(IO_PORT_DM, 1);
gpio_set_die(IO_PORT_DM, 0);
gpio_set_dieh(IO_PORT_DM, 0);
VDDIOW_VOL_SEL(power_param.vddiow_lev);
#if (TCFG_SD0_ENABLE || TCFG_SD1_ENABLE)
sdpg_config(0);
#endif
os_time_dly(10);
//dac_power_off();
}
#define APP_IO_DEBUG_0(i,x) //{JL_PORT##i->DIR &= ~BIT(x), JL_PORT##i->OUT &= ~BIT(x);}
#define APP_IO_DEBUG_1(i,x) //{JL_PORT##i->DIR &= ~BIT(x), JL_PORT##i->OUT |= BIT(x);}
void sleep_exit_callback(u32 usec)
{
/* putchar('>'); */
APP_IO_DEBUG_1(A, 6);
key_wakeup_disable();
}
void sleep_enter_callback(u8 step)
{
/* 此函数禁止添加打印 */
if (step == 1) {
/* putchar('<'); */
APP_IO_DEBUG_0(A, 6);
dac_sniff_power_off();
/* dac_power_off(); */
} else {
key_wakeup_enable();
gpio_set_pull_up(IO_PORTA_03, 0);
gpio_set_pull_down(IO_PORTA_03, 0);
gpio_set_direction(IO_PORTA_03, 1);
usb_iomode(1);
gpio_set_pull_up(IO_PORT_DP, 0);
gpio_set_pull_down(IO_PORT_DP, 0);
gpio_set_direction(IO_PORT_DP, 1);
gpio_set_die(IO_PORT_DP, 0);
gpio_set_pull_up(IO_PORT_DM, 0);
gpio_set_pull_down(IO_PORT_DM, 0);
gpio_set_direction(IO_PORT_DM, 1);
gpio_set_die(IO_PORT_DM, 0);
}
}
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);
power_keep_dacvdd_en(0);
#if (!TCFG_IOKEY_ENABLE && !TCFG_ADKEY_ENABLE)
charge_check_and_set_pinr(0);
#endif
}
static void board_power_wakeup_init(void)
{
power_wakeup_init(&wk_param);
key_wakeup_disable();
#if TCFG_POWER_ON_NEED_KEY
extern u8 power_reset_src;
if ((power_reset_src & BIT(0)) || (power_reset_src & BIT(1))) {
#if TCFG_CHARGE_ENABLE
log_info("is ldo5v wakeup:%d\n",is_ldo5v_wakeup());
if (is_ldo5v_wakeup()) {
return;
}
if (get_ldo5v_online_hw()) {
return;
}
/*LDO5V,检测上升沿用于检测ldoin插入*/
LDO5V_EN(1);
LDO5V_EDGE_SEL(0);
LDO5V_PND_CLR();
LDO5V_EDGE_WKUP_EN(1);
#endif
power_set_callback(TCFG_LOWPOWER_LOWPOWER_SEL, sleep_enter_callback, sleep_exit_callback, board_set_soft_poweroff);
power_set_soft_poweroff();
}
#endif
}
early_initcall(board_power_wakeup_init);
#endif