drivers/sensors/mlx90614.c: Fix MLX90614 to reflash new device address
This commit is contained in:
parent
9f2cb42918
commit
2129ce134c
@ -46,6 +46,7 @@
|
|||||||
|
|
||||||
#include <nuttx/kmalloc.h>
|
#include <nuttx/kmalloc.h>
|
||||||
#include <nuttx/fs/fs.h>
|
#include <nuttx/fs/fs.h>
|
||||||
|
#include <nuttx/signal.h>
|
||||||
#include <nuttx/i2c/i2c_master.h>
|
#include <nuttx/i2c/i2c_master.h>
|
||||||
#include <nuttx/sensors/ioctl.h>
|
#include <nuttx/sensors/ioctl.h>
|
||||||
#include <nuttx/sensors/mlx90614.h>
|
#include <nuttx/sensors/mlx90614.h>
|
||||||
@ -200,6 +201,7 @@ static int mlx90614_write_word(FAR struct mlx90614_dev_s *priv, uint8_t cmd,
|
|||||||
{
|
{
|
||||||
struct i2c_config_s config;
|
struct i2c_config_s config;
|
||||||
uint8_t pkgcrc[5];
|
uint8_t pkgcrc[5];
|
||||||
|
uint8_t *buffer;
|
||||||
uint8_t crc;
|
uint8_t crc;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -211,20 +213,23 @@ static int mlx90614_write_word(FAR struct mlx90614_dev_s *priv, uint8_t cmd,
|
|||||||
|
|
||||||
/* First write 0x00 0x00 to erase the EEPROM */
|
/* First write 0x00 0x00 to erase the EEPROM */
|
||||||
|
|
||||||
pkgcrc[0] = cmd;
|
pkgcrc[0] = I2C_WRITEADDR8(priv->addr);
|
||||||
pkgcrc[1] = 0x00;
|
pkgcrc[1] = cmd;
|
||||||
pkgcrc[2] = 0x00;
|
pkgcrc[2] = 0x00;
|
||||||
|
pkgcrc[3] = 0x00;
|
||||||
|
|
||||||
/* Generate the CRC to put in the PEC field */
|
/* Generate the CRC to put in the PEC field */
|
||||||
|
|
||||||
crc = crc8ccitt(pkgcrc, 3);
|
crc = crc8ccitt(pkgcrc, 4);
|
||||||
sninfo("Generated CRC: 0x%02X\n", crc);
|
sninfo("Generated CRC: 0x%02X\n", crc);
|
||||||
|
|
||||||
pkgcrc[3] = crc;
|
pkgcrc[4] = crc;
|
||||||
|
|
||||||
|
buffer = &(pkgcrc[1]);
|
||||||
|
|
||||||
/* Write the Command + 2 Bytes + PEC to device */
|
/* Write the Command + 2 Bytes + PEC to device */
|
||||||
|
|
||||||
ret = i2c_write(priv->i2c, &config, (FAR const uint8_t *) pkgcrc, 4);
|
ret = i2c_write(priv->i2c, &config, (FAR const uint8_t *) buffer, 4);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
snerr ("i2c_writeread failed: %d\n", ret);
|
snerr ("i2c_writeread failed: %d\n", ret);
|
||||||
@ -233,30 +238,33 @@ static int mlx90614_write_word(FAR struct mlx90614_dev_s *priv, uint8_t cmd,
|
|||||||
|
|
||||||
/* Wait the EEPROM erase */
|
/* Wait the EEPROM erase */
|
||||||
|
|
||||||
nxsig_usleep(100 * 1000);
|
nxsig_usleep(10 * 1000);
|
||||||
|
|
||||||
/* Create the I2C command that will be sent to device */
|
/* Create the I2C command that will be sent to device */
|
||||||
|
|
||||||
pkgcrc[0] = cmd;
|
pkgcrc[0] = I2C_WRITEADDR8(priv->addr);
|
||||||
pkgcrc[1] = (regval & 0xff);
|
pkgcrc[1] = cmd;
|
||||||
pkgcrc[2] = (regval & 0xff00) >> 8;
|
pkgcrc[2] = (regval & 0xff);
|
||||||
|
pkgcrc[3] = (regval & 0xff00) >> 8;
|
||||||
|
|
||||||
/* Generate the CRC to put in the PEC field */
|
/* Generate the CRC to put in the PEC field */
|
||||||
|
|
||||||
crc = crc8ccitt(pkgcrc, 3);
|
crc = crc8ccitt(pkgcrc, 4);
|
||||||
sninfo("Generated CRC: 0x%02X\n", crc);
|
sninfo("Generated CRC: 0x%02X\n", crc);
|
||||||
|
|
||||||
pkgcrc[3] = crc;
|
pkgcrc[4] = crc;
|
||||||
|
|
||||||
/* Write the Command + 2 Bytes + PEC to device */
|
/* Write the Command + 2 Bytes + PEC to device */
|
||||||
|
|
||||||
ret = i2c_write(priv->i2c, &config, (FAR const uint8_t *) pkgcrc, 4);
|
ret = i2c_write(priv->i2c, &config, (FAR const uint8_t *) buffer, 4);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
snerr ("i2c_writeread failed: %d\n", ret);
|
snerr ("i2c_writeread failed: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sninfo("New address 0x%02x stored correctly!\n", regval);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,18 +384,24 @@ static int mlx90614_ioctl(FAR struct file *filep, int cmd,
|
|||||||
|
|
||||||
case SNIOC_CHANGE_SMBUSADDR:
|
case SNIOC_CHANGE_SMBUSADDR:
|
||||||
{
|
{
|
||||||
|
FAR struct mlx90614_dev_s newdev;
|
||||||
FAR uint8_t *ptr = (FAR uint8_t *)((uintptr_t)arg);
|
FAR uint8_t *ptr = (FAR uint8_t *)((uintptr_t)arg);
|
||||||
uint16_t newaddr;
|
uint16_t newaddr;
|
||||||
uint8_t smbcmd;
|
uint8_t smbcmd;
|
||||||
|
|
||||||
|
/* EEPROM reflash only happen when sent at I2C address 0x00 */
|
||||||
|
|
||||||
|
newdev.i2c = priv->i2c;
|
||||||
|
newdev.addr = 0x00;
|
||||||
|
|
||||||
/* The I2C address is put in the high byte position */
|
/* The I2C address is put in the high byte position */
|
||||||
|
|
||||||
newaddr = (uint16_t) (*ptr << 8);
|
newaddr = (uint16_t) *ptr;
|
||||||
snerr("Setting new address: 0x%02x\n", newaddr);
|
sninfo("Setting new address: 0x%02x\n", newaddr);
|
||||||
|
|
||||||
smbcmd = MLX90614_CMD_EEPROM_ACCESS | MLX90614_SMBUS_ADDR;
|
smbcmd = MLX90614_CMD_EEPROM_ACCESS | MLX90614_SMBUS_ADDR;
|
||||||
|
|
||||||
ret = mlx90614_write_word(priv, smbcmd, newaddr);
|
ret = mlx90614_write_word(&newdev, smbcmd, newaddr);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
snerr("ERROR: Failed to change the I2C/SMBus address!\n");
|
snerr("ERROR: Failed to change the I2C/SMBus address!\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user