예제 #1
0
static bool
read_values(int16_t *data)
{
	struct { /* status register and data as read back from the device */
		uint32_t		pressure;
		uint32_t		temperature;
	} __attribute__((packed))	report;

	/* exchange the report structure with the device */
//	I2C_LOCK(dev.i2c, true);
	I2C_SETADDRESS(dev.i2c, MS5611_ADDRESS_2, 7);

	uint8_t cmd = ADDR_DATA;
	int ret = 1;

	cmd = ADDR_DATA;
	ret = I2C_WRITEREAD(dev.i2c, &cmd, 1, (uint8_t*)&(report), sizeof(report));

	/* start conversion for next update */

//	I2C_LOCK(dev.i2c, false);

	/* write values and clamp them to 12 bit */
	data[0] = report.pressure;
	data[1] = report.temperature;

	/* return 1 if new data is available, 0 else */
	/* XXX Check if last read was at least 9.5 ms ago */
	return ret;
}
예제 #2
0
static int
write_reg(uint8_t address, uint8_t data)
{
	uint8_t cmd[] = {address, data};
	/* XXX change to I2C_WRITE once FSM of I2C is fully debugged */
	uint8_t dummy;
	return I2C_WRITEREAD(dev.i2c, &cmd, 2, &dummy, 1);
}
예제 #3
0
int
ms5611_attach(struct i2c_dev_s *i2c)
{
	int	result = ERROR;

	dev.i2c = i2c;

	MS5611_ADDRESS = MS5611_ADDRESS_1;
	uint8_t cmd = ADDR_PROM;

	/* reset */

//	I2C_LOCK(dev.i2c, true);
	I2C_SETADDRESS(dev.i2c, MS5611_ADDRESS, 7);
	int ret = write_reg(ADDR_RESET_CMD, 1);

	/* check if the address was wrong */
	if (ret < 0)
	{
		/* try second address */
		MS5611_ADDRESS = MS5611_ADDRESS_2;
		I2C_SETADDRESS(dev.i2c, MS5611_ADDRESS, 7);
		ret = write_reg(ADDR_RESET_CMD, 1);
	}

	if (ret < 0) return EIO;

	/* wait for PROM contents to be in the device */
	usleep(10000);

	/* read PROM */
	ret = I2C_WRITEREAD(i2c, &cmd, 1, (uint8_t*)dev.prom, sizeof(dev.prom));

	/* OR PROM contents as poor-man's alive check, PROM cannot be all-zero */
	int sum = dev.prom[0] | dev.prom[1] | dev.prom[2] | dev.prom[3] | dev.prom[4] | dev.prom[5] | dev.prom[6] | dev.prom[7];

	/* verify that the device is attached and functioning */
	if ((ret >= 0) && (sum > 0)) {

		/* start first conversion */
		read_reg(ADDR_CMD_CONVERT_D1);
		/* wait */
		usleep(10000);
		read_reg(ADDR_CMD_CONVERT_D2);

		/* make ourselves available */
		register_driver("/dev/ms5611", &ms5611_fops, 0666, NULL);

		result = 0;

	} else {
		errno = EIO;
	}



	return result;
}
예제 #4
0
static int
read_reg(uint8_t address)
{
	uint8_t cmd = address;
	uint8_t data;

	int ret = I2C_WRITEREAD(dev.i2c, &cmd, 1, &data, 1);
	/* return data on success, error code on failure */
	if (ret == 0) ret = data;
	return ret;
}
예제 #5
0
파일: kxtj9.c 프로젝트: jksim/nuttx
static uint8_t kxtj9_reg_read(uint8_t reg, uint8_t *data, int len)
{
    uint8_t buf[1];
    int ret = 0;
    int index = ACCEL_NUM_RETRIES;
    buf[0] = reg;
    do {
        ret = I2C_WRITEREAD(g_data->i2c, buf, 1, data, len);
    } while (ret != 0 && index--);
    return ret;
}
예제 #6
0
파일: tfa9890.c 프로젝트: jksim/nuttx
int tfa9890_reg_read(FAR struct tfa9890_dev_s *priv, uint8_t reg)
{
     uint8_t reg_val[2];
     int ret;

     I2C_SETADDRESS(priv->i2c, priv->i2c_addr, 7);

     ret = I2C_WRITEREAD(priv->i2c, (uint8_t *)&reg, sizeof(reg),
              reg_val, sizeof(reg_val));
     if (ret)
         return ret;

#ifdef CONFIG_ENDIAN_BIG
     ret = *((uint16_t *)reg_val);
#else
     ret = be16_to_cpu(*((uint16_t *)reg_val));
#endif
     return ret;
}