896 lines
29 KiB
C
896 lines
29 KiB
C
|
||
#include "app_config.h"
|
||
#include "app_power_manage.h"
|
||
#include "system/includes.h"
|
||
#include "device/includes.h"
|
||
#include "device/iic.h"
|
||
#include "server/audio_dev.h"
|
||
#include "asm/includes.h"
|
||
#ifdef CONFIG_USB_ENABLE
|
||
#include "otg.h"
|
||
#include "usb_host.h"
|
||
#include "usb_storage.h"
|
||
#endif
|
||
#ifdef CONFIG_UI_ENABLE
|
||
#include "ui/include/lcd_drive.h"
|
||
#include "ui/include/ui_api.h"
|
||
#endif
|
||
|
||
// *INDENT-OFF*
|
||
|
||
//*********************************************************************************//
|
||
// 打印配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_UART_ENABLE
|
||
#if CONFIG_UART0_ENABLE
|
||
UART0_PLATFORM_DATA_BEGIN(uart0_data)
|
||
.baudrate = 1000000,
|
||
.port = PORTA_5_6,
|
||
.tx_pin = IO_PORTA_05,
|
||
.rx_pin = IO_PORTA_06,
|
||
.max_continue_recv_cnt = 1024,
|
||
.idle_sys_clk_cnt = 500000,
|
||
.clk_src = PLL_48M,
|
||
.flags = UART_DEBUG,
|
||
UART0_PLATFORM_DATA_END();
|
||
#endif
|
||
|
||
#if CONFIG_DEBUG_ENABLE
|
||
UART1_PLATFORM_DATA_BEGIN(uart1_data)//打印串口
|
||
.baudrate = 115200,//
|
||
.port = PORT_REMAP,//任意IO通道
|
||
#if CONFIG_AUDIO_ENC_SAMPLE_SOURCE == AUDIO_ENC_SAMPLE_SOURCE_PLNK0
|
||
.output_channel = OUTPUT_CHANNEL3,//选择映射输出通道
|
||
#else
|
||
.output_channel = OUTPUT_CHANNEL0,
|
||
#endif
|
||
#if 0
|
||
.tx_pin = IO_PORTB_03,
|
||
#else
|
||
.tx_pin = IO_PORTB_05,
|
||
#endif
|
||
.rx_pin = -1,
|
||
.max_continue_recv_cnt = 1024,
|
||
.idle_sys_clk_cnt = 500000,
|
||
.clk_src = PLL_48M,
|
||
.flags = UART_DEBUG,
|
||
UART1_PLATFORM_DATA_END();
|
||
#endif
|
||
|
||
#if CONFIG_UART2_ENABLE
|
||
UART2_PLATFORM_DATA_BEGIN(uart2_data)
|
||
.baudrate = 1000000,
|
||
.port = PORTH_2_3,
|
||
.tx_pin = IO_PORTH_02,
|
||
.rx_pin = IO_PORTH_03,
|
||
.max_continue_recv_cnt = 1024,
|
||
.idle_sys_clk_cnt = 500000,
|
||
.clk_src = PLL_48M,
|
||
.flags = UART_DEBUG,
|
||
UART2_PLATFORM_DATA_END();
|
||
#endif
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
//*********************************************************************************//
|
||
// WIFI,蓝牙模块配置 //
|
||
//*********************************************************************************//
|
||
#if defined CONFIG_BT_ENABLE || defined CONFIG_WIFI_ENABLE
|
||
#include "wifi/wifi_connect.h"
|
||
const struct wifi_calibration_param wifi_calibration_param = {
|
||
.xosc_l = 0xb,// 调节左晶振电容
|
||
.xosc_r = 0xb,// 调节右晶振电容
|
||
.pa_trim_data ={1, 7, 4, 7, 11, 1, 7},// 根据MP测试生成PA TRIM值
|
||
.mcs_dgain ={
|
||
45,//11B_1M
|
||
45,//11B_2.2M
|
||
45,//11B_5.5M
|
||
42,//11B_11M
|
||
|
||
60,//11G_6M
|
||
60,//11G_9M
|
||
75,//11G_12M
|
||
70,//11G_18M
|
||
62,//11G_24M
|
||
52,//11G_36M
|
||
50,//11G_48M
|
||
38,//11G_54M
|
||
|
||
62,//11N_MCS0
|
||
80,//11N_MCS1
|
||
70,//11N_MCS2
|
||
62,//11N_MCS3
|
||
50,//11N_MCS4
|
||
48,//11N_MCS5
|
||
40,//11N_MCS6
|
||
36,//11N_MCS7
|
||
}
|
||
};
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
//*********************************************************************************//
|
||
// SD模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_SD_ENABLE
|
||
SD0_PLATFORM_DATA_BEGIN(sd0_data)
|
||
.port = TCFG_SD_PORTS,
|
||
.priority = 3,
|
||
.data_width = TCFG_SD_DAT_WIDTH,
|
||
.speed = TCFG_SD_CLK,
|
||
.detect_mode = TCFG_SD_DET_MODE,
|
||
#if (TCFG_SD_DET_MODE == SD_CLK_DECT)
|
||
.detect_func = sdmmc_0_clk_detect,
|
||
#elif (TCFG_SD_DET_MODE == SD_IO_DECT)
|
||
.detect_func = sdmmc_0_io_detect,
|
||
#else
|
||
.detect_func = NULL,
|
||
#endif
|
||
SD0_PLATFORM_DATA_END()
|
||
#endif//TCFG_SD0_ENABLE
|
||
//**********************************END*******************************************//
|
||
|
||
|
||
//*********************************************************************************//
|
||
// gpcnt模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef USE_GPCNT_TEST_DEMO
|
||
#include "gpcnt.h"
|
||
const struct gpcnt_platform_data gpcnt_data = {
|
||
.gpcnt_gpio = IO_PORTC_07,
|
||
.gss_clk_source = GPCNT_PLL_CLK,//480M
|
||
.ch_source = GPCNT_INPUT_CHANNEL4,
|
||
.cycle = CYCLE_15,
|
||
};
|
||
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
//*********************************************************************************//
|
||
// gsensor模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_GSENSOR_ENABLE
|
||
#include "gSensor_manage.h"
|
||
const struct gsensor_platform_data gsensor_data = {
|
||
|
||
.iic = "iic0",
|
||
|
||
};
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
|
||
//*********************************************************************************//
|
||
// IIC模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_IIC_ENABLE
|
||
HW_IIC0_PLATFORM_DATA_BEGIN(hw_iic1_data)//硬件IIC
|
||
.clk_pin = IO_PORTH_00,
|
||
.dat_pin = IO_PORTH_01,
|
||
.baudrate = 0x3f,
|
||
HW_IIC0_PLATFORM_DATA_END()
|
||
|
||
SW_IIC_PLATFORM_DATA_BEGIN(sw_iic0_data)//软件iic
|
||
.clk_pin = IO_PORTH_00,
|
||
.dat_pin = IO_PORTH_01,
|
||
.sw_iic_delay = 50,
|
||
SW_IIC_PLATFORM_DATA_END()
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
//*********************************************************************************//
|
||
// SPI模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_SPI_ENABLE
|
||
SPI0_PLATFORM_DATA_BEGIN(spi0_data)
|
||
.clk = 40000000,
|
||
.mode = SPI_DUAL_MODE,
|
||
.port = 'A',
|
||
.attr = SPI_SCLK_L_UPL_SMPH | SPI_UPDATE_SAMPLE_SAME,
|
||
SPI0_PLATFORM_DATA_END()
|
||
|
||
SPI1_PLATFORM_DATA_BEGIN(spi1_data)
|
||
.clk = 2000000,
|
||
.mode = SPI_STD_MODE,
|
||
.port = 'B',
|
||
.attr = SPI_SCLK_L_UPH_SMPH | SPI_BIDIR_MODE,
|
||
SPI1_PLATFORM_DATA_END()
|
||
|
||
SPI2_PLATFORM_DATA_BEGIN(spi2_data)
|
||
.clk = 40000000,
|
||
.mode = SPI_DUAL_MODE,
|
||
.port = 'C',
|
||
.attr = (SPI_MODE_SLAVE | SPI_SCLK_L_UPL_SMPH | SPI_UNIDIR_MODE),//从机,CLK低 更新数据低,单向模式
|
||
|
||
SPI2_PLATFORM_DATA_END()
|
||
|
||
static const struct spiflash_platform_data spiflash_data = {
|
||
.name = "spi0",
|
||
.mode = FAST_READ_OUTPUT_MODE,//FAST_READ_IO_MODE,
|
||
.sfc_run_mode = SFC_FAST_READ_DUAL_OUTPUT_MODE,
|
||
};
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
//*********************************************************************************//
|
||
// 按键模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_KEY_ENABLE
|
||
#if TCFG_IRKEY_ENABLE //红外按键
|
||
|
||
const struct irkey_platform_data irkey_data = {
|
||
.enable = 1,
|
||
.port = IO_PORTB_05,
|
||
};
|
||
#endif
|
||
|
||
#if TCFG_RDEC_KEY_ENABLE //旋转编码器
|
||
const struct rdec_device rdeckey_list[] = {
|
||
{
|
||
.index = RDEC0 ,
|
||
.sin_port0 = IO_PORTB_06,
|
||
.sin_port1 = IO_PORTB_07,
|
||
.key_value0 = KEY_VOLUME_DEC | BIT(7),
|
||
.key_value1 = KEY_VOLUME_INC | BIT(7),
|
||
},
|
||
};
|
||
const struct rdec_platform_data rdec_key_data = {
|
||
.enable = 1,
|
||
.num = ARRAY_SIZE(rdeckey_list), //RDEC按键的个数
|
||
.rdec = rdeckey_list, //RDEC按键参数表
|
||
};
|
||
#endif
|
||
|
||
#if TCFG_IOKEY_ENABLE
|
||
static const struct iokey_port iokey_list[] = {
|
||
{
|
||
.connect_way = ONE_PORT_TO_LOW, //IO按键的连接方式
|
||
.key_type.one_io.port = IO_PORTB_06, //IO按键对应的引脚
|
||
.key_value = KEY_VOLUME_DEC, //按键值
|
||
},
|
||
{
|
||
.connect_way = ONE_PORT_TO_LOW,
|
||
.key_type.one_io.port = IO_PORTB_07,
|
||
.key_value = KEY_VOLUME_INC, //按键值
|
||
},
|
||
};
|
||
const struct iokey_platform_data iokey_data = {
|
||
.enable = 1, //是否使能IO按键
|
||
.num = ARRAY_SIZE(iokey_list), //IO按键的个数
|
||
.port = iokey_list, //IO按键参数表
|
||
};
|
||
#endif
|
||
|
||
#if TCFG_TOUCH_KEY_ENABLE
|
||
static const struct touch_key_port plcnt_port[] = {
|
||
{
|
||
.port = IO_PORTC_09,
|
||
.key_value = KEY_VOLUME_DEC,
|
||
},
|
||
{
|
||
.port = IO_PORTC_10,
|
||
.key_value = KEY_VOLUME_INC,
|
||
},
|
||
};
|
||
const struct touch_key_platform_data touch_key_data = {
|
||
.num = ARRAY_SIZE(plcnt_port),
|
||
.clock = TOUCH_KEY_PLL_240M_CLK,
|
||
.change_gain = 4, //变化放大倍数, 一般固定
|
||
.press_cfg = -100, //触摸按下灵敏度, 类型:s16, 数值越大, 灵敏度越高
|
||
.release_cfg0 = -50, //触摸释放灵敏度0, 类型:s16, 数值越大, 灵敏度越高
|
||
.release_cfg1 = -80, //触摸释放灵敏度1, 类型:s16, 数值越大, 灵敏度越高
|
||
.port_list = plcnt_port,
|
||
};
|
||
#endif
|
||
|
||
#if TCFG_CTMU_TOUCH_KEY_ENABLE
|
||
static const struct touch_key_port ctmu_port[] = {
|
||
{
|
||
.port = IO_PORTC_09,
|
||
.key_value = KEY_VOLUME_DEC,
|
||
},
|
||
{
|
||
.port = IO_PORTC_10,
|
||
.key_value = KEY_VOLUME_INC,
|
||
},
|
||
};
|
||
const struct touch_key_platform_data ctmkey_data = {
|
||
.num = ARRAY_SIZE(ctmu_port),
|
||
.press_cfg = -10,
|
||
.release_cfg0 = -50,
|
||
.release_cfg1 = -80,
|
||
.port_list = ctmu_port,
|
||
};
|
||
#endif
|
||
|
||
#if TCFG_ADKEY_ENABLE
|
||
#define ADKEY_UPLOAD_R 22
|
||
#define ADC_VDDIO (0x3FF)
|
||
#define ADC_09 (0x3FF)
|
||
#define ADC_08 (0x3FF)
|
||
#define ADC_07 (0x3FF * 150 / (150 + ADKEY_UPLOAD_R))
|
||
#define ADC_06 (0x3FF * 62 / (62 + ADKEY_UPLOAD_R))
|
||
#define ADC_05 (0x3FF * 36 / (36 + ADKEY_UPLOAD_R))
|
||
#define ADC_04 (0x3FF * 22 / (22 + ADKEY_UPLOAD_R))
|
||
#define ADC_03 (0x3FF * 13 / (13 + ADKEY_UPLOAD_R))
|
||
#define ADC_02 (0x3FF * 75 / (75 + ADKEY_UPLOAD_R * 10))
|
||
#define ADC_01 (0x3FF * 3 / (3 + ADKEY_UPLOAD_R))
|
||
#define ADC_00 (0)
|
||
#define ADKEY_V_9 ((ADC_09 + ADC_VDDIO)/2)
|
||
#define ADKEY_V_8 ((ADC_08 + ADC_09)/2)
|
||
#define ADKEY_V_7 ((ADC_07 + ADC_08)/2 + 50)
|
||
#define ADKEY_V_6 ((ADC_06 + ADC_07)/2)
|
||
#define ADKEY_V_5 ((ADC_05 + ADC_06)/2)
|
||
#define ADKEY_V_4 ((ADC_04 + ADC_05)/2)
|
||
#define ADKEY_V_3 ((ADC_03 + ADC_04)/2)
|
||
#define ADKEY_V_2 ((ADC_02 + ADC_03)/2)
|
||
#define ADKEY_V_1 ((ADC_01 + ADC_02)/2)
|
||
#define ADKEY_V_0 ((ADC_00 + ADC_01)/2)
|
||
const struct adkey_platform_data adkey_data = {
|
||
.enable = 1,
|
||
.adkey_pin = IO_PORTB_01,
|
||
.extern_up_en = 1,
|
||
.ad_channel = 3,
|
||
.ad_value = {
|
||
ADKEY_V_0,//122 //0~122
|
||
ADKEY_V_1,//192 //122~192
|
||
ADKEY_V_2,//319 //192~319
|
||
ADKEY_V_3,//445 //319~445
|
||
ADKEY_V_4,//572 //445~572
|
||
ADKEY_V_5,//694 //572~694
|
||
ADKEY_V_6,//823 //694~823
|
||
ADKEY_V_7,//1007 //823~1007
|
||
ADKEY_V_8,//1023 //1007~1023
|
||
ADKEY_V_9,//1023 //1023
|
||
},
|
||
.key_value = {
|
||
KEY_POWER, /*0*/
|
||
KEY_ENC, /*1*/
|
||
KEY_PHOTO, /*2*/
|
||
KEY_OK, /*3*/
|
||
KEY_VOLUME_INC, /*4*/
|
||
KEY_VOLUME_DEC, /*5*/
|
||
KEY_MODE, /*6*/
|
||
KEY_CANCLE, /*7*/
|
||
NO_KEY,
|
||
NO_KEY,
|
||
},
|
||
};
|
||
#endif
|
||
#endif//CONFIG_KEY_ENABLE
|
||
//**********************************END*******************************************//
|
||
|
||
|
||
//*********************************************************************************//
|
||
// 音频模块配置 //
|
||
//*********************************************************************************//
|
||
static const struct dac_platform_data dac_data = {
|
||
.sw_differ = 0,
|
||
.pa_auto_mute = 1,
|
||
.pa_mute_port = IO_PORTB_02,
|
||
.pa_mute_value = 0,
|
||
.differ_output = 0,
|
||
.hw_channel = 0x05,
|
||
.ch_num = 4,
|
||
.vcm_init_delay_ms = 1000,
|
||
.mute_delay_ms = 200,
|
||
#ifdef CONFIG_DEC_ANALOG_VOLUME_ENABLE
|
||
.fade_enable = 1,
|
||
.fade_delay_ms = 40,
|
||
#endif
|
||
};
|
||
static const struct adc_platform_data adc_data = {
|
||
#ifdef CONFIG_ALL_ADC_CHANNEL_OPEN_ENABLE
|
||
.mic_channel = (LADC_CH_MIC1_P_N | LADC_CH_MIC3_P_N),
|
||
.linein_channel = (LADC_CH_AUX1 | LADC_CH_AUX3),
|
||
.mic_ch_num = 2,
|
||
.linein_ch_num = 2,
|
||
.all_channel_open = 1,
|
||
#else
|
||
.mic_channel = LADC_CH_MIC1_P_N,
|
||
.mic_ch_num = 1,
|
||
#endif
|
||
.isel = 2,
|
||
.dump_num = 480,
|
||
};
|
||
static const struct iis_platform_data iis0_data = {
|
||
.channel_in = BIT(1),
|
||
.channel_out = BIT(0),
|
||
.port_sel = IIS_PORTA,
|
||
.data_width = 0,
|
||
.mclk_output = 0,
|
||
.slave_mode = 0,
|
||
.dump_points_num = 320,
|
||
};
|
||
static const struct iis_platform_data iis1_data = {
|
||
.channel_in = BIT(0),
|
||
.channel_out = BIT(1),
|
||
.port_sel = IIS_PORTA,
|
||
.data_width = 0,
|
||
.mclk_output = 0,
|
||
.slave_mode = 0,
|
||
.dump_points_num = 320,
|
||
};
|
||
static void plnk0_port_remap_cb(void)
|
||
{
|
||
//重映射PDM DAT-PH2 PDM CLK-PH3
|
||
extern int gpio_plnk_rx_input(u32 gpio, u8 index, u8 data_sel);
|
||
gpio_plnk_rx_input(IO_PORTH_02, 0, 0);
|
||
gpio_output_channle(IO_PORTH_03, CH0_PLNK0_SCLK_OUT); //SCLK0使用outputchannel0
|
||
JL_IOMAP->CON3 |= BIT(18);
|
||
}
|
||
static void plnk0_port_unremap_cb(void)
|
||
{
|
||
JL_IOMAP->CON3 &= ~BIT(18);
|
||
gpio_clear_output_channle(IO_PORTH_03, CH0_PLNK0_SCLK_OUT);
|
||
gpio_set_die(IO_PORTH_02, 0);
|
||
}
|
||
//plnk的时钟和数据引脚都采用重映射的使用例子
|
||
static const struct plnk_platform_data plnk0_data = {
|
||
.hw_channel = PLNK_CH_MIC_L,
|
||
.clk_out = 1,
|
||
.port_remap_cb = plnk0_port_remap_cb,
|
||
.port_unremap_cb = plnk0_port_unremap_cb,
|
||
.sample_edge = 0, //在CLK的下降沿采样左MIC
|
||
.share_data_io = 1, //两个数字MIC共用一个DAT脚
|
||
.high_gain = 1,
|
||
.dc_cancelling_filter = 14,
|
||
.dump_points_num = 640, //丢弃刚打开硬件时的数据点数
|
||
};
|
||
static const struct plnk_platform_data plnk1_data = {
|
||
.hw_channel = PLNK_CH_MIC_DOUBLE,
|
||
.clk_out = 1,
|
||
.dc_cancelling_filter = 14,
|
||
.dump_points_num = 640, //丢弃刚打开硬件时的数据点数
|
||
};
|
||
static const struct audio_pf_data audio_pf_d = {
|
||
.adc_pf_data = &adc_data,
|
||
.dac_pf_data = &dac_data,
|
||
// .iis0_pf_data = &iis0_data,
|
||
// .iis1_pf_data = &iis1_data,
|
||
// .plnk0_pf_data = &plnk0_data,
|
||
// .plnk1_pf_data = &plnk1_data,
|
||
};
|
||
static const struct audio_platform_data audio_data = {
|
||
.private_data = (void *) &audio_pf_d,
|
||
};
|
||
//**********************************END*******************************************//
|
||
|
||
|
||
//*********************************************************************************//
|
||
// 摄像头模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_VIDEO_ENABLE//dvp摄像头
|
||
static const struct camera_platform_data camera0_data = {
|
||
.xclk_gpio = IO_PORTH_02,//注意: 如果硬件xclk接到芯片IO,则会占用OUTPUT_CHANNEL1
|
||
.reset_gpio = IO_PORTH_03,
|
||
.online_detect = NULL,
|
||
.pwdn_gpio = -1,
|
||
.power_value = 0,
|
||
.interface = SEN_INTERFACE0,//SEN_INTERFACE_CSI2,
|
||
.dvp={
|
||
.pclk_gpio = IO_PORTA_08,
|
||
.hsync_gpio = IO_PORTA_09,
|
||
.vsync_gpio = IO_PORTA_10,
|
||
.group_port = ISC_GROUPA,
|
||
.data_gpio = {
|
||
IO_PORTA_07,
|
||
IO_PORTA_06,
|
||
IO_PORTA_05,
|
||
IO_PORTA_04,
|
||
IO_PORTA_03,
|
||
IO_PORTA_02,
|
||
IO_PORTA_01,
|
||
IO_PORTA_00,
|
||
-1,
|
||
-1,
|
||
},
|
||
}
|
||
};
|
||
static const struct video_subdevice_data video0_subdev_data[] = {
|
||
{ VIDEO_TAG_CAMERA, (void *)&camera0_data },
|
||
};
|
||
static const struct video_platform_data video0_data = {
|
||
.data = video0_subdev_data,
|
||
.num = ARRAY_SIZE(video0_subdev_data),
|
||
};
|
||
static const struct camera_platform_data camera1_data = {
|
||
.xclk_gpio = -1,//IO_PORTB_02,//IO_PORTC_08,//IO_PORTC_06,//注意: 如果硬件xclk接到芯片IO,则会占用OUTPUT_CHANNEL1
|
||
.reset_gpio = IO_PORTH_03,
|
||
.online_detect = NULL,
|
||
.pwdn_gpio = -1,
|
||
.power_value = 0,
|
||
.interface = -1,
|
||
.dvp={
|
||
.group_port = -1,
|
||
.pclk_gpio = -1,
|
||
.hsync_gpio = -1,
|
||
.vsync_gpio = -1,
|
||
.data_gpio={-1},
|
||
}
|
||
};
|
||
static const struct video_subdevice_data video1_subdev_data[] = {
|
||
{ VIDEO_TAG_CAMERA, (void *)&camera1_data },
|
||
};
|
||
static const struct video_platform_data video1_data = {
|
||
.data = video1_subdev_data,
|
||
.num = ARRAY_SIZE(video1_subdev_data),
|
||
};
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
//*********************************************************************************//
|
||
// PWM模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_PWM_ENABLE
|
||
LED_PLATFORM_DATA_BEGIN(pwm_led_data)//屏背光
|
||
.led_pin = IO_PORTB_00, //固定IO,不能更改
|
||
.clk_src = PWM_LED_CLK_RC32K,
|
||
.led_cfg.led0_bright = 4, //1 ~ 4, value越大, (红灯)亮度越高
|
||
.led_cfg.led1_bright = 4, //1 ~ 4, value越大, (蓝灯)亮度越高
|
||
.led_cfg.single_led_slow_freq = 8, //1 ~ 8, value越大, LED单独慢闪速度越慢, value * 0.5s闪烁一次
|
||
.led_cfg.single_led_fast_freq = 2, //1 ~ 4, value越大, LED单独快闪速度越慢, value * 100ms闪烁一次
|
||
.led_cfg.double_led_slow_freq = 3, //1 ~ 8, value越大, LED交替慢闪速度越慢, value * 0.5s闪烁一次
|
||
.led_cfg.double_led_fast_freq = 3, //1 ~ 4, value越大, LED交替快闪速度越慢, value * 100ms闪烁一次
|
||
LED_PLATFORM_DATA_END()
|
||
PWM_PLATFORM_DATA_BEGIN(pwm_data1)
|
||
.port = IO_PORTH_02,//选择定时器的TIMER PWM任意IO,pwm_ch加上PWM_TIMER3_OPCH3或PWM_TIMER2_OPCH2有效,只支持2个PWM,占用output_channel2/3,其他外设使用output_channel需留意
|
||
.pwm_ch = PWM_TIMER2_OPCH2,//初始化可选多通道,如:PWMCH0_H | PWMCH0_L | PWMCH1_H ... | PWMCH7_H | PWMCH7_L | PWM_TIMER2_OPCH2 | PWM_TIMER3_OPCH3 ,
|
||
.freq = 30000000,//频率
|
||
.duty = 50,//占空比
|
||
.point_bit = 0,//根据point_bit值调节占空比小数点精度位: 0<freq<=4K,point_bit=2;4K<freq<=40K,point_bit=1; freq>40K,point_bit=0;
|
||
PWM_PLATFORM_DATA_END()
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
|
||
|
||
//*********************************************************************************//
|
||
// USB模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_USB_ENABLE
|
||
static const struct otg_dev_data otg_data = {
|
||
.usb_dev_en = 0x03,
|
||
#if TCFG_USB_SLAVE_ENABLE
|
||
.slave_online_cnt = 10,
|
||
.slave_offline_cnt = 10,
|
||
#endif
|
||
#if TCFG_USB_HOST_ENABLE
|
||
.host_online_cnt = 10,
|
||
.host_offline_cnt = 10,
|
||
#endif
|
||
.detect_mode = OTG_HOST_MODE | OTG_SLAVE_MODE | OTG_CHARGE_MODE,
|
||
.detect_time_interval = 50,
|
||
};
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
//*********************************************************************************//
|
||
// UI模块配置 //
|
||
//*********************************************************************************//
|
||
#ifdef CONFIG_UI_ENABLE //注意使用UI不能使用SD卡D口 建议使用A口 io冲突问题
|
||
|
||
#define EMI_BAUD EMI_BAUD_DIV8
|
||
static const struct emi_platform_data emi_data = {
|
||
.bits_mode = EMI_8BITS_MODE,
|
||
.baudrate = EMI_BAUD, //clock = HSB_CLK / (baudrate + 1) , HSB分频
|
||
.colection = EMI_FALLING_COLT, //EMI_FALLING_COLT / EMI_RISING_COLT : 下降沿 上升沿 采集数据
|
||
.time_out = 1 * 1000, //最大写超时时间ms
|
||
.th = EMI_TWIDTH_NO_HALF,
|
||
.ts = 0,
|
||
.tw = EMI_BAUD,
|
||
.data_bit_en = 0, //0默认根据bits_mode数据位来配置
|
||
};
|
||
static const struct ui_lcd_platform_data pdata = {
|
||
.rst_pin = IO_PORTB_00,//触摸和屏共用一个复位引脚
|
||
.cs_pin = -1,
|
||
.rs_pin = IO_PORTC_09,
|
||
.bl_pin = IO_PORTB_08,
|
||
.te_pin = IO_PORTC_00,
|
||
.check_pin_D6 = IO_PORTC_07,//用于检查区分不同的显示屏驱动
|
||
.check_pin_D7 = IO_PORTC_08,
|
||
.touch_int_pin = IO_PORTB_04,
|
||
.lcd_if = LCD_EMI,//屏幕接口类型还有 PAP , SPI
|
||
};
|
||
const struct ui_devices_cfg ui_cfg_data = {
|
||
.type = TFT_LCD,
|
||
.private_data = (void *) &pdata,
|
||
};
|
||
#endif
|
||
//**********************************END*******************************************//
|
||
|
||
#ifdef TCFG_EXTFLASH_ENABLE
|
||
extern const struct device_operations extflash_dev_ops;
|
||
#endif
|
||
|
||
#ifdef CONFIG_RTC_ENABLE
|
||
const struct rtc_init_config rtc_init_data = {
|
||
#if 1//使用内部RTC时钟
|
||
.rtc_clk_sel = RTC_CLK_SEL_INSIDE,
|
||
#else//使用外部32.768k时钟
|
||
.rtc_clk_sel = RTC_CLK_SEL_OUTSIDE,
|
||
#endif
|
||
.rtc_power_sel = RTCVDD_SUPPLY_OUTSIDE,
|
||
};
|
||
#endif
|
||
|
||
REGISTER_DEVICES(device_table) = { //注册模块 系统使用模块时会根据配置进行初始化
|
||
#ifdef CONFIG_UART_ENABLE
|
||
#if CONFIG_UART0_ENABLE
|
||
{"uart0", &uart_dev_ops, (void *)&uart0_data },
|
||
#endif
|
||
#if CONFIG_DEBUG_ENABLE
|
||
{"uart1", &uart_dev_ops, (void *)&uart1_data },
|
||
#endif
|
||
#if CONFIG_UART2_ENABLE
|
||
{"uart2", &uart_dev_ops, (void *)&uart2_data },
|
||
#endif
|
||
#endif
|
||
|
||
#ifdef CONFIG_SD_ENABLE
|
||
{ "sd0", &sd_dev_ops, (void *)&sd0_data },
|
||
#endif
|
||
|
||
#ifdef CONFIG_SPI_ENABLE
|
||
{ "spi0", &spi_dev_ops, (void *)&spi0_data },
|
||
{ "spi1", &spi_dev_ops, (void *)&spi1_data },
|
||
{ "spi2", &spi_dev_ops, (void *)&spi2_data },
|
||
#endif
|
||
|
||
#ifdef CONFIG_PWM_ENABLE
|
||
{ "pwm1", &pwm_dev_ops, (void *)&pwm_data1},
|
||
/* { "pwm_led",&pwm_led_ops, (void *)&pwm_led_data}, */
|
||
#endif
|
||
|
||
#ifdef CONFIG_IIC_ENABLE
|
||
{ "iic0", &iic_dev_ops, (void *)&sw_iic0_data },
|
||
{ "iic1", &iic_dev_ops, (void *)&hw_iic1_data },
|
||
#endif
|
||
|
||
#ifdef USE_GPCNT_TEST_DEMO
|
||
{"gpcnt", &gpcnt_dev_ops, (void *) &gpcnt_data },
|
||
#endif
|
||
|
||
#ifdef CONFIG_GSENSOR_ENABLE
|
||
{"gsensor", &gsensor_dev_ops, (void *)&gsensor_data},
|
||
#endif
|
||
|
||
{ "audio", &audio_dev_ops, (void *)&audio_data },
|
||
|
||
#ifdef CONFIG_VIDEO_ENABLE
|
||
{ "video0.*", &video_dev_ops, (void *)&video0_data },
|
||
{ "video1.*", &video_dev_ops, (void *)&video1_data },
|
||
#endif
|
||
|
||
#ifdef CONFIG_VIDEO_DEC_ENABLE
|
||
{ "video_dec", &video_dev_ops, NULL },
|
||
#endif
|
||
|
||
{"rtc", &rtc_dev_ops, NULL},
|
||
|
||
#ifdef CONFIG_USB_ENABLE
|
||
{ "otg", &usb_dev_ops, (void *)&otg_data},
|
||
#endif
|
||
|
||
#if TCFG_UDISK_ENABLE
|
||
{ "udisk0", &mass_storage_ops, NULL },
|
||
{ "udisk1", &mass_storage_ops, NULL },
|
||
#endif
|
||
|
||
#ifdef CONFIG_UI_ENABLE
|
||
{ "emi", &emi_dev_ops, (void *)&emi_data },
|
||
#endif
|
||
|
||
#ifdef TCFG_EXTFLASH_ENABLE
|
||
{"extflash", &extflash_dev_ops, NULL},
|
||
#endif
|
||
};
|
||
|
||
|
||
/************************** LOW POWER config ****************************/
|
||
static const struct low_power_param power_param = {
|
||
.config = TCFG_LOWPOWER_LOWPOWER_SEL,
|
||
.btosc_disable = TCFG_LOWPOWER_BTOSC_DISABLE, //进入低功耗时BTOSC是否保持
|
||
.vddiom_lev = TCFG_LOWPOWER_VDDIOM_LEVEL, //强VDDIO等级,可选:2.2V 2.4V 2.6V 2.8V 3.0V 3.2V 3.4V 3.6V
|
||
.vddiow_lev = TCFG_LOWPOWER_VDDIOW_LEVEL, //弱VDDIO等级,可选:2.1V 2.4V 2.8V 3.2V
|
||
.vdc14_dcdc = TRUE, //打开内部1.4VDCDC,关闭则用外部
|
||
.vdc14_lev = VDC14_VOL_SEL_LEVEL, //VDD1.4V配置
|
||
.sysvdd_lev = SYSVDD_VOL_SEL_LEVEL, //内核、sdram电压配置
|
||
.vlvd_enable = TRUE, //TRUE电压复位使能
|
||
.vlvd_value = VLVD_SEL_25V, //低电压复位电压值
|
||
};
|
||
|
||
/************************** PWR config ****************************/
|
||
//#define PORT_VCC33_CTRL_IO IO_PORTA_03 //VCC33 DCDC控制引脚,该引脚控制DCDC器件输出的3.3V连接芯片HPVDD、VDDIO、VDD33
|
||
#define PORT_WAKEUP_IO IO_PORTB_01 //软关机和休眠唤醒引脚
|
||
#define PORT_WAKEUP_NUM (PORT_WAKEUP_IO/IO_GROUP_NUM)//默认:0-7:GPIOA-GPIOH, 可以指定0-7组
|
||
|
||
static const struct port_wakeup port0 = {
|
||
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
|
||
.attribute = BLUETOOTH_RESUME, //保留参数
|
||
.iomap = PORT_WAKEUP_IO, //唤醒口选择
|
||
.low_power = POWER_SLEEP_WAKEUP|POWER_OFF_WAKEUP, //低功耗IO唤醒,不需要写0
|
||
};
|
||
|
||
static const struct long_press lpres_port = {
|
||
.enable = FALSE,
|
||
.use_sec4 = TRUE, //enable = TRUE , use_sec4: TRUE --> 4 sec , FALSE --> 8 sec
|
||
.edge = FALLING_EDGE, //长按方式,可选:FALLING_EDGE / RISING_EDGE --> 低电平/高电平
|
||
.iomap = PORT_WAKEUP_IO, //长按复位IO和IO唤醒共用一个IO
|
||
};
|
||
|
||
static const struct sub_wakeup sub_wkup = {
|
||
.attribute = BLUETOOTH_RESUME,
|
||
};
|
||
|
||
static const struct charge_wakeup charge_wkup = {
|
||
.attribute = BLUETOOTH_RESUME,
|
||
};
|
||
|
||
static const struct wakeup_param wk_param = {
|
||
.port[PORT_WAKEUP_NUM] = &port0,
|
||
.sub = &sub_wkup,
|
||
.charge = &charge_wkup,
|
||
.lpres = &lpres_port,
|
||
};
|
||
|
||
#ifdef CONFIG_PRESS_LONG_KEY_POWERON
|
||
//ad按键和开关机键复用
|
||
static unsigned int read_power_key(int dly)
|
||
{
|
||
gpio_latch_en(adkey_data.adkey_pin, 0);
|
||
gpio_direction_input(adkey_data.adkey_pin);
|
||
gpio_set_die(adkey_data.adkey_pin, 0);
|
||
gpio_set_pull_up(adkey_data.adkey_pin, 0);
|
||
gpio_set_pull_down(adkey_data.adkey_pin, 0);
|
||
|
||
if (dly) {
|
||
delay_us(3000);
|
||
}
|
||
|
||
JL_ADC->CON = (0xf << 12) | (adkey_data.ad_channel << 8) | (1 << 6) | (1 << 4) | (1 << 3) | (6 << 0);
|
||
while (!(JL_ADC->CON & BIT(7)));
|
||
return (JL_ADC->RES < 50);
|
||
}
|
||
|
||
void sys_power_poweroff_wait_powerkey_up(void)
|
||
{
|
||
JL_TIMER1->CON = 0;
|
||
JL_TIMER1->CON = 0;
|
||
JL_TIMER1->CON = 0;
|
||
JL_ADC->CON = 0;
|
||
JL_ADC->CON = 0;
|
||
JL_ADC->CON = 0;
|
||
while (read_power_key(1));
|
||
}
|
||
#endif
|
||
|
||
/*进软关机之前默认将IO口都设置成高阻状态,需要保留原来状态的请修改该函数*/
|
||
static void board_set_soft_poweroff(void)
|
||
{
|
||
u32 IO_PORT;
|
||
JL_PORT_FLASH_TypeDef *gpio[] = {JL_PORTA, JL_PORTB, JL_PORTC, JL_PORTD, JL_PORTE, JL_PORTF, JL_PORTG, JL_PORTH};
|
||
|
||
for (u8 p = 0; p < 8; ++p) {
|
||
//flash sdram PD PE PF PG口不能进行配置,由内部完成控制
|
||
if (gpio[p] == JL_PORTD || gpio[p] == JL_PORTE || gpio[p] == JL_PORTF || gpio[p] == JL_PORTG) {
|
||
continue;
|
||
}
|
||
for (u8 i = 0; i < 16; ++i) {
|
||
IO_PORT = IO_PORTA_00 + p * 16 + i;
|
||
gpio_set_pull_up(IO_PORT, 0);
|
||
gpio_set_pull_down(IO_PORT, 0);
|
||
gpio_set_direction(IO_PORT, 1);
|
||
gpio_set_die(IO_PORT, 0);
|
||
gpio_set_dieh(IO_PORT, 0);
|
||
gpio_set_hd(IO_PORT, 0);
|
||
gpio_set_hd1(IO_PORT, 0);
|
||
gpio_latch_en(IO_PORT, 1);
|
||
}
|
||
}
|
||
#ifdef PORT_VCC33_CTRL_IO
|
||
gpio_latch_en(PORT_VCC33_CTRL_IO, 0);
|
||
gpio_direction_output(PORT_VCC33_CTRL_IO, 0);
|
||
gpio_set_pull_up(PORT_VCC33_CTRL_IO, 0);
|
||
gpio_set_pull_down(PORT_VCC33_CTRL_IO, 1);
|
||
gpio_set_direction(PORT_VCC33_CTRL_IO, 1);
|
||
gpio_set_die(PORT_VCC33_CTRL_IO, 0);
|
||
gpio_set_dieh(PORT_VCC33_CTRL_IO, 0);
|
||
gpio_latch_en(PORT_VCC33_CTRL_IO, 1);
|
||
#endif
|
||
}
|
||
|
||
static void sleep_exit_callback(u32 usec)
|
||
{
|
||
#ifdef PORT_VCC33_CTRL_IO
|
||
gpio_direction_output(PORT_VCC33_CTRL_IO, 1);
|
||
gpio_set_pull_up(PORT_VCC33_CTRL_IO, 1);
|
||
gpio_set_pull_down(PORT_VCC33_CTRL_IO,0);
|
||
#endif
|
||
/* putchar('-'); */
|
||
}
|
||
|
||
static void sleep_enter_callback(u8 step)
|
||
{
|
||
/* 此函数禁止添加打印 */
|
||
if (step == 1) {
|
||
dac_power_off();
|
||
} else {
|
||
#ifdef PORT_VCC33_CTRL_IO
|
||
gpio_direction_output(PORT_VCC33_CTRL_IO, 0);
|
||
gpio_set_pull_up(PORT_VCC33_CTRL_IO, 0);
|
||
gpio_set_pull_down(PORT_VCC33_CTRL_IO, 1);
|
||
gpio_set_direction(PORT_VCC33_CTRL_IO, 1);
|
||
gpio_set_die(PORT_VCC33_CTRL_IO, 0);
|
||
#endif
|
||
}
|
||
}
|
||
|
||
static void board_power_init(void)
|
||
{
|
||
#ifdef PORT_VCC33_CTRL_IO
|
||
gpio_direction_output(PORT_VCC33_CTRL_IO, 1);
|
||
gpio_set_pull_up(PORT_VCC33_CTRL_IO, 1);
|
||
gpio_set_pull_down(PORT_VCC33_CTRL_IO,0);
|
||
#endif
|
||
|
||
power_init(&power_param);
|
||
|
||
power_set_callback(TCFG_LOWPOWER_LOWPOWER_SEL, sleep_enter_callback, sleep_exit_callback, board_set_soft_poweroff);
|
||
|
||
power_keep_state(POWER_KEEP_RESET | POWER_KEEP_DACVDD);
|
||
|
||
#ifdef CONFIG_RTC_ENABLE
|
||
power_keep_state(POWER_KEEP_RTC);//0, POWER_KEEP_DACVDD | POWER_KEEP_RTC | POWER_KEEP_RESET
|
||
#endif
|
||
/* power_keep_state(POWER_KEEP_PWM_LED);//0, POWER_KEEP_DACVDD | POWER_KEEP_RTC | POWER_KEEP_RESET */
|
||
|
||
power_wakeup_init(&wk_param);
|
||
|
||
#ifdef CONFIG_PRESS_LONG_KEY_POWERON
|
||
if (system_reset_reason_get() == SYS_RST_PORT_WKUP) {
|
||
for (int i = 0; i < 500; i++) {
|
||
if (0 == read_power_key(1)) {
|
||
sys_power_poweroff();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
extern void clean_wakeup_source_port(void);
|
||
clean_wakeup_source_port();
|
||
}
|
||
|
||
#ifdef CONFIG_DEBUG_ENABLE
|
||
void debug_uart_init()
|
||
{
|
||
uart_init(&uart1_data);
|
||
}
|
||
#endif
|
||
|
||
void board_early_init()
|
||
{
|
||
dac_early_init(0, dac_data.differ_output ? (dac_data.ch_num > 1 ? 0xf : 0x3): dac_data.hw_channel, 1000);
|
||
devices_init();
|
||
}
|
||
|
||
void board_init()
|
||
{
|
||
board_power_init();
|
||
#ifdef CONFIG_RTC_ENABLE
|
||
rtc_early_init();
|
||
#endif
|
||
#if TCFG_ADKEY_ENABLE || (defined CONFIG_BT_ENABLE || defined CONFIG_WIFI_ENABLE)
|
||
adc_init();
|
||
#endif
|
||
key_driver_init();
|
||
#ifdef CONFIG_AUTO_SHUTDOWN_ENABLE
|
||
sys_power_init();
|
||
#endif
|
||
#ifdef CONFIG_BT_ENABLE
|
||
void cfg_file_parse(void);
|
||
cfg_file_parse();
|
||
#endif
|
||
}
|
||
|