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; }
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); }
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; }
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; }
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; }
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 *)®, 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; }