Skip to content

Commit

Permalink
sensor/bmi160.c:provides work in character device mode and UORB commu…
Browse files Browse the repository at this point in the history
…nication mode.

Create bmi160_base.h, bmi160_base.c bmi160_uorb.c files, the bmi160_base file stores
public function interfaces, and the bmi160_uorb file stores functions related to the
uorb framework. Switch the character interface and UORB interface through the
macro CONFIG_SENSORS_BMI160_UORB.

Signed-off-by: likun17 <[email protected]>
  • Loading branch information
likun17 authored and raiden00pl committed Sep 4, 2023
1 parent bc066af commit ad643fe
Show file tree
Hide file tree
Showing 6 changed files with 1,090 additions and 278 deletions.
1 change: 1 addition & 0 deletions drivers/sensors/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ ifeq ($(CONFIG_SENSORS_BMG160),y)
endif

ifeq ($(CONFIG_SENSORS_BMI160),y)
CSRCS += bmi160_base.c
ifeq ($(CONFIG_SENSORS_BMI160_UORB),y)
CSRCS += bmi160_uorb.c
else
Expand Down
267 changes: 1 addition & 266 deletions drivers/sensors/bmi160.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
* Included Files
****************************************************************************/

#include "bmi160.h"
#include "bmi160_base.h"

#if defined(CONFIG_SENSORS_BMI160)

Expand Down Expand Up @@ -229,271 +229,6 @@ static int bmi160_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
* Public Functions
****************************************************************************/

/****************************************************************************
* Name: bmi160_checkid
*
* Description:
* Read and verify the BMI160 chip ID
*
****************************************************************************/

int bmi160_checkid(FAR struct bmi160_dev_s *priv)
{
uint8_t devid = 0;

/* Read device ID */

devid = bmi160_getreg8(priv, BMI160_CHIP_ID);
sninfo("devid: %04x\n", devid);

if (devid != (uint16_t) DEVID)
{
/* ID is not Correct */

return -ENODEV;
}

return OK;
}

/****************************************************************************
* Name: bmi160_getreg8
*
* Description:
* Read from an 8-bit BMI160 register
*
****************************************************************************/

uint8_t bmi160_getreg8(FAR struct bmi160_dev_s *priv, uint8_t regaddr)
{
uint8_t regval = 0;

#ifdef CONFIG_SENSORS_BMI160_I2C
struct i2c_msg_s msg[2];
int ret;

msg[0].frequency = priv->freq;
msg[0].addr = priv->addr;
msg[0].flags = I2C_M_NOSTOP;
msg[0].buffer = &regaddr;
msg[0].length = 1;

msg[1].frequency = priv->freq;
msg[1].addr = priv->addr;
msg[1].flags = I2C_M_READ;
msg[1].buffer = &regval;
msg[1].length = 1;

ret = I2C_TRANSFER(priv->i2c, msg, 2);
if (ret < 0)
{
snerr("I2C_TRANSFER failed: %d\n", ret);
}

#else /* CONFIG_SENSORS_BMI160_SPI */
/* If SPI bus is shared then lock and configure it */

SPI_LOCK(priv->spi, true);
bmi160_configspi(priv->spi);

/* Select the BMI160 */

SPI_SELECT(priv->spi, SPIDEV_ACCELEROMETER(0), true);

/* Send register to read and get the next byte */

SPI_SEND(priv->spi, regaddr | 0x80);
SPI_RECVBLOCK(priv->spi, &regval, 1);

/* Deselect the BMI160 */

SPI_SELECT(priv->spi, SPIDEV_ACCELEROMETER(0), false);

/* Unlock bus */

SPI_LOCK(priv->spi, false);
#endif

return regval;
}

/****************************************************************************
* Name: bmi160_putreg8
*
* Description:
* Write a value to an 8-bit BMI160 register
*
****************************************************************************/

