cleanup
This commit is contained in:
parent
e64cc577e9
commit
9a0b274711
25
bme680.c
25
bme680.c
@ -13,7 +13,8 @@ static void calc_press_comp(bme680_t *bme680);
|
|||||||
static void calc_hum_comp(bme680_t *bme680);
|
static void calc_hum_comp(bme680_t *bme680);
|
||||||
|
|
||||||
|
|
||||||
static int write_dev(bme680_t *bme680, uint8_t reg, uint8_t *src, uint32_t size) {
|
static int write_dev(bme680_t *bme680, uint8_t reg, uint8_t value) {
|
||||||
|
|
||||||
uint8_t tmp;
|
uint8_t tmp;
|
||||||
|
|
||||||
if (BME680_IS_SPI(bme680->mode)) {
|
if (BME680_IS_SPI(bme680->mode)) {
|
||||||
@ -23,15 +24,15 @@ static int write_dev(bme680_t *bme680, uint8_t reg, uint8_t *src, uint32_t size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bme680->dev.write(reg, src, size);
|
return bme680->dev.write(reg, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int write_spi_page(bme680_t *bme680, uint8_t page_value) {
|
static int write_spi_page(bme680_t *bme680, uint8_t page_value) {
|
||||||
uint8_t status_byte = (!!page_value) << 4;
|
uint8_t status_byte = (!!page_value) << 4;
|
||||||
|
return bme680->dev.write(REG_STATUS, status_byte);
|
||||||
return bme680->dev.write(REG_STATUS, &status_byte, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int read_dev(bme680_t *bme680, uint8_t reg, uint8_t *dst, uint32_t size) {
|
static int read_dev(bme680_t *bme680, uint8_t reg, uint8_t *dst, uint32_t size) {
|
||||||
|
|
||||||
uint8_t tmp;
|
uint8_t tmp;
|
||||||
@ -87,7 +88,7 @@ int bme680_reset(bme680_t *bme680) {
|
|||||||
uint8_t magic = 0xB6;
|
uint8_t magic = 0xB6;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = write_dev(bme680, reg, &magic, 1);
|
ret = write_dev(bme680, reg, magic);
|
||||||
usleep(5000); /* sleep for 5 ms */
|
usleep(5000); /* sleep for 5 ms */
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -102,19 +103,19 @@ int bme680_start(bme680_t *bme680) {
|
|||||||
/* ctrl_meas. the last 0 is ticked on to enable forced mode,
|
/* ctrl_meas. the last 0 is ticked on to enable forced mode,
|
||||||
* but the config has to be written fist. strange behaviour.
|
* but the config has to be written fist. strange behaviour.
|
||||||
*/
|
*/
|
||||||
meas = (bme680->cfg.osrs_t) << 5 | (bme680->cfg.osrs_p) << 2;
|
meas = bme680->cfg.osrs_t << 5 | bme680->cfg.osrs_p << 2;
|
||||||
hum = bme680->cfg.osrs_h;
|
hum = bme680->cfg.osrs_h;
|
||||||
filter = (bme680->cfg.filter) << 2;
|
filter = bme680->cfg.filter << 2;
|
||||||
|
|
||||||
err |= write_dev(bme680, REG_CTRL_MEAS, &meas, 1);
|
err |= write_dev(bme680, REG_CTRL_MEAS, meas);
|
||||||
err |= write_dev(bme680, REG_CTRL_HUM, &hum, 1);
|
err |= write_dev(bme680, REG_CTRL_HUM, hum);
|
||||||
err |= write_dev(bme680, REG_CONFIG, &filter, 1);
|
err |= write_dev(bme680, REG_CONFIG, filter);
|
||||||
|
|
||||||
// TODO: gas stuff
|
// TODO: gas stuff
|
||||||
|
|
||||||
/* Now, re-send `meas' but LSb set to 1 to enable a forced conversion */
|
/* Now, re-send `meas' but LSb set to 1 to enable a forced conversion */
|
||||||
meas |= 1;
|
meas |= 1;
|
||||||
err |= write_dev(bme680, REG_CTRL_MEAS, &meas, 1);
|
err |= write_dev(bme680, REG_CTRL_MEAS, meas);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -137,7 +138,7 @@ int bme680_poll(bme680_t *bme680) {
|
|||||||
} while (((meas_status >> 5) & 1) && attempts++ < BME680_MAX_POLL_ATTEMPTS && !err);
|
} while (((meas_status >> 5) & 1) && attempts++ < BME680_MAX_POLL_ATTEMPTS && !err);
|
||||||
|
|
||||||
if (attempts == BME680_MAX_POLL_ATTEMPTS) {
|
if (attempts == BME680_MAX_POLL_ATTEMPTS) {
|
||||||
err = 1;
|
err = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
15
bme680.h
15
bme680.h
@ -14,14 +14,12 @@
|
|||||||
#define BME680_MODE_INT 2
|
#define BME680_MODE_INT 2
|
||||||
#define BME680_MODE_FLOAT 0
|
#define BME680_MODE_FLOAT 0
|
||||||
|
|
||||||
#define BME680_MAX_XFER_SIZE 128
|
|
||||||
|
|
||||||
/* config values */
|
/* config values */
|
||||||
#define BME680_OVERSAMPLE_1X 0b001
|
#define BME680_OVERSAMPLE_X1 0b001
|
||||||
#define BME680_OVERSAMPLE_2X 0b010
|
#define BME680_OVERSAMPLE_X2 0b010
|
||||||
#define BME680_OVERSAMPLE_4X 0b011
|
#define BME680_OVERSAMPLE_X4 0b011
|
||||||
#define BME680_OVERSAMPLE_8X 0b100
|
#define BME680_OVERSAMPLE_X8 0b100
|
||||||
#define BME680_OVERSAMPLE_16X 0b101
|
#define BME680_OVERSAMPLE_X16 0b101
|
||||||
|
|
||||||
/* IIR filter */
|
/* IIR filter */
|
||||||
#define BME680_IIR_COEFF_0 0b000
|
#define BME680_IIR_COEFF_0 0b000
|
||||||
@ -38,8 +36,7 @@
|
|||||||
struct bme680_dev {
|
struct bme680_dev {
|
||||||
int (*init) (void);
|
int (*init) (void);
|
||||||
int (*read) (uint8_t reg, uint8_t *dst, uint32_t size);
|
int (*read) (uint8_t reg, uint8_t *dst, uint32_t size);
|
||||||
int (*write) (uint8_t reg, uint8_t *src, uint32_t size);
|
int (*write) (uint8_t reg, uint8_t value);
|
||||||
int (*xfer) (uint8_t reg, uint8_t *src, uint8_t *dst, uint32_t size);
|
|
||||||
int (*deinit) (void);
|
int (*deinit) (void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
23
i2c.c
23
i2c.c
@ -7,6 +7,8 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "i2c.h"
|
||||||
|
|
||||||
int i2c_init(const char *dev, uint8_t addr) {
|
int i2c_init(const char *dev, uint8_t addr) {
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
|
||||||
@ -26,30 +28,29 @@ int i2c_init(const char *dev, uint8_t addr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int i2c_read_reg(int fd, uint8_t reg, uint8_t length, uint8_t *buf) {
|
int i2c_read_reg(int fd, uint8_t reg, uint8_t *dst, uint32_t size) {
|
||||||
|
|
||||||
uint8_t cmd[2] = {reg, 0x00};
|
uint8_t cmd[2] = {reg, 0x00};
|
||||||
write(fd, cmd, 2);
|
write(fd, cmd, 2);
|
||||||
if (read(fd, buf, length) != length) {
|
|
||||||
|
if (read(fd, dst, size) != (ssize_t)size) {
|
||||||
fprintf(stderr, "error read()\n");
|
fprintf(stderr, "error read()\n");
|
||||||
return 1;
|
return I2C_ERR;
|
||||||
|
|
||||||
}
|
}
|
||||||
return 0;
|
return I2C_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_read_reg2(int fd, uint8_t reg) {
|
|
||||||
uint8_t buf;
|
|
||||||
i2c_read_reg(fd, reg, 1, &buf);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
int i2c_write_reg(int fd, uint8_t reg, uint8_t value) {
|
int i2c_write_reg(int fd, uint8_t reg, uint8_t value) {
|
||||||
|
|
||||||
uint8_t cmd[2] = {reg, value};
|
uint8_t cmd[2] = {reg, value};
|
||||||
|
|
||||||
if (write(fd, cmd, 2) != 2) {
|
if (write(fd, cmd, 2) != 2) {
|
||||||
fprintf(stderr, "error write()\n");
|
fprintf(stderr, "error write()\n");
|
||||||
return 1;
|
return I2C_ERR;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
return I2C_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
14
i2c.h
14
i2c.h
@ -1,9 +1,13 @@
|
|||||||
#pragma once
|
#ifndef I2C_H
|
||||||
|
#define I2C_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
int i2c_init(const char *, uint8_t);
|
#define I2C_OK 0
|
||||||
int i2c_read_reg(int, uint8_t, uint8_t, uint8_t *);
|
#define I2C_ERR 1
|
||||||
uint8_t i2c_read_reg2(uint8_t, uint8_t);
|
|
||||||
int i2c_write_reg(int, uint8_t, uint8_t);
|
|
||||||
|
|
||||||
|
int i2c_init (const char *dev, uint8_t addr);
|
||||||
|
int i2c_read_reg (int fd, uint8_t reg, uint8_t *dst, uint32_t size);
|
||||||
|
int i2c_write_reg (int fd, uint8_t reg, uint8_t value);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
56
main.c
56
main.c
@ -13,7 +13,7 @@ int i2c_dev_fd;
|
|||||||
|
|
||||||
int linux_i2c_init (void);
|
int linux_i2c_init (void);
|
||||||
int linux_i2c_read (uint8_t reg, uint8_t *dst, uint32_t size);
|
int linux_i2c_read (uint8_t reg, uint8_t *dst, uint32_t size);
|
||||||
int linux_i2c_write (uint8_t reg, uint8_t *src, uint32_t size);
|
int linux_i2c_write (uint8_t reg, uint8_t value);
|
||||||
int linux_i2c_deinit (void);
|
int linux_i2c_deinit (void);
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
@ -26,7 +26,6 @@ int main() {
|
|||||||
bme680.dev.read = linux_i2c_read;
|
bme680.dev.read = linux_i2c_read;
|
||||||
bme680.dev.write = linux_i2c_write;
|
bme680.dev.write = linux_i2c_write;
|
||||||
bme680.dev.deinit = linux_i2c_deinit;
|
bme680.dev.deinit = linux_i2c_deinit;
|
||||||
bme680.dev.xfer = NULL;
|
|
||||||
|
|
||||||
/* 2. set the device mode */
|
/* 2. set the device mode */
|
||||||
mode = BME680_MODE_FLOAT | BME680_I2C;
|
mode = BME680_MODE_FLOAT | BME680_I2C;
|
||||||
@ -53,10 +52,10 @@ int main() {
|
|||||||
bme680_print_calibration(&bme680);
|
bme680_print_calibration(&bme680);
|
||||||
|
|
||||||
/* 6. set up device config */
|
/* 6. set up device config */
|
||||||
bme680.cfg.osrs_t = BME680_OVERSAMPLE_16X;
|
bme680.cfg.osrs_t = BME680_OVERSAMPLE_X16;
|
||||||
bme680.cfg.osrs_p = BME680_OVERSAMPLE_16X;
|
bme680.cfg.osrs_p = BME680_OVERSAMPLE_X16;
|
||||||
bme680.cfg.osrs_h = BME680_OVERSAMPLE_8X;
|
bme680.cfg.osrs_h = BME680_OVERSAMPLE_X8;
|
||||||
bme680.cfg.filter = BME680_IIR_COEFF_63;
|
bme680.cfg.filter = BME680_IIR_COEFF_127;
|
||||||
|
|
||||||
/* 7. write config to device and set off conversion */
|
/* 7. write config to device and set off conversion */
|
||||||
if (bme680_start(&bme680) != 0) {
|
if (bme680_start(&bme680) != 0) {
|
||||||
@ -100,12 +99,15 @@ int main() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// STUBS
|
// STUBS
|
||||||
|
|
||||||
int linux_i2c_init (void) {
|
int linux_i2c_init (void) {
|
||||||
puts("linux_i2c_init");
|
|
||||||
int ret = i2c_init(DEVICE, ADDRESS);
|
int ret;
|
||||||
if (ret > 0) {
|
puts("i2c_init");
|
||||||
|
|
||||||
|
if ((ret = i2c_init(DEVICE, ADDRESS)) > 0) {
|
||||||
i2c_dev_fd = ret;
|
i2c_dev_fd = ret;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -115,20 +117,20 @@ int linux_i2c_init (void) {
|
|||||||
|
|
||||||
int linux_i2c_read (uint8_t reg, uint8_t *dst, uint32_t size) {
|
int linux_i2c_read (uint8_t reg, uint8_t *dst, uint32_t size) {
|
||||||
|
|
||||||
int i;
|
uint32_t i;
|
||||||
int ret;
|
|
||||||
|
|
||||||
printf("linux_i2c_read: %X (%d) [", reg, size);
|
printf("i2c_read: %.2X (%d) [", reg, size);
|
||||||
|
|
||||||
ret = i2c_read_reg(i2c_dev_fd, reg, (uint8_t)size, dst);
|
if (i2c_read_reg(i2c_dev_fd, reg, dst, size) != I2C_OK) {
|
||||||
if (ret != 0) {
|
return 1;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0; i<size; i++) {
|
for(i=0; i<size; i++) {
|
||||||
printf("%X", dst[i]);
|
|
||||||
|
printf("%.2X", dst[i]);
|
||||||
|
|
||||||
if (i < (size - 1)) {
|
if (i < (size - 1)) {
|
||||||
printf(",");
|
printf(", ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,27 +139,21 @@ int linux_i2c_read (uint8_t reg, uint8_t *dst, uint32_t size) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int linux_i2c_write (uint8_t reg, uint8_t *src, uint32_t size) {
|
int linux_i2c_write (uint8_t reg, uint8_t value) {
|
||||||
|
|
||||||
int i;
|
printf("i2c_write: %.2X [%.2X]\n", reg, value);
|
||||||
|
|
||||||
printf("linux_i2c_write: %X (%d) [", reg, size);
|
if (i2c_write_reg(i2c_dev_fd, reg, value) != I2C_OK) {
|
||||||
for(i=0; i<size; i++) {
|
|
||||||
printf("%X", src[i]);
|
|
||||||
if (i < (size - 1)) {
|
|
||||||
printf(",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf("]\n");
|
|
||||||
|
|
||||||
if (i2c_write_reg(i2c_dev_fd, reg, *src) != 0) {
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int linux_i2c_deinit (void) {
|
int linux_i2c_deinit (void) {
|
||||||
puts("linux_i2c_deinit");
|
|
||||||
|
puts("i2c_deinit");
|
||||||
close(i2c_dev_fd);
|
close(i2c_dev_fd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user