nrf52_i2c: add support for I2C_M_NOSTART flags
This commit is contained in:
parent
df8139c59b
commit
0f1c026a16
@ -626,3 +626,11 @@ config NRF52_SPI_MASTER_WORKAROUND_1BYTE_TRANSFER
|
|||||||
Enable the workaround to fix SPI Master 1 byte transfer bug
|
Enable the workaround to fix SPI Master 1 byte transfer bug
|
||||||
which occurs in NRF52832 revision 1 and revision 2.
|
which occurs in NRF52832 revision 1 and revision 2.
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
|
menu "I2C Master Configuration"
|
||||||
|
|
||||||
|
config NRF52_I2C_MASTER_DISABLE_NOSTART
|
||||||
|
bool "Disable the I2C Master NOSTART flag support"
|
||||||
|
default n
|
||||||
|
|
||||||
|
endmenu
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include <nuttx/irq.h>
|
#include <nuttx/irq.h>
|
||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
#include <nuttx/semaphore.h>
|
#include <nuttx/semaphore.h>
|
||||||
|
#include <nuttx/kmalloc.h>
|
||||||
#include <arch/board/board.h>
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
#include "arm_arch.h"
|
#include "arm_arch.h"
|
||||||
@ -207,6 +208,9 @@ static int nrf52_i2c_transfer(FAR struct i2c_master_s *dev,
|
|||||||
FAR struct nrf52_i2c_priv_s *priv = (FAR struct nrf52_i2c_priv_s *)dev;
|
FAR struct nrf52_i2c_priv_s *priv = (FAR struct nrf52_i2c_priv_s *)dev;
|
||||||
uint32_t regval = 0;
|
uint32_t regval = 0;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
#ifndef CONFIG_NRF52_I2C_MASTER_DISABLE_NOSTART
|
||||||
|
uint8_t *pack_buf = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
ret = nxsem_wait(&priv->sem_excl);
|
ret = nxsem_wait(&priv->sem_excl);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -291,6 +295,56 @@ static int nrf52_i2c_transfer(FAR struct i2c_master_s *dev,
|
|||||||
|
|
||||||
if ((priv->flags & I2C_M_READ) == 0)
|
if ((priv->flags & I2C_M_READ) == 0)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_NRF52_I2C_MASTER_DISABLE_NOSTART
|
||||||
|
/* Check if we need to combine messages */
|
||||||
|
|
||||||
|
if (priv->msgc > 1)
|
||||||
|
{
|
||||||
|
if (priv->msgv[1].flags & I2C_M_NOSTART)
|
||||||
|
{
|
||||||
|
/* More than 2 messages not supported */
|
||||||
|
|
||||||
|
DEBUGASSERT(priv->msgc < 3);
|
||||||
|
|
||||||
|
/* Combine buffers */
|
||||||
|
|
||||||
|
pack_buf = kmm_malloc(priv->msgv[0].length +
|
||||||
|
priv->msgv[1].length);
|
||||||
|
if (pack_buf == NULL)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Combine messages */
|
||||||
|
|
||||||
|
memcpy(pack_buf, priv->msgv[0].buffer,
|
||||||
|
priv->msgv[0].length);
|
||||||
|
memcpy(pack_buf + priv->msgv[0].length,
|
||||||
|
priv->msgv[1].buffer, priv->msgv[1].length);
|
||||||
|
|
||||||
|
/* Use new buffer to transmit data */
|
||||||
|
|
||||||
|
priv->ptr = pack_buf;
|
||||||
|
priv->dcnt = priv->msgv[0].length + priv->msgv[1].length;
|
||||||
|
|
||||||
|
/* Next message */
|
||||||
|
|
||||||
|
priv->msgc -= 1;
|
||||||
|
priv->msgv += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (priv->msgc > 1)
|
||||||
|
{
|
||||||
|
if (priv->msgv[1].flags & I2C_M_NOSTART)
|
||||||
|
{
|
||||||
|
/* Not supported */
|
||||||
|
|
||||||
|
DEBUGASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Write TXD data pointer */
|
/* Write TXD data pointer */
|
||||||
|
|
||||||
regval = (uint32_t)priv->ptr;
|
regval = (uint32_t)priv->ptr;
|
||||||
@ -441,6 +495,13 @@ static int nrf52_i2c_transfer(FAR struct i2c_master_s *dev,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
errout:
|
errout:
|
||||||
|
#ifndef CONFIG_NRF52_I2C_MASTER_DISABLE_NOSTART
|
||||||
|
if (pack_buf != NULL)
|
||||||
|
{
|
||||||
|
kmm_free(pack_buf);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
nxsem_post(&priv->sem_excl);
|
nxsem_post(&priv->sem_excl);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user