9 #ifdef CONFIG_MPU9250_DEBUG
10 # define PRINTF(fmt, ...) printf("MPU: " fmt, ##__VA_ARGS__)
12 # define PRINTF(fmt, ...)
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);
21 static inline int32_t mpu_send(
struct mpu9250 *mpu, uint16_t reg, uint8_t data, TickType_t waittime) {
22 #ifdef CONFIG_ICM20948
24 if ((reg >> 8) != 0 && (reg >> 8) != mpu->
bank) {
26 ret = mpu_switchBank(mpu, reg >> 8, waittime);
41 static int32_t mpu_recv(
struct mpu9250 *mpu, uint16_t reg, uint8_t *data, uint32_t len, TickType_t waittime) {
43 uint32_t size =
sizeof(uint16_t) * (len + 1);
44 uint16_t *wdata = alloca(size);
45 uint16_t *rdata = alloca(size);
47 #ifdef CONFIG_ICM20948
48 if ((reg >> 8) != 0 && (reg >> 8) != mpu->
bank) {
50 ret = mpu_switchBank(mpu, reg >> 8, waittime);
56 memset(wdata, 0xFF, size);
57 memset(rdata, 0x00, size);
58 wdata[0] = MPU_READ | (reg & 0xFF);
60 for (i = 1; i < (len + 1); i++) {
61 data[i - 1] = (uint8_t) rdata[i];
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);
71 static inline int32_t mpu_clearSetBit(
struct mpu9250 *mpu, uint8_t reg, uint8_t clear, uint8_t set, TickType_t waittime) {
74 ret = mpu_recv(mpu, reg, &val, 1, waittime);
80 return mpu_send(mpu, reg, val, waittime);
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);