@@ -462,7 +462,11 @@ void uartSetBaudRate(uart_t* uart, uint32_t baud_rate)
462
462
return ;
463
463
}
464
464
UART_MUTEX_LOCK ();
465
+ #if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
465
466
uart_ll_set_baudrate (UART_LL_GET_HW (uart -> num ), _get_effective_baudrate (baud_rate ));
467
+ #else
468
+ uart_ll_set_baudrate (UART_LL_GET_HW (uart -> num ), baud_rate );
469
+ #endif
466
470
UART_MUTEX_UNLOCK ();
467
471
}
468
472
@@ -474,6 +478,12 @@ uint32_t uartGetBaudRate(uart_t* uart)
474
478
475
479
UART_MUTEX_LOCK ();
476
480
uint32_t baud_rate = uart_ll_get_baudrate (UART_LL_GET_HW (uart -> num ));
481
+ #if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
482
+ uint32_t Freq = getApbFrequency ()/1000000 ;
483
+ if (Freq < 80 ) {
484
+ baud_rate = baud_rate / (80 / Freq );
485
+ }
486
+ #endif
477
487
UART_MUTEX_UNLOCK ();
478
488
return baud_rate ;
479
489
}
@@ -630,32 +640,31 @@ void log_print_buf(const uint8_t *b, size_t len){
630
640
631
641
/*
632
642
* if enough pulses are detected return the minimum high pulse duration + minimum low pulse duration divided by two.
643
+ * In the case of S3 and C3 using XTAL as UART CLK SOURCE, one bit period = Negative Pulse Count + 1
633
644
* This equals one bit period. If flag is true the function return inmediately, otherwise it waits for enough pulses.
634
645
*/
635
646
unsigned long uartBaudrateDetect (uart_t * uart , bool flg )
636
647
{
637
- // Baud rate detection only works for ESP32 and ESP32S2
638
- #if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
639
648
if (uart == NULL ) {
640
649
return 0 ;
641
650
}
642
651
643
652
uart_dev_t * hw = UART_LL_GET_HW (uart -> num );
644
653
645
- while (hw -> rxd_cnt . edge_cnt < 30 ) { // UART_PULSE_NUM(uart_num)
654
+ while (uart_ll_get_rxd_edge_cnt ( hw ) < 30 ) { // UART_PULSE_NUM(uart_num)
646
655
if (flg ) return 0 ;
647
656
ets_delay_us (1000 );
648
657
}
649
658
650
659
UART_MUTEX_LOCK ();
651
- //log_i("lowpulse_min_cnt = %d hightpulse_min_cnt = %d", hw->lowpulse.min_cnt, hw->highpulse.min_cnt);
652
- unsigned long ret = ((hw -> lowpulse .min_cnt + hw -> highpulse .min_cnt ) >> 1 );
660
+ #if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
661
+ unsigned long ret = ((uart_ll_get_low_pulse_cnt (hw ) + uart_ll_get_high_pulse_cnt (hw )) >> 1 );
662
+ #else
663
+ unsigned long ret = uart_ll_get_neg_pulse_cnt (hw ) + 1 ;
664
+ #endif
653
665
UART_MUTEX_UNLOCK ();
654
666
655
667
return ret ;
656
- #else
657
- return 0 ;
658
- #endif
659
668
}
660
669
661
670
@@ -664,61 +673,23 @@ unsigned long uartBaudrateDetect(uart_t *uart, bool flg)
664
673
* detected calling uartBadrateDetect(). The raw baudrate is computed using the UART_CLK_FREQ. The raw baudrate is
665
674
* rounded to the closed real baudrate.
666
675
*
667
- * ESP32-C3 reports wrong baud rate detection as shown below:
668
- *
669
- * This will help in a future recall for the C3.
670
- * Baud Sent: Baud Read:
671
- * 300 --> 19536
672
- * 2400 --> 19536
673
- * 4800 --> 19536
674
- * 9600 --> 28818
675
- * 19200 --> 57678
676
- * 38400 --> 115440
677
- * 57600 --> 173535
678
- * 115200 --> 347826
679
- * 230400 --> 701754
680
- *
681
- *
682
676
*/
683
677
void uartStartDetectBaudrate (uart_t * uart ) {
684
678
if (uart == NULL ) {
685
679
return ;
686
680
}
687
681
688
- #ifdef CONFIG_IDF_TARGET_ESP32C3
689
-
690
- // ESP32-C3 requires further testing
691
- // Baud rate detection returns wrong values
692
-
693
- log_e ("ESP32-C3 baud rate detection is not supported." );
694
- return ;
695
-
696
- // Code bellow for C3 kept for future recall
697
- //hw->rx_filt.glitch_filt = 0x08;
698
- //hw->rx_filt.glitch_filt_en = 1;
699
- //hw->conf0.autobaud_en = 0;
700
- //hw->conf0.autobaud_en = 1;
701
- #elif CONFIG_IDF_TARGET_ESP32S3
702
- log_e ("ESP32-S3 baud rate detection is not supported." );
703
- return ;
704
- #else
705
682
uart_dev_t * hw = UART_LL_GET_HW (uart -> num );
706
- hw -> auto_baud .glitch_filt = 0x08 ;
707
- hw -> auto_baud .en = 0 ;
708
- hw -> auto_baud .en = 1 ;
709
- #endif
683
+ uart_ll_set_autobaud_en (hw , false);
684
+ uart_ll_set_autobaud_en (hw , true);
710
685
}
711
686
712
- unsigned long
713
- uartDetectBaudrate (uart_t * uart )
687
+ unsigned long uartDetectBaudrate (uart_t * uart )
714
688
{
715
689
if (uart == NULL ) {
716
690
return 0 ;
717
691
}
718
692
719
- // Baud rate detection only works for ESP32 and ESP32S2
720
- #if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
721
-
722
693
static bool uartStateDetectingBaudrate = false;
723
694
724
695
if (!uartStateDetectingBaudrate ) {
@@ -732,37 +703,27 @@ uartDetectBaudrate(uart_t *uart)
732
703
}
733
704
734
705
uart_dev_t * hw = UART_LL_GET_HW (uart -> num );
735
- hw -> auto_baud . en = 0 ;
706
+ uart_ll_set_autobaud_en ( hw , false) ;
736
707
737
708
uartStateDetectingBaudrate = false; // Initialize for the next round
738
-
739
- unsigned long baudrate = getApbFrequency () / divisor ;
740
709
741
- //log_i("APB_FREQ = %d\nraw baudrate detected = %d", getApbFrequency(), baudrate);
742
-
743
- static const unsigned long default_rates [] = {300 , 600 , 1200 , 2400 , 4800 , 9600 , 19200 , 38400 , 57600 , 74880 , 115200 , 230400 , 256000 , 460800 , 921600 , 1843200 , 3686400 };
744
-
710
+ #if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
711
+ unsigned long baudrate = getApbFrequency () / divisor ; // ESP32 and S2 APB Freq
712
+ #else
713
+ unsigned long baudrate = (getXtalFrequencyMhz () * 1000000 ) / divisor ; // S3 and C3 XTAL Frequency
714
+ #endif
715
+
716
+ static const unsigned long default_rates [] = {300 , 600 , 1200 , 2400 , 4800 , 9600 , 19200 , 38400 , 57600 , 74880 , 115200 , 230400 , 250000 ,
717
+ 256000 , 460800 , 500000 , 921600 , 1000000 , 1843200 , 2000000 , 3686400 };
745
718
size_t i ;
746
- for (i = 1 ; i < sizeof (default_rates ) / sizeof (default_rates [0 ]) - 1 ; i ++ ) // find the nearest real baudrate
747
- {
748
- if (baudrate <= default_rates [i ])
749
- {
750
- if (baudrate - default_rates [i - 1 ] < default_rates [i ] - baudrate ) {
751
- i -- ;
752
- }
719
+ for (i = 1 ; i < sizeof (default_rates ) / sizeof (default_rates [0 ]) - 1 ; i ++ ) { // find the nearest real baudrate
720
+ if (baudrate <= default_rates [i ]) {
721
+ if (baudrate - default_rates [i - 1 ] < default_rates [i ] - baudrate ) i -- ;
753
722
break ;
754
723
}
755
724
}
756
725
757
726
return default_rates [i ];
758
- #else
759
- #ifdef CONFIG_IDF_TARGET_ESP32C3
760
- log_e ("ESP32-C3 baud rate detection is not supported." );
761
- #else
762
- log_e ("ESP32-S3 baud rate detection is not supported." );
763
- #endif
764
- return 0 ;
765
- #endif
766
727
}
767
728
768
729
/*
0 commit comments