47
47
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
48
48
#include "esp_private/sleep_modem.h"
49
49
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
50
+ #include "esp_private/esp_modem_clock.h"
50
51
51
52
#include "freertos/FreeRTOS.h"
52
53
#include "freertos/task.h"
73
74
#define EXT_FUNC_MAGIC_VALUE 0xA5A5A5A5
74
75
75
76
#define BT_ASSERT_PRINT ets_printf
76
- typedef enum ble_rtc_slow_clk_src {
77
- BT_SLOW_CLK_SRC_MAIN_XTAL ,
78
- BT_SLOW_CLK_SRC_32K_XTAL_ON_PIN0 ,
79
- } ble_rtc_slow_clk_src_t ;
80
-
81
77
/* Types definition
82
78
************************************************************************
83
79
*/
@@ -440,6 +436,7 @@ static bool s_ble_active = false;
440
436
static DRAM_ATTR esp_pm_lock_handle_t s_pm_lock = NULL ;
441
437
#define BTDM_MIN_TIMER_UNCERTAINTY_US (200)
442
438
#endif // CONFIG_PM_ENABLE
439
+ static DRAM_ATTR modem_clock_lpclk_src_t s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_INVALID ;
443
440
444
441
#define BLE_RTC_DELAY_US (1800)
445
442
@@ -554,6 +551,20 @@ void sleep_modem_light_sleep_overhead_set(uint32_t overhead)
554
551
}
555
552
#endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */
556
553
554
+ modem_clock_lpclk_src_t esp_bt_get_lpclk_src (void )
555
+ {
556
+ return s_bt_lpclk_src ;
557
+ }
558
+
559
+ void esp_bt_set_lpclk_src (modem_clock_lpclk_src_t clk_src )
560
+ {
561
+ if (clk_src >= MODEM_CLOCK_LPCLK_SRC_MAX ) {
562
+ return ;
563
+ }
564
+
565
+ s_bt_lpclk_src = clk_src ;
566
+ }
567
+
557
568
IRAM_ATTR void controller_sleep_cb (uint32_t enable_tick , void * arg )
558
569
{
559
570
if (!s_ble_active ) {
@@ -580,15 +591,15 @@ IRAM_ATTR void controller_wakeup_cb(void *arg)
580
591
s_ble_active = true;
581
592
}
582
593
583
- esp_err_t controller_sleep_init (ble_rtc_slow_clk_src_t slow_clk_src )
594
+ esp_err_t controller_sleep_init (modem_clock_lpclk_src_t slow_clk_src )
584
595
{
585
596
esp_err_t rc = 0 ;
586
597
#ifdef CONFIG_BT_LE_SLEEP_ENABLE
587
598
ESP_LOGW (NIMBLE_PORT_LOG_TAG , "BLE modem sleep is enabled\n" );
588
599
r_ble_lll_rfmgmt_set_sleep_cb (controller_sleep_cb , controller_wakeup_cb , 0 , 0 , 500 + BLE_RTC_DELAY_US );
589
600
590
601
#ifdef CONFIG_PM_ENABLE
591
- if (slow_clk_src == BT_SLOW_CLK_SRC_MAIN_XTAL ) {
602
+ if (slow_clk_src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL ) {
592
603
esp_sleep_pd_config (ESP_PD_DOMAIN_XTAL , ESP_PD_OPTION_ON );
593
604
} else {
594
605
esp_sleep_pd_config (ESP_PD_DOMAIN_XTAL , ESP_PD_OPTION_AUTO );
@@ -643,11 +654,11 @@ void controller_sleep_deinit(void)
643
654
#endif //CONFIG_PM_ENABLE
644
655
}
645
656
646
- static void esp_bt_rtc_slow_clk_select (ble_rtc_slow_clk_src_t slow_clk_src )
657
+ static void esp_bt_rtc_slow_clk_select (modem_clock_lpclk_src_t slow_clk_src )
647
658
{
648
659
/* Select slow clock source for BT momdule */
649
660
switch (slow_clk_src ) {
650
- case BT_SLOW_CLK_SRC_MAIN_XTAL :
661
+ case MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL :
651
662
ESP_LOGI (NIMBLE_PORT_LOG_TAG , "Using main XTAL as clock source" );
652
663
SET_PERI_REG_BITS (MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG , 1 , 0 , MODEM_CLKRST_LP_TIMER_SEL_XTAL32K_S );
653
664
SET_PERI_REG_BITS (MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG , 1 , 1 , MODEM_CLKRST_LP_TIMER_SEL_XTAL_S );
@@ -659,7 +670,7 @@ static void esp_bt_rtc_slow_clk_select(ble_rtc_slow_clk_src_t slow_clk_src)
659
670
SET_PERI_REG_BITS (MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG , MODEM_CLKRST_LP_TIMER_CLK_DIV_NUM , 249 , MODEM_CLKRST_LP_TIMER_CLK_DIV_NUM_S );
660
671
#endif // CONFIG_XTAL_FREQ_26
661
672
break ;
662
- case BT_SLOW_CLK_SRC_32K_XTAL_ON_PIN0 :
673
+ case MODEM_CLOCK_LPCLK_SRC_EXT32K :
663
674
ESP_LOGI (NIMBLE_PORT_LOG_TAG , "Using external 32.768 kHz XTAL as clock source" );
664
675
SET_PERI_REG_BITS (MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG , 1 , 1 , MODEM_CLKRST_LP_TIMER_SEL_XTAL32K_S );
665
676
SET_PERI_REG_BITS (MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG , 1 , 0 , MODEM_CLKRST_LP_TIMER_SEL_XTAL_S );
@@ -676,40 +687,39 @@ static void esp_bt_rtc_slow_clk_select(ble_rtc_slow_clk_src_t slow_clk_src)
676
687
SET_PERI_REG_BITS (MODEM_CLKRST_ETM_CLK_CONF_REG , 1 , 0 , MODEM_CLKRST_ETM_CLK_SEL_S );
677
688
}
678
689
679
- static ble_rtc_slow_clk_src_t ble_rtc_clk_init (esp_bt_controller_config_t * cfg )
690
+ static modem_clock_lpclk_src_t ble_rtc_clk_init (esp_bt_controller_config_t * cfg )
680
691
{
681
- ble_rtc_slow_clk_src_t slow_clk_src ;
682
-
692
+ if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_INVALID ) {
683
693
#if CONFIG_BT_LE_LP_CLK_SRC_MAIN_XTAL
684
- #ifdef CONFIG_XTAL_FREQ_26
685
- cfg -> rtc_freq = 40000 ;
686
- #else
687
- cfg -> rtc_freq = 32000 ;
688
- #endif // CONFIG_XTAL_FREQ_26
689
- slow_clk_src = BT_SLOW_CLK_SRC_MAIN_XTAL ;
694
+ s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL ;
690
695
#else
691
- if (rtc_clk_slow_src_get () == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW ) {
696
+ if (rtc_clk_slow_src_get () == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW ) {
697
+ s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_EXT32K ;
698
+ } else {
699
+ ESP_LOGW (NIMBLE_PORT_LOG_TAG , "32.768kHz XTAL not detected, fall back to main XTAL as Bluetooth sleep clock" );
700
+ s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL ;
701
+ }
702
+ #endif // CONFIG_BT_LE_LP_CLK_SRC_MAIN_XTAL
703
+ }
704
+
705
+ if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_EXT32K ) {
692
706
cfg -> rtc_freq = 32768 ;
693
- slow_clk_src = BT_SLOW_CLK_SRC_32K_XTAL_ON_PIN0 ;
694
- } else {
695
- ESP_LOGW (NIMBLE_PORT_LOG_TAG , "32.768kHz XTAL not detected, fall back to main XTAL as Bluetooth sleep clock" );
707
+ } else if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL ) {
696
708
#ifdef CONFIG_XTAL_FREQ_26
697
709
cfg -> rtc_freq = 40000 ;
698
710
#else
699
711
cfg -> rtc_freq = 32000 ;
700
712
#endif // CONFIG_XTAL_FREQ_26
701
- slow_clk_src = BT_SLOW_CLK_SRC_MAIN_XTAL ;
702
713
}
703
- #endif /* CONFIG_BT_LE_LP_CLK_SRC_MAIN_XTAL */
704
- esp_bt_rtc_slow_clk_select (slow_clk_src );
705
- return slow_clk_src ;
714
+ esp_bt_rtc_slow_clk_select (s_bt_lpclk_src );
715
+ return s_bt_lpclk_src ;
706
716
}
707
717
708
718
esp_err_t esp_bt_controller_init (esp_bt_controller_config_t * cfg )
709
719
{
710
720
esp_err_t ret = ESP_OK ;
711
721
ble_npl_count_info_t npl_info ;
712
- ble_rtc_slow_clk_src_t rtc_clk_src ;
722
+ modem_clock_lpclk_src_t rtc_clk_src ;
713
723
uint8_t hci_transport_mode ;
714
724
715
725
memset (& npl_info , 0 , sizeof (ble_npl_count_info_t ));
0 commit comments