429 lines
10 KiB
C
Executable File
429 lines
10 KiB
C
Executable File
// Copyright 2020-2021 Beken
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include <common/bk_include.h>
|
|
#include "dd_pub.h"
|
|
#include "bk_drv_model.h"
|
|
#include "bk_sys_ctrl.h"
|
|
#include "sys_driver.h"
|
|
#include <driver/int.h>
|
|
#include <driver/pwm.h>
|
|
#include <driver/timer.h>
|
|
#include <driver/gpio.h>
|
|
#include <driver/dma.h>
|
|
#include <driver/uart.h>
|
|
#include <driver/wdt.h>
|
|
#include <driver/aon_wdt.h>
|
|
#include <driver/trng.h>
|
|
#include <driver/efuse.h>
|
|
#include <driver/ckmn.h>
|
|
#include <os/mem.h>
|
|
#include <driver/adc.h>
|
|
#include <driver/spi.h>
|
|
#include <driver/i2c.h>
|
|
#include <driver/aon_rtc.h>
|
|
#include <modules/pm.h>
|
|
#include <driver/psram.h>
|
|
#include <driver/lin.h>
|
|
#include "bk_driver.h"
|
|
#include "interrupt_base.h"
|
|
#include <driver/otp.h>
|
|
#include <driver/pwr_clk.h>
|
|
|
|
|
|
#if CONFIG_SECURITY
|
|
#include "bk_security.h"
|
|
#endif
|
|
|
|
#if CONFIG_AON_PMU
|
|
#include "aon_pmu_driver.h"
|
|
#endif
|
|
|
|
#if CONFIG_FLASH
|
|
#include <driver/flash.h>
|
|
#endif
|
|
|
|
#if CONFIG_EASY_FLASH
|
|
#include "bk_ef.h"
|
|
#endif
|
|
|
|
#if ((CONFIG_SDIO_HOST) || (CONFIG_SDCARD))
|
|
#include "driver/sdio_host.h"
|
|
#endif
|
|
|
|
#if CONFIG_SDCARD
|
|
#include "sdcard.h"
|
|
#endif
|
|
|
|
#if (CONFIG_SDIO_V2P0 && CONFIG_SDIO_SLAVE)
|
|
#include "sdio_slave_driver.h"
|
|
#if CONFIG_SDIO_TEST_EN
|
|
#include "sdio_test.h"
|
|
#endif
|
|
#endif
|
|
|
|
#if CONFIG_QSPI
|
|
#include <driver/qspi.h>
|
|
#endif
|
|
|
|
#if CONFIG_JPEGENC_HW
|
|
#include <driver/jpeg_enc.h>
|
|
#endif
|
|
|
|
#if CONFIG_CALENDAR
|
|
#include <driver/calendar.h>
|
|
#endif
|
|
|
|
#if CONFIG_ATE
|
|
#include <components/ate.h>
|
|
#endif
|
|
|
|
#if CONFIG_TOUCH_PM_SUPPORT
|
|
#include <driver/touch.h>
|
|
#endif
|
|
|
|
#if CONFIG_CHIP_SUPPORT
|
|
#include "modules/chip_support.h"
|
|
#endif
|
|
|
|
#if CONFIG_YUV_BUF
|
|
#include <driver/yuv_buf.h>
|
|
#endif
|
|
|
|
#if CONFIG_H264
|
|
#include <driver/h264.h>
|
|
#endif
|
|
|
|
#if CONFIG_SDMADC
|
|
#include <driver/sdmadc.h>
|
|
#endif
|
|
|
|
#if CONFIG_HW_ROTATE_PFC
|
|
#include <driver/rott_driver.h>
|
|
#endif
|
|
|
|
#if CONFIG_GET_UID_ENABLE
|
|
#include <components/bk_uid.h>
|
|
#endif
|
|
|
|
//TODO only init driver model and necessary drivers
|
|
#if CONFIG_POWER_CLOCK_RF
|
|
#define MODULES_POWER_OFF_ENABLE (1)
|
|
#define ROSC_DEBUG_EN (0)
|
|
#define MODULES_CLK_ENABLE (0)
|
|
extern void clock_dco_cali(UINT32 speed);
|
|
void power_clk_rf_init()
|
|
{
|
|
uint32_t param =0;
|
|
/*power on all the modules for bringup test*/
|
|
|
|
module_name_t use_module = MODULE_NAME_WIFI;
|
|
/*1. power on all the modules*/
|
|
#if MODULES_POWER_OFF_ENABLE
|
|
sys_drv_module_power_ctrl(POWER_MODULE_NAME_ENCP,POWER_MODULE_STATE_OFF);
|
|
//sys_drv_module_power_ctrl(POWER_MODULE_NAME_BAKP,POWER_MODULE_STATE_OFF);
|
|
sys_drv_module_power_ctrl(POWER_MODULE_NAME_AUDP,POWER_MODULE_STATE_OFF);
|
|
sys_drv_module_power_ctrl(POWER_MODULE_NAME_VIDP,POWER_MODULE_STATE_OFF);
|
|
sys_drv_module_power_ctrl(POWER_MODULE_NAME_BTSP,POWER_MODULE_STATE_OFF);
|
|
sys_drv_module_power_ctrl(POWER_MODULE_NAME_WIFIP_MAC,POWER_MODULE_STATE_OFF);
|
|
sys_drv_module_power_ctrl(POWER_MODULE_NAME_WIFI_PHY,POWER_MODULE_STATE_OFF);
|
|
sys_drv_module_power_ctrl(POWER_MODULE_NAME_CPU1,POWER_MODULE_STATE_OFF);
|
|
#else
|
|
power_module_name_t module = POWER_MODULE_NAME_MEM1;
|
|
for(module = POWER_MODULE_NAME_MEM1 ; module < POWER_MODULE_NAME_NONE ; module++)
|
|
{
|
|
sys_drv_module_power_ctrl(module,POWER_MODULE_STATE_ON);
|
|
}
|
|
#endif
|
|
/*2. enable the analog clock*/
|
|
sys_drv_module_RF_power_ctrl(use_module ,POWER_MODULE_STATE_ON);
|
|
|
|
/*3.enable all the modules clock*/
|
|
#if MODULES_CLK_ENABLE
|
|
dev_clk_pwr_id_t devid = 0;
|
|
for(devid = 0; devid < 32; devid++)
|
|
{
|
|
sys_drv_dev_clk_pwr_up(devid, CLK_PWR_CTRL_PWR_UP);
|
|
}
|
|
#endif
|
|
/*4.set the cpu0 and matrix clock*/
|
|
/*cpu0:26m ,matrix:26m*/
|
|
//sys_drv_core_bus_clock_ctrl(HIGH_FREQUECY_CLOCK_MODULE_CPU0, 1,0, HIGH_FREQUECY_CLOCK_MODULE_CPU0_MATRIX,0,0);
|
|
/*cpu0:120m ,matrix:120m*/
|
|
//sys_drv_core_bus_clock_ctrl(HIGH_FREQUECY_CLOCK_MODULE_CPU0, 3,0, HIGH_FREQUECY_CLOCK_MODULE_CPU0_MATRIX,0,0);
|
|
/*cpu0:240m ,matrix:120m*/
|
|
//sys_drv_core_bus_clock_ctrl(HIGH_FREQUECY_CLOCK_MODULE_CPU0, 0,0, HIGH_FREQUECY_CLOCK_MODULE_CPU0_MATRIX,0,0);
|
|
#if CONFIG_SYS_CPU0
|
|
//bk_pm_module_vote_cpu_freq(PM_DEV_ID_DEFAULT,PM_CPU_FRQ_120M);
|
|
#if CONFIG_ATE_TEST
|
|
//bk_pm_module_vote_cpu_freq(PM_DEV_ID_DEFAULT,PM_CPU_FRQ_320M);//improve the cpu frequency for save boot time at ate test
|
|
#endif
|
|
#endif
|
|
/*5.config the analog*/
|
|
//sys_drv_analog_set(ANALOG_REG0, param);
|
|
//sys_drv_analog_set(ANALOG_REG0, param);
|
|
//sys_drv_analog_set(ANALOG_REG0, param);
|
|
|
|
//config apll
|
|
//param = 0;
|
|
//param = sys_drv_analog_get(ANALOG_REG4);
|
|
//param &= ~(0x1f << 5);
|
|
//param |= (0x14 << 5);
|
|
//sys_drv_analog_set(ANALOG_REG4, param);
|
|
|
|
/*set low power low voltage value */
|
|
#if 0
|
|
param = 0;
|
|
param = sys_drv_analog_get(ANALOG_REG3);
|
|
param &= ~(0x7 << 29);
|
|
param |= (0x4 << 29);
|
|
sys_drv_analog_set(ANALOG_REG3, param);
|
|
|
|
param = sys_drv_analog_get(ANALOG_REG2);
|
|
param |= (0x1 << 25);
|
|
sys_drv_analog_set(ANALOG_REG2, param);
|
|
#endif
|
|
/*tempreture det enable for VIO*/
|
|
param = 0;
|
|
param = sys_drv_analog_get(ANALOG_REG6);
|
|
param |= (0x1 << SYS_ANA_REG6_EN_TEMPDET_POS)|(0x7 << SYS_ANA_REG6_RXTAL_LP_POS)|(0x7 << SYS_ANA_REG6_RXTAL_HP_POS);
|
|
param &= ~(0x1 << SYS_ANA_REG6_EN_SLEEP_POS);
|
|
sys_drv_analog_set(ANALOG_REG6, param);
|
|
|
|
#if 0
|
|
param = 0;
|
|
param = aon_pmu_drv_reg_get(PMU_REG3);
|
|
param = 0x1 << 0; //security boot bypass
|
|
aon_pmu_drv_reg_set(PMU_REG3,param);
|
|
#endif
|
|
/*let rosc to bt/wifi ip*/
|
|
param = 0;
|
|
param = aon_pmu_drv_reg_get(PMU_REG0x41);
|
|
param |= 0x1 << 24;
|
|
aon_pmu_drv_reg_set(PMU_REG0x41,param);
|
|
/*wake delay of Xtal*/
|
|
#if 0
|
|
param = 0;
|
|
param = aon_pmu_drv_reg_get(PMU_REG0x40);
|
|
param |= 0xF << 0;
|
|
aon_pmu_drv_reg_set(PMU_REG0x40,param);
|
|
#endif
|
|
/* rosc calibration start*/
|
|
/*a.open rosc debug*/
|
|
#if ROSC_DEBUG_EN
|
|
param = 0;
|
|
param = sys_drv_analog_get(ANALOG_REG5);
|
|
param |= 0x1 << SYS_ANA_REG5_CK_TST_ENBALE_POS;
|
|
sys_drv_analog_set(ANALOG_REG5,param);
|
|
|
|
param = 0;
|
|
param = sys_drv_analog_get(ANALOG_REG11);
|
|
param |= 0x1 << SYS_ANA_REG11_TEST_EN_POS;
|
|
sys_drv_analog_set(ANALOG_REG11,param);
|
|
|
|
param = 0;
|
|
param = sys_drv_analog_get(ANALOG_REG4);
|
|
param |= (0x1 << SYS_ANA_REG4_ROSC_TSTEN_POS);//Rosc test enable
|
|
sys_drv_analog_set(ANALOG_REG4,param);
|
|
|
|
#endif
|
|
/*b.config calibration*/
|
|
param = 0;
|
|
param = sys_drv_analog_get(ANALOG_REG4);
|
|
param &= ~(SYS_ANA_REG4_ROSC_CAL_INTVAL_MASK << SYS_ANA_REG4_ROSC_CAL_INTVAL_POS);//clear the data
|
|
param |= 0x4 << SYS_ANA_REG4_ROSC_CAL_INTVAL_POS;//Rosc Calibration Interlval 0.25s~2s (4:1s)
|
|
param |= 0x1 << SYS_ANA_REG4_ROSC_CAL_MODE_POS;//0x1: 32K ;0x0: 31.25K
|
|
param |= 0x1 << SYS_ANA_REG4_ROSC_CAL_EN_POS;//Rosc Calibration Enable
|
|
param &= ~(0x1 << SYS_ANA_REG4_ROSC_MANU_EN_POS);//0:close Rosc Calibration Manual Mode
|
|
sys_drv_analog_set(ANALOG_REG4,param);
|
|
|
|
/*c.trigger calibration*/
|
|
param = 0;
|
|
param = sys_drv_analog_get(ANALOG_REG4);
|
|
param &= ~(0x1 << SYS_ANA_REG4_ROSC_CAL_TRIG_POS);//trigger clear
|
|
sys_drv_analog_set(ANALOG_REG4,param);
|
|
|
|
param = 0;
|
|
param = sys_drv_analog_get(ANALOG_REG4);
|
|
param |= (0x1 << SYS_ANA_REG4_ROSC_CAL_TRIG_POS);//trigger enable
|
|
sys_drv_analog_set(ANALOG_REG4,param);
|
|
/* rosc calibration end*/
|
|
/*7.dpll calibration */
|
|
//sys_drv_cali_dpll(0);
|
|
|
|
/*8.dco calibration*/
|
|
//clock_dco_cali(0x4);
|
|
}
|
|
#endif
|
|
|
|
int driver_init(void)
|
|
{
|
|
sys_drv_init();
|
|
|
|
#if CONFIG_AON_PMU
|
|
aon_pmu_drv_init();
|
|
#endif
|
|
|
|
#if CONFIG_POWER_CLOCK_RF
|
|
power_clk_rf_init();
|
|
#endif
|
|
|
|
interrupt_init();
|
|
|
|
bk_gpio_driver_init();
|
|
|
|
//Important notice!!!!!
|
|
//ATE uses UART TX PIN as the detect ATE mode pin,
|
|
//so it should be called after GPIO init and before UART init.
|
|
//or caused ATE can't work or UART can't work
|
|
#if CONFIG_ATE
|
|
bk_ate_init();
|
|
#endif
|
|
|
|
//Important notice!
|
|
//Before UART is initialized, any call of BK_LOG_RAW/os_print/BK_LOGx may
|
|
//cause problems, such as crash etc!
|
|
bk_uart_driver_init();
|
|
|
|
#if CONFIG_CHIP_SUPPORT
|
|
if(!bk_is_chip_supported()) {
|
|
return BK_FAIL;
|
|
}
|
|
#endif
|
|
|
|
os_show_memory_config_info(); //TODO - remove it after bk_early_printf() is supported.
|
|
drv_model_init();
|
|
|
|
g_dd_init();
|
|
|
|
#if CONFIG_FLASH
|
|
bk_flash_driver_init();
|
|
#if CONFIG_FLASH_ORIGIN_API
|
|
extern int hal_flash_init();
|
|
hal_flash_init();
|
|
#endif
|
|
#endif
|
|
|
|
#if CONFIG_EASY_FLASH
|
|
easyflash_init();
|
|
#endif
|
|
|
|
#if CONFIG_SECURITY
|
|
bk_secrity_init();
|
|
#endif
|
|
|
|
#if CONFIG_PWM
|
|
bk_pwm_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_TIMER
|
|
bk_timer_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_GENERAL_DMA
|
|
bk_dma_driver_init();
|
|
#endif
|
|
|
|
bk_wdt_driver_init();
|
|
|
|
#if CONFIG_AON_WDT && !CONFIG_INT_AON_WDT
|
|
bk_aon_wdt_stop();
|
|
#endif
|
|
|
|
#if CONFIG_TRNG_SUPPORT
|
|
bk_trng_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_EFUSE
|
|
bk_efuse_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_SARADC
|
|
bk_adc_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_SPI
|
|
bk_spi_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_I2C
|
|
bk_i2c_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_QSPI
|
|
bk_qspi_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_YUV_BUF
|
|
bk_yuv_buf_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_JPEGENC_HW
|
|
bk_jpeg_enc_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_H264
|
|
bk_h264_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_AON_RTC
|
|
bk_aon_rtc_driver_init();
|
|
#endif
|
|
|
|
#if ((CONFIG_SDIO_HOST) || (CONFIG_SDCARD))
|
|
bk_sdio_host_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_CALENDAR
|
|
bk_calendar_driver_init();
|
|
#endif
|
|
|
|
//call it after LOG is valid.
|
|
#if CONFIG_ATE
|
|
os_printf("ate enabled is %d\r\n", ate_is_enabled());
|
|
#endif
|
|
|
|
#if CONFIG_TOUCH_PM_SUPPORT
|
|
bk_touch_pm_init();
|
|
#endif
|
|
|
|
#if CONFIG_SDMADC
|
|
//bk_sdmadc_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_HW_ROTATE_PFC
|
|
// bk_rott_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_CKMN
|
|
bk_ckmn_driver_init();
|
|
#endif
|
|
#if CONFIG_LIN
|
|
bk_lin_driver_init();
|
|
#endif
|
|
|
|
#if CONFIG_MBEDTLS_ACCELERATOR
|
|
extern int dubhe_driver_init( unsigned long dbh_base_addr );
|
|
dubhe_driver_init(SOC_SHANHAI_BASE);
|
|
#endif
|
|
|
|
#if CONFIG_GET_UID_ENABLE
|
|
bk_uid_driver_init();
|
|
#endif
|
|
os_printf("driver_init end\r\n");
|
|
|
|
return 0;
|
|
}
|
|
|