Hardware Abstraction Layer for FreeRTOS
mpu9250_prv.h
Go to the documentation of this file.
1 #ifndef MPU9250_PRV_H_
2 #define MPU9250_PRV_H_
3 #include <stdint.h>
4 #include <mpu9250.h>
5 #include <vec.h>
6 #include <spi.h>
7 #include <hal.h>
8 
9 #ifdef CONFIG_MPU9250_DEBUG
10 # define PRINTF(fmt, ...) printf("MPU: " fmt, ##__VA_ARGS__)
11 #else
12 # define PRINTF(fmt, ...)
13 #endif
14 
15 #define mpu9250_lock(u, w, e) HAL_LOCK(u, w, e)
16 #define mpu9250_unlock(u, e) HAL_UNLOCK(u, e)
17 #ifdef CONFIG_ICM20948
18 static inline int32_t mpu_switchBank(struct mpu9250 *mpu, uint8_t bank, TickType_t waittime);
19 #endif
20 
21 static inline int32_t mpu_send(struct mpu9250 *mpu, uint16_t reg, uint8_t data, TickType_t waittime) {
22 #ifdef CONFIG_ICM20948
23  int ret;
24  if ((reg >> 8) != 0 && (reg >> 8) != mpu->bank) {
25  /* swtich bank is needed */
26  ret = mpu_switchBank(mpu, reg >> 8, waittime);
27  if (ret < 0) {
28  return reg;
29  }
30  }
31 #endif
32  {
33  uint16_t wdata[] = {
34  (reg & 0xFF),
35  (uint16_t) data
36  };
37  return spiSlave_send(mpu->slave, wdata, 2, waittime);
38  }
39 }
40 
41 static int32_t mpu_recv(struct mpu9250 *mpu, uint16_t reg, uint8_t *data, uint32_t len, TickType_t waittime) {
42  int32_t ret;
43  uint32_t size = sizeof(uint16_t) * (len + 1);
44  uint16_t *wdata = alloca(size);
45  uint16_t *rdata = alloca(size);
46  uint32_t i;
47 #ifdef CONFIG_ICM20948
48  if ((reg >> 8) != 0 && (reg >> 8) != mpu->bank) {
49  /* swtich bank is needed */
50  ret = mpu_switchBank(mpu, reg >> 8, waittime);
51  if (ret < 0) {
52  return reg;
53  }
54  }
55 #endif
56  memset(wdata, 0xFF, size);
57  memset(rdata, 0x00, size);
58  wdata[0] = MPU_READ | (reg & 0xFF);
59  ret = spiSlave_transfer(mpu->slave, wdata, rdata, (len + 1), waittime);
60  for (i = 1; i < (len + 1); i++) {
61  data[i - 1] = (uint8_t) rdata[i];
62  }
63  return ret;
64 }
65 #ifdef CONFIG_ICM20948
66 static inline int32_t mpu_switchBank(struct mpu9250 *mpu, uint8_t bank, TickType_t waittime) {
67  return mpu_send(mpu, MPU_REG_BANK_SEL, MPU_REG_BANK_SEL_USER_BANK(bank - 1), waittime);
68 }
69 #endif
70 
71 static inline int32_t mpu_clearSetBit(struct mpu9250 *mpu, uint8_t reg, uint8_t clear, uint8_t set, TickType_t waittime) {
72  int32_t ret;
73  uint8_t val;
74  ret = mpu_recv(mpu, reg, &val, 1, waittime);
75  if (ret < 0) {
76  return -1;
77  }
78  val &= clear;
79  val |= set;
80  return mpu_send(mpu, reg, val, waittime);
81 }
82 static inline void mpu_buildVec(struct vector *vec, uint8_t *data) {
83  vec->x = (((uint16_t) data[0]) << 8) | (((uint16_t) data[1]) << 0);
84  vec->y = (((uint16_t) data[2]) << 8) | (((uint16_t) data[3]) << 0);
85  vec->z = (((uint16_t) data[4]) << 8) | (((uint16_t) data[5]) << 0);
86 }
87 #endif
hal.h
spi.h
vector::y
int16_t y
Definition: vec.h:20
vector::z
int16_t z
Definition: vec.h:24
mpu9250::slave
struct spi_slave * slave
Definition: mpu9250.h:424
spiSlave_send
int32_t spiSlave_send(struct spi_slave *slave, uint16_t *data, uint32_t len, TickType_t waittime)
spiSlave_transfer
int32_t spiSlave_transfer(struct spi_slave *slave, uint16_t *sendData, uint16_t *recvData, uint32_t len, TickType_t waittime)
vector
Definition: vec.h:12
vector::x
int16_t x
Definition: vec.h:16
mpu9250
Definition: mpu9250.h:406
mpu9250.h
mpu9250::bank
uint32_t bank
Definition: mpu9250.h:436
vec.h