doubao_chat/apps/scan_box/board/wl82/board_demo_scanbox.c

481 lines
14 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"
#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值调节占空比小数点精度位: 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 = 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();
}