doubao_chat/apps/demo/demo_uvc/board/wl82/board_develop.c

906 lines
26 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_DEVELOP
#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"
#if (TCFG_IOKEY_ENABLE || TCFG_IRKEY_ENABLE || TCFG_RDEC_KEY_ENABLE || TCFG_ADKEY_ENABLE)
#include "key/iokey.h"
#include "key/adkey.h"
#include "key/irkey.h"
#include "key/rdec_key.h"
#include "key/key_driver.h"
#include "event/key_event.h"
#endif
#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"
#include "asm/uvc_device.h"
#endif
#ifdef CONFIG_UI_ENABLE
#include "lcd_drive.h"
#include "ui_api.h"
#endif
#ifdef CONFIG_LTE_PHY_ENABLE
#include "lte_module.h"
#endif
// *INDENT-OFF*
#define DEBUG_IO TCFG_DEBUG_PORT
UART0_PLATFORM_DATA_BEGIN(uart0_data)
.baudrate = 1000000,
.port = PORT_REMAP,
.output_channel = OUTPUT_CHANNEL0,
.input_channel = INPUT_CHANNEL0,
.tx_pin = DEBUG_IO,
.rx_pin = -1,
.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_00,
.rx_pin = IO_PORTB_01,
.output_channel = OUTPUT_CHANNEL3,
.input_channel = INPUT_CHANNEL3,
.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,
/*.tx_pin = IO_PORTH_02,*/
/*.rx_pin = IO_PORTH_03,*/
.port = PORT_REMAP,
.tx_pin = DEBUG_IO,
.rx_pin = -1,
/* .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,*/
.output_channel = OUTPUT_CHANNEL2,
.input_channel = INPUT_CHANNEL2,
.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 || TCFG_SD1_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
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
.power = NULL,//sd_set_power,
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 = TCFG_IIC0_CLK,
.dat_pin = TCFG_IIC0_DAT,
.sw_iic_delay = 50,
SW_IIC_PLATFORM_DATA_END()
#ifdef CONFIG_VIDEO1_ENABLE
SW_IIC_PLATFORM_DATA_BEGIN(sw_iic1_data)
.clk_pin = TCFG_IIC1_CLK,
.dat_pin = TCFG_IIC1_DAT,
.sw_iic_delay = 50,
SW_IIC_PLATFORM_DATA_END()
#endif
#if TCFG_ADKEY_ENABLE
/*-------------ADKEY GROUP 1----------------*/
#define ADKEY_UPLOAD_R 22
#define ADC_VDDIO (0x3FF)
#define ADC_09 (0x3FF * 220 / (220 + ADKEY_UPLOAD_R))
#define ADC_08 (0x3FF * 120 / (120 + ADKEY_UPLOAD_R))
#define ADC_07 (0x3FF * 51 / (51 + ADKEY_UPLOAD_R))
#define ADC_06 (0x3FF * 33 / (33 + ADKEY_UPLOAD_R))
#define ADC_05 (0x3FF * 22 / (22 + ADKEY_UPLOAD_R))
#define ADC_04 (0x3FF * 15 / (15 + ADKEY_UPLOAD_R))
#define ADC_03 (0x3FF * 10 / (10 + ADKEY_UPLOAD_R))
#define ADC_02 (0x3FF * 62 / (62 + 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)
#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,
ADKEY_V_1,
ADKEY_V_2,
ADKEY_V_3,
ADKEY_V_4,
ADKEY_V_5,
ADKEY_V_6,
ADKEY_V_7,
ADKEY_V_8,
ADKEY_V_9,
},
.key_value = {
KEY_MENU, /*0*/
KEY_PHOTO, /*1*/
KEY_ENC, /*2*/
KEY_F1, /*3*/
KEY_MODE, /*4*/
KEY_CANCLE,/*5*/
KEY_OK, /*6*/
KEY_DOWN, /*7*/
KEY_UP, /*8*/
NO_KEY,
},
};
#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_01, //IO按键对应的引脚
.key_value = KEY_MENU, //按键值
}
};
const struct iokey_platform_data iokey_data = {//按键不需要添加到设备列表
.enable = 1, //是否使能IO按键
.num = ARRAY_SIZE(iokey_list), //IO按键的个数
.port = iokey_list, //IO按键参数表
};
#endif
#if TCFG_RDEC_KEY_ENABLE
const struct rdec_device rdeckey_list[] = {
{
.index = RDEC0 ,
.sin_port0 = IO_PORTC_09,
.sin_port1 = IO_PORTC_10,
.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
/*
* 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_SCLK_L_UPH_SMPH | SPI_BIDIR_MODE,
.port = 'B',
SPI1_PLATFORM_DATA_END()
SPI2_PLATFORM_DATA_BEGIN(spi2_data)
.clk = 80000000,
#ifdef CONFIG_SPI_VIDEO_ENABLE
//=======SPI接收摄像头数据
#if !CONFIG_SPI_VIDEO_USE_ISC1_RECV
#if CONFIG_SPI_ONE_LINE_ENABLE
.mode = SPI_1WIRE_MODE,//单线
#else
.mode = SPI_DUAL_MODE,//双线
#endif
.port = 'C',
.attr = TCFG_SPI_ATTR,//主从机、边缘极性采样
#endif
//=======SPI接收摄像头数据
#else
.mode = SPI_STD_MODE,
.attr = SPI_SCLK_L_UPH_SMPH | SPI_BIDIR_MODE,
.port = 'A',
#endif
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,
};
#ifdef CONFIG_UI_ENABLE
#if TCFG_LCD_ILI9341_ENABLE
#define EMI_BAUD_DIV EMI_BAUD_DIV6
#else
#define EMI_BAUD_DIV EMI_BAUD_DIV8
#endif
static const struct emi_platform_data emi_data = {
.bits_mode = EMI_8BITS_MODE,
.baudrate = EMI_BAUD_DIV, //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,
#if TCFG_LCD_ILI9481_ENABLE
.tw = EMI_BAUD_DIV5,
#else
.tw = (EMI_BAUD_DIV > 1) ? EMI_BAUD_DIV / 2 : 1,
#endif
.data_bit_en = 0, //0默认根据bits_mode数据位来配置
};
static const struct pap_info pap_data = {
.datawidth = PAP_PORT_8BITS,
.endian = PAP_BE, //数据输出大小端
.cycle = PAP_CYCLE_ONE, //1/2字节发送次数
.pre = PAP_READ_LOW, //读取rd有效电平
.pwe = PAP_WRITE_LOW, //写wr有效电平
.use_sem = TRUE, //使用信号等待
.rd_en = FALSE, //不使用rd读信号
.port_sel = PAP_PORT_A, //PAP_PORT_A PAP_PORT_B
.timing_setup = 1, //具体看pap.h
.timing_hold = 1, //具体看pap.h
.timing_width = 2, //具体看pap.h
};
#if TCFG_LCD_ST7735S_ENABLE || TCFG_LCD_ST7789V_ENABLE
SPI2_PLATFORM_DATA_BEGIN(spi2_data) //pc8 pc9 pc10
.clk = 80000000, //di clk do
.mode = SPI_1WIRE_MODE,
.port = 'A',
.attr = SPI_SCLK_L_UPL_SMPH | SPI_UNIDIR_MODE,//主机,CLK低 更新数据低,单向模式
SPI2_PLATFORM_DATA_END()
#endif
static const struct ui_lcd_platform_data pdata = {
#if TCFG_LCD_ST7735S_ENABLE || TCFG_LCD_ST7789V_ENABLE
.spi_id = "spi2",
.rs_pin = IO_PORTH_02,
.te_pin = IO_PORTH_03,
.rst_pin = IO_PORTH_04,
.cs_pin = IO_PORTH_07,
.lcd_if = LCD_SPI,//屏幕接口类型还有 PAP , SPI
#endif
#if TCFG_LCD_ST7789S_ENABLE
.rs_pin = IO_PORTH_02,
.te_pin = IO_PORTH_03,
.rst_pin = IO_PORTH_04,
.cs_pin = IO_PORTH_07,
.lcd_if = LCD_EMI,//屏幕接口类型还有 PAP , SPI
#endif
#if TCFG_LCD_ILI9341_ENABLE || TCFG_LCD_ILI9481_ENABLE
.rs_pin = IO_PORTC_09,
.te_pin = IO_PORTC_00,
.bl_pin = IO_PORTB_08,
.touch_int_pin = IO_PORTB_04,
.touch_reset_pin = IO_PORTB_00,
.cs_pin = -1,
.rst_pin = -1,
.lcd_if = LCD_EMI,//屏幕接口类型还有 PAP , SPI
#endif
#if TCFG_LCD_480x272_8BITS /*RGB*/
.lcd_if = LCD_IMD,
#endif
};
const struct ui_devices_cfg ui_cfg_data = {
.type = TFT_LCD,
.private_data = (void *)&pdata,
};
#endif
static const struct dac_platform_data dac_data = {
.sw_differ = 0,
.pa_auto_mute = 1,
.pa_mute_port = TCFG_DAC_MUTE_PORT,
.pa_mute_value = TCFG_DAC_MUTE_VALUE,
.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 = TCFG_MIC_CHANNEL_MAP,
.linein_channel = TCFG_LINEIN_CHANNEL_MAP,
.mic_ch_num = TCFG_MIC_CHANNEL_NUM,
.linein_ch_num = TCFG_LINEIN_CHANNEL_NUM,
.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 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 = TCFG_VIDEO0_CAMERA_XCLOCK,//注意: 如果硬件xclk接到芯片IO,则会占用OUTPUT_CHANNEL1
.reset_gpio = TCFG_VIDEO0_CAMERA_RESET,
.reset_gpio = TCFG_VIDEO0_CAMERA_RESET,
.pwdn_gpio = TCFG_VIDEO0_CAMERA_PWDN,
.online_detect = NULL,
.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
#ifdef CONFIG_VIDEO1_ENABLE
static const struct camera_platform_data camera1_data = {
.xclk_gpio = TCFG_VIDEO1_CAMERA_XCLOCK,//IO_PORTB_02,//IO_PORTC_08,//IO_PORTC_06,//注意: 如果硬件xclk接到芯片IO,则会占用OUTPUT_CHANNEL1
.reset_gpio = TCFG_VIDEO1_CAMERA_RESET,
.online_detect = NULL,
.pwdn_gpio = TCFG_VIDEO1_CAMERA_PWDN,
.power_value = 0,
.interface = SEN_INTERFACE0,
.dvp={
.group_port = CAMERA1_GROUP_PORT,
#if (CAMERA1_GROUP_PORT == ISC_GROUPC)
.pclk_gpio = IO_PORTC_08,
#elif (CAMERA1_GROUP_PORT == ISC_GROUPH)
.pclk_gpio = IO_PORTH_04,
#endif
.hsync_gpio = -1,
.vsync_gpio = -1,
.data_gpio={
#if (CAMERA1_GROUP_PORT == ISC_GROUPC)
IO_PORTC_00,
#elif (CAMERA1_GROUP_PORT == ISC_GROUPH)
IO_PORTH_03,
#endif
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-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
LED_PLATFORM_DATA_BEGIN(pwm_led_data)
.led_pin = IO_PORTB_00,
.led_cfg.led0_bright = 2, //1 ~ 4, value越大, (红灯)亮度越高
.led_cfg.led1_bright = 2, //1 ~ 4, value越大, (蓝灯)亮度越高
.led_cfg.single_led_slow_freq = 3, //1 ~ 8, value越大, LED单独慢闪速度越慢, value * 0.5s闪烁一次
.led_cfg.single_led_fast_freq = 3, //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_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值调节占空比小数点精度位: 0<freq<=4K,point_bit=2;4K<freq<=40K,point_bit=1; freq>40K,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值调节占空比小数点精度位: 0<freq<=4K,point_bit=2;4K<freq<=40K,point_bit=1; freq>40K,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 = (TCFG_HUSB_EN << 1) | TCFG_FUSB_EN,
#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
#ifdef CONFIG_LTE_PHY_ENABLE
extern const struct device_operations lte_module_dev_ops;
LTE_MODULE_DATA_BEGIN(lte_module_data)
.name = (u8 *)"usb_rndis",
LTE_MODULE_DATA_END()
#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值
.mcs_dgain ={
50,//11B_1M
50,//11B_2.2M
50,//11B_5.5M
50,//11B_11M
72,//11G_6M
72,//11G_9M
85,//11G_12M
80,//11G_18M
64,//11G_24M
64,//11G_36M
62,//11G_48M
52,//11G_54M
72,//11N_MCS0
90,//11N_MCS1
80,//11N_MCS2
64,//11N_MCS3
64,//11N_MCS4
64,//11N_MCS5
50,//11N_MCS6
43,//11N_MCS7
}
};
#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) = {
#ifdef CONFIG_UI_ENABLE
{ "pap", &pap_dev_ops, (void *)&pap_data},
{ "emi", &emi_dev_ops, (void *)&emi_data},
{ "imd", &imd_dev_ops, NULL},
#endif
{ "pwm0", &pwm_dev_ops, (void *)&pwm_data0},
{ "pwm1", &pwm_dev_ops, (void *)&pwm_data1},
{ "iic0", &iic_dev_ops, (void *)&sw_iic0_data },
#ifdef CONFIG_VIDEO1_ENABLE
{ "iic1", &iic_dev_ops, (void *)&sw_iic1_data },
{ "iic2", &iic_dev_ops, (void *)&hw_iic1_data },
#else
{ "iic1", &iic_dev_ops, (void *)&hw_iic1_data },
#endif
{ "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
#ifdef CONFIG_VIDEO1_ENABLE
{ "video1.*", &video_dev_ops, (void *)&video1_data },//vdieo1为spi摄像头
{ "video3.*", &video_dev_ops, (void *)&video1_data },//video3为双路(jpeg+yuv)dvp摄像头
#endif
#ifdef CONFIG_VIDEO_DEC_ENABLE
{ "video_dec", &video_dev_ops, NULL },
#endif
#ifdef CONFIG_UVC_VIDEO2_ENABLE
{"uvc", &uvc_dev_ops, NULL},
{ "video2.*", &video_dev_ops, NULL },
#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
#if TCFG_UDISK_ENABLE
{ "udisk0", &mass_storage_ops, NULL },
{ "udisk1", &mass_storage_ops, NULL },
#endif
#ifdef CONFIG_LTE_PHY_ENABLE
{ "lte", &lte_module_dev_ops, (void *) &lte_module_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.8V 2.9V 3.0V 3.1V 3.2V 3.3V 3.4V 3.5V
.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,
};
unsigned char PWR_CTL(unsigned char on_off)
{
return 0;
}
#define USB_WKUP_IO 0//IO_PORT_PR_01
unsigned char usb_is_charging()
{
#if 0
static unsigned char init = 0;
if (!init) {
init = 1;
gpio_latch_en(USB_WKUP_IO, 0);
gpio_direction_input(USB_WKUP_IO);
gpio_set_pull_up(USB_WKUP_IO, 0);
gpio_set_pull_down(USB_WKUP_IO, 0);
gpio_set_die(USB_WKUP_IO, 1);
delay(10);
}
return (gpio_read(USB_WKUP_IO));//no usb charing == false
#else
return 0;
#endif
}
unsigned char read_power_key()
{
unsigned char usb_wk;
static unsigned char pkey_init = 0;
if (!pkey_init) {
pkey_init = 1;
gpio_latch_en(PORT_WAKEUP_IO, 0);
gpio_direction_input(PORT_WAKEUP_IO);
gpio_set_pull_up(PORT_WAKEUP_IO, 0);
gpio_set_pull_down(PORT_WAKEUP_IO, 0);
gpio_set_die(PORT_WAKEUP_IO, 1);
delay(200);
}
delay_us(3000);
return !gpio_read(PORT_WAKEUP_IO);
return 0;
}
unsigned int get_usb_wkup_gpio()
{
return (USB_WKUP_IO);
}
/*进软关机之前默认将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)
{
gpio_direction_input(IO_PORTB_08);
gpio_set_pull_up(IO_PORTB_08,0);
gpio_set_pull_down(IO_PORTB_08,0);
gpio_direction_input(IO_PORTC_05);
gpio_set_pull_up(IO_PORTC_05,0);
gpio_set_pull_down(IO_PORTC_05,0);
gpio_direction_input(IO_PORTH_07);
gpio_set_pull_up(IO_PORTH_07,0);
gpio_set_pull_down(IO_PORTH_07,0);
gpio_direction_input(IO_PORTH_06);
gpio_set_pull_up(IO_PORTH_06,0);
gpio_set_pull_down(IO_PORTH_06,0);
#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()
{
dac_early_init(0, 0, 1000);
devices_init();
}
void board_init()
{
board_power_init();
#ifdef CONFIG_RTC_ENABLE
rtc_early_init();
#endif
adc_init();
#if (TCFG_IOKEY_ENABLE || TCFG_IRKEY_ENABLE || TCFG_RDEC_KEY_ENABLE || TCFG_ADKEY_ENABLE)
key_driver_init();
#endif
}
#endif