* fix a bug in crc computation for ms583730

* implement POSIX read.
This commit is contained in:
Pierre-noel Bouteville 2016-05-27 07:05:20 -06:00 committed by Gregory Nutt
parent 3d3b7b5422
commit 41412d0ce9
2 changed files with 133 additions and 40 deletions

View File

@ -139,7 +139,7 @@ struct ms58xx_dev_s
****************************************************************************/ ****************************************************************************/
/* CRC Calculation */ /* CRC Calculation */
static uint8_t ms58xx_crc(FAR uint16_t *src, uint8_t crcIndex); static uint8_t ms58xx_crc(FAR uint16_t *src, uint8_t crcndx, uint16_t crcmask);
/* I2C Helpers */ /* I2C Helpers */
@ -200,7 +200,7 @@ static const struct file_operations g_fops =
* *
****************************************************************************/ ****************************************************************************/
static uint8_t ms58xx_crc(FAR uint16_t *src, uint8_t crcIndex) static uint8_t ms58xx_crc(FAR uint16_t *src, uint8_t crcndx, uint16_t crcmask)
{ {
uint16_t cnt; uint16_t cnt;
uint16_t n_rem; uint16_t n_rem;
@ -208,8 +208,8 @@ static uint8_t ms58xx_crc(FAR uint16_t *src, uint8_t crcIndex)
uint8_t n_bit; uint8_t n_bit;
n_rem = 0x00; n_rem = 0x00;
crc_read = src[crcIndex]; crc_read = src[crcndx];
src[crcIndex] = (0xff00 & (src[7])); src[crcndx] &= ~crcmask;
for (cnt = 0; cnt < 16; cnt++) for (cnt = 0; cnt < 16; cnt++)
{ {
@ -236,7 +236,7 @@ static uint8_t ms58xx_crc(FAR uint16_t *src, uint8_t crcIndex)
} }
n_rem = (0x000F & (n_rem >> 12)); n_rem = (0x000F & (n_rem >> 12));
src[crcIndex] = crc_read; src[crcndx] = crc_read;
return (n_rem ^ 0x00); return (n_rem ^ 0x00);
} }
@ -369,24 +369,73 @@ static int ms58xx_readadc(FAR struct ms58xx_dev_s *priv, FAR uint32_t *adc)
*adc = (uint32_t)buffer[0] << 16 | *adc = (uint32_t)buffer[0] << 16 |
(uint32_t)buffer[1] << 8 | (uint32_t)buffer[1] << 8 |
(uint32_t)buffer[2]; (uint32_t)buffer[2];
sndbg("adc: %06x ret: %d\n", *adc, ret); sndbg("adc: %06x ret: %d\n", *adc, ret);
return ret; return ret;
} }
/**************************************************************************** /****************************************************************************
* Name: ms58xx_setosr * Name: ms58xx_setosr_1
* *
* Description: * Description:
* Set the oversampling ratio. * Set the oversampling ratio.
* *
****************************************************************************/ ****************************************************************************/
static int ms58xx_setosr(FAR struct ms58xx_dev_s *priv, uint16_t osr) static int ms58xx_setosr_1(FAR struct ms58xx_dev_s *priv, uint16_t osr)
{ {
int ret = OK; int ret = OK;
switch (osr)
{
case 256:
priv->delay = 600;
priv->osr = 0x0;
break;
sndbg("osr: %04x\n", osr); case 512:
priv->delay = 1170;
priv->osr = 0x2;
break;
case 1024:
priv->delay = 2280;
priv->osr = 0x4;
break;
case 2048:
priv->delay = 4540;
priv->osr = 0x6;
break;
case 4096:
priv->delay = 9040;
priv->osr = 0x8;
break;
case 8192:
priv->delay = 18080;
priv->osr = 0xA;
break;
default:
ret = -EINVAL;
break;
}
return ret;
}
/****************************************************************************
* Name: ms58xx_setosr_2
*
* Description:
* Set the oversampling ratio.
*
****************************************************************************/
static int ms58xx_setosr_2(FAR struct ms58xx_dev_s *priv, uint16_t osr)
{
int ret = OK;
switch (osr) switch (osr)
{ {
case 256: case 256:
@ -409,26 +458,6 @@ static int ms58xx_setosr(FAR struct ms58xx_dev_s *priv, uint16_t osr)
priv->delay = 9040; priv->delay = 9040;
break; break;
case 8192:
switch (priv->model)
{
case MS58XX_MODEL_MS5805_02:
case MS58XX_MODEL_MS5837_30:
priv->delay = 18080;
break;
case MS58XX_MODEL_MS5803_02:
case MS58XX_MODEL_MS5803_05:
case MS58XX_MODEL_MS5803_07:
case MS58XX_MODEL_MS5803_14:
case MS58XX_MODEL_MS5803_30:
case MS58XX_MODEL_MS5806_02:
default:
ret = -EINVAL;
break;
}
break;
default: default:
ret = -EINVAL; ret = -EINVAL;
break; break;
@ -442,6 +471,44 @@ static int ms58xx_setosr(FAR struct ms58xx_dev_s *priv, uint16_t osr)
return ret; return ret;
} }
/****************************************************************************
* Name: ms58xx_setosr
*
* Description:
* Set the oversampling ratio.
*
****************************************************************************/
static int ms58xx_setosr(FAR struct ms58xx_dev_s *priv, uint16_t osr)
{
int ret = OK;
sndbg("osr: %04x\n", osr);
switch (priv->model)
{
case MS58XX_MODEL_MS5805_02:
case MS58XX_MODEL_MS5837_30:
ret = ms58xx_setosr_1(priv,osr);
break;
case MS58XX_MODEL_MS5803_02:
case MS58XX_MODEL_MS5803_05:
case MS58XX_MODEL_MS5803_07:
case MS58XX_MODEL_MS5803_14:
case MS58XX_MODEL_MS5803_30:
case MS58XX_MODEL_MS5806_02:
ret = ms58xx_setosr_2(priv,osr);
break;
default:
ret = -EINVAL;
break;
}
return ret;
}
/**************************************************************************** /****************************************************************************
* Name: ms58xx_readprom * Name: ms58xx_readprom
* *
@ -499,7 +566,7 @@ static int ms58xx_readprom(FAR struct ms58xx_dev_s *priv)
crcmask = (uint16_t)0xf << crcshift; crcmask = (uint16_t)0xf << crcshift;
crc = (uint8_t)((prom[crcindex] & crcmask) >> crcshift); crc = (uint8_t)((prom[crcindex] & crcmask) >> crcshift);
if (crc != ms58xx_crc(prom, crcindex)) if (crc != ms58xx_crc(prom, crcindex, crcmask))
{ {
sndbg("crc mismatch\n"); sndbg("crc mismatch\n");
return -ENODEV; return -ENODEV;
@ -787,7 +854,27 @@ static int ms58xx_close(FAR struct file *filep)
static ssize_t ms58xx_read(FAR struct file *filep, FAR char *buffer, static ssize_t ms58xx_read(FAR struct file *filep, FAR char *buffer,
size_t buflen) size_t buflen)
{ {
return 0; ssize_t size;
FAR struct inode *inode = filep->f_inode;
FAR struct ms58xx_dev_s *priv = inode->i_private;
FAR struct ms58xx_measure_s *p = (FAR struct ms58xx_measure_s *)buffer;
size = buflen;
while (size >= sizeof(*p))
{
if (ms58xx_measure(priv) < 0)
{
return -1;
}
p->temperature = priv->temp;
p->pressure = priv->press;
p++;
size -= sizeof(*p);
}
return size;
} }
/**************************************************************************** /****************************************************************************
@ -907,16 +994,16 @@ int ms58xx_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
/* Sanity check */ /* Sanity check */
DEBUGASSERT(i2c != NULL); DEBUGASSERT(i2c != NULL);
DEBUGASSERT((model == MS58XX_MODEL_MS5803_02 || DEBUGASSERT(((model == MS58XX_MODEL_MS5803_02 ||
model == MS58XX_MODEL_MS5803_05 || model == MS58XX_MODEL_MS5803_05 ||
model == MS58XX_MODEL_MS5803_07 || model == MS58XX_MODEL_MS5803_07 ||
model == MS58XX_MODEL_MS5803_14 || model == MS58XX_MODEL_MS5803_14 ||
model == MS58XX_MODEL_MS5803_30 || model == MS58XX_MODEL_MS5803_30 ||
model == MS58XX_MODEL_MS5806_02) && model == MS58XX_MODEL_MS5806_02) &&
(addr == MS58XX_ADDR0 || addr == MS58XX_ADDR1) || (addr == MS58XX_ADDR0 || addr == MS58XX_ADDR1)) ||
(model == MS58XX_MODEL_MS5805_02 || ((model == MS58XX_MODEL_MS5805_02 ||
model == MS58XX_MODEL_MS5837_30) && model == MS58XX_MODEL_MS5837_30) &&
addr == MS58XX_ADDR0); addr == MS58XX_ADDR0));
/* Initialize the device's structure */ /* Initialize the device's structure */

View File

@ -87,6 +87,12 @@ enum ms58xx_model_e
MS58XX_MODEL_MS5837_30 = 7 MS58XX_MODEL_MS5837_30 = 7
}; };
struct ms58xx_measure_s
{
int32_t temperature; /* in Degree x100 */
int32_t pressure; /* in mBar x10 */
};
struct i2c_master_s; struct i2c_master_s;
/**************************************************************************** /****************************************************************************