void bmi160_putreg8(FAR struct bmi160_dev_s *priv, uint8_t regaddr,
uint8_t regval)
{
#ifdef CONFIG_SENSORS_BMI160_I2C
struct i2c_msg_s msg[2];
int ret;
uint8_t txbuffer[2];

txbuffer[0] = regaddr;
txbuffer[1] = regval;

msg[0].frequency = priv->freq;
msg[0].addr = priv->addr;
msg[0].flags = 0;
msg[0].buffer = txbuffer;
msg[0].length = 2;

ret = I2C_TRANSFER(priv->i2c, msg, 1);
if (ret < 0)
{
snerr("I2C_TRANSFER failed: %d\n", ret);
}

#else /* CONFIG_SENSORS_BMI160_SPI */
/* If SPI bus is shared then lock and configure it */

SPI_LOCK(priv->spi, true);
bmi160_configspi(priv->spi);

/* Select the BMI160 */

SPI_SELECT(priv->spi, SPIDEV_ACCELEROMETER(0), true);

/* Send register address and set the value */

SPI_SEND(priv->spi, regaddr);
SPI_SEND(priv->spi, regval);

/* Deselect the BMI160 */

SPI_SELECT(priv->spi, SPIDEV_ACCELEROMETER(0), false);

/* Unlock bus */

SPI_LOCK(priv->spi, false);

#endif
}

/****************************************************************************
* Name: bmi160_getreg16
*
* Description:
* Read 16-bits of data from an BMI160 register
*
****************************************************************************/

uint16_t bmi160_getreg16(FAR struct bmi160_dev_s *priv, uint8_t regaddr)
{
uint16_t regval = 0;

#ifdef CONFIG_SENSORS_BMI160_I2C
struct i2c_msg_s msg[2];
int ret;

msg[0].frequency = priv->freq;
msg[0].addr = priv->addr;
msg[0].flags = I2C_M_NOSTOP;
msg[0].buffer = &regaddr;
msg[0].length = 1;

msg[1].frequency = priv->freq;
msg[1].addr = priv->addr;
msg[1].flags = I2C_M_READ;
msg[1].buffer = (uint8_t *)&regval;
msg[1].length = 2;

ret = I2C_TRANSFER(priv->i2c, msg, 2);
if (ret < 0)
{
snerr("I2C_TRANSFER failed: %d\n", ret);
}

#else /* CONFIG_SENSORS_BMI160_SPI */
/* If SPI bus is shared then lock and configure it */

SPI_LOCK(priv->spi, true);
bmi160_configspi(priv->spi);

/* Select the BMI160 */

SPI_SELECT(priv->spi, SPIDEV_ACCELEROMETER(0), true);

/* Send register to read and get the next 2 bytes */

SPI_SEND(priv->spi, regaddr | 0x80);
SPI_RECVBLOCK(priv->spi, &regval, 2);

/* Deselect the BMI160 */

SPI_SELECT(priv->spi, SPIDEV_ACCELEROMETER(0), false);

/* Unlock bus */

SPI_LOCK(priv->spi, false);
#endif

return regval;
}

/****************************************************************************
* Name: bmi160_getregs
*
* Description:
* Read cnt bytes from specified dev_addr and reg_addr
*
****************************************************************************/

void bmi160_getregs(FAR struct bmi160_dev_s *priv, uint8_t regaddr,
uint8_t *regval, int len)
{
#ifdef CONFIG_SENSORS_BMI160_I2C
struct i2c_msg_s msg[2];
int ret;

msg[0].frequency = priv->freq;
msg[0].addr = priv->addr;
msg[0].flags = I2C_M_NOSTOP;
msg[0].buffer = &regaddr;
msg[0].length = 1;

msg[1].frequency = priv->freq;
msg[1].addr = priv->addr;
msg[1].flags = I2C_M_READ;
msg[1].buffer = regval;
msg[1].length = len;

ret = I2C_TRANSFER(priv->i2c, msg, 2);
if (ret < 0)
{
snerr("I2C_TRANSFER failed: %d\n", ret);
}

#else /* CONFIG_SENSORS_BMI160_SPI */
/* If SPI bus is shared then lock and configure it */

SPI_LOCK(priv->spi, true);
bmi160_configspi(priv->spi);

/* Select the BMI160 */

SPI_SELECT(priv->spi, SPIDEV_ACCELEROMETER(0), true);

/* Send register to read and get the next 2 bytes */

SPI_SEND(priv->spi, regaddr | 0x80);
SPI_RECVBLOCK(priv->spi, regval, len);

/* Deselect the BMI160 */

SPI_SELECT(priv->spi, SPIDEV_ACCELEROMETER(0), false);

/* Unlock bus */

SPI_LOCK(priv->spi, false);

#endif
}

/****************************************************************************
* Name: bmi160_register
*
Expand Down
Loading

0 comments on commit ad643fe

Please sign in to comment.