esp_nano_hosted/src/nh_shared_if.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... */
}