75 lines
2.1 KiB
C
75 lines
2.1 KiB
C
#include "nh_shared_if.h"
|
|
|
|
#define NH_XFER_REQ_TIMEOUT 5000
|
|
|
|
#define NH_XFER_MAX_SIZE 1600
|
|
|
|
nh_ret_t nh_shared_if_init(nh_shared_if_t *shared_if) {
|
|
nh_ret_t ret;
|
|
|
|
ret = shared_if->osa->sem_create(shared_if->osa->user_data, &shared_if->p_semaphore_xfer_req);
|
|
if (ret != NH_RET_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
ret = shared_if->osa->buf_allocate(shared_if->osa->user_data, &shared_if->p_buf_frame_tx, NH_XFER_MAX_SIZE);
|
|
if (ret != NH_RET_SUCCESS) {
|
|
goto err_free_sem_xfer;
|
|
}
|
|
|
|
ret = shared_if->osa->buf_allocate(shared_if->osa->user_data, &shared_if->p_buf_frame_rx, NH_XFER_MAX_SIZE);
|
|
if (ret != NH_RET_SUCCESS) {
|
|
goto err_free_tx_buf;
|
|
}
|
|
|
|
return ret;
|
|
|
|
err_free_tx_buf:
|
|
shared_if->osa->buf_free(shared_if->osa->user_data, shared_if->p_buf_frame_tx);
|
|
|
|
err_free_sem_xfer:
|
|
shared_if->osa->sem_destroy(shared_if->osa->user_data, shared_if->p_semaphore_xfer_req);
|
|
|
|
return ret;
|
|
}
|
|
|
|
void nh_shared_if_task(nh_shared_if_t *shared_if) {
|
|
nh_ret_t ret;
|
|
|
|
ret = shared_if->osa->sem_take(shared_if->osa->user_data, shared_if->p_semaphore_xfer_req, NH_XFER_REQ_TIMEOUT);
|
|
if (ret != NH_RET_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
/* Wait for device available */
|
|
ret = shared_if->ops.handshake_poll(shared_if->ops.user_data);
|
|
if(ret != NH_RET_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
/* Taken the xfer request semaphore. The possible reasons are:
|
|
* 1: Some data (could from any interfaces) needs to be sent
|
|
* 2: Data ready pin has been toggled, some data needs to be received
|
|
*/
|
|
|
|
bool rx_available = false;
|
|
|
|
/* Check if new data is available */
|
|
ret = shared_if->ops.data_ready_read(shared_if->ops.user_data, &rx_available);
|
|
if (ret != NH_RET_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
ret = shared_if->ops.xfer(shared_if->ops.user_data, shared_if->p_buf_frame_tx, shared_if->p_buf_frame_rx,
|
|
NH_XFER_MAX_SIZE);
|
|
if (ret != NH_RET_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
/* If we do not have RX data... */
|
|
if (!rx_available) {
|
|
return;
|
|
}
|
|
|
|
/* TODO: Check interface type... */
|
|
} |