mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 19:36:35 +08:00
drivers/: Check return from nxsem_wait_uninterruptible.
This commit is contained in:
@@ -140,9 +140,9 @@ static void comp_pollnotify(FAR struct comp_dev_s *dev,
|
|||||||
* Name: comp_semtake
|
* Name: comp_semtake
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void comp_semtake(FAR sem_t *sem)
|
static int comp_semtake(FAR sem_t *sem)
|
||||||
{
|
{
|
||||||
nxsem_wait_uninterruptible(sem);
|
return nxsem_wait_uninterruptible(sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -161,7 +161,12 @@ static int comp_poll(FAR struct file *filep, FAR struct pollfd *fds,
|
|||||||
|
|
||||||
/* Are we setting up the poll? Or tearing it down? */
|
/* Are we setting up the poll? Or tearing it down? */
|
||||||
|
|
||||||
comp_semtake(&dev->ad_sem);
|
ret = comp_semtake(&dev->ad_sem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (setup)
|
if (setup)
|
||||||
{
|
{
|
||||||
/* This is a request to set up the poll. Find an available
|
/* This is a request to set up the poll. Find an available
|
||||||
|
|||||||
@@ -129,9 +129,9 @@ static const struct ioexpander_ops_s g_pca9538_ops =
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void pca9538_lock(FAR struct pca9538_dev_s *pca)
|
static int pca9538_lock(FAR struct pca9538_dev_s *pca)
|
||||||
{
|
{
|
||||||
nxsem_wait_uninterruptible(&pca->exclsem);
|
return nxsem_wait_uninterruptible(&pca->exclsem);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define pca9538_unlock(p) nxsem_post(&(p)->exclsem)
|
#define pca9538_unlock(p) nxsem_post(&(p)->exclsem)
|
||||||
@@ -311,7 +311,12 @@ static int pca9538_direction(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9538_lock(pca);
|
ret = pca9538_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9538_setbit(pca, PCA9538_REG_CONFIG, pin,
|
ret = pca9538_setbit(pca, PCA9538_REG_CONFIG, pin,
|
||||||
(direction == IOEXPANDER_DIRECTION_IN));
|
(direction == IOEXPANDER_DIRECTION_IN));
|
||||||
pca9538_unlock(pca);
|
pca9538_unlock(pca);
|
||||||
@@ -349,7 +354,12 @@ static int pca9538_option(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9538_lock(pca);
|
ret = pca9538_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9538_setbit(pca, PCA9538_REG_POLINV, pin, ival);
|
ret = pca9538_setbit(pca, PCA9538_REG_POLINV, pin, ival);
|
||||||
pca9538_unlock(pca);
|
pca9538_unlock(pca);
|
||||||
}
|
}
|
||||||
@@ -382,7 +392,12 @@ static int pca9538_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9538_lock(pca);
|
ret = pca9538_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9538_setbit(pca, PCA9538_REG_OUTPUT, pin, value);
|
ret = pca9538_setbit(pca, PCA9538_REG_OUTPUT, pin, value);
|
||||||
pca9538_unlock(pca);
|
pca9538_unlock(pca);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -415,7 +430,12 @@ static int pca9538_readpin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9538_lock(pca);
|
ret = pca9538_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9538_getbit(pca, PCA9538_REG_INPUT, pin, value);
|
ret = pca9538_getbit(pca, PCA9538_REG_INPUT, pin, value);
|
||||||
pca9538_unlock(pca);
|
pca9538_unlock(pca);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -446,7 +466,12 @@ static int pca9538_readbuf(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9538_lock(pca);
|
ret = pca9538_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9538_getbit(pca, PCA9538_REG_OUTPUT, pin, value);
|
ret = pca9538_getbit(pca, PCA9538_REG_OUTPUT, pin, value);
|
||||||
pca9538_unlock(pca);
|
pca9538_unlock(pca);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -533,7 +558,11 @@ static int pca9538_multiwritepin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9538_lock(pca);
|
ret = pca9538_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Start by reading both registers, whatever the pins to change. We could
|
/* Start by reading both registers, whatever the pins to change. We could
|
||||||
* attempt to read one port only if all pins were on the same port, but
|
* attempt to read one port only if all pins were on the same port, but
|
||||||
@@ -617,7 +646,12 @@ static int pca9538_multireadpin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9538_lock(pca);
|
ret = pca9538_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9538_getmultibits(pca, PCA9538_REG_INPUT,
|
ret = pca9538_getmultibits(pca, PCA9538_REG_INPUT,
|
||||||
pins, values, count);
|
pins, values, count);
|
||||||
pca9538_unlock(pca);
|
pca9538_unlock(pca);
|
||||||
@@ -650,7 +684,12 @@ static int pca9538_multireadbuf(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9538_lock(pca);
|
ret = pca9538_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9538_getmultibits(pca, PCA9538_REG_OUTPUT,
|
ret = pca9538_getmultibits(pca, PCA9538_REG_OUTPUT,
|
||||||
pins, values, count);
|
pins, values, count);
|
||||||
pca9538_unlock(pca);
|
pca9538_unlock(pca);
|
||||||
@@ -687,10 +726,15 @@ static FAR void *pca9538_attach(FAR struct ioexpander_dev_s *dev,
|
|||||||
FAR struct pca9538_dev_s *pca = (FAR struct pca9538_dev_s *)dev;
|
FAR struct pca9538_dev_s *pca = (FAR struct pca9538_dev_s *)dev;
|
||||||
FAR void *handle = NULL;
|
FAR void *handle = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9538_lock(pca);
|
ret = pca9538_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Find and available in entry in the callback table */
|
/* Find and available in entry in the callback table */
|
||||||
|
|
||||||
@@ -822,7 +866,7 @@ static void pca9538_irqworker(void *arg)
|
|||||||
|
|
||||||
static int pca9538_interrupt(int irq, FAR void *context, FAR void *arg)
|
static int pca9538_interrupt(int irq, FAR void *context, FAR void *arg)
|
||||||
{
|
{
|
||||||
register FAR struct pca9538_dev_s *pca = (FAR struct pca9538_dev_s *)arg;
|
FAR struct pca9538_dev_s *pca = (FAR struct pca9538_dev_s *)arg;
|
||||||
|
|
||||||
/* In complex environments, we cannot do I2C transfers from the interrupt
|
/* In complex environments, we cannot do I2C transfers from the interrupt
|
||||||
* handler because semaphores are probably used to lock the I2C bus. In
|
* handler because semaphores are probably used to lock the I2C bus. In
|
||||||
|
|||||||
@@ -147,9 +147,9 @@ static const struct ioexpander_ops_s g_pca9555_ops =
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void pca9555_lock(FAR struct pca9555_dev_s *pca)
|
static int pca9555_lock(FAR struct pca9555_dev_s *pca)
|
||||||
{
|
{
|
||||||
nxsem_wait_uninterruptible(&pca->exclsem);
|
return nxsem_wait_uninterruptible(&pca->exclsem);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define pca9555_unlock(p) nxsem_post(&(p)->exclsem)
|
#define pca9555_unlock(p) nxsem_post(&(p)->exclsem)
|
||||||
@@ -202,7 +202,8 @@ static inline int pca9555_writeread(FAR struct pca9555_dev_s *pca,
|
|||||||
config.address = pca->config->address;
|
config.address = pca->config->address;
|
||||||
config.addrlen = 7;
|
config.addrlen = 7;
|
||||||
|
|
||||||
return i2c_writeread(pca->i2c, &config, wbuffer, wbuflen, rbuffer, rbuflen);
|
return i2c_writeread(pca->i2c, &config, wbuffer, wbuflen,
|
||||||
|
rbuffer, rbuflen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -338,7 +339,12 @@ static int pca9555_direction(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9555_lock(pca);
|
ret = pca9555_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9555_setbit(pca, PCA9555_REG_CONFIG, pin,
|
ret = pca9555_setbit(pca, PCA9555_REG_CONFIG, pin,
|
||||||
(direction == IOEXPANDER_DIRECTION_IN));
|
(direction == IOEXPANDER_DIRECTION_IN));
|
||||||
pca9555_unlock(pca);
|
pca9555_unlock(pca);
|
||||||
@@ -376,7 +382,12 @@ static int pca9555_option(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9555_lock(pca);
|
ret = pca9555_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9555_setbit(pca, PCA9555_REG_POLINV, pin, ival);
|
ret = pca9555_setbit(pca, PCA9555_REG_POLINV, pin, ival);
|
||||||
pca9555_unlock(pca);
|
pca9555_unlock(pca);
|
||||||
}
|
}
|
||||||
@@ -409,7 +420,12 @@ static int pca9555_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9555_lock(pca);
|
ret = pca9555_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9555_setbit(pca, PCA9555_REG_OUTPUT, pin, value);
|
ret = pca9555_setbit(pca, PCA9555_REG_OUTPUT, pin, value);
|
||||||
pca9555_unlock(pca);
|
pca9555_unlock(pca);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -419,14 +435,15 @@ static int pca9555_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
* Name: pca9555_readpin
|
* Name: pca9555_readpin
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Read the actual PIN level. This can be different from the last value written
|
* Read the actual PIN level. This can be different from the last value
|
||||||
* to this pin. Required.
|
* written to this pin. Required.
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* dev - Device-specific state data
|
* dev - Device-specific state data
|
||||||
* pin - The index of the pin
|
* pin - The index of the pin
|
||||||
* valptr - Pointer to a buffer where the pin level is stored. Usually TRUE
|
* valptr - Pointer to a buffer where the pin level is stored. Usually TRUE
|
||||||
* if the pin is high, except if OPTION_INVERT has been set on this pin.
|
* if the pin is high, except if OPTION_INVERT has been set on
|
||||||
|
* this pin.
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* 0 on success, else a negative error code
|
* 0 on success, else a negative error code
|
||||||
@@ -441,7 +458,12 @@ static int pca9555_readpin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9555_lock(pca);
|
ret = pca9555_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9555_getbit(pca, PCA9555_REG_INPUT, pin, value);
|
ret = pca9555_getbit(pca, PCA9555_REG_INPUT, pin, value);
|
||||||
pca9555_unlock(pca);
|
pca9555_unlock(pca);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -472,7 +494,12 @@ static int pca9555_readbuf(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9555_lock(pca);
|
ret = pca9555_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9555_getbit(pca, PCA9555_REG_OUTPUT, pin, value);
|
ret = pca9555_getbit(pca, PCA9555_REG_OUTPUT, pin, value);
|
||||||
pca9555_unlock(pca);
|
pca9555_unlock(pca);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -507,8 +534,8 @@ static int pca9555_getmultibits(FAR struct pca9555_dev_s *pca, uint8_t addr,
|
|||||||
#ifdef CONFIG_PCA9555_SHADOW_MODE
|
#ifdef CONFIG_PCA9555_SHADOW_MODE
|
||||||
/* Save the new register value in the shadow register */
|
/* Save the new register value in the shadow register */
|
||||||
|
|
||||||
pca->sreg[addr] = buf[0];
|
pca->sreg[addr] = buf[0];
|
||||||
pca->sreg[addr+1] = buf[1];
|
pca->sreg[addr + 1] = buf[1];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Read the requested bits */
|
/* Read the requested bits */
|
||||||
@@ -564,7 +591,11 @@ static int pca9555_multiwritepin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9555_lock(pca);
|
ret = pca9555_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Start by reading both registers, whatever the pins to change. We could
|
/* Start by reading both registers, whatever the pins to change. We could
|
||||||
* attempt to read one port only if all pins were on the same port, but
|
* attempt to read one port only if all pins were on the same port, but
|
||||||
@@ -582,7 +613,7 @@ static int pca9555_multiwritepin(FAR struct ioexpander_dev_s *dev,
|
|||||||
/* In Shadow-Mode we "read" the pin status from the shadow registers */
|
/* In Shadow-Mode we "read" the pin status from the shadow registers */
|
||||||
|
|
||||||
buf[1] = pca->sreg[addr];
|
buf[1] = pca->sreg[addr];
|
||||||
buf[2] = pca->sreg[addr+1];
|
buf[2] = pca->sreg[addr + 1];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Apply the user defined changes */
|
/* Apply the user defined changes */
|
||||||
@@ -617,8 +648,9 @@ static int pca9555_multiwritepin(FAR struct ioexpander_dev_s *dev,
|
|||||||
buf[0] = addr;
|
buf[0] = addr;
|
||||||
#ifdef CONFIG_PCA9555_SHADOW_MODE
|
#ifdef CONFIG_PCA9555_SHADOW_MODE
|
||||||
/* Save the new register values in the shadow register */
|
/* Save the new register values in the shadow register */
|
||||||
pca->sreg[addr] = buf[1];
|
|
||||||
pca->sreg[addr+1] = buf[2];
|
pca->sreg[addr] = buf[1];
|
||||||
|
pca->sreg[addr + 1] = buf[2];
|
||||||
#endif
|
#endif
|
||||||
ret = pca9555_write(pca, buf, 3);
|
ret = pca9555_write(pca, buf, 3);
|
||||||
|
|
||||||
@@ -652,7 +684,12 @@ static int pca9555_multireadpin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9555_lock(pca);
|
ret = pca9555_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9555_getmultibits(pca, PCA9555_REG_INPUT,
|
ret = pca9555_getmultibits(pca, PCA9555_REG_INPUT,
|
||||||
pins, values, count);
|
pins, values, count);
|
||||||
pca9555_unlock(pca);
|
pca9555_unlock(pca);
|
||||||
@@ -663,8 +700,8 @@ static int pca9555_multireadpin(FAR struct ioexpander_dev_s *dev,
|
|||||||
* Name: pca9555_multireadbuf
|
* Name: pca9555_multireadbuf
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Read the buffered level of multiple pins. This routine may be faster than
|
* Read the buffered level of multiple pins. This routine may be faster
|
||||||
* individual pin accesses. Optional.
|
* than individual pin accesses. Optional.
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* dev - Device-specific state data
|
* dev - Device-specific state data
|
||||||
@@ -685,7 +722,12 @@ static int pca9555_multireadbuf(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9555_lock(pca);
|
ret = pca9555_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = pca9555_getmultibits(pca, PCA9555_REG_OUTPUT,
|
ret = pca9555_getmultibits(pca, PCA9555_REG_OUTPUT,
|
||||||
pins, values, count);
|
pins, values, count);
|
||||||
pca9555_unlock(pca);
|
pca9555_unlock(pca);
|
||||||
@@ -722,27 +764,32 @@ static FAR void *pca9555_attach(FAR struct ioexpander_dev_s *dev,
|
|||||||
FAR struct pca9555_dev_s *pca = (FAR struct pca9555_dev_s *)dev;
|
FAR struct pca9555_dev_s *pca = (FAR struct pca9555_dev_s *)dev;
|
||||||
FAR void *handle = NULL;
|
FAR void *handle = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access to the PCA555 */
|
/* Get exclusive access to the PCA555 */
|
||||||
|
|
||||||
pca9555_lock(pca);
|
ret = pca9555_lock(pca);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Find and available in entry in the callback table */
|
/* Find and available in entry in the callback table */
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_PCA9555_INT_NCALLBACKS; i++)
|
for (i = 0; i < CONFIG_PCA9555_INT_NCALLBACKS; i++)
|
||||||
{
|
{
|
||||||
/* Is this entry available (i.e., no callback attached) */
|
/* Is this entry available (i.e., no callback attached) */
|
||||||
|
|
||||||
if (pca->cb[i].cbfunc == NULL)
|
if (pca->cb[i].cbfunc == NULL)
|
||||||
{
|
{
|
||||||
/* Yes.. use this entry */
|
/* Yes.. use this entry */
|
||||||
|
|
||||||
pca->cb[i].pinset = pinset;
|
pca->cb[i].pinset = pinset;
|
||||||
pca->cb[i].cbfunc = callback;
|
pca->cb[i].cbfunc = callback;
|
||||||
pca->cb[i].cbarg = arg;
|
pca->cb[i].cbarg = arg;
|
||||||
handle = &pca->cb[i];
|
handle = &pca->cb[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add this callback to the table */
|
/* Add this callback to the table */
|
||||||
@@ -769,11 +816,13 @@ static FAR void *pca9555_attach(FAR struct ioexpander_dev_s *dev,
|
|||||||
static int pca9555_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle)
|
static int pca9555_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle)
|
||||||
{
|
{
|
||||||
FAR struct pca9555_dev_s *pca = (FAR struct pca9555_dev_s *)dev;
|
FAR struct pca9555_dev_s *pca = (FAR struct pca9555_dev_s *)dev;
|
||||||
FAR struct pca9555_callback_s *cb = (FAR struct pca9555_callback_s *)handle;
|
FAR struct pca9555_callback_s *cb =
|
||||||
|
(FAR struct pca9555_callback_s *)handle;
|
||||||
|
|
||||||
DEBUGASSERT(pca != NULL && cb != NULL);
|
DEBUGASSERT(pca != NULL && cb != NULL);
|
||||||
DEBUGASSERT((uintptr_t)cb >= (uintptr_t)&pca->cb[0] &&
|
DEBUGASSERT((uintptr_t)cb >= (uintptr_t)&pca->cb[0] &&
|
||||||
(uintptr_t)cb <= (uintptr_t)&pca->cb[CONFIG_TCA64XX_INT_NCALLBACKS-1]);
|
(uintptr_t)cb <=
|
||||||
|
(uintptr_t)&pca->cb[CONFIG_TCA64XX_INT_NCALLBACKS - 1]);
|
||||||
UNUSED(pca);
|
UNUSED(pca);
|
||||||
|
|
||||||
cb->pinset = 0;
|
cb->pinset = 0;
|
||||||
@@ -808,8 +857,8 @@ static void pca9555_irqworker(void *arg)
|
|||||||
#ifdef CONFIG_PCA9555_SHADOW_MODE
|
#ifdef CONFIG_PCA9555_SHADOW_MODE
|
||||||
/* Don't forget to update the shadow registers at this point */
|
/* Don't forget to update the shadow registers at this point */
|
||||||
|
|
||||||
pca->sreg[addr] = buf[0];
|
pca->sreg[addr] = buf[0];
|
||||||
pca->sreg[addr+1] = buf[1];
|
pca->sreg[addr + 1] = buf[1];
|
||||||
#endif
|
#endif
|
||||||
/* Create a 16-bit pinset */
|
/* Create a 16-bit pinset */
|
||||||
|
|
||||||
@@ -855,7 +904,7 @@ static void pca9555_irqworker(void *arg)
|
|||||||
|
|
||||||
static int pca9555_interrupt(int irq, FAR void *context, FAR void *arg)
|
static int pca9555_interrupt(int irq, FAR void *context, FAR void *arg)
|
||||||
{
|
{
|
||||||
register FAR struct pca9555_dev_s *pca = (FAR struct pca9555_dev_s*)arg;
|
FAR struct pca9555_dev_s *pca = (FAR struct pca9555_dev_s *)arg;
|
||||||
|
|
||||||
/* In complex environments, we cannot do I2C transfers from the interrupt
|
/* In complex environments, we cannot do I2C transfers from the interrupt
|
||||||
* handler because semaphores are probably used to lock the I2C bus. In
|
* handler because semaphores are probably used to lock the I2C bus. In
|
||||||
@@ -896,8 +945,9 @@ static int pca9555_interrupt(int irq, FAR void *context, FAR void *arg)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
FAR struct ioexpander_dev_s *pca9555_initialize(FAR struct i2c_master_s *i2cdev,
|
FAR struct ioexpander_dev_s *pca9555_initialize(
|
||||||
FAR struct pca9555_config_s *config)
|
FAR struct i2c_master_s *i2cdev,
|
||||||
|
FAR struct pca9555_config_s *config)
|
||||||
{
|
{
|
||||||
FAR struct pca9555_dev_s *pcadev;
|
FAR struct pca9555_dev_s *pcadev;
|
||||||
|
|
||||||
@@ -906,7 +956,8 @@ FAR struct ioexpander_dev_s *pca9555_initialize(FAR struct i2c_master_s *i2cdev,
|
|||||||
#ifdef CONFIG_PCA9555_MULTIPLE
|
#ifdef CONFIG_PCA9555_MULTIPLE
|
||||||
/* Allocate the device state structure */
|
/* Allocate the device state structure */
|
||||||
|
|
||||||
pcadev = (FAR struct pca9555_dev_s *)kmm_zalloc(sizeof(struct pca9555_dev_s));
|
pcadev = (FAR struct pca9555_dev_s *)
|
||||||
|
kmm_zalloc(sizeof(struct pca9555_dev_s));
|
||||||
if (!pcadev)
|
if (!pcadev)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -31,8 +31,7 @@
|
|||||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
********************************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Included Files
|
* Included Files
|
||||||
@@ -71,8 +70,9 @@
|
|||||||
|
|
||||||
/* PCF8574xx Helpers */
|
/* PCF8574xx Helpers */
|
||||||
|
|
||||||
static void pcf8574_lock(FAR struct pcf8574_dev_s *priv);
|
static int pcf8574_lock(FAR struct pcf8574_dev_s *priv);
|
||||||
static int pcf8574_read(FAR struct pcf8574_dev_s *priv, FAR uint8_t *portval);
|
static int pcf8574_read(FAR struct pcf8574_dev_s *priv,
|
||||||
|
FAR uint8_t *portval);
|
||||||
static int pcf8574_write(struct pcf8574_dev_s *priv, uint8_t portval);
|
static int pcf8574_write(struct pcf8574_dev_s *priv, uint8_t portval);
|
||||||
|
|
||||||
/* I/O Expander Methods */
|
/* I/O Expander Methods */
|
||||||
@@ -94,7 +94,8 @@ static int pcf8574_multireadpin(FAR struct ioexpander_dev_s *dev,
|
|||||||
#ifdef CONFIG_IOEXPANDER_INT_ENABLE
|
#ifdef CONFIG_IOEXPANDER_INT_ENABLE
|
||||||
static FAR void *pcf8574_attach(FAR struct ioexpander_dev_s *dev,
|
static FAR void *pcf8574_attach(FAR struct ioexpander_dev_s *dev,
|
||||||
ioe_pinset_t pinset, ioe_callback_t callback, FAR void *arg);
|
ioe_pinset_t pinset, ioe_callback_t callback, FAR void *arg);
|
||||||
static int pcf8574_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle);
|
static int pcf8574_detach(FAR struct ioexpander_dev_s *dev,
|
||||||
|
FAR void *handle);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PCF8574_INT_ENABLE
|
#ifdef CONFIG_PCF8574_INT_ENABLE
|
||||||
@@ -151,9 +152,9 @@ static const struct ioexpander_ops_s g_pcf8574_ops =
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void pcf8574_lock(FAR struct pcf8574_dev_s *priv)
|
static int pcf8574_lock(FAR struct pcf8574_dev_s *priv)
|
||||||
{
|
{
|
||||||
nxsem_wait_uninterruptible(&priv->exclsem);
|
return nxsem_wait_uninterruptible(&priv->exclsem);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define pcf8574_unlock(p) nxsem_post(&(p)->exclsem)
|
#define pcf8574_unlock(p) nxsem_post(&(p)->exclsem)
|
||||||
@@ -265,7 +266,11 @@ static int pcf8574_direction(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
pcf8574_lock(priv);
|
ret = pcf8574_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set a bit in inpins if the pin is an input. Clear the bit in
|
/* Set a bit in inpins if the pin is an input. Clear the bit in
|
||||||
* inpins if the pin is an output.
|
* inpins if the pin is an output.
|
||||||
@@ -331,7 +336,12 @@ static int pcf8574_option(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
ioe_pinset_t bit = ((ioe_pinset_t)1 << pin);
|
ioe_pinset_t bit = ((ioe_pinset_t)1 << pin);
|
||||||
|
|
||||||
ret = OK;
|
ret = OK;
|
||||||
pcf8574_lock(priv);
|
ret = pcf8574_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
switch (ival)
|
switch (ival)
|
||||||
{
|
{
|
||||||
case IOEXPANDER_VAL_HIGH: /* Interrupt on high level */
|
case IOEXPANDER_VAL_HIGH: /* Interrupt on high level */
|
||||||
@@ -408,7 +418,11 @@ static int pcf8574_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
pcf8574_lock(priv);
|
ret = pcf8574_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Make sure that this is an output pin */
|
/* Make sure that this is an output pin */
|
||||||
|
|
||||||
@@ -444,8 +458,8 @@ static int pcf8574_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
* Name: pcf8574_readpin
|
* Name: pcf8574_readpin
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Read the actual PIN level. This can be different from the last value written
|
* Read the actual PIN level. This can be different from the last value
|
||||||
* to this pin. Required.
|
* written to this pin. Required.
|
||||||
*
|
*
|
||||||
* The PCF8574 is 'interesting' in that it doesn't really have a data
|
* The PCF8574 is 'interesting' in that it doesn't really have a data
|
||||||
* direction register, but instead the outputs are current-limited when
|
* direction register, but instead the outputs are current-limited when
|
||||||
@@ -458,7 +472,8 @@ static int pcf8574_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
* dev - Device-specific state data
|
* dev - Device-specific state data
|
||||||
* pin - The index of the pin
|
* pin - The index of the pin
|
||||||
* valptr - Pointer to a buffer where the pin level is stored. Usually TRUE
|
* valptr - Pointer to a buffer where the pin level is stored. Usually TRUE
|
||||||
* if the pin is high, except if OPTION_INVERT has been set on this pin.
|
* if the pin is high, except if OPTION_INVERT has been set on
|
||||||
|
* this pin.
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* 0 on success, else a negative error code
|
* 0 on success, else a negative error code
|
||||||
@@ -472,13 +487,18 @@ static int pcf8574_readpin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
uint8_t regval;
|
uint8_t regval;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(priv != NULL && priv->config != NULL && pin < 8 && value != NULL);
|
DEBUGASSERT(priv != NULL && priv->config != NULL &&
|
||||||
|
pin < 8 && value != NULL);
|
||||||
|
|
||||||
gpioinfo("I2C addr=%02x, pin=%u\n", priv->config->address, pin);
|
gpioinfo("I2C addr=%02x, pin=%u\n", priv->config->address, pin);
|
||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
pcf8574_lock(priv);
|
ret = pcf8574_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Is the pin an output? */
|
/* Is the pin an output? */
|
||||||
|
|
||||||
@@ -558,7 +578,11 @@ static int pcf8574_multiwritepin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
pcf8574_lock(priv);
|
ret = pcf8574_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Process each pin setting */
|
/* Process each pin setting */
|
||||||
|
|
||||||
@@ -635,7 +659,11 @@ static int pcf8574_multireadpin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
pcf8574_lock(priv);
|
ret = pcf8574_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the input register for this pin
|
/* Read the input register for this pin
|
||||||
*
|
*
|
||||||
@@ -719,27 +747,32 @@ static FAR void *pcf8574_attach(FAR struct ioexpander_dev_s *dev,
|
|||||||
FAR struct pcf8574_dev_s *priv = (FAR struct pcf8574_dev_s *)dev;
|
FAR struct pcf8574_dev_s *priv = (FAR struct pcf8574_dev_s *)dev;
|
||||||
FAR void *handle = NULL;
|
FAR void *handle = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
pcf8574_lock(priv);
|
ret = pcf8574_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Find and available in entry in the callback table */
|
/* Find and available in entry in the callback table */
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_PCF8574_INT_NCALLBACKS; i++)
|
for (i = 0; i < CONFIG_PCF8574_INT_NCALLBACKS; i++)
|
||||||
{
|
{
|
||||||
/* Is this entry available (i.e., no callback attached) */
|
/* Is this entry available (i.e., no callback attached) */
|
||||||
|
|
||||||
if (priv->cb[i].cbfunc == NULL)
|
if (priv->cb[i].cbfunc == NULL)
|
||||||
{
|
{
|
||||||
/* Yes.. use this entry */
|
/* Yes.. use this entry */
|
||||||
|
|
||||||
priv->cb[i].pinset = pinset;
|
priv->cb[i].pinset = pinset;
|
||||||
priv->cb[i].cbfunc = callback;
|
priv->cb[i].cbfunc = callback;
|
||||||
priv->cb[i].cbarg = arg;
|
priv->cb[i].cbarg = arg;
|
||||||
handle = &priv->cb[i];
|
handle = &priv->cb[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pcf8574_unlock(priv);
|
pcf8574_unlock(priv);
|
||||||
@@ -766,11 +799,13 @@ static FAR void *pcf8574_attach(FAR struct ioexpander_dev_s *dev,
|
|||||||
static int pcf8574_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle)
|
static int pcf8574_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle)
|
||||||
{
|
{
|
||||||
FAR struct pcf8574_dev_s *priv = (FAR struct pcf8574_dev_s *)dev;
|
FAR struct pcf8574_dev_s *priv = (FAR struct pcf8574_dev_s *)dev;
|
||||||
FAR struct pcf8574_callback_s *cb = (FAR struct pcf8574_callback_s *)handle;
|
FAR struct pcf8574_callback_s *cb =
|
||||||
|
(FAR struct pcf8574_callback_s *)handle;
|
||||||
|
|
||||||
DEBUGASSERT(priv != NULL && cb != NULL);
|
DEBUGASSERT(priv != NULL && cb != NULL);
|
||||||
DEBUGASSERT((uintptr_t)cb >= (uintptr_t)&priv->cb[0] &&
|
DEBUGASSERT((uintptr_t)cb >= (uintptr_t)&priv->cb[0] &&
|
||||||
(uintptr_t)cb <= (uintptr_t)&priv->cb[CONFIG_PCF8574_INT_NCALLBACKS-1]);
|
(uintptr_t)cb <=
|
||||||
|
(uintptr_t)&priv->cb[CONFIG_PCF8574_INT_NCALLBACKS - 1]);
|
||||||
UNUSED(priv);
|
UNUSED(priv);
|
||||||
|
|
||||||
cb->pinset = 0;
|
cb->pinset = 0;
|
||||||
@@ -905,7 +940,12 @@ static void pcf8574_irqworker(void *arg)
|
|||||||
|
|
||||||
/* Check for pending interrupts */
|
/* Check for pending interrupts */
|
||||||
|
|
||||||
pcf8574_lock(priv);
|
ret = pcf8574_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
pcf8574_register_update(priv);
|
pcf8574_register_update(priv);
|
||||||
|
|
||||||
/* Sample and clear the pending interrupts. */
|
/* Sample and clear the pending interrupts. */
|
||||||
@@ -943,7 +983,8 @@ static void pcf8574_irqworker(void *arg)
|
|||||||
/* Re-start the poll timer */
|
/* Re-start the poll timer */
|
||||||
|
|
||||||
sched_lock();
|
sched_lock();
|
||||||
ret = wd_start(priv->wdog, PCF8574_POLLDELAY, (wdentry_t)pcf8574_poll_expiry,
|
ret = wd_start(priv->wdog, PCF8574_POLLDELAY,
|
||||||
|
(wdentry_t)pcf8574_poll_expiry,
|
||||||
1, (wdparm_t)priv);
|
1, (wdparm_t)priv);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
@@ -1059,8 +1100,8 @@ static void pcf8574_poll_expiry(int argc, wdparm_t arg1, ...)
|
|||||||
* Name: pcf8574_initialize
|
* Name: pcf8574_initialize
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Instantiate and configure the PCF8574xx device driver to use the provided
|
* Instantiate and configure the PCF8574xx device driver to use the
|
||||||
* I2C device instance.
|
* provided I2C device instance.
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* i2c - An I2C driver instance
|
* i2c - An I2C driver instance
|
||||||
@@ -1073,7 +1114,7 @@ static void pcf8574_poll_expiry(int argc, wdparm_t arg1, ...)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
FAR struct ioexpander_dev_s *pcf8574_initialize(FAR struct i2c_master_s *i2c,
|
FAR struct ioexpander_dev_s *pcf8574_initialize(FAR struct i2c_master_s *i2c,
|
||||||
FAR struct pcf8574_config_s *config)
|
FAR struct pcf8574_config_s *config)
|
||||||
{
|
{
|
||||||
FAR struct pcf8574_dev_s *priv;
|
FAR struct pcf8574_dev_s *priv;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -1081,7 +1122,8 @@ FAR struct ioexpander_dev_s *pcf8574_initialize(FAR struct i2c_master_s *i2c,
|
|||||||
#ifdef CONFIG_PCF8574_MULTIPLE
|
#ifdef CONFIG_PCF8574_MULTIPLE
|
||||||
/* Allocate the device state structure */
|
/* Allocate the device state structure */
|
||||||
|
|
||||||
priv = (FAR struct pcf8574_dev_s *)kmm_zalloc(sizeof(struct pcf8574_dev_s));
|
priv = (FAR struct pcf8574_dev_s *)
|
||||||
|
kmm_zalloc(sizeof(struct pcf8574_dev_s));
|
||||||
if (!priv)
|
if (!priv)
|
||||||
{
|
{
|
||||||
gpioerr("ERROR: Failed to allocate driver instance\n");
|
gpioerr("ERROR: Failed to allocate driver instance\n");
|
||||||
@@ -1112,7 +1154,8 @@ FAR struct ioexpander_dev_s *pcf8574_initialize(FAR struct i2c_master_s *i2c,
|
|||||||
priv->wdog = wd_create();
|
priv->wdog = wd_create();
|
||||||
DEBUGASSERT(priv->wdog != NULL);
|
DEBUGASSERT(priv->wdog != NULL);
|
||||||
|
|
||||||
ret = wd_start(priv->wdog, PCF8574_POLLDELAY, (wdentry_t)pcf8574_poll_expiry,
|
ret = wd_start(priv->wdog, PCF8574_POLLDELAY,
|
||||||
|
(wdentry_t)pcf8574_poll_expiry,
|
||||||
1, (wdparm_t)priv);
|
1, (wdparm_t)priv);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -65,9 +65,8 @@
|
|||||||
|
|
||||||
struct skel_callback_s
|
struct skel_callback_s
|
||||||
{
|
{
|
||||||
ioe_pinset_t pinset; /* Set of pin interrupts that will generate
|
ioe_pinset_t pinset; /* Set of pin interrupts that will generate the callback */
|
||||||
* the callback. */
|
ioe_callback_t cbfunc; /* The saved callback function pointer */
|
||||||
ioe_callback_t cbfunc; /* The saved callback function pointer */
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -75,19 +74,18 @@ struct skel_callback_s
|
|||||||
|
|
||||||
struct skel_dev_s
|
struct skel_dev_s
|
||||||
{
|
{
|
||||||
struct ioexpander_dev_s dev; /* Nested structure to allow casting as public gpio
|
struct ioexpander_dev_s dev; /* Nested structure to allow casting as public gpio expander */
|
||||||
* expander. */
|
|
||||||
#ifdef CONFIG_skeleton_MULTIPLE
|
#ifdef CONFIG_skeleton_MULTIPLE
|
||||||
FAR struct skel_dev_s *flink; /* Supports a singly linked list of drivers */
|
FAR struct skel_dev_s *flink; /* Supports a singly linked list of drivers */
|
||||||
#endif
|
#endif
|
||||||
sem_t exclsem; /* Mutual exclusion */
|
sem_t exclsem; /* Mutual exclusion */
|
||||||
|
|
||||||
#ifdef CONFIG_IOEXPANDER_INT_ENABLE
|
#ifdef CONFIG_IOEXPANDER_INT_ENABLE
|
||||||
struct work_s work; /* Supports the interrupt handling "bottom half" */
|
struct work_s work; /* Supports the interrupt handling "bottom half" */
|
||||||
|
|
||||||
/* Saved callback information for each I/O expander client */
|
/* Saved callback information for each I/O expander client */
|
||||||
|
|
||||||
struct skel_callback_s cb[CONFIG_skeleton_INT_NCALLBACKS];
|
struct skel_callback_s cb[CONFIG_SKELETON_INT_NCALLBACKS];
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -95,7 +93,7 @@ struct skel_dev_s
|
|||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void skel_lock(FAR struct skel_dev_s *priv);
|
static int skel_lock(FAR struct skel_dev_s *priv);
|
||||||
|
|
||||||
static int skel_direction(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
static int skel_direction(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
||||||
int dir);
|
int dir);
|
||||||
@@ -166,9 +164,9 @@ static const struct ioexpander_ops_s g_skel_ops =
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void skel_lock(FAR struct skel_dev_s *priv)
|
static int skel_lock(FAR struct skel_dev_s *priv)
|
||||||
{
|
{
|
||||||
nxsem_wait_uninterruptible(&priv->exclsem);
|
return nxsem_wait_uninterruptible(&priv->exclsem);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define skel_unlock(p) nxsem_post(&(p)->exclsem)
|
#define skel_unlock(p) nxsem_post(&(p)->exclsem)
|
||||||
@@ -204,7 +202,11 @@ static int skel_direction(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
skel_lock(priv);
|
ret = skel_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the pin direction in the I/O Expander */
|
/* Set the pin direction in the I/O Expander */
|
||||||
#warning Missing logic
|
#warning Missing logic
|
||||||
@@ -248,7 +250,11 @@ static int skel_option(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
{
|
{
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
skel_lock(priv);
|
ret = skel_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the pin option */
|
/* Set the pin option */
|
||||||
#warning Missing logic
|
#warning Missing logic
|
||||||
@@ -288,7 +294,11 @@ static int skel_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
skel_lock(priv);
|
ret = skel_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Write the pin value */
|
/* Write the pin value */
|
||||||
#warning Missing logic
|
#warning Missing logic
|
||||||
@@ -301,14 +311,15 @@ static int skel_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
* Name: skel_readpin
|
* Name: skel_readpin
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Read the actual PIN level. This can be different from the last value written
|
* Read the actual PIN level. This can be different from the last value
|
||||||
* to this pin. Required.
|
* written to this pin. Required.
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* dev - Device-specific state data
|
* dev - Device-specific state data
|
||||||
* pin - The index of the pin
|
* pin - The index of the pin
|
||||||
* valptr - Pointer to a buffer where the pin level is stored. Usually TRUE
|
* valptr - Pointer to a buffer where the pin level is stored. Usually TRUE
|
||||||
* if the pin is high, except if OPTION_INVERT has been set on this pin.
|
* if the pin is high, except if OPTION_INVERT has been set on
|
||||||
|
* this pin.
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* 0 on success, else a negative error code
|
* 0 on success, else a negative error code
|
||||||
@@ -323,11 +334,16 @@ static int skel_readpin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
gpioinfo("pin=%u\n", priv->addr);
|
gpioinfo("pin=%u\n", priv->addr);
|
||||||
|
|
||||||
DEBUGASSERT(priv != NULL && pin < CONFIG_IOEXPANDER_NPINS && value != NULL);
|
DEBUGASSERT(priv != NULL && pin < CONFIG_IOEXPANDER_NPINS &&
|
||||||
|
value != NULL);
|
||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
skel_lock(priv);
|
ret = skel_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the pin value */
|
/* Read the pin value */
|
||||||
#warning Missing logic
|
#warning Missing logic
|
||||||
@@ -364,7 +380,11 @@ static int skel_readbuf(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
skel_lock(priv);
|
ret = skel_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the buffered pin level */
|
/* Read the buffered pin level */
|
||||||
#warning Missing logic
|
#warning Missing logic
|
||||||
@@ -440,7 +460,11 @@ static int skel_multiwritepin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
skel_lock(priv);
|
ret = skel_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the pinset from the IO-Expander hardware */
|
/* Read the pinset from the IO-Expander hardware */
|
||||||
#warning Missing logic
|
#warning Missing logic
|
||||||
@@ -505,7 +529,12 @@ static int skel_multireadpin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
skel_lock(priv);
|
ret = skel_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = skel_getmultibits(priv, pins, values, count);
|
ret = skel_getmultibits(priv, pins, values, count);
|
||||||
skel_unlock(priv);
|
skel_unlock(priv);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -516,8 +545,8 @@ static int skel_multireadpin(FAR struct ioexpander_dev_s *dev,
|
|||||||
* Name: skel_multireadbuf
|
* Name: skel_multireadbuf
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Read the buffered level of multiple pins. This routine may be faster than
|
* Read the buffered level of multiple pins. This routine may be faster
|
||||||
* individual pin accesses. Optional.
|
* than individual pin accesses. Optional.
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* dev - Device-specific state data
|
* dev - Device-specific state data
|
||||||
@@ -543,7 +572,12 @@ static int skel_multireadbuf(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
skel_lock(priv);
|
ret = skel_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = skel_getmultibits(priv, pins, values, count);
|
ret = skel_getmultibits(priv, pins, values, count);
|
||||||
skel_unlock(priv);
|
skel_unlock(priv);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -577,23 +611,27 @@ static int skel_attach(FAR struct ioexpander_dev_s *dev, ioe_pinset_t pinset,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
skel_lock(priv);
|
ret = skel_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Find and available in entry in the callback table */
|
/* Find and available in entry in the callback table */
|
||||||
|
|
||||||
ret = -ENOSPC;
|
ret = -ENOSPC;
|
||||||
for (i = 0; i < CONFIG_skeleton_INT_NCALLBACKS; i++)
|
for (i = 0; i < CONFIG_SKELETON_INT_NCALLBACKS; i++)
|
||||||
{
|
{
|
||||||
/* Is this entry available (i.e., no callback attached) */
|
/* Is this entry available (i.e., no callback attached) */
|
||||||
|
|
||||||
if (priv->cb[i].cbfunc == NULL)
|
if (priv->cb[i].cbfunc == NULL)
|
||||||
{
|
{
|
||||||
/* Yes.. use this entry */
|
/* Yes.. use this entry */
|
||||||
|
|
||||||
priv->cb[i].pinset = pinset;
|
priv->cb[i].pinset = pinset;
|
||||||
priv->cb[i].cbfunc = callback;
|
priv->cb[i].cbfunc = callback;
|
||||||
ret = OK;
|
ret = OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add this callback to the table */
|
/* Add this callback to the table */
|
||||||
@@ -625,7 +663,7 @@ static void skel_irqworker(void *arg)
|
|||||||
|
|
||||||
/* Perform pin interrupt callbacks */
|
/* Perform pin interrupt callbacks */
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_skeleton_INT_NCALLBACKS; i++)
|
for (i = 0; i < CONFIG_SKELETON_INT_NCALLBACKS; i++)
|
||||||
{
|
{
|
||||||
/* Is this entry valid (i.e., callback attached)? If so, did andy of
|
/* Is this entry valid (i.e., callback attached)? If so, did andy of
|
||||||
* the requested pin interrupts occur?
|
* the requested pin interrupts occur?
|
||||||
@@ -673,7 +711,7 @@ static void skel_irqworker(void *arg)
|
|||||||
#ifdef CONFIG_skeleton_INT_ENABLE
|
#ifdef CONFIG_skeleton_INT_ENABLE
|
||||||
static void skel_interrupt(FAR void *arg)
|
static void skel_interrupt(FAR void *arg)
|
||||||
{
|
{
|
||||||
FAR struct skel_dev_s *priv = (FAR struct skel_dev_s )arg;
|
FAR struct skel_dev_s *priv = (FAR struct skel_dev_s *)arg;
|
||||||
|
|
||||||
DEBUGASSERT(priv != NULL);
|
DEBUGASSERT(priv != NULL);
|
||||||
|
|
||||||
@@ -742,8 +780,8 @@ FAR struct ioexpander_dev_s *skel_initialize(void)
|
|||||||
priv = &g_skel;
|
priv = &g_skel;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Initialize the device state structure */
|
/* Initialize the device state structure
|
||||||
/* NOTE: Normally you would also save the I2C/SPI device interface and
|
* NOTE: Normally you would also save the I2C/SPI device interface and
|
||||||
* any configuration information here as well.
|
* any configuration information here as well.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,29 +12,28 @@
|
|||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* Author: Patrick Titiano, Jean Pihet
|
* Author: Patrick Titiano, Jean Pihet
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||||
|
* used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
*
|
*
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
* this list of conditions and the following disclaimer.
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
* and/or other materials provided with the distribution.
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
* 3. Neither the name of the copyright holder nor the names of its
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
* contributors may be used to endorse or promote products derived from this
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
* software without specific prior written permission.
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
*
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@@ -75,8 +74,9 @@
|
|||||||
|
|
||||||
/* TCA64xx Helpers */
|
/* TCA64xx Helpers */
|
||||||
|
|
||||||
static void tca64_lock(FAR struct tca64_dev_s *priv);
|
static int tca64_lock(FAR struct tca64_dev_s *priv);
|
||||||
static FAR const struct tca64_part_s *tca64_getpart(FAR struct tca64_dev_s *priv);
|
static FAR const struct tca64_part_s *tca64_getpart(
|
||||||
|
FAR struct tca64_dev_s *priv);
|
||||||
static uint8_t tca64_ngpios(FAR struct tca64_dev_s *priv);
|
static uint8_t tca64_ngpios(FAR struct tca64_dev_s *priv);
|
||||||
static uint8_t tca64_input_reg(FAR struct tca64_dev_s *priv, uint8_t pin);
|
static uint8_t tca64_input_reg(FAR struct tca64_dev_s *priv, uint8_t pin);
|
||||||
static uint8_t tca64_output_reg(FAR struct tca64_dev_s *priv, uint8_t pin);
|
static uint8_t tca64_output_reg(FAR struct tca64_dev_s *priv, uint8_t pin);
|
||||||
@@ -194,9 +194,9 @@ static const struct tca64_part_s g_tca64_parts[TCA64_NPARTS] =
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void tca64_lock(FAR struct tca64_dev_s *priv)
|
static int tca64_lock(FAR struct tca64_dev_s *priv)
|
||||||
{
|
{
|
||||||
nxsem_wait_uninterruptible(&priv->exclsem);
|
return nxsem_wait_uninterruptible(&priv->exclsem);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define tca64_unlock(p) nxsem_post(&(p)->exclsem)
|
#define tca64_unlock(p) nxsem_post(&(p)->exclsem)
|
||||||
@@ -209,7 +209,8 @@ static void tca64_lock(FAR struct tca64_dev_s *priv)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static FAR const struct tca64_part_s *tca64_getpart(FAR struct tca64_dev_s *priv)
|
static FAR const struct tca64_part_s *tca64_getpart(
|
||||||
|
FAR struct tca64_dev_s *priv)
|
||||||
{
|
{
|
||||||
DEBUGASSERT(priv != NULL && priv->config != NULL &&
|
DEBUGASSERT(priv != NULL && priv->config != NULL &&
|
||||||
priv->config->part < TCA64_NPARTS);
|
priv->config->part < TCA64_NPARTS);
|
||||||
@@ -370,7 +371,7 @@ static int tca64_putreg(struct tca64_dev_s *priv, uint8_t regaddr,
|
|||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
cmd[i+1] = regval[i];
|
cmd[i + 1] = regval[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
msg[0].frequency = TCA64XX_I2C_MAXFREQUENCY,
|
msg[0].frequency = TCA64XX_I2C_MAXFREQUENCY,
|
||||||
@@ -429,7 +430,11 @@ static int tca64_direction(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
tca64_lock(priv);
|
ret = tca64_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the Configuration Register associated with this pin. The
|
/* Read the Configuration Register associated with this pin. The
|
||||||
* Configuration Register configures the direction of the I/O pins.
|
* Configuration Register configures the direction of the I/O pins.
|
||||||
@@ -527,7 +532,11 @@ static int tca64_option(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
tca64_lock(priv);
|
ret = tca64_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the polarity register */
|
/* Read the polarity register */
|
||||||
|
|
||||||
@@ -572,8 +581,12 @@ static int tca64_option(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
unsigned int ival = (unsigned int)((uintptr_t)value);
|
unsigned int ival = (unsigned int)((uintptr_t)value);
|
||||||
ioe_pinset_t bit = ((ioe_pinset_t)1 << pin);
|
ioe_pinset_t bit = ((ioe_pinset_t)1 << pin);
|
||||||
|
|
||||||
ret = OK;
|
ret = tca64_lock(priv);
|
||||||
tca64_lock(priv);
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
switch (ival)
|
switch (ival)
|
||||||
{
|
{
|
||||||
case IOEXPANDER_VAL_HIGH: /* Interrupt on high level */
|
case IOEXPANDER_VAL_HIGH: /* Interrupt on high level */
|
||||||
@@ -653,7 +666,11 @@ static int tca64_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
tca64_lock(priv);
|
ret = tca64_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the output register. */
|
/* Read the output register. */
|
||||||
|
|
||||||
@@ -698,14 +715,15 @@ errout_with_lock:
|
|||||||
* Name: tca64_readpin
|
* Name: tca64_readpin
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Read the actual PIN level. This can be different from the last value written
|
* Read the actual PIN level. This can be different from the last value
|
||||||
* to this pin. Required.
|
* written to this pin. Required.
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* dev - Device-specific state data
|
* dev - Device-specific state data
|
||||||
* pin - The index of the pin
|
* pin - The index of the pin
|
||||||
* valptr - Pointer to a buffer where the pin level is stored. Usually TRUE
|
* valptr - Pointer to a buffer where the pin level is stored. Usually TRUE
|
||||||
* if the pin is high, except if OPTION_INVERT has been set on this pin.
|
* if the pin is high, except if OPTION_INVERT has been set on
|
||||||
|
* this pin.
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* 0 on success, else a negative error code
|
* 0 on success, else a negative error code
|
||||||
@@ -727,7 +745,11 @@ static int tca64_readpin(FAR struct ioexpander_dev_s *dev, uint8_t pin,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
tca64_lock(priv);
|
ret = tca64_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the input register for this pin
|
/* Read the input register for this pin
|
||||||
*
|
*
|
||||||
@@ -795,7 +817,11 @@ static int tca64_multiwritepin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
tca64_lock(priv);
|
ret = tca64_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the output registers for pin 0 through the number of supported
|
/* Read the output registers for pin 0 through the number of supported
|
||||||
* pins.
|
* pins.
|
||||||
@@ -884,7 +910,11 @@ static int tca64_multireadpin(FAR struct ioexpander_dev_s *dev,
|
|||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
tca64_lock(priv);
|
ret = tca64_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the input register for pin 0 through the number of supported pins.
|
/* Read the input register for pin 0 through the number of supported pins.
|
||||||
*
|
*
|
||||||
@@ -955,27 +985,32 @@ static FAR void *tca64_attach(FAR struct ioexpander_dev_s *dev,
|
|||||||
FAR struct tca64_dev_s *priv = (FAR struct tca64_dev_s *)dev;
|
FAR struct tca64_dev_s *priv = (FAR struct tca64_dev_s *)dev;
|
||||||
FAR void *handle = NULL;
|
FAR void *handle = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access to the I/O Expander */
|
/* Get exclusive access to the I/O Expander */
|
||||||
|
|
||||||
tca64_lock(priv);
|
ret = tca64_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Find and available in entry in the callback table */
|
/* Find and available in entry in the callback table */
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_TCA64XX_INT_NCALLBACKS; i++)
|
for (i = 0; i < CONFIG_TCA64XX_INT_NCALLBACKS; i++)
|
||||||
{
|
{
|
||||||
/* Is this entry available (i.e., no callback attached) */
|
/* Is this entry available (i.e., no callback attached) */
|
||||||
|
|
||||||
if (priv->cb[i].cbfunc == NULL)
|
if (priv->cb[i].cbfunc == NULL)
|
||||||
{
|
{
|
||||||
/* Yes.. use this entry */
|
/* Yes.. use this entry */
|
||||||
|
|
||||||
priv->cb[i].pinset = pinset;
|
priv->cb[i].pinset = pinset;
|
||||||
priv->cb[i].cbfunc = callback;
|
priv->cb[i].cbfunc = callback;
|
||||||
priv->cb[i].cbarg = arg;
|
priv->cb[i].cbarg = arg;
|
||||||
handle = &priv->cb[i];
|
handle = &priv->cb[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tca64_unlock(priv);
|
tca64_unlock(priv);
|
||||||
@@ -1004,7 +1039,8 @@ static int tca64_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle)
|
|||||||
|
|
||||||
DEBUGASSERT(priv != NULL && cb != NULL);
|
DEBUGASSERT(priv != NULL && cb != NULL);
|
||||||
DEBUGASSERT((uintptr_t)cb >= (uintptr_t)&priv->cb[0] &&
|
DEBUGASSERT((uintptr_t)cb >= (uintptr_t)&priv->cb[0] &&
|
||||||
(uintptr_t)cb <= (uintptr_t)&priv->cb[CONFIG_TCA64XX_INT_NCALLBACKS-1]);
|
(uintptr_t)cb <=
|
||||||
|
(uintptr_t)&priv->cb[CONFIG_TCA64XX_INT_NCALLBACKS - 1]);
|
||||||
UNUSED(priv);
|
UNUSED(priv);
|
||||||
|
|
||||||
cb->pinset = 0;
|
cb->pinset = 0;
|
||||||
@@ -1023,7 +1059,8 @@ static int tca64_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_TCA64XX_INT_ENABLE
|
#ifdef CONFIG_TCA64XX_INT_ENABLE
|
||||||
static void tca64_int_update(FAR struct tca64_dev_s *priv, ioe_pinset_t input,
|
static void tca64_int_update(FAR struct tca64_dev_s *priv,
|
||||||
|
ioe_pinset_t input,
|
||||||
ioe_pinset_t mask)
|
ioe_pinset_t mask)
|
||||||
{
|
{
|
||||||
ioe_pinset_t diff;
|
ioe_pinset_t diff;
|
||||||
@@ -1152,7 +1189,11 @@ static void tca64_irqworker(void *arg)
|
|||||||
|
|
||||||
/* Get exclusive access to read inputs and assess pending interrupts. */
|
/* Get exclusive access to read inputs and assess pending interrupts. */
|
||||||
|
|
||||||
tca64_lock(priv);
|
ret = tca64_lock(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the input register for pin 0 through the number of supported pins.
|
/* Read the input register for pin 0 through the number of supported pins.
|
||||||
*
|
*
|
||||||
@@ -1346,7 +1387,7 @@ static void tca64_poll_expiry(int argc, wdparm_t arg1, ...)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
FAR struct ioexpander_dev_s *tca64_initialize(FAR struct i2c_master_s *i2c,
|
FAR struct ioexpander_dev_s *tca64_initialize(FAR struct i2c_master_s *i2c,
|
||||||
FAR struct tca64_config_s *config)
|
FAR struct tca64_config_s *config)
|
||||||
{
|
{
|
||||||
FAR struct tca64_dev_s *priv;
|
FAR struct tca64_dev_s *priv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|||||||
@@ -481,7 +481,8 @@ static int apds9960_probe(FAR struct apds9960_dev_s *priv)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int apds9960_i2c_read(FAR struct apds9960_dev_s *priv,
|
static int apds9960_i2c_read(FAR struct apds9960_dev_s *priv,
|
||||||
uint8_t const regaddr, FAR uint8_t *regval, int len)
|
uint8_t const regaddr,
|
||||||
|
FAR uint8_t *regval, int len)
|
||||||
{
|
{
|
||||||
struct i2c_config_s config;
|
struct i2c_config_s config;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
@@ -1063,10 +1064,14 @@ static int apds9960_readgesture(FAR struct apds9960_dev_s *priv)
|
|||||||
{
|
{
|
||||||
for (i = 0; i < bytes_read; i += 4)
|
for (i = 0; i < bytes_read; i += 4)
|
||||||
{
|
{
|
||||||
priv->gesture_data.u_data[priv->gesture_data.index] = fifo_data[i + 0];
|
priv->gesture_data.u_data[priv->gesture_data.index] =
|
||||||
priv->gesture_data.d_data[priv->gesture_data.index] = fifo_data[i + 1];
|
fifo_data[i + 0];
|
||||||
priv->gesture_data.l_data[priv->gesture_data.index] = fifo_data[i + 2];
|
priv->gesture_data.d_data[priv->gesture_data.index] =
|
||||||
priv->gesture_data.r_data[priv->gesture_data.index] = fifo_data[i + 3];
|
fifo_data[i + 1];
|
||||||
|
priv->gesture_data.l_data[priv->gesture_data.index] =
|
||||||
|
fifo_data[i + 2];
|
||||||
|
priv->gesture_data.r_data[priv->gesture_data.index] =
|
||||||
|
fifo_data[i + 3];
|
||||||
priv->gesture_data.index++;
|
priv->gesture_data.index++;
|
||||||
priv->gesture_data.total_gestures++;
|
priv->gesture_data.total_gestures++;
|
||||||
}
|
}
|
||||||
@@ -1171,6 +1176,7 @@ static ssize_t apds9960_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode;
|
FAR struct inode *inode;
|
||||||
FAR struct apds9960_dev_s *priv;
|
FAR struct apds9960_dev_s *priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(filep);
|
DEBUGASSERT(filep);
|
||||||
inode = filep->f_inode;
|
inode = filep->f_inode;
|
||||||
@@ -1188,7 +1194,11 @@ static ssize_t apds9960_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
/* Wait for data available */
|
/* Wait for data available */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->sample_sem);
|
ret = nxsem_wait_uninterruptible(&priv->sample_sem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return (ssize_t)ret;
|
||||||
|
}
|
||||||
|
|
||||||
buffer[0] = (char) priv->gesture_motion;
|
buffer[0] = (char) priv->gesture_motion;
|
||||||
buflen = 1;
|
buflen = 1;
|
||||||
@@ -1218,7 +1228,7 @@ static ssize_t apds9960_write(FAR struct file *filep,
|
|||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* devpath - The full path to the driver to register. E.g., "/dev/gest0"
|
* devpath - The full path to the driver to register. E.g., "/dev/gest0"
|
||||||
* i2c - An instance of the I2C interface to use to communicate with APDS9960
|
* i2c - An instance of the I2C interface to communicate with APDS9960
|
||||||
* addr - The I2C address of the APDS9960.
|
* addr - The I2C address of the APDS9960.
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
|
|||||||
+28
-33
@@ -1,35 +1,20 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* include/nuttx/sensors/dhtxx.c
|
* drivers/sensors/dhtxx.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2018 Abdelatif GUETTOUCHE. All rights reserved.
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
* Author: Abdelatif GUETTOUCHE <abdelatif.guettouche@gmail.com>
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the
|
||||||
|
* License. You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
*
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* notice, this list of conditions and the following disclaimer.
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
* notice, this list of conditions and the following disclaimer in
|
* License for the specific language governing permissions and limitations
|
||||||
* the documentation and/or other materials provided with the
|
* under the License.
|
||||||
* distribution.
|
|
||||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
|
||||||
* used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
||||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
||||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@@ -53,7 +38,7 @@
|
|||||||
#include <nuttx/semaphore.h>
|
#include <nuttx/semaphore.h>
|
||||||
#include <nuttx/sensors/dhtxx.h>
|
#include <nuttx/sensors/dhtxx.h>
|
||||||
|
|
||||||
/*****************************************************************************
|
/****************************************************************************
|
||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@@ -428,12 +413,17 @@ static int dhtxx_open(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct dhtxx_dev_s *priv = inode->i_private;
|
FAR struct dhtxx_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Acquire the semaphore, wait the sampling time before sending anything to
|
/* Acquire the semaphore, wait the sampling time before sending anything to
|
||||||
* pass unstable state.
|
* pass unstable state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
dht_standby_mode(priv);
|
dht_standby_mode(priv);
|
||||||
|
|
||||||
@@ -479,13 +469,17 @@ static ssize_t dhtxx_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
if (buflen < sizeof(FAR struct dhtxx_sensor_data_s))
|
if (buflen < sizeof(FAR struct dhtxx_sensor_data_s))
|
||||||
{
|
{
|
||||||
snerr("ERROR: Not enough memory for reading out a sensor data sample.\n");
|
snerr("ERROR: Not enough memory to read data sample.\n");
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(priv->raw_data, 0u, sizeof(priv->raw_data));
|
memset(priv->raw_data, 0u, sizeof(priv->raw_data));
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return (ssize_t)ret;
|
||||||
|
}
|
||||||
|
|
||||||
dht_send_start_signal(priv);
|
dht_send_start_signal(priv);
|
||||||
|
|
||||||
@@ -587,7 +581,8 @@ static int dhtxx_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int dhtxx_register(FAR const char *devpath, FAR struct dhtxx_config_s *config)
|
int dhtxx_register(FAR const char *devpath,
|
||||||
|
FAR struct dhtxx_config_s *config)
|
||||||
{
|
{
|
||||||
FAR struct dhtxx_dev_s *priv;
|
FAR struct dhtxx_dev_s *priv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
*****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int hcsr04_open(FAR struct file *filep);
|
static int hcsr04_open(FAR struct file *filep);
|
||||||
static int hcsr04_close(FAR struct file *filep);
|
static int hcsr04_close(FAR struct file *filep);
|
||||||
@@ -149,8 +149,14 @@ static int hcsr04_open(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct hcsr04_dev_s *priv = inode->i_private;
|
FAR struct hcsr04_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
|
||||||
nxsem_post(&priv->devsem);
|
nxsem_post(&priv->devsem);
|
||||||
hcsr04_dbg("OPENED\n");
|
hcsr04_dbg("OPENED\n");
|
||||||
return OK;
|
return OK;
|
||||||
@@ -160,8 +166,14 @@ static int hcsr04_close(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct hcsr04_dev_s *priv = inode->i_private;
|
FAR struct hcsr04_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
|
||||||
nxsem_post(&priv->devsem);
|
nxsem_post(&priv->devsem);
|
||||||
hcsr04_dbg("CLOSED\n");
|
hcsr04_dbg("CLOSED\n");
|
||||||
return OK;
|
return OK;
|
||||||
@@ -174,10 +186,15 @@ static ssize_t hcsr04_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
FAR struct hcsr04_dev_s *priv = inode->i_private;
|
FAR struct hcsr04_dev_s *priv = inode->i_private;
|
||||||
int distance = 0;
|
int distance = 0;
|
||||||
ssize_t length = 0;
|
ssize_t length = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return (ssize_t)ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup and send a pulse to start measuring */
|
/* Setup and send a pulse to start measuring */
|
||||||
|
|
||||||
@@ -187,7 +204,11 @@ static ssize_t hcsr04_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->conv_donesem);
|
ret = nxsem_wait_uninterruptible(&priv->conv_donesem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return (ssize_t)ret;
|
||||||
|
}
|
||||||
|
|
||||||
distance = hcsr04_read_distance(priv);
|
distance = hcsr04_read_distance(priv);
|
||||||
if (distance < 0)
|
if (distance < 0)
|
||||||
@@ -224,7 +245,11 @@ static int hcsr04_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
@@ -267,8 +292,8 @@ static void hcsr04_notify(FAR struct hcsr04_dev_s *priv)
|
|||||||
|
|
||||||
/* If there are threads waiting on poll() for data to become available,
|
/* If there are threads waiting on poll() for data to become available,
|
||||||
* then wake them up now. NOTE: we wake up all waiting threads because we
|
* then wake them up now. NOTE: we wake up all waiting threads because we
|
||||||
* do not know that they are going to do. If they all try to read the data,
|
* do not know that they are going to do. If they all try to read the
|
||||||
* then some make end up blocking after all.
|
* data, then some make end up blocking after all.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_HCSR04_NPOLLWAITERS; i++)
|
for (i = 0; i < CONFIG_HCSR04_NPOLLWAITERS; i++)
|
||||||
@@ -300,7 +325,11 @@ static int hcsr04_poll(FAR struct file *filep, FAR struct pollfd *fds,
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (setup)
|
if (setup)
|
||||||
{
|
{
|
||||||
|
|||||||
+42
-17
@@ -120,7 +120,7 @@
|
|||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
*****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int hts221_open(FAR struct file *filep);
|
static int hts221_open(FAR struct file *filep);
|
||||||
static int hts221_close(FAR struct file *filep);
|
static int hts221_close(FAR struct file *filep);
|
||||||
@@ -333,7 +333,8 @@ static int hts221_config_ctrl_reg3(FAR struct hts221_dev_s *priv,
|
|||||||
}
|
}
|
||||||
|
|
||||||
regval &= ~mask;
|
regval &= ~mask;
|
||||||
regval |= (uint8_t)(settings->is_high_edge ? 0 : HTS221_CTRL_REG3_DRDY_L_H);
|
regval |= (uint8_t)(settings->is_high_edge ?
|
||||||
|
0 : HTS221_CTRL_REG3_DRDY_L_H);
|
||||||
regval |= (uint8_t)(settings->is_open_drain ? HTS221_CTRL_REG3_PP_OD : 0);
|
regval |= (uint8_t)(settings->is_open_drain ? HTS221_CTRL_REG3_PP_OD : 0);
|
||||||
regval |= (uint8_t)(settings->is_data_rdy ? HTS221_CTRL_REG3_DRDY_EN : 0);
|
regval |= (uint8_t)(settings->is_data_rdy ? HTS221_CTRL_REG3_DRDY_EN : 0);
|
||||||
|
|
||||||
@@ -623,7 +624,8 @@ static int hts221_read_raw_data(FAR struct hts221_dev_s *priv,
|
|||||||
|
|
||||||
/* Add low-order bytes to entropy pool. */
|
/* Add low-order bytes to entropy pool. */
|
||||||
|
|
||||||
add_sensor_randomness(((uint32_t)data->humid_low_bits << 8) | data->temp_low_bits);
|
add_sensor_randomness(((uint32_t)data->humid_low_bits << 8) |
|
||||||
|
data->temp_low_bits);
|
||||||
|
|
||||||
flags = enter_critical_section();
|
flags = enter_critical_section();
|
||||||
priv->int_pending = false;
|
priv->int_pending = false;
|
||||||
@@ -803,18 +805,20 @@ static int hts221_calculate_humidity(FAR struct hts221_dev_s *priv,
|
|||||||
FAR unsigned int *humidity,
|
FAR unsigned int *humidity,
|
||||||
FAR hts221_raw_data_t *raw_data)
|
FAR hts221_raw_data_t *raw_data)
|
||||||
{
|
{
|
||||||
int16_t h_out = (raw_data->humid_high_bits << 8) | raw_data->humid_low_bits;
|
int16_t h_out;
|
||||||
int x0 = priv->calib.h0_t0_out;
|
int x0 = priv->calib.h0_t0_out;
|
||||||
int x1 = priv->calib.h1_t0_out;
|
int x1 = priv->calib.h1_t0_out;
|
||||||
int y0 = priv->calib.h0_x2;
|
int y0 = priv->calib.h0_x2;
|
||||||
int y1 = priv->calib.h1_x2;
|
int y1 = priv->calib.h1_x2;
|
||||||
int x = h_out;
|
int x;
|
||||||
int64_t y;
|
int64_t y;
|
||||||
int x1_x0_diff;
|
int x1_x0_diff;
|
||||||
|
|
||||||
|
h_out = (raw_data->humid_high_bits << 8) | raw_data->humid_low_bits;
|
||||||
|
x = h_out;
|
||||||
x1_x0_diff = x1 - x0;
|
x1_x0_diff = x1 - x0;
|
||||||
|
|
||||||
y = (y0 * x1_x0_diff + (y1 - y0) * (x - x0));
|
y = (y0 * x1_x0_diff + (y1 - y0) * (x - x0));
|
||||||
y *= HTS221_HUMIDITY_PRECISION;
|
y *= HTS221_HUMIDITY_PRECISION;
|
||||||
y /= x1_x0_diff * 2;
|
y /= x1_x0_diff * 2;
|
||||||
|
|
||||||
@@ -904,10 +908,15 @@ static int hts221_open(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct hts221_dev_s *priv = inode->i_private;
|
FAR struct hts221_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
priv->config->set_power(priv->config, true);
|
priv->config->set_power(priv->config, true);
|
||||||
priv->config->irq_enable(priv->config, true);
|
priv->config->irq_enable(priv->config, true);
|
||||||
@@ -925,7 +934,11 @@ static int hts221_close(FAR struct file *filep)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
priv->config->irq_enable(priv->config, false);
|
priv->config->irq_enable(priv->config, false);
|
||||||
ret = hts221_power_on_off(priv, false);
|
ret = hts221_power_on_off(priv, false);
|
||||||
@@ -947,7 +960,11 @@ static ssize_t hts221_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return (ssize_t)ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = hts221_read_convert_data(priv, &data);
|
ret = hts221_read_convert_data(priv, &data);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@@ -985,7 +1002,11 @@ static int hts221_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
@@ -1032,10 +1053,10 @@ static bool hts221_sample(FAR struct hts221_dev_s *priv)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
hts221_status_t status =
|
hts221_status_t status =
|
||||||
{
|
{
|
||||||
.is_humid_ready = false,
|
.is_humid_ready = false,
|
||||||
.is_temp_ready = false
|
.is_temp_ready = false
|
||||||
};
|
};
|
||||||
|
|
||||||
ret = hts221_check_status(priv, &status);
|
ret = hts221_check_status(priv, &status);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@@ -1054,8 +1075,8 @@ static void hts221_notify(FAR struct hts221_dev_s *priv)
|
|||||||
|
|
||||||
/* If there are threads waiting on poll() for data to become available,
|
/* If there are threads waiting on poll() for data to become available,
|
||||||
* then wake them up now. NOTE: we wake up all waiting threads because we
|
* then wake them up now. NOTE: we wake up all waiting threads because we
|
||||||
* do not know that they are going to do. If they all try to read the data,
|
* do not know that they are going to do. If they all try to read the
|
||||||
* then some make end up blocking after all.
|
* data, then some make end up blocking after all.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_HTS221_NPOLLWAITERS; i++)
|
for (i = 0; i < CONFIG_HTS221_NPOLLWAITERS; i++)
|
||||||
@@ -1087,7 +1108,11 @@ static int hts221_poll(FAR struct file *filep, FAR struct pollfd *fds,
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (setup)
|
if (setup)
|
||||||
{
|
{
|
||||||
|
|||||||
+43
-24
@@ -10,28 +10,31 @@
|
|||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
*
|
*
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
* this list of conditions and the following disclaimer.
|
* notice, this list of conditions and the following disclaimer.
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
* notice, this list of conditions and the following disclaimer in
|
||||||
* and/or other materials provided with the distribution.
|
* the documentation and/or other materials provided with the
|
||||||
* 3. Neither the name of the copyright holder nor the names of its
|
* distribution.
|
||||||
* contributors may be used to endorse or promote products derived from this
|
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||||
* software without specific prior written permission.
|
* used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@@ -341,8 +344,13 @@ static void kxtj9_set_mode_standby(FAR struct kxtj9_dev_s *priv)
|
|||||||
static int kxtj9_configure(FAR struct kxtj9_dev_s *priv, uint8_t odr)
|
static int kxtj9_configure(FAR struct kxtj9_dev_s *priv, uint8_t odr)
|
||||||
{
|
{
|
||||||
uint8_t wbuf[0];
|
uint8_t wbuf[0];
|
||||||
|
int ret;
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->exclsem);
|
ret = nxsem_wait_uninterruptible(&priv->exclsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
kxtj9_soft_reset(priv);
|
kxtj9_soft_reset(priv);
|
||||||
kxtj9_set_mode_standby(priv);
|
kxtj9_set_mode_standby(priv);
|
||||||
@@ -389,8 +397,13 @@ static int kxtj9_configure(FAR struct kxtj9_dev_s *priv, uint8_t odr)
|
|||||||
static int kxtj9_enable(FAR struct kxtj9_dev_s *priv, bool on)
|
static int kxtj9_enable(FAR struct kxtj9_dev_s *priv, bool on)
|
||||||
{
|
{
|
||||||
uint8_t wbuf[1];
|
uint8_t wbuf[1];
|
||||||
|
int ret;
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->exclsem);
|
ret = nxsem_wait_uninterruptible(&priv->exclsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (!on && priv->power_enabled)
|
if (!on && priv->power_enabled)
|
||||||
{
|
{
|
||||||
@@ -431,8 +444,13 @@ static int kxtj9_read_sensor_data(FAR struct kxtj9_dev_s *priv,
|
|||||||
{
|
{
|
||||||
int16_t acc_data[3];
|
int16_t acc_data[3];
|
||||||
uint8_t data;
|
uint8_t data;
|
||||||
|
int ret;
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->exclsem);
|
ret = nxsem_wait_uninterruptible(&priv->exclsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
kxtj9_reg_read(priv, XOUT_L, (uint8_t *)acc_data, 6);
|
kxtj9_reg_read(priv, XOUT_L, (uint8_t *)acc_data, 6);
|
||||||
|
|
||||||
@@ -525,7 +543,8 @@ static ssize_t kxtj9_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
{
|
{
|
||||||
/* Get the next sample data */
|
/* Get the next sample data */
|
||||||
|
|
||||||
ret = kxtj9_read_sensor_data(priv, (FAR struct kxtj9_sensor_data *)buffer);
|
ret = kxtj9_read_sensor_data(priv,
|
||||||
|
(FAR struct kxtj9_sensor_data *)buffer);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
snerr("ERROR: kxtj9_read_sensor_data failed: %d\n", ret);
|
snerr("ERROR: kxtj9_read_sensor_data failed: %d\n", ret);
|
||||||
|
|||||||
@@ -343,7 +343,11 @@ static int lps25h_open(FAR struct file *filep)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&dev->devsem);
|
ret = nxsem_wait_uninterruptible(&dev->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
dev->config->set_power(dev->config, true);
|
dev->config->set_power(dev->config, true);
|
||||||
ret = lps25h_read_reg8(dev, &addr, &value);
|
ret = lps25h_read_reg8(dev, &addr, &value);
|
||||||
@@ -372,7 +376,11 @@ static int lps25h_close(FAR struct file *filep)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&dev->devsem);
|
ret = nxsem_wait_uninterruptible(&dev->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
dev->config->irq_enable(dev->config, false);
|
dev->config->irq_enable(dev->config, false);
|
||||||
dev->irqenabled = false;
|
dev->irqenabled = false;
|
||||||
@@ -395,7 +403,11 @@ static ssize_t lps25h_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&dev->devsem);
|
ret = nxsem_wait_uninterruptible(&dev->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return (ssize_t)ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = lps25h_configure_dev(dev);
|
ret = lps25h_configure_dev(dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@@ -706,7 +718,11 @@ static int lps25h_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&dev->devsem);
|
ret = nxsem_wait_uninterruptible(&dev->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -106,7 +106,8 @@ static ssize_t max44009_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
size_t buflen);
|
size_t buflen);
|
||||||
static ssize_t max44009_write(FAR struct file *filep, FAR const char *buffer,
|
static ssize_t max44009_write(FAR struct file *filep, FAR const char *buffer,
|
||||||
size_t buflen);
|
size_t buflen);
|
||||||
static int max44009_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
|
static int max44009_ioctl(FAR struct file *filep, int cmd,
|
||||||
|
unsigned long arg);
|
||||||
static int max44009_poll(FAR struct file *filep, FAR struct pollfd *fds,
|
static int max44009_poll(FAR struct file *filep, FAR struct pollfd *fds,
|
||||||
bool setup);
|
bool setup);
|
||||||
|
|
||||||
@@ -235,7 +236,11 @@ static int max44009_open(FAR struct file *filep)
|
|||||||
DEBUGASSERT(inode && inode->i_private);
|
DEBUGASSERT(inode && inode->i_private);
|
||||||
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->dev_sem);
|
ret = nxsem_wait_uninterruptible(&priv->dev_sem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
use_count = priv->cref + 1;
|
use_count = priv->cref + 1;
|
||||||
if (use_count == 1)
|
if (use_count == 1)
|
||||||
@@ -272,6 +277,7 @@ static int max44009_close(FAR struct file *filep)
|
|||||||
FAR struct inode *inode;
|
FAR struct inode *inode;
|
||||||
FAR struct max44009_dev_s *priv;
|
FAR struct max44009_dev_s *priv;
|
||||||
int use_count;
|
int use_count;
|
||||||
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(filep);
|
DEBUGASSERT(filep);
|
||||||
inode = filep->f_inode;
|
inode = filep->f_inode;
|
||||||
@@ -279,7 +285,11 @@ static int max44009_close(FAR struct file *filep)
|
|||||||
DEBUGASSERT(inode && inode->i_private);
|
DEBUGASSERT(inode && inode->i_private);
|
||||||
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->dev_sem);
|
ret = nxsem_wait_uninterruptible(&priv->dev_sem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
use_count = priv->cref - 1;
|
use_count = priv->cref - 1;
|
||||||
if (use_count == 0)
|
if (use_count == 0)
|
||||||
@@ -318,7 +328,11 @@ static ssize_t max44009_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
DEBUGASSERT(inode && inode->i_private);
|
DEBUGASSERT(inode && inode->i_private);
|
||||||
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->dev_sem);
|
ret = nxsem_wait_uninterruptible(&priv->dev_sem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return (ssize_t)ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = max44009_read_data(priv, &data);
|
ret = max44009_read_data(priv, &data);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@@ -665,7 +679,8 @@ static int max44009_read_data(FAR struct max44009_dev_s *priv,
|
|||||||
*
|
*
|
||||||
* E[3..0] = Exponent, M[7..0]: Mantissa.
|
* E[3..0] = Exponent, M[7..0]: Mantissa.
|
||||||
*
|
*
|
||||||
* Lux can be calculated as (full resolution): (M[7..0] << E[3..0]) * 0.045.
|
* Lux can be calculated as (full resolution):
|
||||||
|
* (M[7..0] << E[3..0]) * 0.045.
|
||||||
*
|
*
|
||||||
* Lux can also be calculated using only HBYTE:
|
* Lux can also be calculated using only HBYTE:
|
||||||
* (M[7..4] << E[3..0]) * 0.72
|
* (M[7..4] << E[3..0]) * 0.72
|
||||||
@@ -717,7 +732,11 @@ static int max44009_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
DEBUGASSERT(inode && inode->i_private);
|
DEBUGASSERT(inode && inode->i_private);
|
||||||
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->dev_sem);
|
ret = nxsem_wait_uninterruptible(&priv->dev_sem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
@@ -787,7 +806,11 @@ static int max44009_poll(FAR struct file *filep, FAR struct pollfd *fds,
|
|||||||
DEBUGASSERT(inode && inode->i_private);
|
DEBUGASSERT(inode && inode->i_private);
|
||||||
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
priv = (FAR struct max44009_dev_s *)inode->i_private;
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->dev_sem);
|
ret = nxsem_wait_uninterruptible(&priv->dev_sem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (setup)
|
if (setup)
|
||||||
{
|
{
|
||||||
@@ -799,8 +822,8 @@ static int max44009_poll(FAR struct file *filep, FAR struct pollfd *fds,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a request to set up the poll. Find an available slot for the
|
/* This is a request to set up the poll. Find an available slot for
|
||||||
* poll structure reference.
|
* the poll structure reference.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_MAX44009_NPOLLWAITERS; i++)
|
for (i = 0; i < CONFIG_MAX44009_NPOLLWAITERS; i++)
|
||||||
|
|||||||
+38
-13
@@ -153,8 +153,9 @@ static void scd30_set_command_param(FAR struct scd30_word_s *param,
|
|||||||
uint16_t value);
|
uint16_t value);
|
||||||
static int scd30_check_data_crc(FAR const struct scd30_word_s *words,
|
static int scd30_check_data_crc(FAR const struct scd30_word_s *words,
|
||||||
unsigned int num_words);
|
unsigned int num_words);
|
||||||
static uint16_t scd30_data_word_to_uint16(FAR const struct scd30_word_s *word);
|
static uint16_t scd30_data_word2uint16(FAR const struct scd30_word_s *word);
|
||||||
static float scd30_data_words_to_float(FAR const struct scd30_word_s words[2]);
|
static float scd30_data_words_to_float(
|
||||||
|
FAR const struct scd30_word_s words[2]);
|
||||||
|
|
||||||
/* Driver features */
|
/* Driver features */
|
||||||
|
|
||||||
@@ -361,7 +362,8 @@ static void scd30_set_command_param(FAR struct scd30_word_s *param,
|
|||||||
* Name: scd30_data_words_to_float
|
* Name: scd30_data_words_to_float
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static float scd30_data_words_to_float(FAR const struct scd30_word_s words[2])
|
static float scd30_data_words_to_float(
|
||||||
|
FAR const struct scd30_word_s words[2])
|
||||||
{
|
{
|
||||||
uint8_t data[4];
|
uint8_t data[4];
|
||||||
float value;
|
float value;
|
||||||
@@ -375,10 +377,10 @@ static float scd30_data_words_to_float(FAR const struct scd30_word_s words[2])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: scd30_data_word_to_uint16
|
* Name: scd30_data_word2uint16
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static uint16_t scd30_data_word_to_uint16(FAR const struct scd30_word_s *word)
|
static uint16_t scd30_data_word2uint16(FAR const struct scd30_word_s *word)
|
||||||
{
|
{
|
||||||
return (word[0].data[0] << 8) | (word[0].data[1]);
|
return (word[0].data[0] << 8) | (word[0].data[1]);
|
||||||
}
|
}
|
||||||
@@ -392,7 +394,7 @@ static int scd30_check_data_crc(FAR const struct scd30_word_s *words,
|
|||||||
{
|
{
|
||||||
while (num_words)
|
while (num_words)
|
||||||
{
|
{
|
||||||
if (scd30_crc_word(scd30_data_word_to_uint16(words)) != words->crc)
|
if (scd30_crc_word(scd30_data_word2uint16(words)) != words->crc)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -487,7 +489,7 @@ static int scd30_read_values(FAR struct scd30_dev_s *priv, FAR float *temp,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scd30_data_word_to_uint16(data) != 0x0001)
|
if (scd30_data_word2uint16(data) != 0x0001)
|
||||||
{
|
{
|
||||||
if (!wait)
|
if (!wait)
|
||||||
{
|
{
|
||||||
@@ -614,7 +616,11 @@ static int scd30_open(FAR struct file *filep)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Increment the count of open references on the driver */
|
/* Increment the count of open references on the driver */
|
||||||
|
|
||||||
@@ -649,10 +655,15 @@ static int scd30_close(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct scd30_dev_s *priv = inode->i_private;
|
FAR struct scd30_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Decrement the count of open references on the driver */
|
/* Decrement the count of open references on the driver */
|
||||||
|
|
||||||
@@ -695,7 +706,11 @@ static ssize_t scd30_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return (ssize_t)ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||||
if (priv->unlinked)
|
if (priv->unlinked)
|
||||||
@@ -765,7 +780,11 @@ static int scd30_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||||
if (priv->unlinked)
|
if (priv->unlinked)
|
||||||
@@ -804,7 +823,8 @@ static int scd30_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
/* Start measurements (and set pressure compensation). */
|
/* Start measurements (and set pressure compensation). */
|
||||||
|
|
||||||
scd30_set_command_param(¶m, priv->pressure_comp);
|
scd30_set_command_param(¶m, priv->pressure_comp);
|
||||||
ret = scd30_write_cmd(priv, SCD30_CMD_START_MEASUREMENT, ¶m, 1);
|
ret = scd30_write_cmd(priv, SCD30_CMD_START_MEASUREMENT,
|
||||||
|
¶m, 1);
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
{
|
{
|
||||||
priv->started = true;
|
priv->started = true;
|
||||||
@@ -972,13 +992,18 @@ static int scd30_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
static int scd30_unlink(FAR struct inode *inode)
|
static int scd30_unlink(FAR struct inode *inode)
|
||||||
{
|
{
|
||||||
FAR struct scd30_dev_s *priv;
|
FAR struct scd30_dev_s *priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
||||||
priv = (FAR struct scd30_dev_s *)inode->i_private;
|
priv = (FAR struct scd30_dev_s *)inode->i_private;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Are there open references to the driver data structure? */
|
/* Are there open references to the driver data structure? */
|
||||||
|
|
||||||
|
|||||||
+61
-25
@@ -114,10 +114,12 @@ struct sgp30_cmd_s
|
|||||||
static int sgp30_do_transfer(FAR struct i2c_master_s *i2c,
|
static int sgp30_do_transfer(FAR struct i2c_master_s *i2c,
|
||||||
FAR struct i2c_msg_s *msgv,
|
FAR struct i2c_msg_s *msgv,
|
||||||
size_t nmsg);
|
size_t nmsg);
|
||||||
static int sgp30_write_cmd(FAR struct sgp30_dev_s *priv, struct sgp30_cmd_s cmd,
|
static int sgp30_write_cmd(FAR struct sgp30_dev_s *priv,
|
||||||
|
struct sgp30_cmd_s cmd,
|
||||||
FAR struct sgp30_word_s *params,
|
FAR struct sgp30_word_s *params,
|
||||||
unsigned int num_params);
|
unsigned int num_params);
|
||||||
static int sgp30_read_cmd(FAR struct sgp30_dev_s *priv, struct sgp30_cmd_s cmd,
|
static int sgp30_read_cmd(FAR struct sgp30_dev_s *priv,
|
||||||
|
struct sgp30_cmd_s cmd,
|
||||||
FAR struct sgp30_word_s *words,
|
FAR struct sgp30_word_s *words,
|
||||||
unsigned int num_words);
|
unsigned int num_words);
|
||||||
|
|
||||||
@@ -128,7 +130,8 @@ static void sgp30_set_command_param(FAR struct sgp30_word_s *param,
|
|||||||
uint16_t value);
|
uint16_t value);
|
||||||
static int sgp30_check_data_crc(FAR const struct sgp30_word_s *words,
|
static int sgp30_check_data_crc(FAR const struct sgp30_word_s *words,
|
||||||
unsigned int num_words);
|
unsigned int num_words);
|
||||||
static uint16_t sgp30_data_word_to_uint16(FAR const struct sgp30_word_s *word);
|
static uint16_t sgp30_data_word_to_uint16(
|
||||||
|
FAR const struct sgp30_word_s *word);
|
||||||
|
|
||||||
/* Driver features */
|
/* Driver features */
|
||||||
|
|
||||||
@@ -273,7 +276,8 @@ static int sgp30_do_transfer(FAR struct i2c_master_s *i2c,
|
|||||||
* Name: sgp30_write_cmd
|
* Name: sgp30_write_cmd
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int sgp30_write_cmd(FAR struct sgp30_dev_s *priv, struct sgp30_cmd_s cmd,
|
static int sgp30_write_cmd(FAR struct sgp30_dev_s *priv,
|
||||||
|
struct sgp30_cmd_s cmd,
|
||||||
FAR struct sgp30_word_s *params,
|
FAR struct sgp30_word_s *params,
|
||||||
unsigned int num_params)
|
unsigned int num_params)
|
||||||
{
|
{
|
||||||
@@ -310,7 +314,8 @@ static int sgp30_write_cmd(FAR struct sgp30_dev_s *priv, struct sgp30_cmd_s cmd,
|
|||||||
* Name: sgp30_read_cmd
|
* Name: sgp30_read_cmd
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int sgp30_read_cmd(FAR struct sgp30_dev_s *priv, struct sgp30_cmd_s cmd,
|
static int sgp30_read_cmd(FAR struct sgp30_dev_s *priv,
|
||||||
|
struct sgp30_cmd_s cmd,
|
||||||
FAR struct sgp30_word_s *words,
|
FAR struct sgp30_word_s *words,
|
||||||
unsigned int num_words)
|
unsigned int num_words)
|
||||||
{
|
{
|
||||||
@@ -415,7 +420,8 @@ static void sgp30_set_command_param(FAR struct sgp30_word_s *param,
|
|||||||
* Name: sgp30_data_word_to_uint16
|
* Name: sgp30_data_word_to_uint16
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static uint16_t sgp30_data_word_to_uint16(FAR const struct sgp30_word_s *word)
|
static uint16_t sgp30_data_word_to_uint16(
|
||||||
|
FAR const struct sgp30_word_s *word)
|
||||||
{
|
{
|
||||||
return (word[0].data[0] << 8) | (word[0].data[1]);
|
return (word[0].data[0] << 8) | (word[0].data[1]);
|
||||||
}
|
}
|
||||||
@@ -567,7 +573,11 @@ static int sgp30_open(FAR struct file *filep)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Increment the count of open references on the driver */
|
/* Increment the count of open references on the driver */
|
||||||
|
|
||||||
@@ -581,10 +591,12 @@ static int sgp30_open(FAR struct file *filep)
|
|||||||
|
|
||||||
if (sgp30_read_cmd(priv, SGP30_CMD_GET_SERIAL_ID, serial, 3) >= 0
|
if (sgp30_read_cmd(priv, SGP30_CMD_GET_SERIAL_ID, serial, 3) >= 0
|
||||||
&& sgp30_check_data_crc(serial, 3) >= 0 &&
|
&& sgp30_check_data_crc(serial, 3) >= 0 &&
|
||||||
sgp30_read_cmd(priv, SGP30_CMD_GET_FEATURE_SET_VERSION, buf, 1) >= 0
|
sgp30_read_cmd(priv,
|
||||||
|
SGP30_CMD_GET_FEATURE_SET_VERSION, buf, 1) >= 0
|
||||||
&& sgp30_check_data_crc(buf, 1) >= 0)
|
&& sgp30_check_data_crc(buf, 1) >= 0)
|
||||||
{
|
{
|
||||||
struct timespec start, curr;
|
struct timespec start;
|
||||||
|
struct timespec curr;
|
||||||
sgp30_dbg("serial id: %04x-%04x-%04x\n",
|
sgp30_dbg("serial id: %04x-%04x-%04x\n",
|
||||||
sgp30_data_word_to_uint16(serial + 0),
|
sgp30_data_word_to_uint16(serial + 0),
|
||||||
sgp30_data_word_to_uint16(serial + 1),
|
sgp30_data_word_to_uint16(serial + 1),
|
||||||
@@ -599,23 +611,26 @@ static int sgp30_open(FAR struct file *filep)
|
|||||||
ret = sgp30_write_cmd(priv, SGP30_CMD_INIT_AIR_QUALITY, NULL, 0);
|
ret = sgp30_write_cmd(priv, SGP30_CMD_INIT_AIR_QUALITY, NULL, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
sgp30_dbg("sgp30_write_cmd(SGP30_CMD_INIT_AIR_QUALITY) failed, %d\n",
|
sgp30_dbg("sgp30_write_cmd(SGP30_CMD_INIT_AIR_QUALITY)"
|
||||||
ret);
|
" failed, %d\n", ret);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uint32_t repeat = SGP30_INIT_RETRIES;
|
uint32_t repeat = SGP30_INIT_RETRIES;
|
||||||
clock_gettime(CLOCK_REALTIME, &curr);
|
clock_gettime(CLOCK_REALTIME, &curr);
|
||||||
sgp30_dbg("sgp30_write_cmd(SGP30_CMD_INIT_AIR_QUALITY)\n");
|
sgp30_dbg("sgp30_write_cmd(SGP30_CMD_INIT_AIR_QUALITY)\n");
|
||||||
while (repeat-- && time_has_passed_ms(&curr, &start, SGP30_INIT_LIMIT_MS))
|
while (repeat-- &&
|
||||||
|
time_has_passed_ms(&curr, &start, SGP30_INIT_LIMIT_MS))
|
||||||
{
|
{
|
||||||
/* Infrequently the SGP30_CMD_INIT_AIR_QUALITY message delivery
|
/* Infrequently the SGP30_CMD_INIT_AIR_QUALITY message
|
||||||
* takes suspiciously long time (SGP30_INIT_LIMIT_MS or more) and
|
* delivery takes suspiciously long time
|
||||||
* in these cases the TVOC values will never reach the correct
|
* (SGP30_INIT_LIMIT_MS or more) and in these cases the
|
||||||
* level (not even after 24 hours).
|
* TVOC values will never reach the correct level (not
|
||||||
* If this delay is detected, the sensor is given a "General Call"
|
* even after 24 hours).
|
||||||
* soft reset as described in the SGP30 datasheet and initialization
|
* If this delay is detected, the sensor is given a
|
||||||
* is tried again after CONFIG_SGP30_RESET_DELAY_US.
|
* "General Call" soft reset as described in the SGP30
|
||||||
|
* datasheet and initialization is tried again after
|
||||||
|
* CONFIG_SGP30_RESET_DELAY_US.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = sgp30_soft_reset(priv);
|
ret = sgp30_soft_reset(priv);
|
||||||
@@ -624,14 +639,17 @@ static int sgp30_open(FAR struct file *filep)
|
|||||||
sgp30_dbg("sgp30_soft_reset failed, %d\n", ret);
|
sgp30_dbg("sgp30_soft_reset failed, %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
nxsig_usleep(CONFIG_SGP30_RESET_DELAY_US);
|
nxsig_usleep(CONFIG_SGP30_RESET_DELAY_US);
|
||||||
|
|
||||||
clock_gettime(CLOCK_REALTIME, &start);
|
clock_gettime(CLOCK_REALTIME, &start);
|
||||||
ret = sgp30_write_cmd(priv, SGP30_CMD_INIT_AIR_QUALITY, NULL, 0);
|
ret = sgp30_write_cmd(priv, SGP30_CMD_INIT_AIR_QUALITY,
|
||||||
|
NULL, 0);
|
||||||
clock_gettime(CLOCK_REALTIME, &curr);
|
clock_gettime(CLOCK_REALTIME, &curr);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
sgp30_dbg("sgp30_write_cmd(SGP30_CMD_INIT_AIR_QUALITY) failed, %d\n", ret);
|
sgp30_dbg("sgp30_write_cmd(SGP30_CMD_INIT_AIR_QUALITY)"
|
||||||
|
" failed, %d\n", ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -666,10 +684,15 @@ static int sgp30_close(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct sgp30_dev_s *priv = inode->i_private;
|
FAR struct sgp30_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Decrement the count of open references on the driver */
|
/* Decrement the count of open references on the driver */
|
||||||
|
|
||||||
@@ -709,7 +732,11 @@ static ssize_t sgp30_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||||
if (priv->unlinked)
|
if (priv->unlinked)
|
||||||
@@ -804,7 +831,11 @@ static int sgp30_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||||
if (priv->unlinked)
|
if (priv->unlinked)
|
||||||
@@ -968,13 +999,18 @@ static int sgp30_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
static int sgp30_unlink(FAR struct inode *inode)
|
static int sgp30_unlink(FAR struct inode *inode)
|
||||||
{
|
{
|
||||||
FAR struct sgp30_dev_s *priv;
|
FAR struct sgp30_dev_s *priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
||||||
priv = (FAR struct sgp30_dev_s *)inode->i_private;
|
priv = (FAR struct sgp30_dev_s *)inode->i_private;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Are there open references to the driver data structure? */
|
/* Are there open references to the driver data structure? */
|
||||||
|
|
||||||
|
|||||||
+30
-6
@@ -382,10 +382,15 @@ static int sht21_open(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct sht21_dev_s *priv = inode->i_private;
|
FAR struct sht21_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Increment the count of open references on the driver */
|
/* Increment the count of open references on the driver */
|
||||||
|
|
||||||
@@ -410,10 +415,15 @@ static int sht21_close(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct sht21_dev_s *priv = inode->i_private;
|
FAR struct sht21_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Decrement the count of open references on the driver */
|
/* Decrement the count of open references on the driver */
|
||||||
|
|
||||||
@@ -440,7 +450,8 @@ static int sht21_close(FAR struct file *filep)
|
|||||||
* Name: sht21_read
|
* Name: sht21_read
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static ssize_t sht21_read(FAR struct file *filep, FAR char *buffer, size_t buflen)
|
static ssize_t sht21_read(FAR struct file *filep, FAR char *buffer,
|
||||||
|
size_t buflen)
|
||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct sht21_dev_s *priv = inode->i_private;
|
FAR struct sht21_dev_s *priv = inode->i_private;
|
||||||
@@ -451,7 +462,11 @@ static ssize_t sht21_read(FAR struct file *filep, FAR char *buffer, size_t bufle
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return (ssize_t)ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||||
if (priv->unlinked)
|
if (priv->unlinked)
|
||||||
@@ -507,7 +522,11 @@ static int sht21_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||||
if (priv->unlinked)
|
if (priv->unlinked)
|
||||||
@@ -582,13 +601,18 @@ static int sht21_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
static int sht21_unlink(FAR struct inode *inode)
|
static int sht21_unlink(FAR struct inode *inode)
|
||||||
{
|
{
|
||||||
FAR struct sht21_dev_s *priv;
|
FAR struct sht21_dev_s *priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
||||||
priv = (FAR struct sht21_dev_s *)inode->i_private;
|
priv = (FAR struct sht21_dev_s *)inode->i_private;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Are there open references to the driver data structure? */
|
/* Are there open references to the driver data structure? */
|
||||||
|
|
||||||
|
|||||||
+28
-9
@@ -320,10 +320,10 @@ static uint8_t sht3x_crc_word(uint16_t word)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: sht3x_data_word_to_uint16
|
* Name: sht3x_data_word2uint16
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static uint16_t sht3x_data_word_to_uint16(FAR const struct sht3x_word_s *word)
|
static uint16_t sht3x_data_word2uint16(FAR const struct sht3x_word_s *word)
|
||||||
{
|
{
|
||||||
return (word[0].data[0] << 8) | (word[0].data[1]);
|
return (word[0].data[0] << 8) | (word[0].data[1]);
|
||||||
}
|
}
|
||||||
@@ -337,7 +337,7 @@ static int sht3x_check_data_crc(FAR const struct sht3x_word_s *words,
|
|||||||
{
|
{
|
||||||
while (num_words)
|
while (num_words)
|
||||||
{
|
{
|
||||||
if (sht3x_crc_word(sht3x_data_word_to_uint16(words)) != words->crc)
|
if (sht3x_crc_word(sht3x_data_word2uint16(words)) != words->crc)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -427,8 +427,8 @@ static int sht3x_read_values(FAR struct sht3x_dev_s *priv,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
temp16 = sht3x_data_word_to_uint16(data);
|
temp16 = sht3x_data_word2uint16(data);
|
||||||
rh16 = sht3x_data_word_to_uint16(&data[1]);
|
rh16 = sht3x_data_word2uint16(&data[1]);
|
||||||
add_sensor_randomness(ts.tv_nsec ^ ((int)temp16 << 16 | rh16));
|
add_sensor_randomness(ts.tv_nsec ^ ((int)temp16 << 16 | rh16));
|
||||||
|
|
||||||
priv->data.temperature = sht3x_temp_to_celsius(temp16);
|
priv->data.temperature = sht3x_temp_to_celsius(temp16);
|
||||||
@@ -453,10 +453,15 @@ static int sht3x_open(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct sht3x_dev_s *priv = inode->i_private;
|
FAR struct sht3x_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Increment the count of open references on the driver */
|
/* Increment the count of open references on the driver */
|
||||||
|
|
||||||
@@ -481,10 +486,15 @@ static int sht3x_close(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct sht3x_dev_s *priv = inode->i_private;
|
FAR struct sht3x_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Decrement the count of open references on the driver */
|
/* Decrement the count of open references on the driver */
|
||||||
|
|
||||||
@@ -541,7 +551,11 @@ static int sht3x_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||||
if (priv->unlinked)
|
if (priv->unlinked)
|
||||||
@@ -609,13 +623,18 @@ static int sht3x_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
static int sht3x_unlink(FAR struct inode *inode)
|
static int sht3x_unlink(FAR struct inode *inode)
|
||||||
{
|
{
|
||||||
FAR struct sht3x_dev_s *priv;
|
FAR struct sht3x_dev_s *priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
||||||
priv = (FAR struct sht3x_dev_s *)inode->i_private;
|
priv = (FAR struct sht3x_dev_s *)inode->i_private;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Are there open references to the driver data structure? */
|
/* Are there open references to the driver data structure? */
|
||||||
|
|
||||||
|
|||||||
+56
-30
@@ -145,8 +145,8 @@ static void sps30_set_command_param(FAR struct sps30_word_s *param,
|
|||||||
uint16_t value);
|
uint16_t value);
|
||||||
static int sps30_check_data_crc(FAR const struct sps30_word_s *words,
|
static int sps30_check_data_crc(FAR const struct sps30_word_s *words,
|
||||||
unsigned int num_words);
|
unsigned int num_words);
|
||||||
static uint16_t sps30_data_word_to_uint16(FAR const struct sps30_word_s *word);
|
static uint16_t sps30_data_word2uint16(FAR const struct sps30_word_s *word);
|
||||||
static float sps30_data_words_to_float(FAR const struct sps30_word_s words[2]);
|
static float sps30_data_words2float(FAR const struct sps30_word_s words[2]);
|
||||||
|
|
||||||
/* Driver features */
|
/* Driver features */
|
||||||
|
|
||||||
@@ -372,10 +372,10 @@ static void sps30_set_command_param(FAR struct sps30_word_s *param,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: sps30_data_words_to_float
|
* Name: sps30_data_words2float
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static float sps30_data_words_to_float(FAR const struct sps30_word_s words[2])
|
static float sps30_data_words2float(FAR const struct sps30_word_s words[2])
|
||||||
{
|
{
|
||||||
uint8_t data[4];
|
uint8_t data[4];
|
||||||
float value;
|
float value;
|
||||||
@@ -389,10 +389,10 @@ static float sps30_data_words_to_float(FAR const struct sps30_word_s words[2])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: sps30_data_word_to_uint16
|
* Name: sps30_data_word2uint16
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static uint16_t sps30_data_word_to_uint16(FAR const struct sps30_word_s *word)
|
static uint16_t sps30_data_word2uint16(FAR const struct sps30_word_s *word)
|
||||||
{
|
{
|
||||||
return (word[0].data[0] << 8) | (word[0].data[1]);
|
return (word[0].data[0] << 8) | (word[0].data[1]);
|
||||||
}
|
}
|
||||||
@@ -406,7 +406,7 @@ static int sps30_check_data_crc(FAR const struct sps30_word_s *words,
|
|||||||
{
|
{
|
||||||
while (num_words)
|
while (num_words)
|
||||||
{
|
{
|
||||||
if (sps30_crc_word(sps30_data_word_to_uint16(words)) != words->crc)
|
if (sps30_crc_word(sps30_data_word2uint16(words)) != words->crc)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -493,7 +493,7 @@ static int sps30_read_values(FAR struct sps30_dev_s *priv,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sps30_data_word_to_uint16(data) != 0x0001)
|
if (sps30_data_word2uint16(data) != 0x0001)
|
||||||
{
|
{
|
||||||
if (!wait)
|
if (!wait)
|
||||||
{
|
{
|
||||||
@@ -542,25 +542,25 @@ static int sps30_read_values(FAR struct sps30_dev_s *priv,
|
|||||||
((data[18].crc ^ data[19].crc) << 8));
|
((data[18].crc ^ data[19].crc) << 8));
|
||||||
|
|
||||||
priv->data.mass_concenration_pm1_0 =
|
priv->data.mass_concenration_pm1_0 =
|
||||||
sps30_data_words_to_float(data + 0);
|
sps30_data_words2float(data + 0);
|
||||||
priv->data.mass_concenration_pm2_5 =
|
priv->data.mass_concenration_pm2_5 =
|
||||||
sps30_data_words_to_float(data + 2);
|
sps30_data_words2float(data + 2);
|
||||||
priv->data.mass_concenration_pm4_0 =
|
priv->data.mass_concenration_pm4_0 =
|
||||||
sps30_data_words_to_float(data + 4);
|
sps30_data_words2float(data + 4);
|
||||||
priv->data.mass_concenration_pm10 =
|
priv->data.mass_concenration_pm10 =
|
||||||
sps30_data_words_to_float(data + 6);
|
sps30_data_words2float(data + 6);
|
||||||
priv->data.number_concenration_pm0_5 =
|
priv->data.number_concenration_pm0_5 =
|
||||||
sps30_data_words_to_float(data + 8);
|
sps30_data_words2float(data + 8);
|
||||||
priv->data.number_concenration_pm1_0 =
|
priv->data.number_concenration_pm1_0 =
|
||||||
sps30_data_words_to_float(data + 10);
|
sps30_data_words2float(data + 10);
|
||||||
priv->data.number_concenration_pm2_5 =
|
priv->data.number_concenration_pm2_5 =
|
||||||
sps30_data_words_to_float(data + 12);
|
sps30_data_words2float(data + 12);
|
||||||
priv->data.number_concenration_pm4_0 =
|
priv->data.number_concenration_pm4_0 =
|
||||||
sps30_data_words_to_float(data + 14);
|
sps30_data_words2float(data + 14);
|
||||||
priv->data.number_concenration_pm10 =
|
priv->data.number_concenration_pm10 =
|
||||||
sps30_data_words_to_float(data + 16);
|
sps30_data_words2float(data + 16);
|
||||||
priv->data.typical_particle_size =
|
priv->data.typical_particle_size =
|
||||||
sps30_data_words_to_float(data + 18);
|
sps30_data_words2float(data + 18);
|
||||||
priv->last_update = ts;
|
priv->last_update = ts;
|
||||||
priv->valid = true;
|
priv->valid = true;
|
||||||
|
|
||||||
@@ -665,17 +665,24 @@ static int sps30_open(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct sps30_dev_s *priv = inode->i_private;
|
FAR struct sps30_dev_s *priv = inode->i_private;
|
||||||
union
|
union article_u
|
||||||
{
|
{
|
||||||
uint32_t u32[8];
|
uint32_t u32[8];
|
||||||
char c[32];
|
char c[32];
|
||||||
} code, sn;
|
};
|
||||||
|
|
||||||
|
union article_u code;
|
||||||
|
union article_u sn;
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Increment the count of open references on the driver */
|
/* Increment the count of open references on the driver */
|
||||||
|
|
||||||
@@ -738,10 +745,15 @@ static int sps30_close(FAR struct file *filep)
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct sps30_dev_s *priv = inode->i_private;
|
FAR struct sps30_dev_s *priv = inode->i_private;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Decrement the count of open references on the driver */
|
/* Decrement the count of open references on the driver */
|
||||||
|
|
||||||
@@ -780,7 +792,11 @@ static ssize_t sps30_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||||
if (priv->unlinked)
|
if (priv->unlinked)
|
||||||
@@ -865,7 +881,11 @@ static int sps30_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||||
if (priv->unlinked)
|
if (priv->unlinked)
|
||||||
@@ -899,7 +919,8 @@ static int sps30_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
/* Start measurements (and set pressure compensation). */
|
/* Start measurements (and set pressure compensation). */
|
||||||
|
|
||||||
sps30_set_command_param(¶m, SPS30_MEASUREMENT_MODE);
|
sps30_set_command_param(¶m, SPS30_MEASUREMENT_MODE);
|
||||||
ret = sps30_write_cmd(priv, SPS30_CMD_START_MEASUREMENT, ¶m, 1);
|
ret = sps30_write_cmd(priv, SPS30_CMD_START_MEASUREMENT,
|
||||||
|
¶m, 1);
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
{
|
{
|
||||||
priv->started = true;
|
priv->started = true;
|
||||||
@@ -989,13 +1010,18 @@ static int sps30_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
static int sps30_unlink(FAR struct inode *inode)
|
static int sps30_unlink(FAR struct inode *inode)
|
||||||
{
|
{
|
||||||
FAR struct sps30_dev_s *priv;
|
FAR struct sps30_dev_s *priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
DEBUGASSERT(inode != NULL && inode->i_private != NULL);
|
||||||
priv = (FAR struct sps30_dev_s *)inode->i_private;
|
priv = (FAR struct sps30_dev_s *)inode->i_private;
|
||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Are there open references to the driver data structure? */
|
/* Are there open references to the driver data structure? */
|
||||||
|
|
||||||
@@ -1028,7 +1054,7 @@ static int sps30_unlink(FAR struct inode *inode)
|
|||||||
* Register the SPS30 character device as 'devpath'
|
* Register the SPS30 character device as 'devpath'
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* devpath - The full path to the driver to register. E.g., "/dev/particle0"
|
* devpath - The full path to the driver to register e.g., "/dev/particle0"
|
||||||
* i2c - An instance of the I2C interface to use to communicate with
|
* i2c - An instance of the I2C interface to use to communicate with
|
||||||
* the SPS30
|
* the SPS30
|
||||||
* addr - The I2C address of the SPS30. The I2C address of SPS30 is
|
* addr - The I2C address of the SPS30. The I2C address of SPS30 is
|
||||||
|
|||||||
+12
-3
@@ -471,7 +471,8 @@ static int t67xx_read_gas_ppm(FAR struct t67xx_dev_s *priv,
|
|||||||
}
|
}
|
||||||
else if (warming_up)
|
else if (warming_up)
|
||||||
{
|
{
|
||||||
snwarn("WARN: sensor still warming up after %d secs\n", T67XX_UPTIME_FULL_SEC);
|
snwarn("WARN: sensor still warming up after %d secs\n",
|
||||||
|
T67XX_UPTIME_FULL_SEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read the CO2 level. */
|
/* Read the CO2 level. */
|
||||||
@@ -635,7 +636,11 @@ static ssize_t t67xx_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* How many samples were requested to get? */
|
/* How many samples were requested to get? */
|
||||||
|
|
||||||
@@ -691,7 +696,11 @@ static int t67xx_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* Get exclusive access */
|
/* Get exclusive access */
|
||||||
|
|
||||||
nxsem_wait_uninterruptible(&priv->devsem);
|
ret = nxsem_wait_uninterruptible(&priv->devsem);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user