Added modifications in SDK drivers needed for mbed HAL implementation.

pull/2234/head
Głąbek, Andrzej 2016-06-16 12:09:24 +01:00
parent 082fd409ce
commit 52b9563e56
4 changed files with 61 additions and 9 deletions

View File

@ -80,6 +80,7 @@ typedef struct
bool tx_done : 1;
bool rx_done : 1;
bool abort : 1;
} spi_control_block_t;
static spi_control_block_t m_cb[SPI_COUNT];
@ -202,7 +203,7 @@ ret_code_t nrf_drv_spi_init(nrf_drv_spi_t const * const p_instance,
CODE_FOR_SPIM
(
NRF_SPIM_Type * p_spim = p_instance->p_registers;
NRF_SPIM_Type * p_spim = (NRF_SPIM_Type * ) p_instance->p_registers;
nrf_spim_pins_set(p_spim, p_config->sck_pin, mosi_pin, miso_pin);
nrf_spim_frequency_set(p_spim,
(nrf_spim_frequency_t)p_config->frequency);
@ -221,7 +222,7 @@ ret_code_t nrf_drv_spi_init(nrf_drv_spi_t const * const p_instance,
)
CODE_FOR_SPI
(
NRF_SPI_Type * p_spi = p_instance->p_registers;
NRF_SPI_Type * p_spi = (NRF_SPI_Type * ) p_instance->p_registers;
nrf_spi_pins_set(p_spi, p_config->sck_pin, mosi_pin, miso_pin);
nrf_spi_frequency_set(p_spi,
(nrf_spi_frequency_t)p_config->frequency);
@ -264,7 +265,7 @@ void nrf_drv_spi_uninit(nrf_drv_spi_t const * const p_instance)
CODE_FOR_SPIM
(
NRF_SPIM_Type * p_spim = p_instance->p_registers;
NRF_SPIM_Type * p_spim = (NRF_SPIM_Type * ) p_instance->p_registers;
if (p_cb->handler)
{
nrf_spim_int_disable(p_spim, DISABLE_ALL);
@ -280,7 +281,7 @@ void nrf_drv_spi_uninit(nrf_drv_spi_t const * const p_instance)
)
CODE_FOR_SPI
(
NRF_SPI_Type * p_spi = p_instance->p_registers;
NRF_SPI_Type * p_spi = (NRF_SPI_Type * ) p_instance->p_registers;
if (p_cb->handler)
{
nrf_spi_int_disable(p_spi, DISABLE_ALL);
@ -352,6 +353,19 @@ static bool transfer_byte(NRF_SPI_Type * p_spi, spi_control_block_t * p_cb)
// see how the transfer is started in the 'nrf_drv_spi_transfer'
// function.
uint16_t bytes_used = p_cb->bytes_transferred + 1;
if (p_cb->abort)
{
if (bytes_used < p_cb->evt.data.done.tx_length)
{
p_cb->evt.data.done.tx_length = bytes_used;
}
if (bytes_used < p_cb->evt.data.done.rx_length)
{
p_cb->evt.data.done.rx_length = bytes_used;
}
}
if (bytes_used < p_cb->evt.data.done.tx_length)
{
nrf_spi_txd_set(p_spi, p_cb->evt.data.done.p_tx_buffer[bytes_used]);
@ -371,8 +385,8 @@ static void spi_xfer(NRF_SPI_Type * p_spi,
spi_control_block_t * p_cb,
nrf_drv_spi_xfer_desc_t const * p_xfer_desc)
{
p_cb->bytes_transferred = 0;
nrf_spi_int_disable(p_spi, NRF_SPI_INT_READY_MASK);
p_cb->bytes_transferred = 0;
nrf_spi_event_clear(p_spi, NRF_SPI_EVENT_READY);
@ -516,8 +530,8 @@ ret_code_t nrf_drv_spi_xfer(nrf_drv_spi_t const * const p_instance,
{
spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx];
ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED);
ASSERT(p_tx_buffer != NULL || tx_buffer_length == 0);
ASSERT(p_rx_buffer != NULL || rx_buffer_length == 0);
ASSERT(p_xfer_desc->p_tx_buffer != NULL || p_xfer_desc->tx_length == 0);
ASSERT(p_xfer_desc->p_rx_buffer != NULL || p_xfer_desc->rx_length == 0);
if (p_cb->transfer_in_progress)
{
@ -534,6 +548,7 @@ ret_code_t nrf_drv_spi_xfer(nrf_drv_spi_t const * const p_instance,
p_cb->evt.data.done = *p_xfer_desc;
p_cb->tx_done = false;
p_cb->rx_done = false;
p_cb->abort = false;
if (p_cb->ss_pin != NRF_DRV_SPI_PIN_NOT_USED)
{
@ -541,7 +556,7 @@ ret_code_t nrf_drv_spi_xfer(nrf_drv_spi_t const * const p_instance,
}
CODE_FOR_SPIM
(
return spim_xfer(p_instance->p_registers, p_cb, p_xfer_desc, flags);
return spim_xfer((NRF_SPIM_Type * ) p_instance->p_registers, p_cb, p_xfer_desc, flags);
)
CODE_FOR_SPI
(
@ -550,10 +565,28 @@ ret_code_t nrf_drv_spi_xfer(nrf_drv_spi_t const * const p_instance,
p_cb->transfer_in_progress = false;
return NRF_ERROR_NOT_SUPPORTED;
}
spi_xfer(p_instance->p_registers, p_cb, p_xfer_desc);
spi_xfer((NRF_SPI_Type * ) p_instance->p_registers, p_cb, p_xfer_desc);
return NRF_SUCCESS;
)
}
void nrf_drv_spi_abort(nrf_drv_spi_t const * p_instance)
{
spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx];
ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED);
CODE_FOR_SPIM
(
nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_STOP);
while (!nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_STOPPED)) {}
p_cb->transfer_in_progress = false;
)
CODE_FOR_SPI
(
p_cb->abort = true;
)
}
#ifdef SPIM_IN_USE
static void irq_handler_spim(NRF_SPIM_Type * p_spim, spi_control_block_t * p_cb)
{

View File

@ -363,6 +363,9 @@ uint32_t nrf_drv_spi_start_task_get(nrf_drv_spi_t const * p_instance);
* @return END event address.
*/
uint32_t nrf_drv_spi_end_event_get(nrf_drv_spi_t const * p_instance);
void nrf_drv_spi_abort(nrf_drv_spi_t const * p_instance);
#endif // NRF_DRV_SPI_H__
/** @} */

View File

@ -737,6 +737,12 @@ ret_code_t nrf_drv_twi_xfer(nrf_drv_twi_t const * p_instance,
return ret;
}
bool nrf_drv_twi_is_busy(nrf_drv_twi_t const * p_instance)
{
twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx];
return p_cb->busy;
}
ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * p_instance,
uint8_t address,
uint8_t const * p_data,

View File

@ -342,6 +342,16 @@ ret_code_t nrf_drv_twi_xfer(nrf_drv_twi_t const * p_instance,
nrf_drv_twi_xfer_desc_t const * p_xfer_desc,
uint32_t flags);
/**
* @brief Function for checking the TWI driver state.
*
* @param[in] p_instance TWI instance.
*
* @retval true If the TWI driver is currently busy performing a transfer.
* @retval false If the TWI driver is ready for a new transfer.
*/
bool nrf_drv_twi_is_busy(nrf_drv_twi_t const * p_instance);
/**
* @brief Function for getting the transferred data count.
*