Lines Matching refs:p_uarte
358 static uint32_t uarte_int_lock(NRF_UARTE_Type * p_uarte) in uarte_int_lock() argument
360 uint32_t int_enabled = nrfy_uarte_int_enable_check(p_uarte, UINT32_MAX); in uarte_int_lock()
362 nrfy_uarte_int_disable(p_uarte, int_enabled); in uarte_int_lock()
367 static void uarte_int_unlock(NRF_UARTE_Type * p_uarte, uint32_t int_mask) in uarte_int_unlock() argument
369 nrfy_uarte_int_enable(p_uarte, int_mask); in uarte_int_unlock()
378 static bool is_tx_ready(NRF_UARTE_Type * p_uarte, bool stop_on_end) in is_tx_ready() argument
380 return nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_TXSTOPPED) || in is_tx_ready()
381 (!stop_on_end && nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ENDTX)); in is_tx_ready()
384 static bool prepare_rx(NRF_UARTE_Type * p_uarte) in prepare_rx() argument
391 if (nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXSTARTED)) in prepare_rx()
395 nrfy_uarte_enable(p_uarte); in prepare_rx()
396 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPRX); in prepare_rx()
398 NRFX_WAIT_FOR(nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXTO) || in prepare_rx()
399 nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ERROR), 100, 10, res); in prepare_rx()
401 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXSTARTED); in prepare_rx()
402 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDRX); in prepare_rx()
403 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXTO); in prepare_rx()
404 nrfy_uarte_disable(p_uarte); in prepare_rx()
411 static bool prepare_tx(NRF_UARTE_Type * p_uarte, bool stop_on_end) in prepare_tx() argument
416 nrfy_uarte_enable(p_uarte); in prepare_tx()
422 nrfy_uarte_tx_buffer_set(p_uarte, &dummy, 0); in prepare_tx()
423 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STARTTX); in prepare_tx()
426 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPTX); in prepare_tx()
430 NRFX_WAIT_FOR(is_tx_ready(p_uarte, true), 10, 1, res); in prepare_tx()
437 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDTX); in prepare_tx()
438 nrfy_uarte_disable(p_uarte); in prepare_tx()
595 NRF_UARTE_Type * p_uarte = p_instance->p_reg; in nrfx_uarte_uninit() local
599 nrfy_uarte_int_disable(p_uarte, in nrfx_uarte_uninit()
606 nrfy_uarte_int_uninit(p_uarte); in nrfx_uarte_uninit()
609 nrfy_uarte_shorts_disable(p_uarte, NRF_UARTE_SHORT_ENDTX_STOPTX); in nrfx_uarte_uninit()
613 nrfx_prs_release(p_uarte); in nrfx_uarte_uninit()
637 static void tx_start(NRF_UARTE_Type * p_uarte, const uint8_t *buf, size_t len, bool en_int) in tx_start() argument
639 nrfy_uarte_tx_buffer_set(p_uarte, buf, len); in tx_start()
640 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDTX); in tx_start()
641 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_TXSTOPPED); in tx_start()
642 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_TXSTARTED); in tx_start()
644 nrfy_uarte_enable(p_uarte); in tx_start()
648 nrfy_uarte_int_enable(p_uarte, NRF_UARTE_INT_TXSTOPPED_MASK); in tx_start()
651 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STARTTX); in tx_start()
660 static void disable_hw_from_tx(NRF_UARTE_Type * p_uarte, in disable_hw_from_tx() argument
663 if (nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_TXSTOPPED) && !is_rx_active(p_cb)) in disable_hw_from_tx()
665 nrfy_uarte_disable(p_uarte); in disable_hw_from_tx()
670 static void block_on_tx(NRF_UARTE_Type * p_uarte, in block_on_tx() argument
676 while (!is_tx_ready(p_uarte, stop_on_end)) in block_on_tx()
683 if (nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ENDTX)) in block_on_tx()
685 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPTX); in block_on_tx()
686 while (!is_tx_ready(p_uarte, true)) in block_on_tx()
694 else if (!nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_TXSTOPPED)) in block_on_tx()
701 disable_hw_from_tx(p_uarte, p_cb); in block_on_tx()
706 static nrfx_err_t wait_for_endtx(NRF_UARTE_Type * p_uarte, in wait_for_endtx() argument
720 ready = is_tx_ready(p_uarte, stop_on_end); in wait_for_endtx()
721 amount = nrfy_uarte_tx_amount_get(p_uarte); in wait_for_endtx()
722 p_tx = nrfy_uarte_tx_buffer_get(p_uarte); in wait_for_endtx()
739 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPTX); in wait_for_endtx()
748 NRF_UARTE_Type * p_uarte = p_instance->p_reg; in poll_out() local
756 if (!nrf_dma_accessible_check(p_uarte, p_byte)) in poll_out()
768 bool tx_ready = is_tx_ready(p_uarte, p_cb->flags & UARTE_FLAG_TX_STOP_ON_END); in poll_out()
774 p_cb->tx.amount = (int)nrfy_uarte_tx_amount_get(p_uarte); in poll_out()
786 tx_start(p_uarte, p_buf, 1, early_ret); in poll_out()
793 err = wait_for_endtx(p_uarte, p_buf, 1, p_cb->flags & UARTE_FLAG_TX_STOP_ON_END); in poll_out()
796 disable_hw_from_tx(p_uarte, p_cb); in poll_out()
803 static bool tx_prepare_start(NRF_UARTE_Type * p_uarte, in tx_prepare_start() argument
807 if (!is_tx_ready(p_uarte, p_cb->flags & UARTE_FLAG_TX_STOP_ON_END)) in tx_prepare_start()
811 nrfy_uarte_int_enable(p_uarte, NRF_UARTE_INT_TXSTOPPED_MASK); in tx_prepare_start()
832 tx_start(p_uarte, p_buf, xfer_len, true); in tx_prepare_start()
885 NRF_UARTE_Type * p_uarte = p_instance->p_reg; in nrfx_uarte_tx() local
924 if (!nrf_dma_accessible_check(p_uarte, p_data)) in nrfx_uarte_tx()
972 tx_prepare_start(p_uarte, p_cb, use_cache); in nrfx_uarte_tx()
977 if (nrf_dma_accessible_check(p_uarte, p_cb->tx.curr.p_buffer)) in nrfx_uarte_tx()
995 NRFX_WAIT_FOR(nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_TXSTARTED), 10, 1, res); in nrfx_uarte_tx()
1000 nrfy_uarte_shorts_disable(p_uarte, NRF_UARTE_SHORT_ENDTX_STOPTX); in nrfx_uarte_tx()
1002 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_TXSTARTED); in nrfx_uarte_tx()
1003 nrfy_uarte_tx_buffer_set(p_uarte, p_data, length); in nrfx_uarte_tx()
1035 NRF_UARTE_Type * p_uarte = p_instance->p_reg; in nrfx_uarte_tx_abort() local
1038 int_mask = uarte_int_lock(p_uarte); in nrfx_uarte_tx_abort()
1041 uarte_int_unlock(p_uarte, int_mask); in nrfx_uarte_tx_abort()
1047 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPTX); in nrfx_uarte_tx_abort()
1051 block_on_tx(p_uarte, p_cb); in nrfx_uarte_tx_abort()
1052 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDTX); in nrfx_uarte_tx_abort()
1056 uarte_int_unlock(p_uarte, int_mask); in nrfx_uarte_tx_abort()
1086 static void user_handler_on_error(NRF_UARTE_Type * p_uarte, uarte_control_block_t * p_cb) in user_handler_on_error() argument
1092 .error_mask = nrfy_uarte_errorsrc_get_and_clear(p_uarte) in user_handler_on_error()
1160 static bool is_tx_active(NRF_UARTE_Type * p_uarte) in is_tx_active() argument
1162 return !nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_TXSTOPPED) || in is_tx_active()
1163 nrfy_uarte_int_enable_check(p_uarte, NRF_UARTE_INT_TXSTOPPED_MASK); in is_tx_active()
1166 static void disable_hw_from_rx(NRF_UARTE_Type * p_uarte) in disable_hw_from_rx() argument
1170 if (!is_tx_active(p_uarte)) in disable_hw_from_rx()
1172 nrfy_uarte_disable(p_uarte); in disable_hw_from_rx()
1178 static void on_rx_disabled(NRF_UARTE_Type * p_uarte, in on_rx_disabled() argument
1182 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXDRDY); in on_rx_disabled()
1183 nrfy_uarte_shorts_disable(p_uarte, NRF_UARTE_SHORT_ENDRX_STARTRX); in on_rx_disabled()
1184 nrfy_uarte_int_disable(p_uarte, rx_int_mask); in on_rx_disabled()
1185 disable_hw_from_rx(p_uarte); in on_rx_disabled()
1236 static bool rx_flushed_handler(NRF_UARTE_Type * p_uarte, uarte_control_block_t * p_cb) in rx_flushed_handler() argument
1266 on_rx_disabled(p_uarte, p_cb, 0); in rx_flushed_handler()
1286 NRF_UARTE_Type * p_uarte = p_instance->p_reg; in nrfx_uarte_rx_enable() local
1300 nrfy_uarte_int_disable(p_uarte, rx_int_mask); in nrfx_uarte_rx_enable()
1301 nrfy_uarte_enable(p_uarte); in nrfx_uarte_rx_enable()
1302 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDRX); in nrfx_uarte_rx_enable()
1303 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXSTARTED); in nrfx_uarte_rx_enable()
1304 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXTO); in nrfx_uarte_rx_enable()
1333 if (nrfy_uarte_int_enable_check(p_uarte, NRF_UARTE_INT_RXDRDY_MASK) && p_cb->handler && in nrfx_uarte_rx_enable()
1343 if (!nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXSTARTED)) in nrfx_uarte_rx_enable()
1346 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STARTRX); in nrfx_uarte_rx_enable()
1351 nrfy_uarte_int_enable(p_uarte, rx_int_mask); in nrfx_uarte_rx_enable()
1358 static nrfx_err_t rx_buffer_set(NRF_UARTE_Type * p_uarte, in rx_buffer_set() argument
1366 (!p_cb->handler && nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ENDRX))) in rx_buffer_set()
1370 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDRX); in rx_buffer_set()
1376 if (rx_flushed_handler(p_uarte, p_cb)) in rx_buffer_set()
1378 nrfy_uarte_rx_buffer_set(p_uarte, in rx_buffer_set()
1384 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STARTRX); in rx_buffer_set()
1385 if (nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXTO)) in rx_buffer_set()
1387 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXTO); in rx_buffer_set()
1397 nrfy_uarte_rx_buffer_set(p_uarte, p_data, length); in rx_buffer_set()
1400 nrfy_uarte_shorts_enable(p_uarte, NRF_UARTE_SHORT_ENDRX_STARTRX); in rx_buffer_set()
1451 NRF_UARTE_Type * p_uarte = p_instance->p_reg; in nrfx_uarte_rx_buffer_set() local
1456 int_enabled = uarte_int_lock(p_uarte); in nrfx_uarte_rx_buffer_set()
1462 else if (!nrf_dma_accessible_check(p_uarte, p_data)) in nrfx_uarte_rx_buffer_set()
1517 err = rx_buffer_set(p_uarte, p_cb, p_data, length); in nrfx_uarte_rx_buffer_set()
1520 uarte_int_unlock(p_uarte, int_enabled); in nrfx_uarte_rx_buffer_set()
1525 static void rx_flush(NRF_UARTE_Type * p_uarte, uarte_control_block_t * p_cb) in rx_flush() argument
1538 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXSTARTED); in rx_flush()
1541 nrfy_uarte_rx_buffer_set(p_uarte, p_cb->rx.flush.p_buffer, UARTE_HW_RX_FIFO_SIZE); in rx_flush()
1545 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDRX); in rx_flush()
1546 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_FLUSHRX); in rx_flush()
1547 while (!nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ENDRX)) in rx_flush()
1551 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDRX); in rx_flush()
1555 p_cb->rx.flush.length = nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXSTARTED) ? in rx_flush()
1556 nrfy_uarte_rx_amount_get(p_uarte) : 0; in rx_flush()
1560 p_cb->rx.flush.length = nrfy_uarte_rx_amount_get(p_uarte); in rx_flush()
1562 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXSTARTED); in rx_flush()
1565 static void wait_for_rx_completion(NRF_UARTE_Type * p_uarte, in wait_for_rx_completion() argument
1568 while(nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXTO) == false) in wait_for_rx_completion()
1571 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXSTARTED); in wait_for_rx_completion()
1572 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDRX); in wait_for_rx_completion()
1573 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXTO); in wait_for_rx_completion()
1575 rx_flush(p_uarte, p_cb); in wait_for_rx_completion()
1576 disable_hw_from_rx(p_uarte); in wait_for_rx_completion()
1583 static nrfx_err_t rx_abort(NRF_UARTE_Type * p_uarte, in rx_abort() argument
1589 bool endrx_startrx = nrfy_uarte_shorts_get(p_uarte, NRF_UARTE_SHORT_ENDRX_STARTRX) != 0; in rx_abort()
1608 int_enabled = uarte_int_lock(p_uarte); in rx_abort()
1612 nrfy_uarte_shorts_disable(p_uarte, NRF_UARTE_SHORT_ENDRX_STARTRX); in rx_abort()
1624 nrfy_uarte_int_disable(p_uarte, rx_int_mask); in rx_abort()
1625 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPRX); in rx_abort()
1626 wait_for_rx_completion(p_uarte, p_cb); in rx_abort()
1631 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPRX); in rx_abort()
1634 uarte_int_unlock(p_uarte, int_enabled); in rx_abort()
1645 NRF_UARTE_Type * p_uarte = p_instance->p_reg; in nrfx_uarte_rx_abort() local
1647 return rx_abort(p_uarte, p_cb, disable_all, sync); in nrfx_uarte_rx_abort()
1816 static void rxto_irq_handler(NRF_UARTE_Type * p_uarte, in rxto_irq_handler() argument
1831 rx_flush(p_uarte, p_cb); in rxto_irq_handler()
1834 on_rx_disabled(p_uarte, p_cb, p_cb->rx.flush.length); in rxto_irq_handler()
1837 static bool endrx_irq_handler(NRF_UARTE_Type * p_uarte, in endrx_irq_handler() argument
1841 size_t rx_amount = (size_t)nrfy_uarte_rx_amount_get(p_uarte); in endrx_irq_handler()
1856 nrfy_uarte_shorts_disable(p_uarte, NRF_UARTE_SHORT_ENDRX_STARTRX); in endrx_irq_handler()
1865 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPRX); in endrx_irq_handler()
1870 (rxstarted || nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXSTARTED)))) in endrx_irq_handler()
1879 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STARTRX); in endrx_irq_handler()
1880 if (nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXTO)) in endrx_irq_handler()
1890 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXTO); in endrx_irq_handler()
1891 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXSTARTED); in endrx_irq_handler()
1892 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPRX); in endrx_irq_handler()
1899 static void pending_tx_handler(NRF_UARTE_Type * p_uarte, in pending_tx_handler() argument
1910 if (nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_TXSTOPPED)) in pending_tx_handler()
1915 tx_start(p_uarte, p_tx->curr.p_buffer, p_tx->curr.length, true); in pending_tx_handler()
1921 static void txstopped_irq_handler(NRF_UARTE_Type * p_uarte, in txstopped_irq_handler() argument
1924 nrfy_uarte_int_disable(p_uarte, NRF_UARTE_INT_TXSTOPPED_MASK); in txstopped_irq_handler()
1927 disable_hw_from_tx(p_uarte, p_cb); in txstopped_irq_handler()
1940 pending_tx_handler(p_uarte, &p_cb->tx); in txstopped_irq_handler()
1951 use_cache = !nrf_dma_accessible_check(p_uarte, p_cb->tx.curr.p_buffer); in txstopped_irq_handler()
1955 amount = p_cb->tx.amount >= 0 ? (size_t)p_cb->tx.amount : nrfy_uarte_tx_amount_get(p_uarte); in txstopped_irq_handler()
1975 tx_prepare_start(p_uarte, p_cb, use_cache); in txstopped_irq_handler()
1980 static void error_irq_handler(NRF_UARTE_Type * p_uarte, in error_irq_handler() argument
1983 user_handler_on_error(p_uarte, p_cb); in error_irq_handler()
1986 static void endtx_irq_handler(NRF_UARTE_Type * p_uarte, uarte_control_block_t * p_cb) in endtx_irq_handler() argument
1994 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDTX); in endtx_irq_handler()
1996 if (!nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_TXSTARTED) && !aborted) in endtx_irq_handler()
1998 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STARTTX); in endtx_irq_handler()
2002 nrfy_uarte_int_disable(p_uarte, NRF_UARTE_INT_ENDTX_MASK); in endtx_irq_handler()
2003 nrfy_uarte_shorts_enable(p_uarte, NRF_UARTE_SHORT_ENDTX_STOPTX); in endtx_irq_handler()
2016 len = nrfy_uarte_tx_amount_get(p_uarte); in endtx_irq_handler()
2026 if (nrfy_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ENDTX)) in endtx_irq_handler()
2028 nrfy_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDTX); in endtx_irq_handler()
2029 nrfy_uarte_task_trigger(p_uarte, NRF_UARTE_TASK_STOPTX); in endtx_irq_handler()
2040 static inline bool event_check_and_clear(NRF_UARTE_Type * p_uarte, in event_check_and_clear() argument
2044 if (nrfy_uarte_event_check(p_uarte, event) && (int_mask & NRFY_EVENT_TO_INT_BITMASK(event))) { in event_check_and_clear()
2045 nrfy_uarte_event_clear(p_uarte, event); in event_check_and_clear()
2052 static inline bool event_check(NRF_UARTE_Type * p_uarte, in event_check() argument
2056 return nrfy_uarte_event_check(p_uarte, event) && in event_check()
2060 static void irq_handler(NRF_UARTE_Type * p_uarte, uarte_control_block_t * p_cb) in irq_handler() argument
2064 uint32_t int_mask = nrfy_uarte_int_enable_check(p_uarte, UINT32_MAX); in irq_handler()
2065 bool txstopped = event_check(p_uarte, NRF_UARTE_EVENT_TXSTOPPED, int_mask); in irq_handler()
2066 bool endtx = event_check(p_uarte, NRF_UARTE_EVENT_ENDTX, int_mask); in irq_handler()
2070 if (event_check_and_clear(p_uarte, NRF_UARTE_EVENT_ERROR, int_mask)) in irq_handler()
2072 error_irq_handler(p_uarte, p_cb); in irq_handler()
2078 bool rxto = event_check_and_clear(p_uarte, NRF_UARTE_EVENT_RXTO, int_mask); in irq_handler()
2079 bool rxstarted = event_check_and_clear(p_uarte, NRF_UARTE_EVENT_RXSTARTED, int_mask); in irq_handler()
2080 bool endrx = event_check_and_clear(p_uarte, NRF_UARTE_EVENT_ENDRX, int_mask); in irq_handler()
2081 bool rxdrdy = event_check_and_clear(p_uarte, NRF_UARTE_EVENT_RXDRDY, int_mask); in irq_handler()
2095 rxstarted = event_check_and_clear(p_uarte, NRF_UARTE_EVENT_RXSTARTED, int_mask); in irq_handler()
2098 if (endrx_irq_handler(p_uarte, p_cb, rxstarted) == true) in irq_handler()
2106 rxstarted_irq_handler(p_uarte, p_cb); in irq_handler()
2111 rxto_irq_handler(p_uarte, p_cb); in irq_handler()
2117 endtx_irq_handler(p_uarte, p_cb); in irq_handler()
2122 txstopped_irq_handler(p_uarte, p_cb); in irq_handler()