I2C: Eliminate the I2C_WRITEREAD method

This commit is contained in:
Gregory Nutt 2016-01-26 10:23:09 -06:00
parent b64a45d667
commit c0fb4e34a7
8 changed files with 3 additions and 467 deletions

View File

@ -336,12 +336,6 @@ static int efm32_i2c_write(FAR struct i2c_dev_s *dev, const uint8_t * buffer,
static int efm32_i2c_read(FAR struct i2c_dev_s *dev, uint8_t * buffer,
int buflen);
#ifdef CONFIG_I2C_WRITEREAD
static int efm32_i2c_writeread(FAR struct i2c_dev_s *dev,
const uint8_t * wbuffer, int wbuflen,
uint8_t * buffer, int buflen);
#endif /* CONFIG_I2C_WRITEREAD */
#ifdef CONFIG_I2C_TRANSFER
static int efm32_i2c_transfer(FAR struct i2c_dev_s *dev,
FAR struct i2c_msg_s *msgs, int count);
@ -421,9 +415,6 @@ static const struct i2c_ops_s efm32_i2c_ops =
.setaddress = efm32_i2c_setaddress,
.write = efm32_i2c_write,
.read = efm32_i2c_read
#ifdef CONFIG_I2C_WRITEREAD
, .writeread = efm32_i2c_writeread
#endif
#ifdef CONFIG_I2C_TRANSFER
, .transfer = efm32_i2c_transfer
#endif
@ -1703,38 +1694,6 @@ int efm32_i2c_read(FAR struct i2c_dev_s *dev, uint8_t * buffer, int buflen)
return efm32_i2c_process(dev, &msgv, 1);
}
/****************************************************************************
* Name: efm32_i2c_writeread
*
* Description:
* Read then write I2C data
*
****************************************************************************/
#ifdef CONFIG_I2C_WRITEREAD
static int efm32_i2c_writeread(FAR struct i2c_dev_s *dev,
const uint8_t * wbuffer, int wbuflen,
uint8_t * buffer, int buflen)
{
struct i2c_msg_s msgv[2] =
{
{
.addr = ((struct efm32_i2c_inst_s *)dev)->address,
.flags = ((struct efm32_i2c_inst_s *)dev)->flags,
.buffer = (uint8_t *) wbuffer, /* This is really ugly, sorry const ... */
.length = wbuflen},
{
.addr = ((struct efm32_i2c_inst_s *)dev)->address,
.flags = ((struct efm32_i2c_inst_s *)dev)->flags |
((buflen > 0) ? I2C_M_READ : I2C_M_NORESTART),
.buffer = buffer,
.length = (buflen > 0) ? buflen : -buflen}
};
return efm32_i2c_process(dev, msgv, 2);
}
#endif
/****************************************************************************
* Name: efm32_i2c_transfer
*

View File

@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/sam34/sam_twi.c
*
* Copyright (C) 2013, 2015 Gregory Nutt. All rights reserved.
* Copyright (C) 2013, 2015-2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* References:
@ -195,10 +195,6 @@ static int twi_setaddress(FAR struct i2c_dev_s *dev, int addr, int nbits);
static int twi_write(FAR struct i2c_dev_s *dev, const uint8_t *buffer,
int buflen);
static int twi_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen);
#ifdef CONFIG_I2C_WRITEREAD
static int twi_writeread(FAR struct i2c_dev_s *inst, const uint8_t *wbuffer,
int wbuflen, uint8_t *rbuffer, int rbuflen);
#endif
#ifdef CONFIG_I2C_TRANSFER
static int twi_transfer(FAR struct i2c_dev_s *dev,
FAR struct i2c_msg_s *msgs, int count);
@ -234,9 +230,6 @@ struct i2c_ops_s g_twiops =
.setaddress = twi_setaddress,
.write = twi_write,
.read = twi_read,
#ifdef CONFIG_I2C_WRITEREAD
.writeread = twi_writeread,
#endif
#ifdef CONFIG_I2C_TRANSFER
.transfer = twi_transfer
#endif
@ -904,73 +897,6 @@ static int twi_read(FAR struct i2c_dev_s *dev, uint8_t *rbuffer, int rbuflen)
return ret;
}
/****************************************************************************
* Name: twi_writeread
*
* Description:
*
****************************************************************************/
#ifdef CONFIG_I2C_WRITEREAD
static int twi_writeread(FAR struct i2c_dev_s *dev, const uint8_t *wbuffer,
int wbuflen, uint8_t *rbuffer, int rbuflen)
{
struct twi_dev_s *priv = (struct twi_dev_s *)dev;
irqstate_t flags;
int ret;
struct i2c_msg_s msgv[2] =
{
{
.addr = priv->address,
.flags = priv->flags,
.buffer = (uint8_t *)wbuffer, /* Override const */
.length = wbuflen
},
{
.addr = priv->address,
.flags = priv->flags | ((rbuflen > 0) ? I2C_M_READ : I2C_M_NORESTART),
.buffer = rbuffer,
.length = (rbuflen < 0) ? -rbuflen : rbuflen
}
};
DEBUGASSERT(dev != NULL);
i2cvdbg("TWI%d wbuflen: %d rbuflen: %d\n", priv->twi, wbuflen, rbuflen);
/* Get exclusive access to the device */
twi_takesem(&priv->exclsem);
/* Initiate the read */
priv->msg = msgv;
priv->msgc = 2;
/* Initiate the write operation. The rest will be handled from interrupt
* logic. Interrupts must be disabled to prevent re-entrance from the
* interrupt level.
*/
flags = irqsave();
twi_startwrite(priv, msgv);
/* And wait for the write/read to complete. Interrupts will be re-enabled
* while we are waiting.
*/
ret = twi_wait(priv);
if (ret < 0)
{
i2cdbg("ERROR: Transfer failed: %d\n", ret);
}
irqrestore(flags);
twi_givesem(&priv->exclsem);
return ret;
}
#endif
/****************************************************************************
* Name: twi_setownaddress
*

View File

@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/sama5/sam_twi.c
*
* Copyright (C) 2013-2014 Gregory Nutt. All rights reserved.
* Copyright (C) 2013-2014, 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* References:
@ -242,10 +242,6 @@ static int twi_setaddress(FAR struct i2c_dev_s *dev, int addr, int nbits);
static int twi_write(FAR struct i2c_dev_s *dev, const uint8_t *buffer,
int buflen);
static int twi_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen);
#ifdef CONFIG_I2C_WRITEREAD
static int twi_writeread(FAR struct i2c_dev_s *inst, const uint8_t *wbuffer,
int wbuflen, uint8_t *rbuffer, int rbuflen);
#endif
#ifdef CONFIG_I2C_TRANSFER
static int twi_transfer(FAR struct i2c_dev_s *dev,
FAR struct i2c_msg_s *msgs, int count);
@ -332,9 +328,6 @@ struct i2c_ops_s g_twiops =
.setaddress = twi_setaddress,
.write = twi_write,
.read = twi_read,
#ifdef CONFIG_I2C_WRITEREAD
.writeread = twi_writeread,
#endif
#ifdef CONFIG_I2C_TRANSFER
.transfer = twi_transfer
#endif
@ -1018,83 +1011,6 @@ static int twi_read(FAR struct i2c_dev_s *dev, uint8_t *rbuffer, int rbuflen)
return ret;
}
/****************************************************************************
* Name: twi_writeread
*
* Description:
*
****************************************************************************/
#ifdef CONFIG_I2C_WRITEREAD
static int twi_writeread(FAR struct i2c_dev_s *dev, const uint8_t *wbuffer,
int wbuflen, uint8_t *rbuffer, int rbuflen)
{
struct twi_dev_s *priv = (struct twi_dev_s *)dev;
struct i2c_msg_s msgv[2];
irqstate_t flags;
int ret;
DEBUGASSERT(dev != NULL);
i2cvdbg("TWI%d wbuflen: %d rbuflen: %d\n", priv->attr->twi, wbuflen, rbuflen);
/* Format two messages: The first is a write */
msgv[0].addr = priv->address;
msgv[0].flags = priv->flags;
msgv[0].buffer = (uint8_t *)wbuffer; /* Override const */
msgv[0].length = wbuflen;
/* The second is either a read (rbuflen > 0) or a write (rbuflen <= 0) with
* no restart.
*/
if (rbuflen > 0)
{
msgv[1].flags = (priv->flags | I2C_M_READ);
}
else
{
msgv[1].flags = (priv->flags | I2C_M_NORESTART),
rbuflen = -rbuflen;
}
msgv[1].addr = priv->address;
msgv[1].buffer = rbuffer;
msgv[1].length = rbuflen;
/* Get exclusive access to the device */
twi_takesem(&priv->exclsem);
/* Perform the write-read */
priv->msg = msgv;
priv->msgc = 2;
/* Initiate the write operation. The rest will be handled from interrupt
* logic. Interrupts must be disabled to prevent re-entrance from the
* interrupt level.
*/
flags = irqsave();
twi_startwrite(priv, msgv);
/* And wait for the write/read to complete. Interrupts will be re-enabled
* while we are waiting.
*/
ret = twi_wait(priv, wbuflen + rbuflen);
if (ret < 0)
{
i2cdbg("ERROR: Transfer failed: %d\n", ret);
}
irqrestore(flags);
twi_givesem(&priv->exclsem);
return ret;
}
#endif
/****************************************************************************
* Name: twi_setownaddress
*

View File

@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/samv7/sam_twihs.c
*
* Copyright (C) 2015 Gregory Nutt. All rights reserved.
* Copyright (C) 2015-2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* This driver derives from the SAMA5Dx TWIHS driver. References:
@ -237,10 +237,6 @@ static int twi_setaddress(FAR struct i2c_dev_s *dev, int addr, int nbits);
static int twi_write(FAR struct i2c_dev_s *dev, const uint8_t *buffer,
int buflen);
static int twi_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen);
#ifdef CONFIG_I2C_WRITEREAD
static int twi_writeread(FAR struct i2c_dev_s *inst, const uint8_t *wbuffer,
int wbuflen, uint8_t *rbuffer, int rbuflen);
#endif
#ifdef CONFIG_I2C_TRANSFER
static int twi_transfer(FAR struct i2c_dev_s *dev,
FAR struct i2c_msg_s *msgs, int count);
@ -312,9 +308,6 @@ struct i2c_ops_s g_twiops =
.setaddress = twi_setaddress,
.write = twi_write,
.read = twi_read,
#ifdef CONFIG_I2C_WRITEREAD
.writeread = twi_writeread,
#endif
#ifdef CONFIG_I2C_TRANSFER
.transfer = twi_transfer
#endif
@ -1045,83 +1038,6 @@ static int twi_read(FAR struct i2c_dev_s *dev, uint8_t *rbuffer, int rbuflen)
return ret;
}
/****************************************************************************
* Name: twi_writeread
*
* Description:
*
****************************************************************************/
#ifdef CONFIG_I2C_WRITEREAD
static int twi_writeread(FAR struct i2c_dev_s *dev, const uint8_t *wbuffer,
int wbuflen, uint8_t *rbuffer, int rbuflen)
{
struct twi_dev_s *priv = (struct twi_dev_s *)dev;
struct i2c_msg_s msgv[2];
irqstate_t flags;
int ret;
DEBUGASSERT(dev != NULL);
i2cvdbg("TWIHS%d wbuflen: %d rbuflen: %d\n", priv->attr->twi, wbuflen, rbuflen);
/* Format two messages: The first is a write */
msgv[0].addr = priv->address;
msgv[0].flags = priv->flags;
msgv[0].buffer = (uint8_t *)wbuffer; /* Override const */
msgv[0].length = wbuflen;
/* The second is either a read (rbuflen > 0) or a write (rbuflen < 0) with
* no restart.
*/
if (rbuflen > 0)
{
msgv[1].flags = (priv->flags | I2C_M_READ);
}
else
{
msgv[1].flags = (priv->flags | I2C_M_NORESTART);
rbuflen = -rbuflen;
}
msgv[1].addr = priv->address;
msgv[1].buffer = rbuffer;
msgv[1].length = rbuflen;
/* Get exclusive access to the device */
twi_takesem(&priv->exclsem);
/* Initiate the read */
priv->msg = msgv;
priv->msgc = 2;
/* Initiate the write operation. The rest will be handled from interrupt
* logic. Interrupts must be disabled to prevent re-entrance from the
* interrupt level.
*/
flags = irqsave();
twi_startwrite(priv, msgv);
/* And wait for the write/read to complete. Interrupts will be re-enabled
* while we are waiting.
*/
ret = twi_wait(priv, wbuflen + rbuflen);
if (ret < 0)
{
i2cdbg("ERROR: Transfer failed: %d\n", ret);
}
irqrestore(flags);
twi_givesem(&priv->exclsem);
return ret;
}
#endif
/****************************************************************************
* Name: twi_setownaddress
*

View File

@ -357,12 +357,6 @@ static int stm32_i2c_write(FAR struct i2c_dev_s *dev, const uint8_t *buffer,
int buflen);
static int stm32_i2c_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen);
#ifdef CONFIG_I2C_WRITEREAD
static int stm32_i2c_writeread(FAR struct i2c_dev_s *dev,
const uint8_t *wbuffer, int wbuflen,
uint8_t *buffer, int buflen);
#endif /* CONFIG_I2C_WRITEREAD */
#ifdef CONFIG_I2C_TRANSFER
static int stm32_i2c_transfer(FAR struct i2c_dev_s *dev, FAR struct i2c_msg_s *msgs,
int count);
@ -488,9 +482,6 @@ static const struct i2c_ops_s stm32_i2c_ops =
.setaddress = stm32_i2c_setaddress,
.write = stm32_i2c_write,
.read = stm32_i2c_read
#ifdef CONFIG_I2C_WRITEREAD
, .writeread = stm32_i2c_writeread
#endif
#ifdef CONFIG_I2C_TRANSFER
, .transfer = stm32_i2c_transfer
#endif
@ -1913,42 +1904,6 @@ int stm32_i2c_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen)
return stm32_i2c_process(dev, &msgv, 1);
}
/************************************************************************************
* Name: stm32_i2c_writeread
*
* Description:
* Read then write I2C data
*
************************************************************************************/
#ifdef CONFIG_I2C_WRITEREAD
static int stm32_i2c_writeread(FAR struct i2c_dev_s *dev,
const uint8_t *wbuffer, int wbuflen,
uint8_t *buffer, int buflen)
{
stm32_i2c_sem_wait(dev); /* Ensure that address or flags don't change meanwhile */
struct i2c_msg_s msgv[2] =
{
{
.addr = ((struct stm32_i2c_inst_s *)dev)->address,
.flags = ((struct stm32_i2c_inst_s *)dev)->flags,
.buffer = (uint8_t *)wbuffer, /* This is really ugly, sorry const ... */
.length = wbuflen
},
{
.addr = ((struct stm32_i2c_inst_s *)dev)->address,
.flags = ((struct stm32_i2c_inst_s *)dev)->flags |
((buflen > 0) ? I2C_M_READ : I2C_M_NORESTART),
.buffer = buffer,
.length = (buflen > 0) ? buflen : -buflen
}
};
return stm32_i2c_process(dev, msgv, 2);
}
#endif
/************************************************************************************
* Name: stm32_i2c_transfer
*

View File

@ -386,12 +386,6 @@ static int stm32_i2c_write(FAR struct i2c_dev_s *dev, const uint8_t *buffer,
int buflen);
static int stm32_i2c_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen);
#ifdef CONFIG_I2C_WRITEREAD
static int stm32_i2c_writeread(FAR struct i2c_dev_s *dev,
const uint8_t *wbuffer, int wbuflen,
uint8_t *buffer, int buflen);
#endif /* CONFIG_I2C_WRITEREAD */
#ifdef CONFIG_I2C_TRANSFER
static int stm32_i2c_transfer(FAR struct i2c_dev_s *dev, FAR struct i2c_msg_s *msgs,
int count);
@ -496,9 +490,6 @@ static const struct i2c_ops_s stm32_i2c_ops =
.setaddress = stm32_i2c_setaddress,
.write = stm32_i2c_write,
.read = stm32_i2c_read
#ifdef CONFIG_I2C_WRITEREAD
, .writeread = stm32_i2c_writeread
#endif
#ifdef CONFIG_I2C_TRANSFER
, .transfer = stm32_i2c_transfer
#endif
@ -2357,42 +2348,6 @@ int stm32_i2c_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen)
return stm32_i2c_process(dev, &msgv, 1);
}
/************************************************************************************
* Name: stm32_i2c_writeread
*
* Description:
* Read then write I2C data
*
************************************************************************************/
#ifdef CONFIG_I2C_WRITEREAD
static int stm32_i2c_writeread(FAR struct i2c_dev_s *dev,
const uint8_t *wbuffer, int wbuflen,
uint8_t *buffer, int buflen)
{
stm32_i2c_sem_wait(dev); /* Ensure that address or flags don't change meanwhile */
struct i2c_msg_s msgv[2] =
{
{
.addr = ((struct stm32_i2c_inst_s *)dev)->address,
.flags = ((struct stm32_i2c_inst_s *)dev)->flags,
.buffer = (uint8_t *)wbuffer, /* This is really ugly, sorry const ... */
.length = wbuflen
},
{
.addr = ((struct stm32_i2c_inst_s *)dev)->address,
.flags = ((struct stm32_i2c_inst_s *)dev)->flags |
((buflen > 0) ? I2C_M_READ : I2C_M_NORESTART),
.buffer = buffer,
.length = (buflen > 0) ? buflen : -buflen
}
};
return stm32_i2c_process(dev, msgv, 2);
}
#endif
/************************************************************************************
* Name: stm32_i2c_transfer
*

View File

@ -342,11 +342,6 @@ static int stm32_i2c_process(FAR struct i2c_dev_s *dev, FAR struct i2c_msg_s *ms
static int stm32_i2c_write(FAR struct i2c_dev_s *dev, const uint8_t *buffer,
int buflen);
static int stm32_i2c_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen);
#ifdef CONFIG_I2C_WRITEREAD
static int stm32_i2c_writeread(FAR struct i2c_dev_s *dev,
const uint8_t *wbuffer, int wbuflen,
uint8_t *buffer, int buflen);
#endif
#ifdef CONFIG_I2C_TRANSFER
static int stm32_i2c_transfer(FAR struct i2c_dev_s *dev, FAR struct i2c_msg_s *msgs,
int count);
@ -451,9 +446,6 @@ struct i2c_ops_s stm32_i2c_ops =
.setaddress = stm32_i2c_setaddress,
.write = stm32_i2c_write,
.read = stm32_i2c_read
#ifdef CONFIG_I2C_WRITEREAD
, .writeread = stm32_i2c_writeread
#endif
#ifdef CONFIG_I2C_TRANSFER
, .transfer = stm32_i2c_transfer
#endif
@ -1912,42 +1904,6 @@ int stm32_i2c_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen)
return stm32_i2c_process(dev, &msgv, 1);
}
/************************************************************************************
* Name: stm32_i2c_writeread
*
* Description:
* Read then write I2C data
*
************************************************************************************/
#ifdef CONFIG_I2C_WRITEREAD
static int stm32_i2c_writeread(FAR struct i2c_dev_s *dev,
const uint8_t *wbuffer, int wbuflen,
uint8_t *buffer, int buflen)
{
stm32_i2c_sem_wait(dev); /* ensure that address or flags don't change meanwhile */
struct i2c_msg_s msgv[2] =
{
{
.addr = ((struct stm32_i2c_inst_s *)dev)->address,
.flags = ((struct stm32_i2c_inst_s *)dev)->flags,
.buffer = (uint8_t *)wbuffer, /* this is really ugly, sorry const ... */
.length = wbuflen
},
{
.addr = ((struct stm32_i2c_inst_s *)dev)->address,
.flags = ((struct stm32_i2c_inst_s *)dev)->flags |
((buflen > 0) ? I2C_M_READ : I2C_M_NORESTART),
.buffer = buffer,
.length = (buflen > 0) ? buflen : -buflen
}
};
return stm32_i2c_process(dev, msgv, 2);
}
#endif
/************************************************************************************
* Name: stm32_i2c_transfer
*

View File

@ -349,12 +349,6 @@ static int tiva_i2c_write(struct i2c_dev_s *dev, const uint8_t *buffer,
int buflen);
static int tiva_i2c_read(struct i2c_dev_s *dev, uint8_t *buffer, int buflen);
#ifdef CONFIG_I2C_WRITEREAD
static int tiva_i2c_writeread(struct i2c_dev_s *dev,
const uint8_t *wbuffer, int wbuflen,
uint8_t *buffer, int buflen);
#endif /* CONFIG_I2C_WRITEREAD */
#ifdef CONFIG_I2C_TRANSFER
static int tiva_i2c_transfer(struct i2c_dev_s *dev, struct i2c_msg_s *msgv,
int msgc);
@ -592,9 +586,6 @@ static const struct i2c_ops_s tiva_i2c_ops =
.setaddress = tiva_i2c_setaddress,
.write = tiva_i2c_write,
.read = tiva_i2c_read
#ifdef CONFIG_I2C_WRITEREAD
, .writeread = tiva_i2c_writeread
#endif
#ifdef CONFIG_I2C_TRANSFER
, .transfer = tiva_i2c_transfer
#endif
@ -2141,44 +2132,6 @@ int tiva_i2c_read(struct i2c_dev_s *dev, uint8_t *buffer, int buflen)
return tiva_i2c_process(dev, &msgv, 1);
}
/************************************************************************************
* Name: tiva_i2c_writeread
*
* Description:
* Read then write I2C data
*
************************************************************************************/
#ifdef CONFIG_I2C_WRITEREAD
static int tiva_i2c_writeread(struct i2c_dev_s *dev,
const uint8_t *wbuffer, int wbuflen,
uint8_t *buffer, int buflen)
{
struct tiva_i2c_inst_s *inst = (struct tiva_i2c_inst_s *)dev;
struct i2c_msg_s msgv[2] =
{
{
.addr = inst->address,
.flags = inst->flags,
.buffer = (uint8_t *)wbuffer, /* This is really ugly, sorry const ... */
.length = wbuflen
},
{
.addr = inst->address,
.flags = inst->flags | ((buflen > 0) ? I2C_M_READ : I2C_M_NORESTART),
.buffer = buffer,
.length = (buflen > 0) ? buflen : -buflen
}
};
DEBUGASSERT(inst && inst->priv && inst->priv->config);
i2cvdbg("I2C%d: wbuflen=%d buflen=%d\n", inst->priv->config->devno, wbuflen, buflen);
tiva_i2c_sem_wait(dev); /* Ensure that address or flags don't change meanwhile */
return tiva_i2c_process(dev, msgv, 2);
}
#endif
/************************************************************************************
* Name: tiva_i2c_transfer
*