static void bmi160_handle_interrupts(void *arg) { struct device *dev = (struct device *)arg; union { u8_t raw[6]; struct { u8_t dummy; /* spi related dummy byte */ u8_t status; u8_t int_status[4]; }; } buf; if (bmi160_read(dev, BMI160_REG_STATUS, buf.raw, sizeof(buf)) < 0) { return; } if ((buf.int_status[0] & BMI160_INT_STATUS0_ANYM) && (buf.int_status[2] & (BMI160_INT_STATUS2_ANYM_FIRST_X | BMI160_INT_STATUS2_ANYM_FIRST_Y | BMI160_INT_STATUS2_ANYM_FIRST_Z))) { bmi160_handle_anymotion(dev); } if (buf.int_status[1] & BMI160_INT_STATUS1_DRDY) { bmi160_handle_drdy(dev, buf.status); } }
int bmi160_byte_read(struct device *dev, uint8_t reg_addr, uint8_t *byte) { uint8_t rx_buf[2]; if (bmi160_read(dev, reg_addr, rx_buf, 2) < 0) { return -EIO; } *byte = rx_buf[1]; return 0; }
static int bmi160_word_read(struct device *dev, uint8_t reg_addr, uint16_t *word) { union { uint8_t raw[3]; struct { uint8_t dummy; uint16_t word; } __packed; } buf; if (bmi160_read(dev, reg_addr, buf.raw, 3) < 0) { return -EIO; } *word = sys_le16_to_cpu(buf.word); return 0; }