2687 lines
79 KiB
C
Executable File
2687 lines
79 KiB
C
Executable File
#include <common/bk_include.h>
|
|
#include "bk_arm_arch.h"
|
|
#include "bk_sys_ctrl.h"
|
|
#include "sys_ctrl.h"
|
|
#include "sys_driver.h"
|
|
#include "bk_misc.h"
|
|
#include "bk_drv_model.h"
|
|
#include "bk_uart.h"
|
|
#if CONFIG_FLASH_ORIGIN_API
|
|
#include "bk_flash.h"
|
|
#endif
|
|
#include <driver/int.h>
|
|
#include "bk_icu.h"
|
|
#include "bk_gpio.h"
|
|
#include "reset_reason.h"
|
|
#include <os/os.h>
|
|
|
|
#if (!CONFIG_SOC_BK7256XX)
|
|
|
|
#if ((CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7256XX))
|
|
#define GPIO_WAKEUP_INT_BAK_ADDR (0x00808000)
|
|
#elif ((CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7236XX) || (CONFIG_SOC_BK7239XX) || (CONFIG_SOC_BK7286XX))
|
|
#define GPIO_WAKEUP_INT_BAK_ADDR (0x10E00000)
|
|
#elif (CONFIG_SOC_BK7256XX && CONFIG_SYS_CPU1)
|
|
#define GPIO_WAKEUP_INT_BAK_ADDR (0x00808000)
|
|
#else
|
|
#define GPIO_WAKEUP_INT_BAK_ADDR (0x0080a084)
|
|
#endif
|
|
#define GPIO_WAKEUP_INT_STATUS_BAK (GPIO_WAKEUP_INT_BAK_ADDR + 0x1 * 4)
|
|
#define GPIO_WAKEUP_INT_STATUS1_BAK (GPIO_WAKEUP_INT_BAK_ADDR + 0x2 * 4)
|
|
#if CONFIG_SOC_BK7271
|
|
#include "pmu.h"
|
|
#endif
|
|
|
|
#include "bk_normal_sleep.h"
|
|
|
|
#define DPLL_DIV 0x0
|
|
#define DCO_CALIB_26M 0x1
|
|
#define DCO_CALIB_60M 0x2
|
|
#define DCO_CALIB_80M 0x3
|
|
#define DCO_CALIB_120M 0x4
|
|
#define DCO_CALIB_180M 0x5
|
|
|
|
#if (CONFIG_SOC_BK7271)
|
|
#define DCO_CALIB_240M 0x6
|
|
#define DCO_CLK_SELECT DCO_CALIB_240M
|
|
#define USE_DCO_CLK_POWON 0
|
|
#define SCTRL_AUDIO_PLL_SDM SCTRL_ANALOG_AUDIO_PLL_SDM
|
|
#define SCTRL_AUDIO_PLL_CTRL SCTRL_ANALOG_AUDIO_PLL_CTRL
|
|
#elif (CONFIG_SOC_BK7251)
|
|
#define DCO_CLK_SELECT DCO_CALIB_180M
|
|
#define USE_DCO_CLK_POWON 1
|
|
|
|
UINT8 calib_charger[3] = {
|
|
0x23, //vlcf
|
|
0x15, //icp
|
|
0x1b //vcv
|
|
};
|
|
#else
|
|
#define DCO_CLK_SELECT DCO_CALIB_120M
|
|
/* BK7231N could not using DCO as main clock when boot since DCO_AMSEL_BIT should be disable during calibration*/
|
|
#define USE_DCO_CLK_POWON 0
|
|
#endif
|
|
|
|
static SCTRL_PS_SAVE_VALUES ps_saves[2];
|
|
|
|
#if (CONFIG_DEEP_PS && PS_SUPPORT_MANUAL_SLEEP)
|
|
static UINT32 ps_block_value = 0;
|
|
#endif
|
|
#if CONFIG_DEEP_PS
|
|
static UINT32 deep_sleep_gpio_floating_map = 0;
|
|
static uint32_t gpio_0_31_status = 0;
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX)
|
|
static uint32_t gpio_32_39_status = 0;
|
|
static UINT32 deep_sleep_gpio_last_floating_map = 0;
|
|
#endif
|
|
#endif
|
|
#ifndef CONFIG_SOC_BK7256XX
|
|
static const DD_OPERATIONS sctrl_op = {
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
sctrl_ctrl
|
|
};
|
|
#endif
|
|
static sctrl_cal_bias_cb_t s_cal_bias_callback = NULL;
|
|
static sctrl_wifi_phy_wakeup_rf_reinit_cb_t s_wifi_phy_wakeup_rf_reinit_cb = NULL;
|
|
static sctrl_wifi_phy_wakeup_wifi_reinit_cb_t s_wifi_phy_wakeup_wifi_reinit_cb = NULL;
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7256XX)
|
|
void sctrl_fix_dpll_div(void);
|
|
#endif
|
|
|
|
/**********************************************************************/
|
|
|
|
void sctrl_register_cal_bias_callback(sctrl_cal_bias_cb_t cb)
|
|
{
|
|
s_cal_bias_callback = cb;
|
|
}
|
|
|
|
void sctrl_register_wifi_phy_wakeup_rf_reinit_callback(sctrl_wifi_phy_wakeup_rf_reinit_cb_t cb)
|
|
{
|
|
s_wifi_phy_wakeup_rf_reinit_cb = cb;
|
|
}
|
|
|
|
void sctrl_register_wifi_phy_wakeup_wifi_reinit_callback(sctrl_wifi_phy_wakeup_wifi_reinit_cb_t cb)
|
|
{
|
|
s_wifi_phy_wakeup_wifi_reinit_cb = cb;
|
|
}
|
|
|
|
void sctrl_dpll_delay10us(void)
|
|
{
|
|
volatile UINT32 i = 0;
|
|
|
|
for (i = 0; i < DPLL_DELAY_TIME_10US; i ++)
|
|
;
|
|
}
|
|
|
|
void sctrl_dpll_delay200us(void)
|
|
{
|
|
volatile UINT32 i = 0;
|
|
|
|
for (i = 0; i < DPLL_DELAY_TIME_200US; i ++)
|
|
;
|
|
}
|
|
|
|
void sctrl_ps_dpll_delay(UINT32 time)
|
|
{
|
|
volatile UINT32 i = 0;
|
|
|
|
for (i = 0; i < time; i ++)
|
|
;
|
|
}
|
|
|
|
void sctrl_cali_dpll(UINT8 flag)
|
|
{
|
|
UINT32 param;
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
extern void bk7011_update_tx_power_when_cal_dpll(int start_or_stop);
|
|
|
|
bk7011_update_tx_power_when_cal_dpll(1);
|
|
#endif
|
|
param = sctrl_analog_get(SCTRL_ANALOG_CTRL0);
|
|
param &= ~(SPI_TRIG_BIT);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL0, param);
|
|
|
|
if (!flag)
|
|
sctrl_dpll_delay10us();
|
|
else
|
|
sctrl_ps_dpll_delay(60);
|
|
|
|
param |= (SPI_TRIG_BIT);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL0, param);
|
|
|
|
param = sctrl_analog_get(SCTRL_ANALOG_CTRL0);
|
|
param &= ~(SPI_DET_EN);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL0, param);
|
|
|
|
if (!flag)
|
|
sctrl_dpll_delay200us();
|
|
else
|
|
sctrl_ps_dpll_delay(340);
|
|
|
|
param = sctrl_analog_get(SCTRL_ANALOG_CTRL0);
|
|
param |= (SPI_DET_EN);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL0, param);
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
bk7011_update_tx_power_when_cal_dpll(0);
|
|
#endif
|
|
}
|
|
|
|
void sctrl_dpll_isr(void)
|
|
{
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7256XX)
|
|
if ((DEVICE_ID_BK7231N_P & DEVICE_ID_MASK) != (sctrl_ctrl(CMD_GET_DEVICE_ID, NULL) & DEVICE_ID_MASK))
|
|
{
|
|
os_printf("BIAS Cali\r\n");
|
|
if (s_cal_bias_callback) {
|
|
s_cal_bias_callback();
|
|
}
|
|
}
|
|
#elif (CONFIG_SOC_BK7236A)
|
|
os_printf("BIAS Cali\r\n");
|
|
if (s_cal_bias_callback) {
|
|
s_cal_bias_callback();
|
|
}
|
|
#endif
|
|
sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CLR_DPLL_UNLOOK_INT_BIT, NULL);
|
|
sctrl_cali_dpll(0);
|
|
|
|
os_printf("DPLL Unlock\r\n");
|
|
}
|
|
|
|
void sctrl_dpll_int_open(void)
|
|
{
|
|
UINT32 param;
|
|
|
|
param = (FIQ_DPLL_UNLOCK_BIT);
|
|
#if (CONFIG_SOC_BK7271)
|
|
// sddev_control(DD_DEV_TYPE_ICU, CMD_ICU_FIQ_ENABLE, ¶m);
|
|
(void)sys_drv_fiq_enable(param);
|
|
#else
|
|
// sddev_control(DD_DEV_TYPE_ICU, CMD_ICU_INT_ENABLE, ¶m);
|
|
(void)sys_drv_int_enable(param);
|
|
#endif
|
|
|
|
#if (!CONFIG_SOC_BK7231)
|
|
param = 1;
|
|
sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_EN_DPLL_UNLOOK_INT, ¶m);
|
|
#endif
|
|
}
|
|
|
|
void sctrl_dpll_int_close(void)
|
|
{
|
|
UINT32 param;
|
|
|
|
#if (!CONFIG_SOC_BK7231)
|
|
param = 0;
|
|
sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_EN_DPLL_UNLOOK_INT, ¶m);
|
|
#endif
|
|
|
|
param = (FIQ_DPLL_UNLOCK_BIT);
|
|
#if (CONFIG_SOC_BK7271)
|
|
// sddev_control(DD_DEV_TYPE_ICU, CMD_ICU_FIQ_DISABLE, ¶m);
|
|
(void)sys_drv_fiq_disable(param);
|
|
#else
|
|
// sddev_control(DD_DEV_TYPE_ICU, CMD_ICU_INT_DISABLE, ¶m);
|
|
(void)sys_drv_int_disable(param);
|
|
#endif
|
|
}
|
|
void clock_dco_cali(UINT32 speed)
|
|
{
|
|
UINT32 reg_val;
|
|
|
|
switch (speed) {
|
|
#if (CONFIG_SOC_BK7271)
|
|
case DCO_CALIB_240M:
|
|
reg_val = sys_drv_analog_get(ANALOG_REG1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0x127 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
reg_val |= DIV_BYPASS_BIT;
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
break;
|
|
#endif
|
|
|
|
case DCO_CALIB_180M:
|
|
reg_val = sys_drv_analog_get(ANALOG_REG1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0xDD & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
reg_val |= DIV_BYPASS_BIT;
|
|
#endif
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
break;
|
|
|
|
case DCO_CALIB_120M:
|
|
reg_val = sys_drv_analog_get(ANALOG_REG1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0x127 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
break;
|
|
|
|
case DCO_CALIB_80M:
|
|
reg_val = sctrl_analog_get(ANALOG_REG1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0x0C5 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
break;
|
|
|
|
case DCO_CALIB_60M:
|
|
reg_val = sys_drv_analog_get(ANALOG_REG1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0x127 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
reg_val |= ((0x02 & DCO_DIV_MASK) << DCO_DIV_POSI);
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
break;
|
|
|
|
default:
|
|
reg_val = sys_drv_analog_get(ANALOG_REG1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0xC0 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
reg_val |= ((0x03 & DCO_DIV_MASK) << DCO_DIV_POSI);
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
break;
|
|
}
|
|
|
|
reg_val = sys_drv_analog_get(ANALOG_REG1);
|
|
reg_val &= ~(SPI_RST_BIT);
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
reg_val &= ~(DCO_AMSEL_BIT);
|
|
#endif
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
|
|
reg_val = sys_drv_analog_get(ANALOG_REG1);
|
|
reg_val |= SPI_RST_BIT;
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
|
|
reg_val = sys_drv_analog_get(ANALOG_REG1);
|
|
reg_val |= DCO_TRIG_BIT;
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
|
|
reg_val = sys_drv_analog_get(ANALOG_REG1);
|
|
reg_val &= ~(DCO_TRIG_BIT);
|
|
sys_drv_analog_set(ANALOG_REG1, reg_val);
|
|
}
|
|
void sctrl_dco_cali(UINT32 speed)
|
|
{
|
|
UINT32 reg_val;
|
|
|
|
switch (speed) {
|
|
#if (CONFIG_SOC_BK7271)
|
|
case DCO_CALIB_240M:
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0x127 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
reg_val |= DIV_BYPASS_BIT;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
break;
|
|
#endif
|
|
|
|
case DCO_CALIB_180M:
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0xDD & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
reg_val |= DIV_BYPASS_BIT;
|
|
#endif
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
break;
|
|
|
|
case DCO_CALIB_120M:
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0x127 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
break;
|
|
|
|
case DCO_CALIB_80M:
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0x0C5 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
break;
|
|
|
|
case DCO_CALIB_60M:
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0x127 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
reg_val |= ((0x02 & DCO_DIV_MASK) << DCO_DIV_POSI);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
break;
|
|
|
|
default:
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val &= ~((DCO_CNTI_MASK << DCO_CNTI_POSI) | (DCO_DIV_MASK << DCO_DIV_POSI));
|
|
reg_val |= ((0xC0 & DCO_CNTI_MASK) << DCO_CNTI_POSI);
|
|
reg_val |= ((0x03 & DCO_DIV_MASK) << DCO_DIV_POSI);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
break;
|
|
}
|
|
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val &= ~(SPI_RST_BIT);
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
reg_val &= ~(DCO_AMSEL_BIT);
|
|
#endif
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val |= SPI_RST_BIT;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val |= DCO_TRIG_BIT;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
|
|
reg_val = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
reg_val &= ~(DCO_TRIG_BIT);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, reg_val);
|
|
}
|
|
|
|
void sctrl_set_cpu_clk_dco(void)
|
|
{
|
|
UINT32 reg_val;
|
|
|
|
reg_val = REG_READ(SCTRL_CONTROL);
|
|
reg_val &= ~(MCLK_DIV_MASK << MCLK_DIV_POSI);
|
|
reg_val &= ~(MCLK_MUX_MASK << MCLK_MUX_POSI);
|
|
|
|
reg_val |= ((MCLK_FIELD_DCO & MCLK_MUX_MASK) << MCLK_MUX_POSI);
|
|
reg_val |= HCLK_DIV2_EN_BIT;
|
|
|
|
REG_WRITE(SCTRL_CONTROL, reg_val);
|
|
delay(10);
|
|
|
|
}
|
|
|
|
|
|
void sctrl_ble_ps_init(void)
|
|
{
|
|
}
|
|
|
|
static void sctrl_mac_ahb_slave_clock_enable(void)
|
|
{
|
|
UINT32 reg;
|
|
#if (CONFIG_SOC_BK7271)
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
REG_WRITE(SCTRL_CONTROL, reg | MAC_HCLK_EN_BIT);
|
|
#else
|
|
reg = REG_READ(SCTRL_MODEM_CORE_RESET_PHY_HCLK);
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg | MAC_HCLK_EN_BIT);
|
|
#endif
|
|
}
|
|
|
|
void sctrl_mac_ahb_slave_clock_disable(void)
|
|
{
|
|
UINT32 reg;
|
|
#if (CONFIG_SOC_BK7271)
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~MAC_HCLK_EN_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
#else
|
|
reg = REG_READ(SCTRL_MODEM_CORE_RESET_PHY_HCLK);
|
|
reg &= ~MAC_HCLK_EN_BIT;
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg);
|
|
#endif
|
|
}
|
|
#ifndef CONFIG_SOC_BK7256XX
|
|
void sctrl_init(void)
|
|
{
|
|
UINT32 param;
|
|
|
|
#if (CONFIG_SOC_BK7271)
|
|
/* told by huaming to avoid reset */
|
|
addGPIO_Reg0xf = 0x38;
|
|
//set link bus clock, DPLL div 4
|
|
param = REG_READ(LBUS_CONF1_REG);
|
|
param &= ~0x7;
|
|
param |= 0x7;
|
|
REG_WRITE(LBUS_CONF1_REG, param);
|
|
#endif
|
|
|
|
sddev_register_dev(DD_DEV_TYPE_SCTRL, (DD_OPERATIONS *)&sctrl_op);
|
|
|
|
/*enable blk clk
|
|
Attention: ENABLE 26m xtal block(BLK_BIT_26M_XTAL), for protect 32k circuit
|
|
*/
|
|
param = BLK_BIT_26M_XTAL | BLK_BIT_DPLL_480M | BLK_BIT_XTAL2RF | BLK_BIT_DCO;
|
|
#if (CONFIG_SOC_BK7271)
|
|
param |= BLK_BIT_AUDIO_PLL;
|
|
#endif
|
|
sctrl_ctrl(CMD_SCTRL_BLK_ENABLE, ¶m);
|
|
|
|
/*config main clk*/
|
|
#if !USE_DCO_CLK_POWON
|
|
param = REG_READ(SCTRL_CONTROL);
|
|
param &= ~(MCLK_DIV_MASK << MCLK_DIV_POSI);
|
|
param &= ~(MCLK_MUX_MASK << MCLK_MUX_POSI);
|
|
|
|
#if (CONFIG_SOC_BK7271)
|
|
param &= ~(HCLK_DIV2_MASK << HCLK_DIV2_POSI);
|
|
param |= HCLK_DIV2_EN_BIT;
|
|
param &= ~(MTB_PRIVILEGE_MASK << MTB_PRIVILEGE_POSI);
|
|
param |= (MTB_PRIVILEGE_ACCESS_AHB << MTB_PRIVILEGE_POSI);
|
|
#elif (CONFIG_SOC_BK7251)
|
|
/* BK7221U ahb bus max rate is 90MHZ, so ahb bus need div 2 from MCU clock */
|
|
/* AHB bus is very import to AUDIO and DMA */
|
|
param |= HCLK_DIV2_EN_BIT;
|
|
#endif // (CONFIG_SOC_BK7251)
|
|
|
|
#if CONFIG_SYS_REDUCE_NORMAL_POWER
|
|
param |= ((MCLK_DIV_7 & MCLK_DIV_MASK) << MCLK_DIV_POSI);
|
|
#elif (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7256XX)
|
|
param |= ((MCLK_DIV_5 & MCLK_DIV_MASK) << MCLK_DIV_POSI);
|
|
#elif (CONFIG_SOC_BK7271)
|
|
param |= ((MCLK_DIV_3 & MCLK_DIV_MASK) << MCLK_DIV_POSI);
|
|
#elif (CONFIG_SOC_BK7236A)
|
|
// for bk7236, no less than 60MHZ, it better 80M above, here set 120M for debug
|
|
param |= ((MCLK_DIV_3 & MCLK_DIV_MASK) << MCLK_DIV_POSI);
|
|
#else // CONFIG_SYS_REDUCE_NORMAL_POWER
|
|
param |= ((MCLK_DIV_3 & MCLK_DIV_MASK) << MCLK_DIV_POSI);
|
|
#endif // CONFIG_SYS_REDUCE_NORMAL_POWER
|
|
|
|
param |= ((MCLK_FIELD_DPLL & MCLK_MUX_MASK) << MCLK_MUX_POSI);
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
param |= (BLE_RF_PTA_EN_BIT);
|
|
#endif
|
|
REG_WRITE(SCTRL_CONTROL, param);
|
|
#endif // (!USE_DCO_CLK_POWON)
|
|
|
|
/*sys_ctrl <0x4c> */
|
|
#if (CONFIG_SOC_BK7271)
|
|
param = (0x17 << LDO_VAL_MANUAL_POSI) | (BIAS_CAL_MANUAL_BIT);//0x00151510; LDO BIAS CALIBRATION
|
|
#else
|
|
param = 0x00171710;//0x00151510; LDO BIAS CALIBRATION
|
|
#endif
|
|
REG_WRITE(SCTRL_BIAS, param);
|
|
|
|
/*mac & modem power up */
|
|
#if (CONFIG_SOC_BK7271)
|
|
sctrl_ctrl(CMD_SCTRL_DSP_POWERUP, NULL);
|
|
sctrl_ctrl(CMD_SCTRL_BT_POWERUP, NULL);
|
|
sctrl_ctrl(CMD_SCTRL_LBUS_POWERUP, NULL);
|
|
#else
|
|
sctrl_ctrl(CMD_SCTRL_MAC_POWERUP, NULL);
|
|
#endif
|
|
sctrl_ctrl(CMD_SCTRL_MODEM_POWERUP, NULL);
|
|
|
|
/*sys_ctrl <0x16>, trig spi */
|
|
//170209,from 0x819A54B to 0x819A55B for auto detect dpll unlock
|
|
//170614 from 0x819A55B to 0x819A59B for more easy to trigger
|
|
//181101 xamp:0xf-0 for xtal may dead
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
#if (CONFIG_XTAL_FREQ_40M)
|
|
param = 0x71125B57;
|
|
#else
|
|
param = 0x71104953;//wangjian20200918 Reg0x16<3:1>=1 Reg0x16<9>=0 Reg0x16<13:10>=2
|
|
#endif
|
|
#elif (CONFIG_SOC_BK7271)
|
|
param = 0x61105B57;
|
|
#else
|
|
param = 0x819A59B;
|
|
#endif
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL0, param);
|
|
|
|
sctrl_cali_dpll(0);
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
param = 0x3CC019C2;//wangjian20200918 Reg0x17<1>=1
|
|
/* BK7271: 0x17[28:26] sw_c<2:0> 0 R/W DCO Frequency Triming; 000=freq max; 111=freq min; */
|
|
#elif (CONFIG_SOC_BK7271)
|
|
param = 0x70C03902;
|
|
#else
|
|
param = 0x6AC03102;
|
|
#endif
|
|
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, param);
|
|
/*do dco Calibration*/
|
|
sctrl_dco_cali(DCO_CLK_SELECT);
|
|
#if USE_DCO_CLK_POWON
|
|
sctrl_set_cpu_clk_dco();
|
|
#endif
|
|
|
|
#if (CONFIG_SOC_BK7231)
|
|
param = 0x24006000;
|
|
#elif (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7256XX)
|
|
if ((DEVICE_ID_BK7231N_P & DEVICE_ID_MASK) == (sctrl_ctrl(CMD_GET_DEVICE_ID, NULL) & DEVICE_ID_MASK))
|
|
{
|
|
param = 0x580020E2;//wangjian20210422<28:23>=30 as default for BK7231P
|
|
}
|
|
else
|
|
{
|
|
param = 0x500020E2;//0x400020E0; //wangjian20200822 0x40032030->0x48032030->0x48022032//wangjian20200903<17:16>=0//qunshan20201127<28:23>=20
|
|
}
|
|
#elif (CONFIG_SOC_BK7236A)
|
|
param = 0x500020E2;//0x400020E0; //wangjian20200822 0x40032030->0x48032030->0x48022032//wangjian20200903<17:16>=0//qunshan20201127<28:23>=20
|
|
#elif (CONFIG_SOC_BK7271)
|
|
param = 0x80208B00; //for 32k if enable BLK_BIT_ROSC32K
|
|
#else
|
|
param = 0x24006080; // xtalh_ctune // 24006080
|
|
param &= ~(XTALH_CTUNE_MASK << XTALH_CTUNE_POSI);
|
|
param |= ((0x10 & XTALH_CTUNE_MASK) << XTALH_CTUNE_POSI);
|
|
#endif // (CONFIG_SOC_BK7231)
|
|
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL2, param);
|
|
|
|
#if (CONFIG_SOC_BK7251)
|
|
param = CHARGE_ANALOG_CTRL3_CHARGE_DEFAULT_VALUE;
|
|
#elif (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
param = 0x70000000; //wangjiang20200822 0x00000000->0x70000000
|
|
#elif (CONFIG_SOC_BK7271)
|
|
param = 0x004CA800;
|
|
#else
|
|
param = 0x4FE06C50;
|
|
#endif
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, param);
|
|
|
|
/*sys_ctrl <0x1a> */
|
|
#if (CONFIG_SOC_BK7231)
|
|
param = 0x59E04520;
|
|
#elif (CONFIG_SOC_BK7251)
|
|
param = CHARGE_ANALOG_CTRL4_CAL_DEFAULT_VALUE;
|
|
#elif (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
param = 0x19C04520;
|
|
#elif (CONFIG_SOC_BK7271)
|
|
param = 0x800C1000;
|
|
#else
|
|
param = 0x59C04520; // 0x59E04520
|
|
#endif // (CONFIG_SOC_BK7231)
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, param);
|
|
|
|
/*regist intteruppt handler for Dpll unlock*/
|
|
bk_int_isr_register(INT_SRC_PLL_UNLOCK, sctrl_dpll_isr, NULL);
|
|
|
|
sctrl_sub_reset();
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7256XX)
|
|
if ((DEVICE_ID_BK7231N_P & DEVICE_ID_MASK) != (sctrl_ctrl(CMD_GET_DEVICE_ID, NULL) & DEVICE_ID_MASK)) {
|
|
sctrl_fix_dpll_div();
|
|
}
|
|
#endif
|
|
|
|
/*sys ctrl clk gating, for rx dma dead*/
|
|
REG_WRITE(SCTRL_CLK_GATING, 0x3f);
|
|
|
|
/* increase VDD voltage*/
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
param = 4;//wyg// original=3
|
|
#elif CONFIG_SYS_REDUCE_NORMAL_POWER
|
|
param = 4;
|
|
#else
|
|
param = 5;
|
|
#endif
|
|
sctrl_ctrl(CMD_SCTRL_SET_VDD_VALUE, ¶m);
|
|
|
|
/*32K Rosc calib*/
|
|
#if (CONFIG_SOC_BK7271)
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x80208B00);
|
|
#else
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x7);
|
|
#endif
|
|
|
|
#if (CONFIG_AUDIO)
|
|
#if (CONFIG_SOC_BK7251)
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, 0x0033587C);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9, 0x82204607);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL10, 0x80801027);
|
|
#elif (CONFIG_SOC_BK7271)
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, 0x12A00000);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL6, 0x0009A7F0);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8_REAL, 0x84200461);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9_REAL, 0x3CEF9A5F);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, 0x000A0877);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9, 0x84400000);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL10, 0x80800200);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL13, 0x21084000);
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_CTRL, 0x00B09350);
|
|
|
|
//rtc init
|
|
addPMU_Reg0xd = 681800000; //from 2000-01-01. date(2000-01-01)=730486
|
|
addPMU_Reg0xf = 0x1;
|
|
#endif // (CONFIG_SOC_BK7251)
|
|
#endif // CONFIG_AUDIO
|
|
|
|
sctrl_mac_ahb_slave_clock_enable();
|
|
//rf_ps_init();
|
|
}
|
|
|
|
#endif
|
|
void sctrl_exit(void)
|
|
{
|
|
sddev_unregister_dev(DD_DEV_TYPE_SCTRL);
|
|
}
|
|
|
|
void sctrl_modem_core_reset(void)
|
|
{
|
|
sctrl_ctrl(CMD_SCTRL_MODEM_CORE_RESET, 0);
|
|
}
|
|
|
|
void sctrl_sub_reset(void)
|
|
{
|
|
sctrl_ctrl(CMD_SCTRL_MPIF_CLK_INVERT, 0);
|
|
sctrl_ctrl(CMD_SCTRL_MODEM_CORE_RESET, 0);
|
|
sctrl_ctrl(CMD_SCTRL_MODEM_SUBCHIP_RESET, 0);
|
|
sctrl_ctrl(CMD_SCTRL_MAC_SUBSYS_RESET, 0);
|
|
sctrl_ctrl(CMD_SCTRL_USB_SUBSYS_RESET, 0);
|
|
}
|
|
|
|
|
|
void ps_delay(volatile UINT16 times)
|
|
{
|
|
UINT32 delay = times;
|
|
while (delay--) ;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
void sctrl_ps_dump()
|
|
{
|
|
UINT32 i;
|
|
|
|
os_printf("reg dump\r\n");
|
|
os_printf("sys\r\n0x%8x:0x%8x\r\n", SCTRL_CONTROL, REG_READ(SCTRL_CONTROL));
|
|
os_printf("0x%8x:0x%8x\r\n", SCTRL_MODEM_CORE_RESET_PHY_HCLK, REG_READ(SCTRL_MODEM_CORE_RESET_PHY_HCLK));
|
|
os_printf("0x%8x:0x%8x\r\n", SCTRL_BLOCK_EN_CFG, REG_READ(SCTRL_BLOCK_EN_CFG));
|
|
os_printf("0x%8x:0x%8x\r\n", SCTRL_ROSC_CAL, REG_READ(SCTRL_ROSC_CAL));
|
|
os_printf("0x%8x:0x%8x\r\n", SCTRL_ANALOG_CTRL2, sctrl_analog_get(SCTRL_ANALOG_CTRL2));
|
|
//os_printf("0x%8x:0x%8x\r\n", ICU_R_INT_EN, REG_READ(ICU_R_INT_EN));
|
|
//os_printf("0x%8x:0x%8x\r\n", ICU_PERI_CLK_PWD, REG_READ(ICU_PERI_CLK_PWD));
|
|
os_printf("0x%8x:0x%8x\r\n", SCTRL_SLEEP, REG_READ(SCTRL_SLEEP));
|
|
//os_printf("0x%8x:0x%8x\r\n", ICU_R_ARM_WAKEUP_EN, REG_READ(ICU_R_ARM_WAKEUP_EN));
|
|
// bk_wifi_dump_ps_regs();
|
|
os_printf("saves dump\r\n");
|
|
|
|
for (i = 0; i < (3 * (sizeof(SCTRL_PS_SAVE_VALUES) / 4)); i++)
|
|
os_printf(" %d 0x%x\r\n", i, *((UINT32 *)(&ps_saves) + i));
|
|
}
|
|
#if 0
|
|
void sctrl_hw_sleep(UINT32 peri_clk)
|
|
{
|
|
#if (!CONFIG_SOC_BK7271)
|
|
uint32_t param, c_mclk_mux;
|
|
|
|
//os_printf("h s\r\n");
|
|
PS_DEBUG_HWDOWN_TRIGER;
|
|
|
|
UINT32 reg;
|
|
sctrl_ctrl(CMD_SCTRL_MCLK_MUX_GET, &c_mclk_mux);
|
|
|
|
param = (FIQ_DPLL_UNLOCK_BIT);
|
|
sddev_control(DD_DEV_TYPE_ICU, CMD_ICU_INT_DISABLE, ¶m);
|
|
|
|
PS_DEBUG_HWDOWN_TRIGER;
|
|
|
|
#if ((CONFIG_SOC_BK7231) || (CONFIG_SOC_BK7231U) || (CONFIG_SOC_BK7251))
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x35);
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x37);
|
|
#endif
|
|
|
|
if (c_mclk_mux != MCLK_SELECT_DCO) {
|
|
/* MCLK(main clock) select:dco*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(MCLK_DIV_MASK << MCLK_DIV_POSI);
|
|
reg |= ((MCLK_DIV_1 & MCLK_DIV_MASK) << MCLK_DIV_POSI);
|
|
reg &= ~(MCLK_MUX_MASK << MCLK_MUX_POSI);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
PS_DEBUG_HWDOWN_TRIGER;
|
|
}
|
|
|
|
/*close 32K Rosc calib*/
|
|
#if (CONFIG_SOC_BK7231)
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x36);
|
|
#endif
|
|
PS_DEBUG_HWDOWN_TRIGER;
|
|
/* dpll division reset*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg |= DPLL_CLKDIV_RESET_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
PS_DEBUG_HWDOWN_TRIGER;
|
|
/* dpll (480m) & xtal2rf disable*/
|
|
reg = REG_READ(SCTRL_BLOCK_EN_CFG);
|
|
reg &= ~(BLOCK_EN_WORD_MASK << BLOCK_EN_WORD_POSI);
|
|
reg = reg | (BLOCK_EN_WORD_PWD << BLOCK_EN_WORD_POSI);
|
|
reg &= ~(BLK_EN_DPLL_480M | BLK_EN_XTAL2RF);
|
|
REG_WRITE(SCTRL_BLOCK_EN_CFG, reg);
|
|
PS_DEBUG_HWDOWN_TRIGER;
|
|
#if (!CONFIG_SOC_BK7251)
|
|
/* center bias power down*/
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL2);
|
|
reg &= (~(CENTRAL_BAIS_ENABLE_BIT));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL2, reg);
|
|
#endif
|
|
|
|
#if (!CONFIG_SOC_BK7251)
|
|
while (sctrl_analog_get(SCTRL_ANALOG_CTRL2) & (CENTRAL_BAIS_ENABLE_BIT));
|
|
#endif
|
|
|
|
#if PS_CLOSE_PERI_CLK
|
|
/* close all peri clock*/
|
|
ps_saves[0].peri_clk_cfg = REG_READ(ICU_PERI_CLK_PWD);
|
|
REG_WRITE(ICU_PERI_CLK_PWD, peri_clk);
|
|
#endif
|
|
|
|
ps_delay(1);
|
|
PS_DEBUG_HWDOWN_TRIGER;
|
|
|
|
/* arm clock disable */
|
|
reg = REG_READ(SCTRL_SLEEP);
|
|
reg &= ~(SLEEP_MODE_MASK << SLEEP_MODE_POSI);
|
|
reg = reg | SLEEP_MODE_CFG_NORMAL_VOL_WORD;
|
|
REG_WRITE(SCTRL_SLEEP, reg);
|
|
ps_delay(1);//5
|
|
|
|
#endif
|
|
}
|
|
|
|
void sctrl_hw_wakeup(void)
|
|
{
|
|
#if (!CONFIG_SOC_BK7271)
|
|
uint32_t c_mclk_mux;
|
|
UINT32 reg;
|
|
|
|
PS_DEBUG_HWUP_TRIGER;
|
|
#if (!CONFIG_SOC_BK7251)
|
|
/* center bias power on*/
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL2);
|
|
reg |= CENTRAL_BAIS_ENABLE_BIT;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL2, reg);
|
|
|
|
while ((sctrl_analog_get(SCTRL_ANALOG_CTRL2) & CENTRAL_BAIS_ENABLE_BIT) == 0);
|
|
#endif
|
|
|
|
/*dpll(480m) & xtal2rf enable*/
|
|
reg = REG_READ(SCTRL_BLOCK_EN_CFG);
|
|
reg &= ~(BLOCK_EN_WORD_MASK << BLOCK_EN_WORD_POSI);
|
|
reg |= (BLOCK_EN_WORD_PWD << BLOCK_EN_WORD_POSI);
|
|
reg |= (BLK_EN_DPLL_480M | BLK_EN_XTAL2RF);
|
|
REG_WRITE(SCTRL_BLOCK_EN_CFG, reg);
|
|
ps_delay(10);
|
|
PS_DEBUG_HWUP_TRIGER;
|
|
|
|
sctrl_ctrl(CMD_SCTRL_MCLK_MUX_GET, &c_mclk_mux);
|
|
|
|
if (c_mclk_mux == MCLK_SELECT_DCO) {
|
|
/* MCLK(main clock) select:26M*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(MCLK_MUX_MASK << MCLK_MUX_POSI);
|
|
reg |= ((MCLK_FIELD_26M_XTAL & MCLK_MUX_MASK) << MCLK_MUX_POSI);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
ps_delay(500);
|
|
PS_DEBUG_HWUP_TRIGER;
|
|
/* dpll division reset release*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(DPLL_CLKDIV_RESET_BIT);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
/* MCLK(main clock) select:dpll*//* MCLK division*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(MCLK_DIV_MASK << MCLK_DIV_POSI);
|
|
reg |= ((MCLK_DIV_7 & MCLK_DIV_MASK) << MCLK_DIV_POSI);
|
|
reg &= ~(MCLK_MUX_MASK << MCLK_MUX_POSI);
|
|
reg |= ((MCLK_FIELD_DPLL & MCLK_MUX_MASK) << MCLK_MUX_POSI);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
PS_DEBUG_HWUP_TRIGER;
|
|
|
|
} else {
|
|
ps_delay(500);
|
|
|
|
/* dpll division reset release*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(DPLL_CLKDIV_RESET_BIT);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
PS_DEBUG_HWUP_TRIGER;
|
|
|
|
}
|
|
|
|
sctrl_cali_dpll(1);
|
|
PS_DEBUG_HWUP_TRIGER;
|
|
sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CLR_DPLL_UNLOOK_INT_BIT, NULL);
|
|
|
|
#if ((CONFIG_SOC_BK7231) || (CONFIG_SOC_BK7231U) || (CONFIG_SOC_BK7251))
|
|
/*open 32K Rosc calib*/
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x35);
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x37);
|
|
#endif
|
|
|
|
reg = (FIQ_DPLL_UNLOCK_BIT);
|
|
// sddev_control(DD_DEV_TYPE_ICU, CMD_ICU_INT_ENABLE, ®);
|
|
(void)sys_drv_int_enable(reg);
|
|
|
|
//os_printf("h w\r\n");
|
|
PS_DEBUG_HWUP_TRIGER;
|
|
#endif
|
|
}
|
|
|
|
#endif
|
|
void sctrl_subsys_power(UINT32 cmd)
|
|
{
|
|
UINT32 reg = 0;
|
|
UINT32 reg_val;
|
|
UINT32 reg_word = 0;
|
|
|
|
switch (cmd) {
|
|
case CMD_SCTRL_DSP_POWERDOWN:
|
|
reg = SCTRL_DSP_PWR;
|
|
reg_word = DSP_PWD;
|
|
break;
|
|
|
|
case CMD_SCTRL_DSP_POWERUP:
|
|
reg = SCTRL_DSP_PWR;
|
|
reg_word = DSP_PWU;
|
|
break;
|
|
|
|
#if (CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_LBUS_POWERDOWN:
|
|
reg = SCTRL_PMU_STATUS;
|
|
reg_word = SYNC_BUS_PWD;
|
|
break;
|
|
|
|
case CMD_SCTRL_LBUS_POWERUP:
|
|
reg = SCTRL_PMU_STATUS;
|
|
reg_word = SYNC_BUS_PWU;
|
|
break;
|
|
|
|
case CMD_SCTRL_BT_POWERDOWN:
|
|
reg = SCTRL_BT_PWR;
|
|
reg_word = BT_PWD;
|
|
break;
|
|
|
|
case CMD_SCTRL_BT_POWERUP:
|
|
reg = SCTRL_BT_PWR;
|
|
reg_word = BT_PWU;
|
|
break;
|
|
#else
|
|
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
case CMD_SCTRL_USB_POWERDOWN:
|
|
reg = SCTRL_USB_PWR;
|
|
reg_val = REG_READ(SCTRL_USB_PWR);
|
|
reg_val &= ~(USB_PWD_MASK << USB_PWD_POSI);
|
|
reg_val |= USB_PWD << USB_PWD_POSI;
|
|
reg_word = reg_val;
|
|
break;
|
|
|
|
case CMD_SCTRL_USB_POWERUP:
|
|
reg = SCTRL_USB_PWR;
|
|
reg_val = REG_READ(SCTRL_USB_PWR);
|
|
reg_val &= ~(USB_PWD_MASK << USB_PWD_POSI);
|
|
reg_val |= USB_PWU << USB_PWD_POSI;
|
|
reg_word = reg_val;
|
|
break;
|
|
#endif
|
|
|
|
case CMD_SCTRL_MAC_POWERDOWN:
|
|
reg = SCTRL_PWR_MAC_MODEM;
|
|
reg_val = REG_READ(SCTRL_PWR_MAC_MODEM);
|
|
reg_val &= ~(MAC_PWD_MASK << MAC_PWD_POSI);
|
|
reg_val |= MAC_PWD << MAC_PWD_POSI;
|
|
reg_word = reg_val;
|
|
break;
|
|
|
|
case CMD_SCTRL_MAC_POWERUP:
|
|
reg = SCTRL_PWR_MAC_MODEM;
|
|
reg_val = REG_READ(SCTRL_PWR_MAC_MODEM);
|
|
reg_val &= ~(MAC_PWD_MASK << MAC_PWD_POSI);
|
|
reg_val |= MAC_PWU << MAC_PWD_POSI;
|
|
reg_word = reg_val;
|
|
break;
|
|
#endif
|
|
case CMD_SCTRL_MODEM_POWERDOWN:
|
|
reg = SCTRL_PWR_MAC_MODEM;
|
|
reg_val = REG_READ(SCTRL_PWR_MAC_MODEM);
|
|
reg_val &= ~(MODEM_PWD_MASK << MODEM_PWD_POSI);
|
|
reg_val |= MODEM_PWD << MODEM_PWD_POSI;
|
|
reg_word = reg_val;
|
|
break;
|
|
|
|
#if (!CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_BLE_POWERDOWN:
|
|
reg = SCTRL_USB_PWR;
|
|
reg_val = REG_READ(SCTRL_USB_PWR);
|
|
reg_val &= ~(BLE_PWD_MASK << BLE_PWD_POSI);
|
|
reg_val |= BLE_PWD << BLE_PWD_POSI;
|
|
reg_word = reg_val;
|
|
break;
|
|
#endif
|
|
|
|
case CMD_SCTRL_MODEM_POWERUP:
|
|
reg = SCTRL_PWR_MAC_MODEM;
|
|
reg_val = REG_READ(SCTRL_PWR_MAC_MODEM);
|
|
reg_val &= ~(MODEM_PWD_MASK << MODEM_PWD_POSI);
|
|
reg_val |= MODEM_PWU << MODEM_PWD_POSI;
|
|
reg_word = reg_val;
|
|
break;
|
|
|
|
#if (!CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_BLE_POWERUP:
|
|
reg = SCTRL_USB_PWR;
|
|
reg_val = REG_READ(SCTRL_USB_PWR);
|
|
reg_val &= ~(BLE_PWD_MASK << BLE_PWD_POSI);
|
|
reg_val |= BLE_PWU << BLE_PWD_POSI;
|
|
reg_word = reg_val;
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (reg)
|
|
REG_WRITE(reg, reg_word);
|
|
}
|
|
|
|
void sctrl_subsys_reset(UINT32 cmd)
|
|
{
|
|
UINT32 reg = 0;
|
|
UINT32 reset_word = 0;
|
|
|
|
switch (cmd) {
|
|
case CMD_SCTRL_MODEM_SUBCHIP_RESET:
|
|
reg = SCTRL_MODEM_SUBCHIP_RESET_REQ;
|
|
reset_word = MODEM_SUBCHIP_RESET_WORD;
|
|
break;
|
|
|
|
case CMD_SCTRL_MAC_SUBSYS_RESET:
|
|
reg = SCTRL_MAC_SUBSYS_RESET_REQ;
|
|
reset_word = MAC_SUBSYS_RESET_WORD;
|
|
break;
|
|
|
|
#if (CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_USB_SUBSYS_RESET:
|
|
reg = SCTRL_USB_SUBSYS_RESET_REQ;
|
|
reset_word = USB_SUBSYS_RESET_WORD;
|
|
break;
|
|
|
|
case CMD_SCTRL_DSP_SUBSYS_RESET:
|
|
reg = SCTRL_DSP_SUBSYS_RESET_REQ;
|
|
reset_word = DSP_SUBSYS_RESET_WORD;
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (reg) {
|
|
REG_WRITE(reg, reset_word);
|
|
delay(10);
|
|
REG_WRITE(reg, 0);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7256XX)
|
|
void sctrl_fix_dpll_div(void)
|
|
{
|
|
volatile INT32 i;
|
|
uint32 reg;
|
|
uint32 cpu_clock;
|
|
|
|
GLOBAL_INT_DECLARATION();
|
|
GLOBAL_INT_DISABLE();
|
|
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
cpu_clock = reg & 0xFF;
|
|
reg = (reg & 0xFFFFFF00) | 0x52;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
for (i = 0; i < 100; i ++);
|
|
|
|
REG_WRITE(SCTRL_MODEM_SUBCHIP_RESET_REQ, MODEM_SUBCHIP_RESET_WORD);
|
|
REG_WRITE(SCTRL_CONTROL, REG_READ(SCTRL_CONTROL) | (1 << 14));
|
|
|
|
for (i = 0; i < 100; i ++);
|
|
|
|
REG_WRITE(SCTRL_MODEM_SUBCHIP_RESET_REQ, 0);
|
|
REG_WRITE(SCTRL_CONTROL, REG_READ(SCTRL_CONTROL) & ~(1 << 14));
|
|
|
|
for (i = 0; i < 100; i ++);
|
|
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg = (reg & 0xFFFFFF00) | cpu_clock;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
for (i = 0; i < 100; i ++);
|
|
|
|
GLOBAL_INT_RESTORE();
|
|
}
|
|
#endif
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7256XX)
|
|
void sctrl_mdm_reset(void)
|
|
{
|
|
volatile INT32 i;
|
|
GLOBAL_INT_DECLARATION();
|
|
|
|
os_printf("sctrl_mdm_reset\r\n");
|
|
|
|
// Disable the interrupts
|
|
GLOBAL_INT_DISABLE();
|
|
|
|
if (1) {
|
|
/* MAC reset */
|
|
REG_WRITE(SCTRL_MODEM_SUBCHIP_RESET_REQ, MODEM_SUBCHIP_RESET_WORD);
|
|
REG_WRITE(SCTRL_CONTROL, REG_READ(SCTRL_CONTROL) | DPLL_CLKDIV_RESET_BIT);
|
|
|
|
for (i = 0; i < 100; i++);
|
|
|
|
REG_WRITE(SCTRL_MODEM_SUBCHIP_RESET_REQ, 0);
|
|
REG_WRITE(SCTRL_CONTROL, REG_READ(SCTRL_CONTROL) & ~DPLL_CLKDIV_RESET_BIT);
|
|
|
|
for (i = 0; i < 100; i++);
|
|
} else {
|
|
/* Modem pwd */
|
|
sctrl_ctrl(CMD_SCTRL_MODEM_POWERDOWN, NULL);
|
|
REG_WRITE(SCTRL_CONTROL, REG_READ(SCTRL_CONTROL) | DPLL_CLKDIV_RESET_BIT);
|
|
|
|
for (i = 0; i < 100; i++);
|
|
|
|
/* Modem pwu */
|
|
sctrl_ctrl(CMD_SCTRL_MODEM_POWERUP, NULL);
|
|
REG_WRITE(SCTRL_CONTROL, REG_READ(SCTRL_CONTROL) & ~DPLL_CLKDIV_RESET_BIT);
|
|
|
|
for (i = 0; i < 100; i++);
|
|
}
|
|
|
|
if (s_wifi_phy_wakeup_rf_reinit_cb) {
|
|
s_wifi_phy_wakeup_rf_reinit_cb();
|
|
}
|
|
if (s_wifi_phy_wakeup_wifi_reinit_cb) {
|
|
s_wifi_phy_wakeup_wifi_reinit_cb();
|
|
}
|
|
|
|
// Restore the interrupts
|
|
GLOBAL_INT_RESTORE();
|
|
}
|
|
#endif
|
|
|
|
|
|
#if CONFIG_DEEP_PS
|
|
#if PS_SUPPORT_MANUAL_SLEEP
|
|
void sctrl_enter_rtos_idle_sleep(PS_DEEP_CTRL_PARAM deep_param)
|
|
{
|
|
DD_HANDLE flash_hdl;
|
|
UINT32 status;
|
|
UINT32 param;
|
|
UINT32 reg;
|
|
|
|
if (4 == flash_get_line_mode())
|
|
flash_set_line_mode(2);
|
|
|
|
#if (!(CONFIG_SOC_BK7256XX && CONFIG_SYS_CPU1))
|
|
uart_wait_tx_over();
|
|
#endif
|
|
|
|
/* close all peri clock*/
|
|
ps_saves[1].peri_clk_cfg = REG_READ(ICU_PERI_CLK_PWD);
|
|
REG_WRITE(ICU_PERI_CLK_PWD, 0xfffff);
|
|
|
|
uart2_exit();
|
|
#if CONFIG_UART1
|
|
uart1_exit();
|
|
#endif
|
|
|
|
reg = REG_READ(SCTRL_ROSC_TIMER);
|
|
reg &= ~(ROSC_TIMER_ENABLE_BIT);
|
|
REG_WRITE(SCTRL_ROSC_TIMER, reg);
|
|
|
|
REG_WRITE(SCTRL_GPIO_WAKEUP_EN, 0x0);
|
|
|
|
REG_WRITE(SCTRL_BLOCK_EN_MUX, 0x0);
|
|
|
|
param = LPO_SELECT_ROSC;
|
|
sddev_control(DD_DEV_TYPE_SCTRL, CMD_SCTRL_SET_LOW_PWR_CLK, ¶m);
|
|
|
|
/* close all peri int*/
|
|
ps_saves[1].int_enable_cfg = REG_READ(ICU_R_INT_EN);
|
|
REG_WRITE(ICU_R_INT_EN, 0);
|
|
|
|
/*Enable BK7011:rc_en,ch0_en*/
|
|
rc_cntl_stat_set(0x0);
|
|
|
|
/* MAC pwd*/
|
|
REG_WRITE(SCTRL_PWR_MAC_MODEM, MAC_PWD << MAC_PWD_POSI);
|
|
|
|
sctrl_mac_ahb_slave_clock_disable();
|
|
|
|
/* Mac Subsystem clock 480m disable*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
REG_WRITE(SCTRL_CONTROL, reg | MAC_CLK480M_PWD_BIT);
|
|
|
|
/* Modem pwd*/
|
|
REG_WRITE(SCTRL_PWR_MAC_MODEM, MODEM_PWD << MODEM_PWD_POSI);
|
|
|
|
/* Modem AHB clock disable*/
|
|
#if (CONFIG_SOC_BK7271)
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~PHY_HCLK_EN_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
#else
|
|
reg = REG_READ(SCTRL_MODEM_CORE_RESET_PHY_HCLK);
|
|
reg &= ~PHY_HCLK_EN_BIT;
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg);
|
|
#endif
|
|
|
|
/* Modem Subsystem clock 480m disable*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
REG_WRITE(SCTRL_CONTROL, reg | MODEM_CLK480M_PWD_BIT);
|
|
|
|
/* Flash 26MHz clock select dco clock*/
|
|
flash_hdl = ddev_open(DD_DEV_TYPE_FLASH, &status, 0);
|
|
BK_ASSERT(DD_HANDLE_UNVALID != flash_hdl); /* ASSERT VERIFIED */
|
|
ddev_control(flash_hdl, CMD_FLASH_SET_DCO, 0);
|
|
|
|
/* MCLK(main clock) select:dco*/ /* MCLK division*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(MCLK_MUX_MASK << MCLK_MUX_POSI);
|
|
reg &= ~(MCLK_DIV_MASK << MCLK_DIV_POSI);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x35);
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x37);
|
|
|
|
ps_delay(10);
|
|
|
|
/*close 32K Rosc calib*/
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x36);
|
|
|
|
ps_block_value = REG_READ(SCTRL_BLOCK_EN_CFG) & BLOCK_EN_VALID_MASK;
|
|
/* ALL disable*/
|
|
reg = 0x0;
|
|
reg &= ~(BLOCK_EN_WORD_MASK << BLOCK_EN_WORD_POSI);
|
|
reg = reg | (BLOCK_EN_WORD_PWD << BLOCK_EN_WORD_POSI);
|
|
reg &= ~(BLOCK_EN_VALID_MASK);
|
|
REG_WRITE(SCTRL_BLOCK_EN_CFG, reg);
|
|
|
|
/* center bias power down*/
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL2);
|
|
reg &= (~CENTRAL_BAIS_ENABLE_BIT);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL2, reg);
|
|
|
|
reg = 0xFFFFFFFF;
|
|
REG_WRITE(SCTRL_GPIO_WAKEUP_INT_STATUS, reg);
|
|
|
|
if (deep_param.deep_wkway == PS_DEEP_WAKEUP_RTC
|
|
&& deep_param.param != 0xffffffff) {
|
|
reg = REG_READ(SCTRL_ROSC_TIMER);
|
|
reg |= ROSC_TIMER_INT_STATUS_BIT;
|
|
REG_WRITE(SCTRL_ROSC_TIMER, reg);
|
|
reg = REG_READ(SCTRL_ROSC_TIMER);
|
|
reg &= ~(ROSC_TIMER_PERIOD_MASK << ROSC_TIMER_PERIOD_POSI);
|
|
reg |= (deep_param.param << ROSC_TIMER_PERIOD_POSI);
|
|
REG_WRITE(SCTRL_ROSC_TIMER, reg);
|
|
reg = REG_READ(SCTRL_ROSC_TIMER);
|
|
reg |= ROSC_TIMER_ENABLE_BIT;
|
|
REG_WRITE(SCTRL_ROSC_TIMER, reg);
|
|
|
|
reg = 0x0;
|
|
reg &= ~(BLOCK_EN_WORD_MASK << BLOCK_EN_WORD_POSI);
|
|
reg = reg | (BLOCK_EN_WORD_PWD << BLOCK_EN_WORD_POSI);
|
|
reg |= (BLK_EN_ANALOG_SYS_LDO | BLK_EN_DIGITAL_CORE);
|
|
REG_WRITE(SCTRL_BLOCK_EN_CFG, reg);
|
|
reg = REG_READ(SCTRL_BLOCK_EN_MUX);
|
|
reg &= (~0x1FF);
|
|
reg |= (0x1 << 8);
|
|
REG_WRITE(SCTRL_BLOCK_EN_MUX, reg);
|
|
} else if (deep_param.deep_wkway == PS_DEEP_WAKEUP_GPIO) {
|
|
reg = 0xFFFFFFFF;
|
|
REG_WRITE(SCTRL_GPIO_WAKEUP_INT_STATUS, reg);
|
|
reg = deep_param.gpio_lv;
|
|
REG_WRITE(SCTRL_GPIO_WAKEUP_TYPE, reg);
|
|
reg = deep_param.param;
|
|
REG_WRITE(SCTRL_GPIO_WAKEUP_EN, reg);
|
|
|
|
}
|
|
|
|
ps_delay(10);
|
|
/* arm clock disable */
|
|
reg = REG_READ(SCTRL_SLEEP);
|
|
reg &= ~(SLEEP_MODE_MASK << SLEEP_MODE_POSI);
|
|
reg = reg | SLEEP_MODE_CFG_LOW_VOL_WORD;
|
|
REG_WRITE(SCTRL_SLEEP, reg);
|
|
delay(5);
|
|
}
|
|
|
|
void sctrl_exit_rtos_idle_sleep(void)
|
|
{
|
|
UINT32 reg;
|
|
|
|
/* center bias power on*/
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL2);
|
|
reg |= CENTRAL_BAIS_ENABLE_BIT;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL2, reg);
|
|
|
|
/*dpll(480m) & 26m xtal & xtal2rf enable*/
|
|
reg = REG_READ(SCTRL_BLOCK_EN_MUX);
|
|
reg &= ~(0x1 << 4);
|
|
REG_WRITE(SCTRL_BLOCK_EN_MUX, reg);
|
|
reg = REG_READ(SCTRL_BLOCK_EN_CFG);
|
|
reg &= ~(BLOCK_EN_WORD_MASK << BLOCK_EN_WORD_POSI);
|
|
reg |= (BLOCK_EN_WORD_PWD << BLOCK_EN_WORD_POSI);
|
|
reg |= ps_block_value;
|
|
REG_WRITE(SCTRL_BLOCK_EN_CFG, reg);
|
|
|
|
delay(20); //delay 1.1ms for 26MHz DCO clock. need change for other dco clock frequency
|
|
sctrl_cali_dpll(1);
|
|
/* dpll division reset release*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(0x1 << 14);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
/* MCLK(main clock) select:dpll*//* MCLK division*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(MCLK_DIV_MASK << MCLK_DIV_POSI);
|
|
reg &= ~(MCLK_MUX_MASK << MCLK_MUX_POSI);
|
|
reg |= ((MCLK_DIV_7 & MCLK_DIV_MASK) << MCLK_DIV_POSI);
|
|
reg |= ((MCLK_FIELD_DPLL & MCLK_MUX_MASK) << MCLK_MUX_POSI);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
/*open 32K Rosc calib*/
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x35);
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x37);
|
|
|
|
sctrl_mac_ahb_slave_clock_enable();
|
|
|
|
/* Mac Subsystem clock 480m enable*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~MAC_CLK480M_PWD_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
/* Modem AHB clock enable*/
|
|
#if (CONFIG_SOC_BK7271)
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
REG_WRITE(SCTRL_CONTROL, reg | PHY_HCLK_EN_BIT);
|
|
#else
|
|
reg = REG_READ(SCTRL_MODEM_CORE_RESET_PHY_HCLK);
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg | PHY_HCLK_EN_BIT);
|
|
#endif
|
|
|
|
/* Modem Subsystem clock 480m enable*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~MODEM_CLK480M_PWD_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
/* Modem pwd*/
|
|
reg = REG_READ(SCTRL_PWR_MAC_MODEM);
|
|
reg &= ~(MODEM_PWD_MASK << MODEM_PWD_POSI);
|
|
reg = reg | (0 << MODEM_PWD_POSI);
|
|
REG_WRITE(SCTRL_PWR_MAC_MODEM, reg);
|
|
|
|
/*Enable BK7011:rc_en,ch0_en*/
|
|
rc_cntl_stat_set(0x09);
|
|
|
|
/* recovery periphral unit clock config*/
|
|
REG_WRITE(ICU_PERI_CLK_PWD, ps_saves[1].peri_clk_cfg);
|
|
|
|
/* recovery periphral unit int config*/
|
|
REG_WRITE(ICU_R_INT_EN, ps_saves[1].int_enable_cfg);
|
|
|
|
/*open 32K Rosc calib*/
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x35);
|
|
REG_WRITE(SCTRL_ROSC_CAL, 0x37);
|
|
|
|
uart2_init();
|
|
#if CONFIG_UART1
|
|
uart1_init();
|
|
#endif
|
|
|
|
if (4 == flash_get_line_mode())
|
|
flash_set_line_mode(4);
|
|
|
|
os_printf("idle wake up!\r\n");
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
int bk_init_deep_wakeup_gpio_status(void)
|
|
{
|
|
gpio_0_31_status = REG_READ(GPIO_WAKEUP_INT_STATUS_BAK);
|
|
#if(!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX)
|
|
gpio_32_39_status = REG_READ(GPIO_WAKEUP_INT_STATUS1_BAK);
|
|
#endif
|
|
REG_WRITE(SCTRL_GPIO_WAKEUP_INT_STATUS, 0xFFFFFFFF);
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
REG_WRITE(SCTRL_GPIO_WAKEUP_INT_STATUS1, 0xFFFFFFFF);
|
|
#endif
|
|
return 0;
|
|
}
|
|
int bk_misc_wakeup_get_gpio_num(void)
|
|
{
|
|
int wakeup_gpio_num = -1;
|
|
|
|
REG_WRITE(SCTRL_GPIO_WAKEUP_INT_STATUS, 0xFFFFFFFF);
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
REG_WRITE(SCTRL_GPIO_WAKEUP_INT_STATUS1, 0xFFFFFFFF);
|
|
#endif
|
|
|
|
if((0 == gpio_0_31_status)
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
&& (0 == gpio_32_39_status)
|
|
#endif
|
|
)
|
|
{
|
|
wakeup_gpio_num = -1;
|
|
return wakeup_gpio_num;
|
|
}
|
|
|
|
if(gpio_0_31_status)
|
|
{
|
|
for(int i=0;i<32;i++)
|
|
{
|
|
if(gpio_0_31_status&0x01)
|
|
{
|
|
wakeup_gpio_num = i;
|
|
break;
|
|
}
|
|
|
|
gpio_0_31_status = gpio_0_31_status >> 1;
|
|
}
|
|
}
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
else if(gpio_32_39_status)
|
|
{
|
|
for(int i=32;i<40;i++)
|
|
{
|
|
if(gpio_32_39_status&0x01)
|
|
{
|
|
wakeup_gpio_num = i;
|
|
break;
|
|
}
|
|
|
|
gpio_32_39_status = gpio_32_39_status >> 1;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return wakeup_gpio_num;
|
|
}
|
|
|
|
UINT32 sctrl_get_deep_sleep_wake_soure(void)
|
|
{
|
|
RESET_SOURCE_STATUS waked_source = 0;
|
|
|
|
#if (!CONFIG_SOC_BK7271)
|
|
if (REG_READ(SCTRL_ROSC_TIMER) & ROSC_TIMER_INT_STATUS_BIT)
|
|
{
|
|
waked_source = RESET_SOURCE_DEEPPS_RTC;
|
|
}
|
|
else if(gpio_0_31_status
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
|| gpio_32_39_status
|
|
#endif
|
|
)
|
|
waked_source = RESET_SOURCE_DEEPPS_GPIO;
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
else if (REG_READ(SCTRL_USB_PLUG_WAKEUP) & (USB_PLUG_IN_INT_BIT | USB_PLUG_OUT_INT_BIT))
|
|
waked_source = RESET_SOURCE_DEEPPS_USB;
|
|
#endif
|
|
#endif
|
|
|
|
return waked_source;
|
|
}
|
|
|
|
void sctrl_set_deep_sleep_gpio_floating_map(UINT32 gpio_floating_map)
|
|
{
|
|
deep_sleep_gpio_floating_map = gpio_floating_map;
|
|
}
|
|
|
|
UINT32 sctrl_get_deep_sleep_gpio_floating_map(void)
|
|
{
|
|
return deep_sleep_gpio_floating_map;
|
|
}
|
|
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX)
|
|
void sctrl_set_deep_sleep_gpio_last_floating_map(UINT32 gpio_last_floating_map)
|
|
{
|
|
deep_sleep_gpio_last_floating_map = gpio_last_floating_map;
|
|
}
|
|
|
|
UINT32 sctrl_get_deep_sleep_gpio_last_floating_map(void)
|
|
{
|
|
return deep_sleep_gpio_last_floating_map;
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#if (!CONFIG_SOC_BK7231) && (!CONFIG_SOC_BK7271)
|
|
static int sctrl_read_efuse(void *param)
|
|
{
|
|
UINT32 reg, ret = -1;
|
|
EFUSE_OPER_PTR efuse;
|
|
efuse = (EFUSE_OPER_PTR)param;
|
|
|
|
if (efuse) {
|
|
reg = REG_READ(SCTRL_EFUSE_CTRL);
|
|
reg &= ~(EFUSE_OPER_ADDR_MASK << EFUSE_OPER_ADDR_POSI);
|
|
reg &= ~(EFUSE_OPER_DIR);
|
|
|
|
reg |= ((efuse->addr & EFUSE_OPER_ADDR_MASK) << EFUSE_OPER_ADDR_POSI);
|
|
reg |= (EFUSE_OPER_EN);
|
|
REG_WRITE(SCTRL_EFUSE_CTRL, reg);
|
|
|
|
do {
|
|
reg = REG_READ(SCTRL_EFUSE_CTRL);
|
|
} while (reg & EFUSE_OPER_EN);
|
|
|
|
reg = REG_READ(SCTRL_EFUSE_OPTR);
|
|
if (reg & EFUSE_OPER_RD_DATA_VALID) {
|
|
efuse->data = ((reg >> EFUSE_OPER_RD_DATA_POSI) & EFUSE_OPER_RD_DATA_MASK);
|
|
ret = 0;
|
|
} else
|
|
efuse->data = 0xFF;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static int check_efuse_can_write(UINT8 new_byte, UINT8 old_byte)
|
|
{
|
|
if (new_byte == old_byte) {
|
|
// no need to read
|
|
return 1;
|
|
}
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
UINT8 old_bit = ((old_byte >> i) & 0x01);
|
|
UINT8 new_bit = ((new_byte >> i) & 0x01);
|
|
|
|
if ((old_bit) && (!new_bit)) {
|
|
// can not change old from 1 to 0
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 2;
|
|
}
|
|
|
|
static int sctrl_write_efuse(void *param)
|
|
{
|
|
UINT32 reg, ret = -1;
|
|
EFUSE_OPER_ST *efuse, efuse_bak;
|
|
|
|
#if (CONFIG_SOC_BK7251)
|
|
os_printf("BK7251 cannot write efuse via register\r\n");
|
|
goto wr_exit;
|
|
#endif
|
|
|
|
efuse = (EFUSE_OPER_PTR)param;
|
|
if (efuse) {
|
|
efuse_bak.addr = efuse->addr;
|
|
efuse_bak.data = efuse->data;
|
|
if (sctrl_read_efuse(&efuse_bak) == 0) {
|
|
//read before write, ensure this byte and this bit no wrote
|
|
ret = check_efuse_can_write(efuse->data, efuse_bak.data);
|
|
if (ret == 0) {
|
|
ret = -1;
|
|
goto wr_exit;
|
|
} else if (ret == 1) {
|
|
ret = 0;
|
|
goto wr_exit;
|
|
}
|
|
}
|
|
|
|
// enable vdd2.5v first
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg |= EFUSE_VDD25_EN;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
reg = REG_READ(SCTRL_EFUSE_CTRL);
|
|
reg &= ~(EFUSE_OPER_ADDR_MASK << EFUSE_OPER_ADDR_POSI);
|
|
reg &= ~(EFUSE_OPER_WR_DATA_MASK << EFUSE_OPER_WR_DATA_POSI);
|
|
|
|
reg |= EFUSE_OPER_DIR;
|
|
reg |= ((efuse->addr & EFUSE_OPER_ADDR_MASK) << EFUSE_OPER_ADDR_POSI);
|
|
reg |= ((efuse->data & EFUSE_OPER_WR_DATA_MASK) << EFUSE_OPER_WR_DATA_POSI);
|
|
reg |= EFUSE_OPER_EN;
|
|
REG_WRITE(SCTRL_EFUSE_CTRL, reg);
|
|
|
|
do {
|
|
reg = REG_READ(SCTRL_EFUSE_CTRL);
|
|
} while (reg & EFUSE_OPER_EN);
|
|
|
|
// disable vdd2.5v at last
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~EFUSE_VDD25_EN;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
|
|
// check, so read
|
|
reg = efuse->data;
|
|
efuse->data = 0;
|
|
if (sctrl_read_efuse(param) == 0) {
|
|
if (((UINT8)reg) == efuse->data)
|
|
ret = 0;
|
|
}
|
|
}
|
|
|
|
wr_exit:
|
|
return ret;
|
|
}
|
|
|
|
|
|
#endif // (!CONFIG_SOC_BK7231)
|
|
|
|
#if CONFIG_USB_CHARGE
|
|
#if (CONFIG_SOC_BK7271)
|
|
#define CHARGER_CTRL_0 SCTRL_ANALOG_CTRL7
|
|
#define CHARGER_CTRL_1 SCTRL_ANALOG_CTRL8_REAL
|
|
#else
|
|
#define CHARGER_CTRL_0 SCTRL_ANALOG_CTRL3
|
|
#define CHARGER_CTRL_1 SCTRL_ANALOG_CTRL4
|
|
#endif
|
|
|
|
#if (CONFIG_SOC_BK7251)
|
|
UINT32 usb_charge_oper_val(UINT32 elect)
|
|
{
|
|
if (elect >= 450) {
|
|
/*EXTERNAL CC elect*/
|
|
if (elect > 750)
|
|
elect = 750;
|
|
return (elect - 450) / 20;
|
|
} else {
|
|
/*INTERNAL CC elect*/
|
|
if (elect > 250)
|
|
elect = 250;
|
|
else if (elect < 20)
|
|
elect = 20;
|
|
|
|
if (elect >= 100 && elect <= 250)
|
|
return (elect - 100) / 10 + 16;
|
|
else
|
|
return (elect - 20) / 10;
|
|
}
|
|
}
|
|
|
|
UINT32 usb_power_is_pluged(void)
|
|
{
|
|
UINT32 reg;
|
|
reg = sctrl_analog_get(SCTRL_CHARGE_STATUS);
|
|
return (reg & (1 << 21));
|
|
}
|
|
|
|
void charger_module_enable(UINT32 enable)
|
|
{
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 12)) | (!!enable << 12));
|
|
}
|
|
|
|
void charger_vlcf_calibration(UINT32 type)
|
|
{
|
|
|
|
if (type == 0) {
|
|
/*Internal hardware calibration*/
|
|
/*vlcf calibration*/
|
|
/*>>> Added 5V voltage on Vusb*/
|
|
/*>>> Added 4.2V voltage on vbattery*/
|
|
/*>>> Set pwd=0*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 12));
|
|
/*charge mode select*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 19));
|
|
/*calEn*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 21));
|
|
/*softCalen*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 20));
|
|
/*vlcfSel*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 18));
|
|
/*IcalSel*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 17));
|
|
/*vcvSel*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 16));
|
|
/*vlcf_caltrig*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 21));
|
|
/*vlcf_caltrig*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 21));
|
|
/*Wait for at least 4 clock cycles*/
|
|
delay_ms(1);
|
|
/*vlcf_caltrig*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 21));
|
|
/*Waiting for 1ms, calibration finished*/
|
|
delay_ms(1);
|
|
/*Read the value vcal<5:0>, Recorded*/
|
|
calib_charger[0] = (sctrl_analog_get(SCTRL_CHARGE_STATUS) >> CHARGE_VCAL_POS) & CHARGE_VCAL_MASK ;
|
|
}
|
|
}
|
|
|
|
void charger_icp_calibration(UINT32 type)
|
|
{
|
|
|
|
if (type == 0) {
|
|
/*Internal hardware calibration*/
|
|
/*Icp calibration*/
|
|
/*>>> Added parallel 60ohm resistor and 100nF capacitor from vbattery to ground.(Removed the external 4.2V)*/
|
|
/*>>> Set pwd=0*/
|
|
/*>>> Porb=0*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 12));
|
|
/*Icp=60mA*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
& ~(CHARGE_LCP_MASK << CHARGE_LCP_POS)) | (0x4 << CHARGE_LCP_POS));
|
|
/*calEn*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 21));
|
|
/*softCalen*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 20));
|
|
/*vlcfSel*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 18));
|
|
/*vcal<5:0>=previous vlcf calibration value*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
& ~(CHARGE_VCAL_MASK << 0)) | (calib_charger[0] << 0));
|
|
/*IcalSel*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 17));
|
|
/*vcvSel*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 16));
|
|
/*Ical_trig*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 20));
|
|
/*Ical_trig*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 20));
|
|
/*Wait for at least 4 clock cycles*/
|
|
delay_ms(1);
|
|
/*Ical_trig*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 20));
|
|
/*Waiting for 1ms, calibration finished*/
|
|
delay_ms(1);
|
|
/*Read the value Ical<4:0>, Recorded*/
|
|
calib_charger[1] = (sctrl_analog_get(SCTRL_CHARGE_STATUS) >> CHARGE_LCAL_POS) & CHARGE_LCAL_MASK ;
|
|
}
|
|
}
|
|
|
|
void charger_vcv_calibration(UINT32 type)
|
|
{
|
|
|
|
if (type == 0) {
|
|
/*Internal hardware calibration*/
|
|
/*vcv calibration*/
|
|
/*>>> Added 5V voltage on Vusb*/
|
|
/*>>> Added 4.2V voltage on vbattery*/
|
|
/*>>> Set pwd=0*/
|
|
/*>>> Porb=0*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 12));
|
|
/*charge mode select*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 19));
|
|
/*Icp=60mA*/
|
|
/*sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
* & ~(CHARGE_LCP_MASK << CHARGE_LCP_POS)) | (0x4 << CHARGE_LCP_POS));
|
|
**/
|
|
/*calEn*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 21));
|
|
/*softCalen*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 20));
|
|
/*vlcfSel*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 18));
|
|
/*vcal<5:0>=previous vlcf calibration value*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
& ~(CHARGE_VCAL_MASK << 0)) | (calib_charger[0] << 0));
|
|
/*IcalSel*/
|
|
//sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 17));
|
|
/*Ical<4:0>=previous Ical calibration value*/
|
|
/*sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4)\
|
|
* & ~(CHARGE_LCAL_MASK << 27)) | (calib_charger[1] << 27));
|
|
*/
|
|
/*vcvSel*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 16));
|
|
/*vcv_caltrig*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 19));
|
|
/*vcv_caltrig*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 19));
|
|
/*Wait for at least 4 clock cycles*/
|
|
delay_ms(1);
|
|
/*vcv_caltrig*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 19));
|
|
/*Waiting for 1ms, calibration finished*/
|
|
delay_ms(1);
|
|
/*Read the value vcvcal<4:0>, Recorded*/
|
|
calib_charger[2] = (sctrl_analog_get(SCTRL_CHARGE_STATUS) >> CHARGE_VCVCAL_POS) & CHARGE_VCVCAL_MASK ;
|
|
}
|
|
}
|
|
|
|
void charger_calib_get(UINT8 value[])
|
|
{
|
|
value[0] = calib_charger[0];
|
|
value[1] = calib_charger[1];
|
|
value[2] = calib_charger[2];
|
|
return;
|
|
}
|
|
|
|
void charger_calib_set(UINT8 value[])
|
|
{
|
|
if (!value[0] || !value[1] || !value[2])
|
|
return;
|
|
|
|
calib_charger[0] = value[0];
|
|
calib_charger[1] = value[1];
|
|
calib_charger[2] = value[2];
|
|
return;
|
|
}
|
|
|
|
UINT32 charger_is_full(void)
|
|
{
|
|
UINT32 reg;
|
|
reg = sctrl_analog_get(SCTRL_CHARGE_STATUS);
|
|
return (reg & (1 << 20));
|
|
}
|
|
|
|
void charger_start(void *param)
|
|
{
|
|
UINT32 charge_cal_type ;
|
|
CHARGE_OPER_ST *chrg;
|
|
|
|
chrg = (CHARGE_OPER_ST *)param;
|
|
|
|
if (! usb_power_is_pluged()) {
|
|
os_printf("%s: not pluged\r\n", __FUNCTION__);
|
|
return;
|
|
}
|
|
|
|
charger_calib_set(chrg->cal);
|
|
os_printf("%s: %d %d %d %x %x %x\r\n", __FUNCTION__, chrg->type, chrg->step, chrg->elect,
|
|
calib_charger[0], calib_charger[1], calib_charger[2]);
|
|
if (chrg->step == STEP_START) {
|
|
if (chrg->type == INTERNAL_HW_MODE || chrg->type == INTERNAL_SW_MODE) {
|
|
/*Internal*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 21));
|
|
|
|
if (chrg->type == INTERNAL_HW_MODE) {
|
|
/*Internal ,hw control*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 19));
|
|
} else if (chrg->type == INTERNAL_SW_MODE) {
|
|
/*Internal ,sw control*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 19));
|
|
}
|
|
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 28));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 27));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 12));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 13)); //vcvcalEn_spilv
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 11));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 18));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 17));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 16));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
& ~(CHARGE_LCP_MASK << CHARGE_LCP_POS)) | (0x1f << CHARGE_LCP_POS));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
& ~(CHARGE_VCAL_MASK << 0)) | (calib_charger[0] << 0));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4)\
|
|
& ~(CHARGE_LCAL_MASK << 27)) | (calib_charger[1] << 27));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4)\
|
|
& ~(CHARGE_LCAL_MASK << 22)) | (calib_charger[2] << 22));
|
|
|
|
if (chrg->type == INTERNAL_HW_MODE) {
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3) \
|
|
& ~(CHARGE_LC2CVDLYLV_MASK << CHARGE_LC2CVDLYLV_POS)) | (4 << CHARGE_LC2CVDLYLV_POS));
|
|
} else if (chrg->type == INTERNAL_SW_MODE) {
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3) \
|
|
& ~(CHARGE_LC2CVDLYLV_MASK << CHARGE_LC2CVDLYLV_POS)));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 22));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3) \
|
|
& ~(CHARGE_VLCSWLV_MASK << CHARGE_VLCSWLV_POS)) | (8 << CHARGE_VLCSWLV_POS));
|
|
}
|
|
|
|
} else if (chrg->type == EXTERNAL_HW_MODE || chrg->type == EXTERNAL_SW_MODE) {
|
|
/*External*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 21));
|
|
|
|
if (chrg->type == EXTERNAL_HW_MODE) {
|
|
/*External ,hw control*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 19));
|
|
} else if (chrg->type == EXTERNAL_SW_MODE) {
|
|
/*External ,sw control*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 19));
|
|
}
|
|
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 28));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 27));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 12));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 13)); //vcvcalEn_spilv
|
|
|
|
if (chrg->type == EXTERNAL_HW_MODE)
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 11));
|
|
else if (chrg->type == EXTERNAL_SW_MODE) {
|
|
//sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4)& ~(1 << 11));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 11));
|
|
}
|
|
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 18));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 17));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 16));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
& ~(CHARGE_LCP_MASK << CHARGE_LCP_POS)) | (0x1f << CHARGE_LCP_POS));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
& ~(CHARGE_VCAL_MASK << 0)) | (calib_charger[0] << 0));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4)\
|
|
& ~(CHARGE_LCAL_MASK << 27)) | (calib_charger[1] << 27));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4)\
|
|
& ~(CHARGE_LCAL_MASK << 22)) | (calib_charger[2] << 22));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 28));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3) \
|
|
& ~(CHARGE_LC2CVDLYLV_MASK << CHARGE_LC2CVDLYLV_POS)));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 15));
|
|
|
|
if (chrg->type == EXTERNAL_HW_MODE) {
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) | (1 << 22));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3) \
|
|
& ~(CHARGE_VLCSWLV_MASK << CHARGE_VLCSWLV_POS)) | (0xf << CHARGE_VLCSWLV_POS));
|
|
}
|
|
}
|
|
} else if (chrg->step == STEP_TRICKLE) {
|
|
/*trickle charge*/
|
|
if (chrg->type == INTERNAL_SW_MODE || chrg->type == EXTERNAL_SW_MODE) {
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 19));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4) \
|
|
& ~(CHARGE_MANMODE_MASK << CHARGE_MANMODE_POS)) | (4 << CHARGE_MANMODE_POS));
|
|
}
|
|
} else if (chrg->step == STEP_EXTER_CC) {
|
|
/*External CC charge*/
|
|
if (chrg->type == EXTERNAL_SW_MODE) {
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
& ~(CHARGE_LCP_MASK << CHARGE_LCP_POS)) | (usb_charge_oper_val(chrg->elect) << CHARGE_LCP_POS));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 19));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4) \
|
|
& ~(CHARGE_MANMODE_MASK << CHARGE_MANMODE_POS)) | (2 << CHARGE_MANMODE_POS));
|
|
}
|
|
} else if (chrg->step == STEP_INTER_CC) {
|
|
/*Internal CC charge*/
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3)\
|
|
& ~(CHARGE_LCP_MASK << CHARGE_LCP_POS)) | (usb_charge_oper_val(chrg->elect) << CHARGE_LCP_POS));
|
|
|
|
if (chrg->type == INTERNAL_SW_MODE) {
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 19));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4) \
|
|
& ~(CHARGE_MANMODE_MASK << CHARGE_MANMODE_POS)) | (2 << CHARGE_MANMODE_POS));
|
|
}
|
|
|
|
if (chrg->type == EXTERNAL_SW_MODE) {
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 19));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4) \
|
|
& ~(CHARGE_MANMODE_MASK << CHARGE_MANMODE_POS)) | (2 << CHARGE_MANMODE_POS));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 15));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 11));
|
|
}
|
|
} else if (chrg->step == STEP_INTER_CV) {
|
|
/*Internal CV charge*/
|
|
if (chrg->type == INTERNAL_SW_MODE || chrg->type == EXTERNAL_SW_MODE) {
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) | (1 << 19));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (sctrl_analog_get(SCTRL_ANALOG_CTRL4) \
|
|
& ~(CHARGE_MANMODE_MASK << CHARGE_MANMODE_POS)) | (1 << CHARGE_MANMODE_POS));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 15));
|
|
}
|
|
|
|
if (chrg->type == EXTERNAL_SW_MODE)
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 11));
|
|
|
|
if (chrg->type == EXTERNAL_HW_MODE) {
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, sctrl_analog_get(SCTRL_ANALOG_CTRL4) & ~(1 << 11));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, sctrl_analog_get(SCTRL_ANALOG_CTRL3) & ~(1 << 22));
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (sctrl_analog_get(SCTRL_ANALOG_CTRL3) \
|
|
& ~(CHARGE_VLCSWLV_MASK << CHARGE_VLCSWLV_POS)));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void charger_stop(UINT32 type)
|
|
{
|
|
os_printf("%s\r\n", __FUNCTION__);
|
|
charger_module_enable(0);
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
UINT32 sctrl_ctrl(UINT32 cmd, void *param)
|
|
{
|
|
UINT32 ret;
|
|
UINT32 reg;
|
|
GLOBAL_INT_DECLARATION();
|
|
|
|
ret = SCTRL_SUCCESS;
|
|
GLOBAL_INT_DISABLE();
|
|
switch (cmd) {
|
|
case CMD_SCTRL_NORMAL_SLEEP:
|
|
//sctrl_hw_sleep(*(UINT32 *)param);
|
|
break;
|
|
|
|
case CMD_SCTRL_NORMAL_WAKEUP:
|
|
//sctrl_hw_wakeup();
|
|
break;
|
|
|
|
#if CONFIG_DEEP_PS
|
|
#if PS_SUPPORT_MANUAL_SLEEP
|
|
case CMD_SCTRL_RTOS_IDLE_SLEEP:
|
|
sctrl_enter_rtos_idle_sleep(*(PS_DEEP_CTRL_PARAM *)param);
|
|
break;
|
|
|
|
case CMD_SCTRL_RTOS_IDLE_WAKEUP:
|
|
sctrl_exit_rtos_idle_sleep();
|
|
break;
|
|
#endif
|
|
|
|
case CMD_SCTRL_RTOS_DEEP_SLEEP:
|
|
//sctrl_enter_rtos_deep_sleep((PS_DEEP_CTRL_PARAM *)param);
|
|
break;
|
|
#endif
|
|
|
|
case CMD_GET_CHIP_ID:
|
|
ret = REG_READ(SCTRL_CHIP_ID);
|
|
break;
|
|
|
|
case CMD_SCTRL_SET_FLASH_DPLL:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg |= FLASH_26M_MUX_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_SET_FLASH_DCO:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~FLASH_26M_MUX_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_DSP_POWERDOWN:
|
|
case CMD_SCTRL_USB_POWERDOWN:
|
|
case CMD_SCTRL_MODEM_POWERDOWN:
|
|
case CMD_SCTRL_MAC_POWERDOWN:
|
|
case CMD_SCTRL_DSP_POWERUP:
|
|
case CMD_SCTRL_USB_POWERUP:
|
|
case CMD_SCTRL_MAC_POWERUP:
|
|
case CMD_SCTRL_MODEM_POWERUP:
|
|
case CMD_SCTRL_BLE_POWERDOWN:
|
|
case CMD_SCTRL_BLE_POWERUP:
|
|
|
|
#if (CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_LBUS_POWERDOWN:
|
|
case CMD_SCTRL_LBUS_POWERUP:
|
|
case CMD_SCTRL_BT_POWERDOWN:
|
|
case CMD_SCTRL_BT_POWERUP:
|
|
#endif
|
|
sctrl_subsys_power(cmd);
|
|
break;
|
|
|
|
case CMD_GET_DEVICE_ID:
|
|
ret = REG_READ(SCTRL_DEVICE_ID);
|
|
break;
|
|
|
|
case CMD_GET_SCTRL_CONTROL:
|
|
*((UINT32 *)param) = REG_READ(SCTRL_CONTROL);
|
|
break;
|
|
|
|
case CMD_SET_SCTRL_CONTROL:
|
|
REG_WRITE(SCTRL_CONTROL, *((UINT32 *)param));
|
|
break;
|
|
|
|
case CMD_SCTRL_MCLK_SELECT:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(MCLK_MUX_MASK << MCLK_MUX_POSI);
|
|
reg |= ((*(UINT32 *)param) & MCLK_MUX_MASK) << MCLK_MUX_POSI;
|
|
|
|
#if (CONFIG_SOC_BK7251)
|
|
if (((reg >> MCLK_MUX_POSI) & MCLK_MUX_MASK) == MCLK_SELECT_DPLL) {
|
|
if ((((reg >> MCLK_DIV_POSI) & MCLK_DIV_MASK) <= MCLK_DIV_7))
|
|
reg &= ~HCLK_DIV2_EN_BIT;
|
|
else
|
|
reg |= HCLK_DIV2_EN_BIT;
|
|
}
|
|
#endif
|
|
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_MCLK_DIVISION:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(MCLK_DIV_MASK << MCLK_DIV_POSI);
|
|
reg |= ((*(UINT32 *)param) & MCLK_DIV_MASK) << MCLK_DIV_POSI;
|
|
|
|
#if (CONFIG_SOC_BK7251)
|
|
if (((reg >> MCLK_MUX_POSI) & MCLK_MUX_MASK) == MCLK_SELECT_DPLL) {
|
|
if ((((reg >> MCLK_DIV_POSI) & MCLK_DIV_MASK) <= MCLK_DIV_7))
|
|
reg &= ~HCLK_DIV2_EN_BIT;
|
|
else
|
|
reg |= HCLK_DIV2_EN_BIT;
|
|
}
|
|
#endif
|
|
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_MCLK_MUX_GET:
|
|
reg = ((REG_READ(SCTRL_CONTROL) >> MCLK_MUX_POSI) & MCLK_MUX_MASK);
|
|
*(UINT32 *)param = reg;
|
|
break;
|
|
|
|
case CMD_SCTRL_MCLK_DIV_GET:
|
|
reg = ((REG_READ(SCTRL_CONTROL) >> MCLK_DIV_POSI) & MCLK_DIV_MASK);
|
|
*(UINT32 *)param = reg;
|
|
break;
|
|
|
|
case CMD_SCTRL_RESET_SET:
|
|
reg = REG_READ(SCTRL_RESET);
|
|
reg |= ((*(UINT32 *)param) & SCTRL_RESET_MASK);
|
|
REG_WRITE(SCTRL_RESET, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_RESET_CLR:
|
|
reg = REG_READ(SCTRL_RESET);
|
|
reg &= ~((*(UINT32 *)param) & SCTRL_RESET_MASK);
|
|
REG_WRITE(SCTRL_RESET, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_MODEM_SUBCHIP_RESET:
|
|
case CMD_SCTRL_USB_SUBSYS_RESET:
|
|
case CMD_SCTRL_DSP_SUBSYS_RESET:
|
|
sctrl_subsys_reset(cmd);
|
|
break;
|
|
|
|
case CMD_SCTRL_MAC_SUBSYS_RESET:
|
|
#if (!CONFIG_SOC_BK7271)
|
|
sctrl_subsys_reset(cmd);
|
|
#else
|
|
ret = REG_READ(SCTRL_MODEM_CORE_RESET_PHY_HCLK);
|
|
ret = ret & (~((MAC_SUBSYS_RESET_MASK) << MAC_SUBSYS_RESET_POSI));
|
|
reg = ret | ((MAC_SUBSYS_RESET_WORD & MAC_SUBSYS_RESET_MASK)
|
|
<< MAC_SUBSYS_RESET_POSI);
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg);
|
|
|
|
delay(1);
|
|
reg = ret;
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg);
|
|
|
|
/*resetting, and waiting for done*/
|
|
reg = REG_READ(SCTRL_RESET);
|
|
while (reg & MODEM_CORE_RESET_BIT) {
|
|
delay(10);
|
|
reg = REG_READ(SCTRL_RESET);
|
|
}
|
|
ret = SCTRL_SUCCESS;
|
|
#endif
|
|
break;
|
|
|
|
case CMD_SCTRL_MODEM_CORE_RESET:
|
|
ret = REG_READ(SCTRL_MODEM_CORE_RESET_PHY_HCLK);
|
|
ret = ret & (~((MODEM_CORE_RESET_MASK) << MODEM_CORE_RESET_POSI));
|
|
reg = ret | ((MODEM_CORE_RESET_WORD & MODEM_CORE_RESET_MASK)
|
|
<< MODEM_CORE_RESET_POSI);
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg);
|
|
|
|
delay(1);
|
|
reg = ret;
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg);
|
|
|
|
/*resetting, and waiting for done*/
|
|
reg = REG_READ(SCTRL_RESET);
|
|
while (reg & MODEM_CORE_RESET_BIT) {
|
|
delay(10);
|
|
reg = REG_READ(SCTRL_RESET);
|
|
}
|
|
ret = SCTRL_SUCCESS;
|
|
break;
|
|
|
|
case CMD_SCTRL_MPIF_CLK_INVERT:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg |= MPIF_CLK_INVERT_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_BLK_ENABLE:
|
|
reg = REG_READ(SCTRL_BLOCK_EN_CFG);
|
|
reg &= (~(BLOCK_EN_WORD_MASK << BLOCK_EN_WORD_POSI));
|
|
reg |= (BLOCK_EN_WORD_PWD & BLOCK_EN_WORD_MASK) << BLOCK_EN_WORD_POSI;
|
|
reg |= ((*(UINT32 *)param) & BLOCK_EN_VALID_MASK);
|
|
REG_WRITE(SCTRL_BLOCK_EN_CFG, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_BLK_DISABLE:
|
|
reg = REG_READ(SCTRL_BLOCK_EN_CFG);
|
|
reg &= (~(BLOCK_EN_WORD_MASK << BLOCK_EN_WORD_POSI));
|
|
reg |= (BLOCK_EN_WORD_PWD & BLOCK_EN_WORD_MASK) << BLOCK_EN_WORD_POSI;
|
|
reg &= ~((*(UINT32 *)param) & BLOCK_EN_VALID_MASK);
|
|
REG_WRITE(SCTRL_BLOCK_EN_CFG, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_BIAS_REG_SET:
|
|
reg = REG_READ(SCTRL_BIAS);
|
|
reg |= (*(UINT32 *)param);
|
|
#if (CONFIG_SOC_BK7271)
|
|
sctrl_analog_set(SCTRL_BIAS, reg);
|
|
#else
|
|
REG_WRITE(SCTRL_BIAS, reg);
|
|
#endif
|
|
break;
|
|
|
|
case CMD_SCTRL_BIAS_REG_CLEAN:
|
|
reg = REG_READ(SCTRL_BIAS);
|
|
reg &= ~(*(UINT32 *)param);
|
|
#if (CONFIG_SOC_BK7271)
|
|
sctrl_analog_set(SCTRL_BIAS, reg);
|
|
#else
|
|
REG_WRITE(SCTRL_BIAS, reg);
|
|
#endif
|
|
break;
|
|
|
|
case CMD_SCTRL_BIAS_REG_READ:
|
|
ret = REG_READ(SCTRL_BIAS);
|
|
break;
|
|
|
|
case CMD_SCTRL_BIAS_GET_CALI_OUT:
|
|
#if (CONFIG_SOC_BK7271)
|
|
reg = REG_READ(PMU_STATUS);
|
|
ret = ((reg >> PMU_BAIS_CAL_OUT_POSI) & PMU_BAIS_CAL_OUT_MASK);
|
|
#endif
|
|
break;
|
|
|
|
case CMD_SCTRL_BIAS_REG_WRITE:
|
|
#if (CONFIG_SOC_BK7271)
|
|
sctrl_analog_set(SCTRL_BIAS, *(UINT32 *)param);
|
|
#else
|
|
REG_WRITE(SCTRL_BIAS, *(UINT32 *)param);
|
|
#endif
|
|
break;
|
|
|
|
case CMD_SCTRL_ANALOG_CTRL4_SET:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL4);
|
|
reg |= (*(UINT32 *)param);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_ANALOG_CTRL4_CLEAN:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL4);
|
|
reg &= ~(*(UINT32 *)param);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, reg);
|
|
break;
|
|
|
|
#if (CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_ANALOG_CTRL9_REAL_SET:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL9_REAL);
|
|
reg |= (*(UINT32 *)param);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9_REAL, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_ANALOG_CTRL9_REAL_CLEAN:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL9_REAL);
|
|
reg &= ~(*(UINT32 *)param);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9_REAL, reg);
|
|
break;
|
|
#endif
|
|
|
|
case CMD_SCTRL_CALI_DPLL:
|
|
sctrl_cali_dpll(0);
|
|
break;
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX)
|
|
case CMD_BLE_RF_PTA_EN:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg |= (BLE_RF_PTA_EN_BIT);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
case CMD_BLE_RF_PTA_DIS:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(BLE_RF_PTA_EN_BIT);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
#endif
|
|
|
|
|
|
#if (!CONFIG_SOC_BK7231)
|
|
#if (CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_SET_XTALH_CTUNE:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL4);
|
|
reg &= ~(XTALH_CTUNE_MASK << XTALH_CTUNE_POSI);
|
|
reg |= (((*(UINT32 *)param) &XTALH_CTUNE_MASK) << XTALH_CTUNE_POSI);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_GET_XTALH_CTUNE:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL4);
|
|
ret = ((reg >> XTALH_CTUNE_POSI) & XTALH_CTUNE_MASK);
|
|
break;
|
|
#else
|
|
case CMD_SCTRL_SET_XTALH_CTUNE:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL2);
|
|
reg &= ~(XTALH_CTUNE_MASK << XTALH_CTUNE_POSI);
|
|
reg |= (((*(UINT32 *)param) &XTALH_CTUNE_MASK) << XTALH_CTUNE_POSI);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL2, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_GET_XTALH_CTUNE:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL2);
|
|
ret = ((reg >> XTALH_CTUNE_POSI) & XTALH_CTUNE_MASK);
|
|
break;
|
|
|
|
case CMD_BLE_RF_BIT_SET:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg |= BLE_RF_EN_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_BLE_RF_BIT_CLR:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(BLE_RF_EN_BIT);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_BLE_RF_BIT_GET:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
*((UINT32 *)param) = reg & (BLE_RF_EN_BIT);
|
|
break;
|
|
|
|
case CMD_EFUSE_WRITE_BYTE:
|
|
ret = sctrl_write_efuse(param);
|
|
break;
|
|
|
|
case CMD_EFUSE_READ_BYTE:
|
|
ret = sctrl_read_efuse(param);
|
|
break;
|
|
#endif
|
|
|
|
#if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7236A) && (!CONFIG_SOC_BK7256XX) && (!CONFIG_SOC_BK7236XX) && (!CONFIG_SOC_BK7239XX) && (!CONFIG_SOC_BK7286XX)
|
|
case CMD_QSPI_VDDRAM_VOLTAGE:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(PSRAM_VDDPAD_VOLT_MASK << PSRAM_VDDPAD_VOLT_POSI);
|
|
reg |= (((*(UINT32 *)param) & PSRAM_VDDPAD_VOLT_MASK) << PSRAM_VDDPAD_VOLT_POSI);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_QSPI_IO_VOLTAGE:
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~(QSPI_IO_VOLT_MASK << QSPI_IO_VOLT_POSI);
|
|
reg |= (((*(UINT32 *)param) & QSPI_IO_VOLT_MASK) << QSPI_IO_VOLT_POSI);
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
#endif
|
|
#endif // (!CONFIG_SOC_BK7231)
|
|
|
|
#if (CONFIG_SOC_BK7251) || (CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_OPEN_DAC_ANALOG:
|
|
#if (CONFIG_SOC_BK7271)
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, 0x300B194E);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9, 0x82205600);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL10, 0x80803390);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL13, 0x2108DB28);
|
|
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_CTRL, 0x00B09350 | AUDIO_PLL_AUDIO_EN | AUDIO_PLL_RESET);
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL13);
|
|
reg |= AUDIO_DCO_EN;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL13, reg);
|
|
#endif
|
|
//cause increase CONFIG_MCU_PS elect
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL9);
|
|
reg |= EN_AUD_DAC_L | EN_AUD_DAC_R
|
|
| DAC_PA_OUTPUT_EN | DAC_DRIVER_OUTPUT_EN
|
|
| AUD_DAC_DGA_EN;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9, reg);
|
|
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL10);
|
|
reg |= DAC_N_END_OUPT_L | DAC_N_END_OUPT_R;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL10, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_CLOSE_DAC_ANALOG:
|
|
//cause reduce CONFIG_MCU_PS elect
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL9);
|
|
reg &= ~(EN_AUD_DAC_L | EN_AUD_DAC_R
|
|
| DAC_PA_OUTPUT_EN | DAC_DRIVER_OUTPUT_EN
|
|
| AUD_DAC_DGA_EN);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9, reg);
|
|
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL10);
|
|
reg &= ~(DAC_N_END_OUPT_L | DAC_N_END_OUPT_R);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL10, reg);
|
|
break;
|
|
|
|
#if (!CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_OPEN_ADC_MIC_ANALOG:
|
|
//cause increase CONFIG_MCU_PS elect
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL8);
|
|
reg &= ~(SPI_PWD_AUD_ADC_L | SPI_PWD_AUD_ADC_R);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_CLOSE_ADC_MIC_ANALOG:
|
|
//cause reduce CONFIG_MCU_PS elect
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL8);
|
|
reg |= (SPI_PWD_AUD_ADC_L | SPI_PWD_AUD_ADC_R);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, reg);
|
|
break;
|
|
#else
|
|
case CMD_SCTRL_OPEN_ADC_MIC_ANALOG:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL13);
|
|
reg &= ~(MIC1_PWR_DOWN | MIC2_PWR_DOWN | MIC3_PWR_DOWN | MIC4_PWR_DOWN | MIC5_PWR_DOWN | MIC6_PWR_DOWN);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL13, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_CLOSE_ADC_MIC_ANALOG:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL13);
|
|
reg |= (MIC1_PWR_DOWN | MIC2_PWR_DOWN | MIC3_PWR_DOWN | MIC4_PWR_DOWN | MIC5_PWR_DOWN | MIC6_PWR_DOWN);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL13, reg);
|
|
break;
|
|
#endif
|
|
|
|
case CMD_SCTRL_ENALBLE_ADC_LINE_IN:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL8);
|
|
reg |= LINE_IN_EN;
|
|
#if (CONFIG_SOC_BK7271)
|
|
reg |= LINE2_IN_EN;
|
|
#endif
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, reg);
|
|
|
|
#if (CONFIG_SOC_BK7271)/*set gpio 2 and 3 to high impendance*/
|
|
reg = GPIO_CFG_PARAM(GPIO2, GMODE_SET_HIGH_IMPENDANCE);
|
|
sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CFG, ®);
|
|
reg = GPIO_CFG_PARAM(GPIO3, GMODE_SET_HIGH_IMPENDANCE);
|
|
sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CFG, ®);
|
|
#endif
|
|
break;
|
|
|
|
case CMD_SCTRL_DISALBLE_ADC_LINE_IN:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL8);
|
|
reg &= ~LINE_IN_EN;
|
|
#if (CONFIG_SOC_BK7271)
|
|
reg &= ~LINE2_IN_EN;
|
|
#endif
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_SET_DAC_VOLUME_ANALOG:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL8);
|
|
reg &= ~(AUD_DAC_GAIN_MASK << AUD_DAC_GAIN_POSI);
|
|
reg |= (((*(UINT32 *)param) & AUD_DAC_GAIN_MASK) << AUD_DAC_GAIN_POSI);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_SET_LINEIN_VOLUME_ANALOG:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL8);
|
|
reg &= ~(LINE_IN_GAIN_MASK << LINE_IN_GAIN_POSI);
|
|
reg |= (((*(UINT32 *)param) & LINE_IN_GAIN_MASK) << LINE_IN_GAIN_POSI);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_SET_VOLUME_PORT:
|
|
if ((*(UINT32 *)param) == AUDIO_DAC_VOL_DIFF_MODE) {
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL9);
|
|
reg |= (DAC_DIFF_EN);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9, reg);
|
|
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL10);
|
|
reg |= (DAC_N_END_OUPT_L | DAC_N_END_OUPT_R);
|
|
reg &= ~(DAC_VSEL_MASK << DAC_VSEL_POSI);
|
|
reg |= ((0x3 & DAC_VSEL_MASK) << DAC_VSEL_POSI);;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL10, reg);
|
|
} else if ((*(UINT32 *)param) == AUDIO_DAC_VOL_SINGLE_MODE) {
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL9);
|
|
reg &= ~(DAC_DIFF_EN);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9, reg);
|
|
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL10);
|
|
reg &= ~(DAC_N_END_OUPT_L | DAC_N_END_OUPT_R);
|
|
reg &= ~(DAC_VSEL_MASK << DAC_VSEL_POSI);
|
|
reg |= ((0 & DAC_VSEL_MASK) << DAC_VSEL_POSI);;
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL10, reg);
|
|
}
|
|
break;
|
|
|
|
case CMD_SCTRL_SET_AUD_DAC_MUTE:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL8);
|
|
if ((*(UINT32 *)param) == AUDIO_DAC_ANALOG_MUTE) {
|
|
reg |= (AUD_DAC_MUTE_EN);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, reg);
|
|
} else if ((*(UINT32 *)param) == AUDIO_DAC_ANALOG_UNMUTE) {
|
|
reg &= ~(AUD_DAC_MUTE_EN);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, reg);
|
|
}
|
|
break;
|
|
#endif // (CONFIG_SOC_BK7251) || (CONFIG_SOC_BK7271)
|
|
|
|
#if (CONFIG_SOC_BK7271)
|
|
case CMD_SCTRL_AUDIO_PLL:
|
|
if ((*(UINT32 *)param) == 8000) { //8KHz
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_SDM, 0x3C7EA932);
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_AUDIO_PLL_CTRL);
|
|
reg &= ~(AUDIO_PLL_CKSEL);
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_CTRL, reg);
|
|
} else if ((*(UINT32 *)param) == 16000) { //16KHz
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_SDM, 0x3C7EA932);
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_AUDIO_PLL_CTRL);
|
|
reg &= ~(AUDIO_PLL_CKSEL);
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_CTRL, reg);
|
|
} else if ((*(UINT32 *)param) == 44100) { //44.1KHz
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_SDM, 0x37945EA6);
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_AUDIO_PLL_CTRL);
|
|
reg |= (AUDIO_PLL_CKSEL);
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_CTRL, reg);
|
|
} else if ((*(UINT32 *)param) == 48000) { //48KHz
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_SDM, 0x3C7EA932);
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_AUDIO_PLL_CTRL);
|
|
reg |= (AUDIO_PLL_CKSEL);
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_CTRL, reg);
|
|
}
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_AUDIO_PLL_CTRL);
|
|
reg &= ~(AUDIO_PLL_SPI_TRIGGER);
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_CTRL, reg);
|
|
reg |= (AUDIO_PLL_SPI_TRIGGER);
|
|
sctrl_analog_set(SCTRL_ANALOG_AUDIO_PLL_CTRL, reg);
|
|
break;
|
|
#endif
|
|
|
|
#if ((!CONFIG_SOC_BK7231) && (!CONFIG_SOC_BK7271))
|
|
case CMD_SCTRL_SET_ANALOG6:
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL6);
|
|
reg |= (DPLL_CLK_FOR_AUDIO_EN | DPLL_DIVIDER_CLK_SEL | DPLL_RESET);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL6, reg);
|
|
break;
|
|
#endif
|
|
case CMD_SCTRL_SET_ANALOG0:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL0, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_SET_ANALOG1:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL1, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_SET_ANALOG2:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL2, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_SET_ANALOG3:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL3, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_SET_ANALOG4:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_SET_ANALOG5:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG0:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL0);
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG1:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL1);
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG2:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL2);
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG3:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL3);
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG4:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL4);
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG5:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL5);
|
|
break;
|
|
#if (CONFIG_SOC_BK7251)
|
|
case CMD_SCTRL_SET_ANALOG7:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL7, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_SET_ANALOG8:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL8, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_SET_ANALOG9:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL9, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_SET_ANALOG10:
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL10, (*(UINT32 *)param));
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG7:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL7);
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG8:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL8);
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG9:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL9);
|
|
break;
|
|
case CMD_SCTRL_GET_ANALOG10:
|
|
ret = sctrl_analog_get(SCTRL_ANALOG_CTRL10);
|
|
break;
|
|
|
|
case CMD_SCTRL_AUDIO_PLL:
|
|
if ((*(UINT32 *)param) == 48000000) //48MHz
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, 0x3B13B13B);
|
|
else if ((*(UINT32 *)param) == 48128000) //48.128MHz
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, 0x3B3C05AC);
|
|
else if ((*(UINT32 *)param) == 48384000) //48.384MHz
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, 0x3B8CAE8E);
|
|
else if ((*(UINT32 *)param) == 49152000) //49.152MHz
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, 0x3C7EA932);
|
|
else if ((*(UINT32 *)param) == 49392000) //49.392MHz
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, 0x3CCA4785);
|
|
else if ((*(UINT32 *)param) == 50688000) //50.688MHz
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, 0x3E629E7C);
|
|
else if ((*(UINT32 *)param) == 50803200) //50.8032MHz
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, 0x3E86EA7A);
|
|
else
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL5, 0x3B13B13B);
|
|
break;
|
|
#endif
|
|
|
|
#if CONFIG_USB_CHARGE
|
|
case CMD_SCTRL_USB_CHARGE_CAL:
|
|
if (1 == ((CHARGE_OPER_PTR)param)->step)
|
|
charger_vlcf_calibration(0);
|
|
else if (2 == ((CHARGE_OPER_PTR)param)->step)
|
|
charger_icp_calibration(0);
|
|
else if (3 == ((CHARGE_OPER_PTR)param)->step)
|
|
charger_vcv_calibration(0);
|
|
else if (4 == ((CHARGE_OPER_PTR)param)->step)
|
|
charger_calib_get(((CHARGE_OPER_PTR)param)->cal);
|
|
break;
|
|
case CMD_SCTRL_USB_CHARGE_START:
|
|
charger_start(param);
|
|
break;
|
|
case CMD_SCTRL_USB_CHARGE_STOP:
|
|
charger_stop((*(UINT32 *)param));
|
|
break;
|
|
#endif
|
|
|
|
case CMD_SCTRL_SET_LOW_PWR_CLK:
|
|
reg = REG_READ(SCTRL_LOW_PWR_CLK);
|
|
reg &= ~(LPO_CLK_MUX_MASK);
|
|
reg |= ((*(UINT32 *)param) << LPO_CLK_MUX_POSI);
|
|
REG_WRITE(SCTRL_LOW_PWR_CLK, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_SET_GADC_SEL:
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7236A) || (CONFIG_SOC_BK7256XX) || (CONFIG_SOC_BK7236XX) || (CONFIG_SOC_BK7239XX) || (CONFIG_SOC_BK7286XX)
|
|
reg = sctrl_analog_get(SCTRL_ANALOG_CTRL4);
|
|
reg &= ~(GADC_CAL_SEL_MASK << GADC_CAL_SEL_POSI);
|
|
reg |= (((*(UINT32 *)param) & GADC_CAL_SEL_MASK) << GADC_CAL_SEL_POSI);
|
|
sctrl_analog_set(SCTRL_ANALOG_CTRL4, reg);
|
|
#endif
|
|
break;
|
|
|
|
case CMD_SCTRL_SET_VDD_VALUE:
|
|
reg = REG_READ(SCTRL_DIGTAL_VDD);
|
|
reg &= (~(DIG_VDD_ACTIVE_MASK << DIG_VDD_ACTIVE_POSI));
|
|
reg |= ((*(UINT32 *)param) << DIG_VDD_ACTIVE_POSI);
|
|
REG_WRITE(SCTRL_DIGTAL_VDD, reg);
|
|
break;
|
|
case CMD_SCTRL_GET_VDD_VALUE:
|
|
reg = REG_READ(SCTRL_DIGTAL_VDD);
|
|
ret = (reg >> DIG_VDD_ACTIVE_POSI) & DIG_VDD_ACTIVE_MASK;
|
|
break;
|
|
|
|
case CMD_GET_SCTRL_RETETION:
|
|
*((UINT32 *)param) = REG_READ(SCTRL_SW_RETENTION);
|
|
break;
|
|
|
|
case CMD_SET_SCTRL_RETETION:
|
|
REG_WRITE(SCTRL_SW_RETENTION, *((UINT32 *)param));
|
|
break;
|
|
|
|
case CMD_SCTRL_MODEM_AHB_CLOCK_DISABLE:
|
|
/* Modem AHB clock disable*/
|
|
#if (CONFIG_SOC_BK7271)
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~PHY_HCLK_EN_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
#else
|
|
reg = REG_READ(SCTRL_MODEM_CORE_RESET_PHY_HCLK);
|
|
reg &= ~PHY_HCLK_EN_BIT;
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg);
|
|
#endif
|
|
break;
|
|
case CMD_SCTRL_MODEM_CLOCK480M_DISABLE:
|
|
/* Modem Subsystem clock 480m disable*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
REG_WRITE(SCTRL_CONTROL, reg | MODEM_CLK480M_PWD_BIT);
|
|
break;
|
|
|
|
case CMD_SCTRL_MODEM_AHB_CLOCK_ENABLE:
|
|
/* Modem AHB clock enable*/
|
|
#if (CONFIG_SOC_BK7271)
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
REG_WRITE(SCTRL_CONTROL, reg | PHY_HCLK_EN_BIT);
|
|
#else
|
|
reg = REG_READ(SCTRL_MODEM_CORE_RESET_PHY_HCLK);
|
|
REG_WRITE(SCTRL_MODEM_CORE_RESET_PHY_HCLK, reg | PHY_HCLK_EN_BIT);
|
|
#endif
|
|
break;
|
|
|
|
case CMD_SCTRL_MODEM_CLOCK480M_ENABLE:
|
|
/* Modem Subsystem clock 480m enable*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~MODEM_CLK480M_PWD_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_MAC_AHB_CLOCK_DISABLE:
|
|
sctrl_mac_ahb_slave_clock_disable();
|
|
break;
|
|
case CMD_SCTRL_MAC_CLOCK480M_DISABLE:
|
|
/* Mac Subsystem clock 480m disable*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
REG_WRITE(SCTRL_CONTROL, reg | MAC_CLK480M_PWD_BIT);
|
|
break;
|
|
case CMD_SCTRL_MAC_AHB_CLOCK_ENABLE:
|
|
sctrl_mac_ahb_slave_clock_enable();
|
|
break;
|
|
case CMD_SCTRL_MAC_CLOCK480M_ENABLE:
|
|
/* Mac Subsystem clock 480m enable*/
|
|
reg = REG_READ(SCTRL_CONTROL);
|
|
reg &= ~MAC_CLK480M_PWD_BIT;
|
|
REG_WRITE(SCTRL_CONTROL, reg);
|
|
break;
|
|
|
|
case CMD_SCTRL_BLOCK_EN_MUX_SET:
|
|
reg = REG_READ(SCTRL_BLOCK_EN_MUX);
|
|
reg &= ~(0x1FF);
|
|
reg |= *((UINT32 *)param);
|
|
REG_WRITE(SCTRL_BLOCK_EN_MUX, reg);
|
|
break;
|
|
|
|
#if (CONFIG_SOC_BK7231N) || (CONFIG_SOC_BK7256XX)
|
|
case CMD_SCTRL_FIX_DPLL_DIV:
|
|
if ((DEVICE_ID_BK7231N_P & DEVICE_ID_MASK) != (sctrl_ctrl(CMD_GET_DEVICE_ID, NULL) & DEVICE_ID_MASK)) {
|
|
sctrl_fix_dpll_div();
|
|
}
|
|
#endif
|
|
default:
|
|
ret = SCTRL_FAILURE;
|
|
break;
|
|
}
|
|
GLOBAL_INT_RESTORE();
|
|
|
|
return ret;
|
|
}
|
|
#endif
|
|
// EOF
|
|
|