123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- #include "ser_phy.h"
- #include "ser_config.h"
- #ifdef SER_CONNECTIVITY
- #include "ser_phy_config_conn.h"
- #else
- #include "ser_phy_config_app.h"
- #endif
- #include "nrf_drv_uart.h"
- #include "app_error.h"
- #include "app_util.h"
- #include "app_util_platform.h"
- #define UART_TRANSFER_MAX 255
- static const nrf_drv_uart_t m_uart = NRF_DRV_UART_INSTANCE(0);
- static const nrf_drv_uart_config_t m_uart_config = {
- .pseltxd = SER_PHY_UART_TX,
- .pselrxd = SER_PHY_UART_RX,
- .pselrts = SER_PHY_UART_RTS,
- .pselcts = SER_PHY_UART_CTS,
- .p_context = NULL,
- .interrupt_priority = UART_IRQ_PRIORITY,
- #if defined(NRF_DRV_UART_WITH_UARTE) && defined(NRF_DRV_UART_WITH_UART)
- .use_easy_dma = true,
- #endif
-
-
- .hwfc = SER_PHY_UART_FLOW_CTRL,
- .parity = SER_PHY_UART_PARITY,
- .baudrate = (nrf_uart_baudrate_t)SER_PHY_UART_BAUDRATE
- };
- static bool volatile m_tx_in_progress;
- static uint8_t m_tx_header_buf[SER_PHY_HEADER_SIZE];
- static uint16_t m_bytes_to_transmit;
- static uint8_t const * mp_tx_buffer;
- static uint8_t m_rx_header_buf[SER_PHY_HEADER_SIZE];
- static uint16_t m_bytes_to_receive;
- static uint8_t m_rx_drop_buf[1];
- static ser_phy_events_handler_t m_ser_phy_event_handler;
- static ser_phy_evt_t m_ser_phy_rx_event;
- static void packet_sent_callback(void)
- {
- static ser_phy_evt_t const event = {
- .evt_type = SER_PHY_EVT_TX_PKT_SENT,
- };
- m_ser_phy_event_handler(event);
- }
- static void buffer_request_callback(uint16_t num_of_bytes)
- {
- m_ser_phy_rx_event.evt_type = SER_PHY_EVT_RX_BUF_REQUEST;
- m_ser_phy_rx_event.evt_params.rx_buf_request.num_of_bytes = num_of_bytes;
- m_ser_phy_event_handler(m_ser_phy_rx_event);
- }
- static void packet_received_callback(void)
- {
- m_ser_phy_event_handler(m_ser_phy_rx_event);
- }
- static void packet_dropped_callback(void)
- {
- static ser_phy_evt_t const event = {
- .evt_type = SER_PHY_EVT_RX_PKT_DROPPED,
- };
- m_ser_phy_event_handler(event);
- }
- static void hardware_error_callback(uint32_t hw_error)
- {
- ser_phy_evt_t event = {
- .evt_type = SER_PHY_EVT_HW_ERROR,
- .evt_params.hw_error.error_code = hw_error,
- };
- m_ser_phy_event_handler(event);
- }
- static void packet_rx_start(void)
- {
- APP_ERROR_CHECK(nrf_drv_uart_rx(&m_uart, m_rx_header_buf,
- SER_PHY_HEADER_SIZE));
- }
- static void packet_byte_drop(void)
- {
- APP_ERROR_CHECK(nrf_drv_uart_rx(&m_uart, m_rx_drop_buf, 1));
- }
- static void uart_event_handler(nrf_drv_uart_event_t * p_event,
- void * p_context)
- {
- (void)p_context;
- switch (p_event->type)
- {
- case NRF_DRV_UART_EVT_ERROR:
-
-
-
- if (p_event->data.error.error_mask &
- (NRF_UART_ERROR_PARITY_MASK | NRF_UART_ERROR_OVERRUN_MASK))
- {
-
- hardware_error_callback(p_event->data.error.error_mask);
- }
- packet_rx_start();
- break;
- case NRF_DRV_UART_EVT_TX_DONE:
- if (p_event->data.rxtx.p_data == m_tx_header_buf)
- {
- #if (SER_HAL_TRANSPORT_TX_MAX_PKT_SIZE > UART_TRANSFER_MAX)
- if (m_bytes_to_transmit > UART_TRANSFER_MAX)
- {
- APP_ERROR_CHECK(nrf_drv_uart_tx(&m_uart, mp_tx_buffer,
- UART_TRANSFER_MAX));
- }
- else
- #endif
- {
- APP_ERROR_CHECK(nrf_drv_uart_tx(&m_uart, mp_tx_buffer,
- m_bytes_to_transmit));
- }
- }
- else
- {
- #if (SER_HAL_TRANSPORT_TX_MAX_PKT_SIZE > UART_TRANSFER_MAX)
- ASSERT(p_event->data.rxtx.bytes <= m_bytes_to_transmit);
- m_bytes_to_transmit -= p_event->data.rxtx.bytes;
- if (m_bytes_to_transmit != 0)
- {
- APP_ERROR_CHECK(nrf_drv_uart_tx(&m_uart,
- p_event->data.rxtx.p_data + p_event->data.rxtx.bytes,
- m_bytes_to_transmit < UART_TRANSFER_MAX ?
- m_bytes_to_transmit : UART_TRANSFER_MAX));
- }
- else
- #endif
- {
- m_tx_in_progress = false;
- packet_sent_callback();
- }
- }
- break;
- case NRF_DRV_UART_EVT_RX_DONE:
- if (p_event->data.rxtx.p_data == m_rx_header_buf)
- {
- m_bytes_to_receive = uint16_decode(m_rx_header_buf);
- buffer_request_callback(m_bytes_to_receive);
- }
- else if (p_event->data.rxtx.p_data == m_rx_drop_buf)
- {
- --m_bytes_to_receive;
- if (m_bytes_to_receive != 0)
- {
- packet_byte_drop();
- }
- else
- {
- packet_dropped_callback();
- packet_rx_start();
- }
- }
- else
- {
- #if (SER_HAL_TRANSPORT_RX_MAX_PKT_SIZE > UART_TRANSFER_MAX)
- ASSERT(p_event->data.rxtx.bytes <= m_bytes_to_receive);
- m_bytes_to_receive -= p_event->data.rxtx.bytes;
- if (m_bytes_to_receive != 0)
- {
- APP_ERROR_CHECK(nrf_drv_uart_rx(&m_uart,
- p_event->data.rxtx.p_data + p_event->data.rxtx.bytes,
- m_bytes_to_receive < UART_TRANSFER_MAX ?
- m_bytes_to_receive : UART_TRANSFER_MAX));
- }
- else
- #endif
- {
- packet_received_callback();
- packet_rx_start();
- }
- }
- break;
- default:
- APP_ERROR_CHECK(NRF_ERROR_INTERNAL);
- }
- }
- uint32_t ser_phy_open(ser_phy_events_handler_t events_handler)
- {
- uint32_t err_code;
- if (events_handler == NULL)
- {
- return NRF_ERROR_NULL;
- }
-
- if (m_ser_phy_event_handler != NULL)
- {
- return NRF_ERROR_INVALID_STATE;
- }
- err_code = nrf_drv_uart_init(&m_uart, &m_uart_config, uart_event_handler);
- if (err_code != NRF_SUCCESS)
- {
- return NRF_ERROR_INVALID_PARAM;
- }
- m_ser_phy_event_handler = events_handler;
- packet_rx_start();
- return err_code;
- }
- uint32_t ser_phy_tx_pkt_send(const uint8_t * p_buffer, uint16_t num_of_bytes)
- {
- if (p_buffer == NULL)
- {
- return NRF_ERROR_NULL;
- }
- else if (num_of_bytes == 0)
- {
- return NRF_ERROR_INVALID_PARAM;
- }
- bool busy;
- CRITICAL_REGION_ENTER();
- busy = m_tx_in_progress;
- m_tx_in_progress = true;
- CRITICAL_REGION_EXIT();
- if (busy)
- {
- return NRF_ERROR_BUSY;
- }
- (void)uint16_encode(num_of_bytes, m_tx_header_buf);
- mp_tx_buffer = p_buffer;
- m_bytes_to_transmit = num_of_bytes;
- APP_ERROR_CHECK(nrf_drv_uart_tx(&m_uart, m_tx_header_buf,
- SER_PHY_HEADER_SIZE));
- return NRF_SUCCESS;
- }
- uint32_t ser_phy_rx_buf_set(uint8_t * p_buffer)
- {
- if (m_ser_phy_rx_event.evt_type != SER_PHY_EVT_RX_BUF_REQUEST)
- {
- return NRF_ERROR_INVALID_STATE;
- }
- m_ser_phy_rx_event.evt_type = SER_PHY_EVT_RX_PKT_RECEIVED;
- m_ser_phy_rx_event.evt_params.rx_pkt_received.p_buffer = p_buffer;
- m_ser_phy_rx_event.evt_params.rx_pkt_received.num_of_bytes =
- m_bytes_to_receive;
-
-
- if (p_buffer == NULL)
- {
- packet_byte_drop();
- }
- #if (SER_HAL_TRANSPORT_RX_MAX_PKT_SIZE > UART_TRANSFER_MAX)
- else if (m_bytes_to_receive > UART_TRANSFER_MAX)
- {
- APP_ERROR_CHECK(nrf_drv_uart_rx(&m_uart, p_buffer, UART_TRANSFER_MAX));
- }
- #endif
- else
- {
- APP_ERROR_CHECK(nrf_drv_uart_rx(&m_uart, p_buffer, m_bytes_to_receive));
- }
- return NRF_SUCCESS;
- }
- void ser_phy_close(void)
- {
- nrf_drv_uart_uninit(&m_uart);
- m_ser_phy_event_handler = NULL;
- }
- void ser_phy_interrupts_enable(void)
- {
- IRQn_Type irqn;
- #if defined(NRF_DRV_UART_WITH_UARTE)
- irqn = nrfx_get_irq_number(m_uart.uarte.p_reg);
- #else
- irqn = nrfx_get_irq_number(m_uart.uart.p_reg);
- #endif
- NVIC_EnableIRQ(irqn);
- }
- void ser_phy_interrupts_disable(void)
- {
- IRQn_Type irqn;
- #if defined(NRF_DRV_UART_WITH_UARTE)
- irqn = nrfx_get_irq_number(m_uart.uarte.p_reg);
- #else
- irqn = nrfx_get_irq_number(m_uart.uart.p_reg);
- #endif
- NVIC_DisableIRQ(irqn);
- }
|