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