1
0
forked from me/IronOS

Compare commits

...

1 Commits

Author SHA1 Message Date
Ben V. Brown
2425902fbc Hotfix: BMA Accel wedges I2C if probed too fast after boot
Only an issue on Pinecil as it boots much faster than Miniware units.
2021-01-17 20:13:02 +11:00
8 changed files with 25 additions and 30 deletions

View File

@@ -385,18 +385,10 @@ bool FRToSI2C::lock() {
if (I2CSemaphore == nullptr) { if (I2CSemaphore == nullptr) {
return false; return false;
} }
if (xTaskGetSchedulerState() != taskSCHEDULER_RUNNING) {
return true;
}
return xSemaphoreTake(I2CSemaphore, TICKS_SECOND) == pdTRUE; return xSemaphoreTake(I2CSemaphore, TICKS_SECOND) == pdTRUE;
} }
void FRToSI2C::unlock() { void FRToSI2C::unlock() { xSemaphoreGive(I2CSemaphore); }
if (xTaskGetSchedulerState() != taskSCHEDULER_RUNNING) {
return;
}
xSemaphoreGive(I2CSemaphore);
}
bool FRToSI2C::writeRegistersBulk(const uint8_t address, const I2C_REG *registers, const uint8_t registersLength) { bool FRToSI2C::writeRegistersBulk(const uint8_t address, const I2C_REG *registers, const uint8_t registersLength) {
for (int index = 0; index < registersLength; index++) { for (int index = 0; index < registersLength; index++) {

View File

@@ -5,8 +5,8 @@
* Author: Ralim * Author: Ralim
*/ */
#ifndef BSP_MINIWARE_IRQ_H_ #ifndef BSP_PINE64_IRQ_H_
#define BSP_MINIWARE_IRQ_H_ #define BSP_PINE64_IRQ_H_
#include "BSP.h" #include "BSP.h"
#include "I2C_Wrapper.hpp" #include "I2C_Wrapper.hpp"
@@ -53,4 +53,4 @@ extern volatile uint8_t i2c_process_flag;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* BSP_MINIWARE_IRQ_H_ */ #endif /* BSP_PINE64_IRQ_H_ */

View File

@@ -5,8 +5,8 @@
* Author: Ralim * Author: Ralim
*/ */
#ifndef BSP_MINIWARE_MODEL_CONFIG_H_ #ifndef BSP_PINE64_MODEL_CONFIG_H_
#define BSP_MINIWARE_MODEL_CONFIG_H_ #define BSP_PINE64_MODEL_CONFIG_H_
/* /*
* Lookup for mapping features <-> Models * Lookup for mapping features <-> Models
*/ */
@@ -29,4 +29,4 @@
#define BATTFILTERDEPTH 32 #define BATTFILTERDEPTH 32
#endif #endif
#endif /* BSP_MINIWARE_MODEL_CONFIG_H_ */ #endif /* BSP_PINE64_MODEL_CONFIG_H_ */

View File

@@ -5,8 +5,8 @@
* Author: Ralim * Author: Ralim
*/ */
#ifndef BSP_MINIWARE_PINS_H_ #ifndef BSP_PINE64_PINS_H_
#define BSP_MINIWARE_PINS_H_ #define BSP_PINE64_PINS_H_
#include "gd32vf103_gpio.h" #include "gd32vf103_gpio.h"
#define KEY_B_Pin BIT(1) #define KEY_B_Pin BIT(1)
@@ -50,4 +50,4 @@
#define FUSB302_IRQ_Pin BIT(5) #define FUSB302_IRQ_Pin BIT(5)
#define FUSB302_IRQ_GPIO_Port GPIOB #define FUSB302_IRQ_GPIO_Port GPIOB
#endif /* BSP_MINIWARE_PINS_H_ */ #endif /* BSP_PINE64_PINS_H_ */

View File

@@ -5,8 +5,8 @@
* Author: Ben V. Brown * Author: Ben V. Brown
*/ */
#ifndef SETUP_H_ #ifndef PINE_SETUP_H_
#define SETUP_H_ #define PINE_SETUP_H_
#include "gd32vf103_libopt.h" #include "gd32vf103_libopt.h"
#include <stdint.h> #include <stdint.h>
@@ -21,4 +21,4 @@ void setupFUSBIRQ();
#endif #endif
extern const uint8_t holdoffTicks; extern const uint8_t holdoffTicks;
extern const uint8_t tempMeasureTicks; extern const uint8_t tempMeasureTicks;
#endif /* SETUP_H_ */ #endif /* PINE_SETUP_H_ */

View File

@@ -5,7 +5,7 @@
* Author: Ralim * Author: Ralim
*/ */
#ifndef BSP_MINIWARE_UNITSETTINGS_H_ #ifndef BSP_PINE64_UNITSETTINGS_H_
#define BSP_MINIWARE_UNITSETTINGS_H_ #define BSP_PINE64_UNITSETTINGS_H_
#endif /* BSP_MINIWARE_UNITSETTINGS_H_ */ #endif /* BSP_PINE64_UNITSETTINGS_H_ */

View File

@@ -749,7 +749,7 @@ void showWarnings() {
// In this case though, we dont want to nag the user _too_ much // In this case though, we dont want to nag the user _too_ much
// So only show first 2 times // So only show first 2 times
while (DetectedAccelerometerVersion == ACCELEROMETERS_SCANNING) { while (DetectedAccelerometerVersion == ACCELEROMETERS_SCANNING) {
osDelay(1); osDelay(5);
} }
// Display alert if accelerometer is not detected // Display alert if accelerometer is not detected
if (DetectedAccelerometerVersion == NO_DETECTED_ACCELEROMETER) { if (DetectedAccelerometerVersion == NO_DETECTED_ACCELEROMETER) {
@@ -800,7 +800,6 @@ void startGUITask(void const *argument __unused) {
ButtonState buttons = getButtonState(); ButtonState buttons = getButtonState();
if (buttons) if (buttons)
ticks = xTaskGetTickCount(); // make timeout now so we will exit ticks = xTaskGetTickCount(); // make timeout now so we will exit
OLED::refresh();
GUIDelay(); GUIDelay();
} }

View File

@@ -12,6 +12,7 @@
#include "LIS2DH12.hpp" #include "LIS2DH12.hpp"
#include "MMA8652FC.hpp" #include "MMA8652FC.hpp"
#include "MSA301.h" #include "MSA301.h"
#include "Model_Config.h"
#include "QC3.h" #include "QC3.h"
#include "SC7A20.hpp" #include "SC7A20.hpp"
#include "Settings.h" #include "Settings.h"
@@ -25,8 +26,9 @@
#define MOVFilter 8 #define MOVFilter 8
uint8_t accelInit = 0; uint8_t accelInit = 0;
TickType_t lastMovementTime = 0; TickType_t lastMovementTime = 0;
void detectAccelerometerVersion() {
DetectedAccelerometerVersion = 99; void detectAccelerometerVersion() {
DetectedAccelerometerVersion = ACCELEROMETERS_SCANNING;
#ifdef ACCEL_MMA #ifdef ACCEL_MMA
if (MMA8652FC::detect()) { if (MMA8652FC::detect()) {
if (MMA8652FC::initalize()) { if (MMA8652FC::initalize()) {
@@ -44,7 +46,7 @@ void detectAccelerometerVersion() {
#endif #endif
#ifdef ACCEL_BMA #ifdef ACCEL_BMA
if (BMA223::detect()) { if (BMA223::detect()) {
// Setup the ST Accelerometer // Setup the BMA223 Accelerometer
if (BMA223::initalize()) { if (BMA223::initalize()) {
DetectedAccelerometerVersion = 3; DetectedAccelerometerVersion = 3;
} }
@@ -68,7 +70,8 @@ void detectAccelerometerVersion() {
#endif #endif
{ {
// disable imu sensitivity // disable imu sensitivity
systemSettings.sensitivity = 0; systemSettings.sensitivity = 0;
DetectedAccelerometerVersion = NO_DETECTED_ACCELEROMETER;
} }
} }
inline void readAccelerometer(int16_t &tx, int16_t &ty, int16_t &tz, Orientation &rotation) { inline void readAccelerometer(int16_t &tx, int16_t &ty, int16_t &tz, Orientation &rotation) {
@@ -107,6 +110,7 @@ inline void readAccelerometer(int16_t &tx, int16_t &ty, int16_t &tz, Orientation
} }
} }
void startMOVTask(void const *argument __unused) { void startMOVTask(void const *argument __unused) {
osDelay(TICKS_100MS / 5);// This is here as the BMA doesnt start up instantly and can wedge the I2C bus if probed too fast after boot
detectAccelerometerVersion(); detectAccelerometerVersion();
osDelay(TICKS_100MS / 2); // wait ~50ms for setup of accel to finalise osDelay(TICKS_100MS / 2); // wait ~50ms for setup of accel to finalise
lastMovementTime = 0; lastMovementTime = 0;