1348 lines
39 KiB
C
1348 lines
39 KiB
C
#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, //0:sniff时芯片不进入低功耗 1:sniff时芯片进入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
|