Sebastian Huber commented on a discussion on 
bsps/shared/dev/serial/zynq-uart-polled.c: 
https://gitlab.rtems.org/rtems/rtos/rtems/-/merge_requests/199#note_112141

 > +  uint32_t  desired_baud,
 > +  uint32_t  mode_clks,
 > +  uint32_t *cd_ptr,
 > +  uint32_t *bdiv_ptr
 > +)
 > +{
 > +  uint32_t best_error = UINT32_MAX;
 > +  uint32_t best_cd;
 > +  uint32_t best_bdiv_plus_one;
 > +  uint32_t bdiv_plus_one;
 > +  uint32_t selected_clock;
 > +
 > +  _Assert((mode_clks & ~ZYNQ_UART_MODE_CLKS) == 0);
 > +  selected_clock = zynq_uart_input_clock() / (1U << (3 * mode_clks));
 > +
 > +  for (bdiv_plus_one = 5; bdiv_plus_one <= 256; ++bdiv_plus_one) {

The previous code just selected the best error. In the new code we have this:

```
    /*
     * The procedure to detect a start bit uses three samples in the middle of
     * an RX-bit.  If the sample set is too small, there may be a sample in
     * another bit in case the baud setting is not accurate.  Most noise is in
     * the form of small peaks, if the sample rate is too high, then noise may
     * get detected as a bit.
     *
     * Prefer an sample set of around 16 per RX-bit.
     */
    if (error < best_error || (bdiv_plus_one <= 20 && error <= best_error)) {
      best_error = error;
      best_cd = cd;
      best_bdiv_plus_one = bdiv_plus_one;
    }
```

In my tests I got this on the ZCU104:

```
desired baud: 9600, actual baud: 9600, error 0, max error: 288, cd: 651, bdiv: 
15
desired baud: 19200, actual baud: 19201, error 1, max error: 576, cd: 372, 
bdiv: 13
desired baud: 38400, actual baud: 38402, error 2, max error: 1152, cd: 186, 
bdiv: 13
desired baud: 57600, actual baud: 57603, error 3, max error: 1728, cd: 124, 
bdiv: 13
desired baud: 115200, actual baud: 115207, error 7, max error: 3456, cd: 62, 
bdiv: 13
```

-- 
View it on GitLab: 
https://gitlab.rtems.org/rtems/rtos/rtems/-/merge_requests/199#note_112141
You're receiving this email because of your account on gitlab.rtems.org.


_______________________________________________
bugs mailing list
bugs@rtems.org
http://lists.rtems.org/mailman/listinfo/bugs

Reply via email to