soc/rtc: Bypass touchpad current to external 32k crystal oscillator
This commit is contained in:
parent
b8d1ff5e95
commit
8ca1efd91a
1 changed files with 28 additions and 5 deletions
|
@ -65,7 +65,7 @@ static const char* TAG = "rtc_clk";
|
||||||
#define APLL_CAL_DELAY_2 0x3f
|
#define APLL_CAL_DELAY_2 0x3f
|
||||||
#define APLL_CAL_DELAY_3 0x1f
|
#define APLL_CAL_DELAY_3 0x1f
|
||||||
|
|
||||||
#define XTAL_32K_DAC_VAL 1
|
#define XTAL_32K_DAC_VAL 3
|
||||||
#define XTAL_32K_DRES_VAL 3
|
#define XTAL_32K_DRES_VAL 3
|
||||||
#define XTAL_32K_DBIAS_VAL 0
|
#define XTAL_32K_DBIAS_VAL 0
|
||||||
|
|
||||||
|
@ -117,14 +117,34 @@ static rtc_cpu_freq_t s_cur_freq = RTC_CPU_FREQ_XTAL;
|
||||||
|
|
||||||
static void rtc_clk_32k_enable_internal(int dac, int dres, int dbias)
|
static void rtc_clk_32k_enable_internal(int dac, int dres, int dbias)
|
||||||
{
|
{
|
||||||
SET_PERI_REG_MASK(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_X32N_MUX_SEL | RTC_IO_X32P_MUX_SEL);
|
|
||||||
CLEAR_PERI_REG_MASK(RTC_IO_XTAL_32K_PAD_REG,
|
CLEAR_PERI_REG_MASK(RTC_IO_XTAL_32K_PAD_REG,
|
||||||
RTC_IO_X32P_RDE | RTC_IO_X32P_RUE | RTC_IO_X32N_RUE |
|
RTC_IO_X32P_RDE | RTC_IO_X32P_RUE | RTC_IO_X32N_RUE |
|
||||||
RTC_IO_X32N_RDE | RTC_IO_X32N_MUX_SEL | RTC_IO_X32P_MUX_SEL);
|
RTC_IO_X32N_RDE | RTC_IO_X32N_MUX_SEL | RTC_IO_X32P_MUX_SEL);
|
||||||
|
SET_PERI_REG_MASK(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_X32N_MUX_SEL | RTC_IO_X32P_MUX_SEL);
|
||||||
|
/* Set the parameters of xtal
|
||||||
|
dac --> current
|
||||||
|
dres --> resistance
|
||||||
|
dbias --> bais voltage
|
||||||
|
*/
|
||||||
REG_SET_FIELD(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_DAC_XTAL_32K, dac);
|
REG_SET_FIELD(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_DAC_XTAL_32K, dac);
|
||||||
REG_SET_FIELD(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_DRES_XTAL_32K, dres);
|
REG_SET_FIELD(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_DRES_XTAL_32K, dres);
|
||||||
REG_SET_FIELD(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_DBIAS_XTAL_32K, dbias);
|
REG_SET_FIELD(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_DBIAS_XTAL_32K, dbias);
|
||||||
SET_PERI_REG_MASK(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_XPD_XTAL_32K);
|
|
||||||
|
/* TOUCH sensor can provide additional current to external XTAL.
|
||||||
|
In some case, X32N and X32P PAD don't have enough drive capability to start XTAL */
|
||||||
|
SET_PERI_REG_MASK(RTC_IO_TOUCH_CFG_REG, RTC_IO_TOUCH_XPD_BIAS_M);
|
||||||
|
/* Tie PAD Touch8 to VDD
|
||||||
|
NOTE: TOUCH8 and TOUCH9 register settings are reversed except for DAC, so we set RTC_IO_TOUCH_PAD9_REG here instead
|
||||||
|
*/
|
||||||
|
SET_PERI_REG_MASK(RTC_IO_TOUCH_PAD9_REG, RTC_IO_TOUCH_PAD9_TIE_OPT_M);
|
||||||
|
/* Set the current used to compensate TOUCH PAD8 */
|
||||||
|
SET_PERI_REG_BITS(RTC_IO_TOUCH_PAD8_REG, RTC_IO_TOUCH_PAD8_DAC, 4, RTC_IO_TOUCH_PAD8_DAC_S);
|
||||||
|
/* Power up TOUCH8
|
||||||
|
So the Touch DAC start to drive some current from VDD to TOUCH8(which is also XTAL-N)
|
||||||
|
*/
|
||||||
|
SET_PERI_REG_MASK(RTC_IO_TOUCH_PAD9_REG, RTC_IO_TOUCH_PAD9_XPD_M);
|
||||||
|
/* Power up external xtal */
|
||||||
|
SET_PERI_REG_MASK(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_XPD_XTAL_32K_M);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_32k_enable(bool enable)
|
void rtc_clk_32k_enable(bool enable)
|
||||||
|
@ -132,7 +152,10 @@ void rtc_clk_32k_enable(bool enable)
|
||||||
if (enable) {
|
if (enable) {
|
||||||
rtc_clk_32k_enable_internal(XTAL_32K_DAC_VAL, XTAL_32K_DRES_VAL, XTAL_32K_DBIAS_VAL);
|
rtc_clk_32k_enable_internal(XTAL_32K_DAC_VAL, XTAL_32K_DRES_VAL, XTAL_32K_DBIAS_VAL);
|
||||||
} else {
|
} else {
|
||||||
|
/* Disable X32N and X32P pad drive external xtal */
|
||||||
CLEAR_PERI_REG_MASK(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_XPD_XTAL_32K);
|
CLEAR_PERI_REG_MASK(RTC_IO_XTAL_32K_PAD_REG, RTC_IO_XPD_XTAL_32K);
|
||||||
|
/* Power down TOUCH */
|
||||||
|
CLEAR_PERI_REG_MASK(RTC_IO_TOUCH_PAD9_REG, RTC_IO_TOUCH_PAD9_XPD_M);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue