#include #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 #include "bk_icu.h" #include "bk_gpio.h" #include "reset_reason.h" #include #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