#include "app_config.h" #include "system/includes.h" #include "device/iic.h" #include "server/audio_dev.h" #include "asm/includes.h" #if TCFG_USB_SLAVE_ENABLE || TCFG_USB_HOST_ENABLE #include "otg.h" #include "usb_host.h" #include "usb_common_def.h" #include "usb_storage.h" #endif // *INDENT-OFF* UART0_PLATFORM_DATA_BEGIN(uart0_data) .baudrate = 115200, /* .baudrate = 1000000, */ /* .port = PORTA_5_6, */ /* .port = PORTB_1_0, */ .port = PORTA_3_4, /* .port = PORTH_0_1, */ /* .tx_pin = IO_PORTA_05, */ /* .rx_pin = IO_PORTA_06, */ /* .tx_pin = IO_PORTB_01, */ /* .rx_pin = IO_PORTB_00, */ .tx_pin = IO_PORTA_03, .rx_pin = IO_PORTA_04, /* .tx_pin = IO_PORTH_00, */ /* .rx_pin = IO_PORTH_01, */ .max_continue_recv_cnt = 1024, .idle_sys_clk_cnt = 500000, .clk_src = PLL_48M, .flags = UART_DEBUG, UART0_PLATFORM_DATA_END(); UART1_PLATFORM_DATA_BEGIN(uart1_data) .baudrate = 1000000, /* .port = PORT_REMAP, */ /* .port = PORTH_6_7, */ /* .port = PORTC_3_4, */ /* .port = PORTUSB_B, */ .port = PORTUSB_A, /* .tx_pin = IO_PORTH_06, */ /* .rx_pin = IO_PORTH_07, */ /* .tx_pin = IO_PORTC_03, */ /* .rx_pin = IO_PORTC_04, */ /* .tx_pin = IO_PORT_USB_DPB, */ /* .rx_pin = IO_PORT_USB_DMB, */ .tx_pin = IO_PORT_USB_DPA, .rx_pin = IO_PORT_USB_DMA, /* .tx_pin = IO_PORTB_06, */ /* .rx_pin = IO_PORTB_07, */ .max_continue_recv_cnt = 1024, .idle_sys_clk_cnt = 500000, .clk_src = PLL_48M, .flags = UART_DEBUG, UART1_PLATFORM_DATA_END(); UART2_PLATFORM_DATA_BEGIN(uart2_data) .baudrate = 1000000, /* .port = PORTH_2_3, */ /* .port = PORTC_9_10, */ /* .port = PORTB_6_7, */ /* .port = PORTE_0_1, */ /* .tx_pin = IO_PORTH_02, */ /* .rx_pin = IO_PORTH_03, */ /* .tx_pin = IO_PORTC_09, */ /* .rx_pin = IO_PORTC_10, */ /* .tx_pin = IO_PORTB_06, */ /* .rx_pin = IO_PORTB_07, */ /* .tx_pin = IO_PORTE_00,*/ /* .rx_pin = IO_PORTE_01,*/ .port = PORT_REMAP, .output_channel = OUTPUT_CHANNEL0, .tx_pin = IO_PORTC_06, .rx_pin = -1, .max_continue_recv_cnt = 1024, .idle_sys_clk_cnt = 500000, .clk_src = PLL_48M, .flags = UART_DEBUG, UART2_PLATFORM_DATA_END(); /****************SD模块********************************************************** * 暂只支持1个SD外设,如需要多个SD外设,自行去掉下面SD0/1_ENABLE控制,另外定义即可 ********************************************************************************/ #if TCFG_SD0_ENABLE //sd0 #define SD_PLATFORM_DATA_BEGIN() SD0_PLATFORM_DATA_BEGIN(sd0_data) #define SD_PLATFORM_DATA_END() SD0_PLATFORM_DATA_END() #define SD_CLK_DETECT_FUNC sdmmc_0_clk_detect #elif TCFG_SD1_ENABLE //sd1 #define SD_PLATFORM_DATA_BEGIN() SD1_PLATFORM_DATA_BEGIN(sd1_data) #define SD_PLATFORM_DATA_END() SD1_PLATFORM_DATA_END() #define SD_CLK_DETECT_FUNC sdmmc_1_clk_detect #endif #if (TCFG_SD0_ENABLE || TCFG_SD1_ENABLE) SD_PLATFORM_DATA_BEGIN() .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 = SD_CLK_DETECT_FUNC, #elif (TCFG_SD_DET_MODE == SD_IO_DECT) .detect_func = sdmmc_0_io_detect, #else .detect_func = NULL, #endif SD_PLATFORM_DATA_END() #endif /****************SD模块*********************/ HW_IIC0_PLATFORM_DATA_BEGIN(hw_iic1_data) /* .clk_pin = IO_PORTC_01, */ /* .dat_pin = IO_PORTC_02, */ .clk_pin = IO_PORTH_00, .dat_pin = IO_PORTH_01, .baudrate = 0x3f,//3f:385k HW_IIC0_PLATFORM_DATA_END() SW_IIC_PLATFORM_DATA_BEGIN(sw_iic0_data) /*.clk_pin = IO_PORTA_03,*/ /*.dat_pin = IO_PORTA_04,*/ .clk_pin = IO_PORTC_01, .dat_pin = IO_PORTC_02, .sw_iic_delay = 50, SW_IIC_PLATFORM_DATA_END() /* * spi0接falsh */ SPI0_PLATFORM_DATA_BEGIN(spi0_data) .clk = 20000000, .mode = SPI_STD_MODE, .port = 'A', SPI0_PLATFORM_DATA_END() SPI1_PLATFORM_DATA_BEGIN(spi1_data) .clk = 80000000, .mode = SPI_STD_MODE, .attr = SPI_MODE_SLAVE | SPI_SCLK_H_UPL_SMPL | SPI_UNIDIR_MODE,//从机,CLK高 更新数据高,单向模式(SPI_DO单线) .port = 'B', SPI1_PLATFORM_DATA_END() SPI2_PLATFORM_DATA_BEGIN(spi2_data) .clk = 20000000, .mode = SPI_STD_MODE, .attr = SPI_SCLK_H_UPH_SMPL | SPI_BIDIR_MODE,//主机,CLK高 更新数据高,双向模式(SPI_DI/SPI_DO双线) .port = 'C', 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, }; static const struct dac_platform_data dac_data = { .pa_auto_mute = 1, .pa_mute_port = 0xff, .pa_mute_value = 1, .differ_output = 0, .hw_channel = 0x01, .ch_num = 1, //差分只需开一个通道 .vcm_init_delay_ms = 1000, }; static const struct adc_platform_data adc_data = { .mic_channel = LADC_CH_MIC1_P_N, .mic_ch_num = 1, .isel = 2, }; static const struct audio_pf_data audio_pf_d = { .adc_pf_data = &adc_data, .dac_pf_data = &dac_data, }; static const struct audio_platform_data audio_data = { .private_data = (void *) &audio_pf_d, }; #ifdef CONFIG_VIDEO_ENABLE #define CAMERA_GROUP_PORT ISC_GROUPA /* #define CAMERA_GROUP_PORT ISC_GROUPC */ static const struct camera_platform_data camera0_data = { .xclk_gpio = IO_PORTC_00,//注意: 如果硬件xclk接到芯片IO,则会占用OUTPUT_CHANNEL1 .reset_gpio = IO_PORTC_03, .online_detect = NULL, .pwdn_gpio = -1, .power_value = 0, .interface = SEN_INTERFACE0,//SEN_INTERFACE_CSI2, .dvp={ #if (CAMERA_GROUP_PORT == ISC_GROUPA) .pclk_gpio = IO_PORTA_08, .hsync_gpio = IO_PORTA_09, .vsync_gpio = IO_PORTA_10, #else .pclk_gpio = IO_PORTC_08, .hsync_gpio = IO_PORTC_09, .vsync_gpio = IO_PORTC_10, #endif .group_port = CAMERA_GROUP_PORT, .data_gpio={ #if (CAMERA_GROUP_PORT == ISC_GROUPA) 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, #else IO_PORTC_07, IO_PORTC_06, IO_PORTC_05, IO_PORTC_04, IO_PORTC_03, IO_PORTC_02, IO_PORTC_01, IO_PORTC_00, -1, -1, #endif }, } }; 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), }; #endif PWM_PLATFORM_DATA_BEGIN(pwm_data0) .port = 0, .pwm_ch = PWMCH0_H | PWMCH0_L,//初始化可选多通道,如:PWMCH0_H | PWMCH0_L | PWMCH1_H ... | PWMCH7_H | PWMCH7_L | PWM_TIMER2_OPCH2 | PWM_TIMER3_OPCH3 , .freq = 1000,//频率 .duty = 50,//占空比 .point_bit = 0,//根据point_bit值调节占空比小数点精度位: 040K,point_bit=0; PWM_PLATFORM_DATA_END() PWM_PLATFORM_DATA_BEGIN(pwm_data1) .port = IO_PORTA_03,//选择定时器的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 = 1000,//频率 .duty = 50,//占空比 .point_bit = 0,//根据point_bit值调节占空比小数点精度位: 040K,point_bit=0; PWM_PLATFORM_DATA_END() #if TCFG_USB_SLAVE_ENABLE || TCFG_USB_HOST_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 = 30, }; #endif #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值 }; #endif #ifdef CONFIG_RTC_ENABLE const struct rtc_init_config rtc_init_data = { .rtc_clk_sel = RTC_CLK_SEL_INSIDE, .rtc_power_sel = RTCVDD_SUPPLY_OUTSIDE, }; #endif REGISTER_DEVICES(device_table) = { { "pwm0", &pwm_dev_ops, (void *)&pwm_data0}, { "pwm1", &pwm_dev_ops, (void *)&pwm_data1}, { "iic0", &iic_dev_ops, (void *)&sw_iic0_data }, { "iic1", &iic_dev_ops, (void *)&hw_iic1_data }, /*{ "audio", &audio_dev_ops, (void *)&audio_data },*/ #if TCFG_SD0_ENABLE { "sd0", &sd_dev_ops, (void *)&sd0_data }, #endif #if TCFG_SD1_ENABLE { "sd1", &sd_dev_ops, (void *)&sd1_data }, #endif #ifdef CONFIG_VIDEO_ENABLE { "video0.*", &video_dev_ops, (void *)&video0_data }, #endif { "spi1", &spi_dev_ops, (void *)&spi1_data }, { "spi2", &spi_dev_ops, (void *)&spi2_data }, {"rtc", &rtc_dev_ops, NULL}, {"uart0", &uart_dev_ops, (void *)&uart0_data }, {"uart1", &uart_dev_ops, (void *)&uart1_data }, {"uart2", &uart_dev_ops, (void *)&uart2_data }, #if TCFG_USB_SLAVE_ENABLE || TCFG_USB_HOST_ENABLE { "otg", &usb_dev_ops, (void *)&otg_data}, #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, }; /*进软关机之前默认将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);//0, POWER_KEEP_DACVDD | POWER_KEEP_RTC | POWER_KEEP_RESET #ifdef CONFIG_RTC_ENABLE power_keep_state(POWER_KEEP_RTC);//0, POWER_KEEP_DACVDD | POWER_KEEP_RTC | POWER_KEEP_RESET #endif power_wakeup_init(&wk_param); } #ifdef CONFIG_DEBUG_ENABLE void debug_uart_init() { uart_init(&uart2_data); } #endif void board_early_init() { devices_init(); } void board_init() { board_power_init(); #ifdef CONFIG_RTC_ENABLE rtc_early_init(); #endif adc_init(); }