-
-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sensor_mpu9250: No need to schedule start of bulk reading
It's simpler and faster to enable the mpu9250 in the python code. Signed-off-by: Kevin O'Connor <[email protected]>
- Loading branch information
1 parent
6f0e91f
commit d853c19
Showing
2 changed files
with
43 additions
and
108 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,7 +2,7 @@ | |
// | ||
// Copyright (C) 2023 Matthew Swabey <[email protected]> | ||
// Copyright (C) 2022 Harry Beyel <[email protected]> | ||
// Copyright (C) 2020-2021 Kevin O'Connor <[email protected]> | ||
// Copyright (C) 2020-2023 Kevin O'Connor <[email protected]> | ||
// | ||
// This file may be distributed under the terms of the GNU GPLv3 license. | ||
|
||
|
@@ -17,27 +17,10 @@ | |
#include "i2ccmds.h" // i2cdev_oid_lookup | ||
|
||
// Chip registers | ||
#define AR_FIFO_SIZE 512 | ||
|
||
#define AR_PWR_MGMT_1 0x6B | ||
#define AR_PWR_MGMT_2 0x6C | ||
#define AR_FIFO_EN 0x23 | ||
#define AR_ACCEL_OUT_XH 0x3B | ||
#define AR_USER_CTRL 0x6A | ||
#define AR_FIFO_COUNT_H 0x72 | ||
#define AR_FIFO 0x74 | ||
#define AR_INT_STATUS 0x3A | ||
|
||
#define SET_ENABLE_FIFO 0x08 | ||
#define SET_DISABLE_FIFO 0x00 | ||
#define SET_USER_FIFO_RESET 0x04 | ||
#define SET_USER_FIFO_EN 0x40 | ||
|
||
#define SET_PWR_SLEEP 0x40 | ||
#define SET_PWR_WAKE 0x00 | ||
#define SET_PWR_2_ACCEL 0x07 // only enable accelerometers | ||
#define SET_PWR_2_NONE 0x3F // disable all sensors | ||
|
||
#define FIFO_OVERFLOW_INT 0x10 | ||
|
||
#define BYTES_PER_FIFO_ENTRY 6 | ||
|
@@ -53,24 +36,11 @@ struct mpu9250 { | |
}; | ||
|
||
enum { | ||
AX_HAVE_START = 1<<0, AX_RUNNING = 1<<1, AX_PENDING = 1<<2, | ||
AX_PENDING = 1<<0, | ||
}; | ||
|
||
static struct task_wake mpu9250_wake; | ||
|
||
// Reads the fifo byte count from the device. | ||
static uint16_t | ||
get_fifo_status (struct mpu9250 *mp) | ||
{ | ||
uint8_t reg[] = {AR_FIFO_COUNT_H}; | ||
uint8_t msg[2]; | ||
i2c_read(mp->i2c->i2c_config, sizeof(reg), reg, sizeof(msg), msg); | ||
uint16_t fifo_bytes = ((msg[0] & 0x1f) << 8) | msg[1]; | ||
if (fifo_bytes > mp->fifo_max) | ||
mp->fifo_max = fifo_bytes; | ||
return fifo_bytes; | ||
} | ||
|
||
// Event handler that wakes mpu9250_task() periodically | ||
static uint_fast8_t | ||
mpu9250_event(struct timer *timer) | ||
|
@@ -101,6 +71,19 @@ mp9250_reschedule_timer(struct mpu9250 *mp) | |
irq_enable(); | ||
} | ||
|
||
// Reads the fifo byte count from the device. | ||
static uint16_t | ||
get_fifo_status(struct mpu9250 *mp) | ||
{ | ||
uint8_t reg[] = {AR_FIFO_COUNT_H}; | ||
uint8_t msg[2]; | ||
i2c_read(mp->i2c->i2c_config, sizeof(reg), reg, sizeof(msg), msg); | ||
uint16_t fifo_bytes = ((msg[0] & 0x1f) << 8) | msg[1]; | ||
if (fifo_bytes > mp->fifo_max) | ||
mp->fifo_max = fifo_bytes; | ||
return fifo_bytes; | ||
} | ||
|
||
// Query accelerometer data | ||
static void | ||
mp9250_query(struct mpu9250 *mp, uint8_t oid) | ||
|
@@ -123,82 +106,35 @@ mp9250_query(struct mpu9250 *mp, uint8_t oid) | |
// otherwise schedule timed wakeup | ||
if (mp->fifo_pkts_bytes >= BYTES_PER_BLOCK) { | ||
sched_wake_task(&mpu9250_wake); | ||
} else if (mp->flags & AX_RUNNING) { | ||
sched_del_timer(&mp->timer); | ||
} else { | ||
mp->flags &= ~AX_PENDING; | ||
mp9250_reschedule_timer(mp); | ||
} | ||
} | ||
|
||
// Startup measurements | ||
static void | ||
mp9250_start(struct mpu9250 *mp, uint8_t oid) | ||
{ | ||
sched_del_timer(&mp->timer); | ||
mp->flags = AX_RUNNING; | ||
uint8_t msg[2]; | ||
|
||
msg[0] = AR_FIFO_EN; | ||
msg[1] = SET_DISABLE_FIFO; // disable FIFO | ||
i2c_write(mp->i2c->i2c_config, sizeof(msg), msg); | ||
|
||
msg[0] = AR_USER_CTRL; | ||
msg[1] = SET_USER_FIFO_RESET; // reset FIFO buffer | ||
i2c_write(mp->i2c->i2c_config, sizeof(msg), msg); | ||
|
||
msg[0] = AR_USER_CTRL; | ||
msg[1] = SET_USER_FIFO_EN; // enable FIFO buffer access | ||
i2c_write(mp->i2c->i2c_config, sizeof(msg), msg); | ||
|
||
uint8_t int_reg[] = {AR_INT_STATUS}; // clear FIFO overflow flag | ||
i2c_read(mp->i2c->i2c_config, sizeof(int_reg), int_reg, 1, msg); | ||
|
||
msg[0] = AR_FIFO_EN; | ||
msg[1] = SET_ENABLE_FIFO; // enable accel output to FIFO | ||
i2c_write(mp->i2c->i2c_config, sizeof(msg), msg); | ||
|
||
mp9250_reschedule_timer(mp); | ||
} | ||
|
||
// End measurements | ||
static void | ||
mp9250_stop(struct mpu9250 *mp, uint8_t oid) | ||
{ | ||
// Disable measurements | ||
sched_del_timer(&mp->timer); | ||
mp->flags = 0; | ||
|
||
// disable accel FIFO | ||
uint8_t msg[2] = { AR_FIFO_EN, SET_DISABLE_FIFO }; | ||
i2c_write(mp->i2c->i2c_config, sizeof(msg), msg); | ||
|
||
// Uncomment and rebuilt to check for FIFO overruns when tuning | ||
//output("mpu9240 limit_count=%u fifo_max=%u", | ||
// mp->limit_count, mp->fifo_max); | ||
} | ||
|
||
void | ||
command_query_mpu9250(uint32_t *args) | ||
{ | ||
struct mpu9250 *mp = oid_lookup(args[0], command_config_mpu9250); | ||
|
||
if (!args[2]) { | ||
sched_del_timer(&mp->timer); | ||
mp->flags = 0; | ||
if (!args[1]) { | ||
// End measurements | ||
mp9250_stop(mp, args[0]); | ||
|
||
// Uncomment and rebuilt to check for FIFO overruns when tuning | ||
//output("mpu9240 fifo_max=%u", mp->fifo_max); | ||
return; | ||
} | ||
|
||
// Start new measurements query | ||
sched_del_timer(&mp->timer); | ||
mp->timer.waketime = args[1]; | ||
mp->rest_ticks = args[2]; | ||
mp->flags = AX_HAVE_START; | ||
mp->rest_ticks = args[1]; | ||
sensor_bulk_reset(&mp->sb); | ||
mp->fifo_max = 0; | ||
mp->fifo_pkts_bytes = 0; | ||
sched_add_timer(&mp->timer); | ||
mp9250_reschedule_timer(mp); | ||
} | ||
DECL_COMMAND(command_query_mpu9250, | ||
"query_mpu9250 oid=%c clock=%u rest_ticks=%u"); | ||
DECL_COMMAND(command_query_mpu9250, "query_mpu9250 oid=%c rest_ticks=%u"); | ||
|
||
void | ||
command_query_mpu9250_status(uint32_t *args) | ||
|
@@ -235,15 +171,8 @@ mpu9250_task(void) | |
struct mpu9250 *mp; | ||
foreach_oid(oid, mp, command_config_mpu9250) { | ||
uint_fast8_t flags = mp->flags; | ||
if (!(flags & AX_PENDING)) { | ||
continue; | ||
} | ||
if (flags & AX_HAVE_START) { | ||
mp9250_start(mp, oid); | ||
} | ||
else { | ||
if (flags & AX_PENDING) | ||
mp9250_query(mp, oid); | ||
} | ||
} | ||
} | ||
DECL_TASK(mpu9250_task); |