diff --git a/ChangeLog b/ChangeLog index 58c6fd2..bfaf2e6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2019-03-29 NIIBE Yutaka + + * contrib/usart-stm32f103.c (usart_read_ext): New. + (usart_read_prepare_poll): New. + 2019-03-02 NIIBE Yutaka * VERSION: 1.14. diff --git a/contrib/usart-stm32f103.c b/contrib/usart-stm32f103.c index f0ddd06..4255b26 100644 --- a/contrib/usart-stm32f103.c +++ b/contrib/usart-stm32f103.c @@ -394,6 +394,14 @@ rb_empty_check (void *arg) return rb->empty == 0; } +/* Can be used two ways: + * + * When the ring buffer is rb_a2h: + * Hardware-side polling if data is available from application. + * + * When the ring buffer is rb_h2a: + * Application-side polling if data is available from hardware. + */ static void rb_get_prepare_poll (struct rb *rb, chopstx_poll_cond_t *poll_desc) { @@ -611,6 +619,43 @@ usart_read (uint8_t dev_no, char *buf, uint16_t buflen) return rb_read (rb, (uint8_t *)buf, buflen); } +void +usart_read_prepare_poll (uint8_t dev_no, chopstx_poll_cond_t *poll_desc) +{ + struct rb *rb; + + if (dev_no == 2) + rb = &usart2_rb_h2a; + else if (dev_no == 3) + rb = &usart3_rb_h2a; + else + return; + + rb_get_prepare_poll (rb, poll_desc); +} + +int +usart_read_ext (uint8_t dev_no, char *buf, uint16_t buflen, uint32 *timeout_p) +{ + struct rb *rb; + chopstx_poll_cond_t poll_desc; + int r; + + if (dev_no == 2) + rb = &usart2_rb_h2a; + else if (dev_no == 3) + rb = &usart3_rb_h2a; + else + return -1; + + rb_get_prepare_poll (rb, &poll_desc); + r = chopstx_poll (timeout_p, 1, (struct chx_poll_head *const)&poll_desc); + if (r == 0) + return 0; + else + return rb_read (rb, (uint8_t *)buf, buflen); +} + int usart_write (uint8_t dev_no, char *buf, uint16_t buflen) { diff --git a/contrib/usart.h b/contrib/usart.h index 14b80fa..3e7f6f5 100644 --- a/contrib/usart.h +++ b/contrib/usart.h @@ -73,3 +73,6 @@ int usart_write (uint8_t dev_no, char *buf, uint16_t buflen); const struct usart_stat *usart_stat (uint8_t dev_no); int usart_send_break (uint8_t dev_no); void usart_config_clken (uint8_t dev_no, int on); + +void usart_read_prepare_poll (uint8_t dev_no, chopstx_poll_cond_t *poll_desc); +int usart_read_ext (uint8_t dev_no, char *buf, uint16_t buflen, uint32 *timeout_p);