From d9c05db05821843f6d0dcf0e9e09ef0e123d0d17 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 5 Sep 2020 20:04:07 +1000 Subject: [PATCH 1/6] I2C wrapper cleanup --- .../TS100/Core/BSP/Miniware/I2C_Wrapper.cpp | 132 +++++++----------- .../TS100/Core/BSP/Miniware/fusb302b.cpp | 10 +- workspace/TS100/Core/Drivers/I2CBB.cpp | 11 +- workspace/TS100/Core/Drivers/I2C_Wrapper.hpp | 12 +- 4 files changed, 63 insertions(+), 102 deletions(-) diff --git a/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp b/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp index 785e3b25..5eb60c81 100644 --- a/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp +++ b/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp @@ -7,8 +7,7 @@ #include #include "BSP.h" #include "Setup.h" -#define I2CUSESDMA -SemaphoreHandle_t FRToSI2C::I2CSemaphore; +SemaphoreHandle_t FRToSI2C::I2CSemaphore = nullptr; StaticSemaphore_t FRToSI2C::xSemaphoreBuffer; void FRToSI2C::CpltCallback() { @@ -21,45 +20,22 @@ void FRToSI2C::CpltCallback() { bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress, uint8_t *pData, uint16_t Size) { - if (I2CSemaphore == NULL) { - // no RToS, run blocking code - HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, - pData, Size, 5000); - return true; - } else { - // RToS is active, run threading - // Get the mutex so we can use the I2C port - // Wait up to 1 second for the mutex - if (xSemaphoreTake(I2CSemaphore, (TickType_t)500) == pdTRUE) { -#ifdef I2CUSESDMA - if (HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, - I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) { + if (!lock()) + return false; + if (HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, + I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) { - I2C_Unstick(); - xSemaphoreGive(I2CSemaphore); - return false; - } else { - xSemaphoreGive(I2CSemaphore); - return true; - } -#else - - if (HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, pData, Size, - 5000)==HAL_OK){ - xSemaphoreGive(I2CSemaphore); - return true; - } - xSemaphoreGive(I2CSemaphore); - return false; -#endif - } else { - return false; - } + I2C_Unstick(); + unlock(); + return false; } + unlock(); + return true; + } -void FRToSI2C::I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data) { - Mem_Write(address, reg, &data, 1); +bool FRToSI2C::I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data) { + return Mem_Write(address, reg, &data, 1); } uint8_t FRToSI2C::I2C_RegisterRead(uint8_t add, uint8_t reg) { @@ -67,67 +43,55 @@ uint8_t FRToSI2C::I2C_RegisterRead(uint8_t add, uint8_t reg) { Mem_Read(add, reg, tx_data, 1); return tx_data[0]; } -void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, +bool FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, uint8_t *pData, uint16_t Size) { - if (I2CSemaphore == NULL) { - // no RToS, run blocking code - HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, - pData, Size, 5000); - } else { - // RToS is active, run threading - // Get the mutex so we can use the I2C port - // Wait up to 1 second for the mutex - if (xSemaphoreTake(I2CSemaphore, (TickType_t)500) == pdTRUE) { - if (HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, - I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) { + if (!lock()) + return false; + if (HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, + I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) { - I2C_Unstick(); - xSemaphoreGive(I2CSemaphore); - } - xSemaphoreGive(I2CSemaphore); - - } + I2C_Unstick(); + unlock(); + return false; } + unlock(); + return true; } -void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size) { - if (I2CSemaphore == NULL) { - // no RToS, run blocking code - HAL_I2C_Master_Transmit(&hi2c1, DevAddress, pData, Size, 5000); - } else { - // RToS is active, run threading - // Get the mutex so we can use the I2C port - // Wait up to 1 second for the mutex - if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) { -#ifdef I2CUSESDMA - - if (HAL_I2C_Master_Transmit_DMA(&hi2c1, DevAddress, pData, Size) - != HAL_OK) { - - I2C_Unstick(); - xSemaphoreGive(I2CSemaphore); - - } -#else - HAL_I2C_Master_Transmit(&hi2c1, DevAddress, pData, Size, 5000); - xSemaphoreGive(I2CSemaphore); -#endif - - } else { - } +bool FRToSI2C::Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size) { + if (!lock()) + return false; + if (HAL_I2C_Master_Transmit_DMA(&hi2c1, DevAddress, pData, Size) + != HAL_OK) { + I2C_Unstick(); + unlock(); + return false; } - + return true; } bool FRToSI2C::probe(uint16_t DevAddress) { + if (!lock()) + return false; uint8_t buffer[1]; - return HAL_I2C_Mem_Read(&hi2c1, DevAddress, 0x0F, I2C_MEMADD_SIZE_8BIT, - buffer, 1, 1000) == HAL_OK; - + bool worked = HAL_I2C_Mem_Read(&hi2c1, DevAddress, 0x0F, + I2C_MEMADD_SIZE_8BIT, buffer, 1, 1000) == HAL_OK; + unlock(); + return worked; } void FRToSI2C::I2C_Unstick() { unstick_I2C(); } + +void FRToSI2C::unlock() { + + xSemaphoreGive(I2CSemaphore); +} + +bool FRToSI2C::lock() { + + return xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE; +} diff --git a/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp b/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp index 9deb8c2f..7ccfc644 100644 --- a/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp +++ b/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp @@ -152,10 +152,8 @@ void fusb_setup() { HAL_NVIC_SetPriority(EXTI9_5_IRQn, 12, 0); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); - if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { - if (!I2CBB::lock2()) { - return; - } + if (!I2CBB::lock2()) { + return; } /* Fully reset the FUSB302B */ fusb_write_byte( FUSB_RESET, FUSB_RESET_SW_RES); @@ -200,9 +198,7 @@ void fusb_setup() { fusb_write_byte( FUSB_SWITCHES1, 0x26); fusb_write_byte( FUSB_SWITCHES0, 0x0B); } - if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { - I2CBB::unlock2(); - } + I2CBB::unlock2(); fusb_reset(); } diff --git a/workspace/TS100/Core/Drivers/I2CBB.cpp b/workspace/TS100/Core/Drivers/I2CBB.cpp index c21a3a97..200fecfe 100644 --- a/workspace/TS100/Core/Drivers/I2CBB.cpp +++ b/workspace/TS100/Core/Drivers/I2CBB.cpp @@ -17,28 +17,31 @@ void I2CBB::init() { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; - GPIO_InitStruct.Pin = SDA2_Pin ; + GPIO_InitStruct.Pin = SDA2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(SDA2_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; - GPIO_InitStruct.Pin = SCL2_Pin; + GPIO_InitStruct.Pin = SCL2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(SCL2_GPIO_Port, &GPIO_InitStruct); SOFT_SDA_HIGH(); SOFT_SCL_HIGH(); - I2CSemaphore = xSemaphoreCreateMutexStatic (&xSemaphoreBuffer); - I2CSemaphore2 = xSemaphoreCreateMutexStatic (&xSemaphoreBuffer2); + I2CSemaphore = xSemaphoreCreateMutexStatic(&xSemaphoreBuffer); + I2CSemaphore2 = xSemaphoreCreateMutexStatic(&xSemaphoreBuffer2); unlock(); unlock2(); } bool I2CBB::probe(uint8_t address) { + if (!lock()) + return false; start(); bool ack = send(address); stop(); + unlock(); return ack; } diff --git a/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp b/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp index 779ddc20..f8981414 100644 --- a/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp +++ b/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp @@ -21,10 +21,6 @@ class FRToSI2C { public: - static void init() { - I2CSemaphore = nullptr; - } - static void FRToSInit() { I2CSemaphore = xSemaphoreCreateBinaryStatic(&xSemaphoreBuffer); xSemaphoreGive(I2CSemaphore); @@ -34,19 +30,21 @@ public: static bool Mem_Read(uint16_t DevAddress, uint16_t MemAddress, uint8_t *pData, uint16_t Size); - static void Mem_Write(uint16_t DevAddress, uint16_t MemAddress, + static bool Mem_Write(uint16_t DevAddress, uint16_t MemAddress, uint8_t *pData, uint16_t Size); //Returns true if device ACK's being addressed static bool probe(uint16_t DevAddress); - static void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size); + static bool Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size); static void Receive(uint16_t DevAddress, uint8_t *pData, uint16_t Size); static void TransmitReceive(uint16_t DevAddress, uint8_t *pData_tx, uint16_t Size_tx, uint8_t *pData_rx, uint16_t Size_rx); - static void I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data); + static bool I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data); static uint8_t I2C_RegisterRead(uint8_t address, uint8_t reg); private: + static void unlock(); + static bool lock(); static void I2C_Unstick(); static SemaphoreHandle_t I2CSemaphore; static StaticSemaphore_t xSemaphoreBuffer; From d48b27928a43d9aee83831cec64c8877fe64f9d1 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 5 Sep 2020 20:10:10 +1000 Subject: [PATCH 2/6] Move I2C initalisations into more logical spots --- workspace/TS100/Core/BSP/Miniware/Setup.c | 2 +- workspace/TS100/Core/BSP/Miniware/flash.c | 2 +- .../TS100/Core/BSP/Miniware/fusb302b.cpp | 4 +-- .../TS100/Core/BSP/Miniware/postRTOS.cpp | 9 +++--- workspace/TS100/Core/BSP/Miniware/preRTOS.cpp | 8 ++--- .../TS100/Core/Drivers/FUSB302/fusbpd.cpp | 15 ++-------- .../TS100/Core/Drivers/FUSB302/int_n.cpp | 4 +-- workspace/TS100/Core/Src/main.cpp | 29 ------------------- workspace/TS100/Core/Threads/GUIThread.cpp | 1 + workspace/TS100/Core/Threads/MOVThread.cpp | 22 +++++++++++++- 10 files changed, 37 insertions(+), 59 deletions(-) diff --git a/workspace/TS100/Core/BSP/Miniware/Setup.c b/workspace/TS100/Core/BSP/Miniware/Setup.c index 9f50feec..fdaeb139 100644 --- a/workspace/TS100/Core/BSP/Miniware/Setup.c +++ b/workspace/TS100/Core/BSP/Miniware/Setup.c @@ -30,7 +30,7 @@ static void MX_TIM2_Init(void); static void MX_DMA_Init(void); static void MX_GPIO_Init(void); static void MX_ADC2_Init(void); - +#define SWD_ENABLE void Setup_HAL() { SystemClock_Config(); diff --git a/workspace/TS100/Core/BSP/Miniware/flash.c b/workspace/TS100/Core/BSP/Miniware/flash.c index 05f2b3d0..7559f23e 100644 --- a/workspace/TS100/Core/BSP/Miniware/flash.c +++ b/workspace/TS100/Core/BSP/Miniware/flash.c @@ -23,7 +23,7 @@ uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) { __HAL_FLASH_CLEAR_FLAG( FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY); HAL_FLASH_Unlock(); - HAL_Delay(10); + HAL_Delay(1); resetWatchdog(); HAL_FLASHEx_Erase(&pEraseInit, &failingAddress); //^ Erase the page of flash (1024 bytes on this stm32) diff --git a/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp b/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp index 7ccfc644..d7d7416f 100644 --- a/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp +++ b/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp @@ -144,12 +144,12 @@ void fusb_send_hardrst() { void fusb_setup() { GPIO_InitTypeDef GPIO_InitStruct; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - HAL_NVIC_SetPriority(EXTI9_5_IRQn, 12, 0); + HAL_NVIC_SetPriority(EXTI9_5_IRQn, 10, 0); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); if (!I2CBB::lock2()) { diff --git a/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp b/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp index c5f16b4c..d0743771 100644 --- a/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp +++ b/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp @@ -12,11 +12,10 @@ // Initialisation to be performed with scheduler active void postRToSInit() { - - /* Init the IPC objects */ - FRToSI2C::FRToSInit(); #ifdef POW_PD - //Spawn all of the USB-C processors - fusb302_start_processing(); + if (usb_pd_detect() == true) { + //Spawn all of the USB-C processors + fusb302_start_processing(); + } #endif } diff --git a/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp index 6b0614b9..67b04f49 100644 --- a/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp +++ b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp @@ -17,13 +17,9 @@ void preRToSInit() { */ HAL_Init(); Setup_HAL(); // Setup all the HAL objects - FRToSI2C::init(); - HAL_Delay(50); - HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET); - HAL_Delay(50); #ifdef I2C_SOFT I2CBB::init(); - #endif - + /* Init the IPC objects */ + FRToSI2C::FRToSInit(); } diff --git a/workspace/TS100/Core/Drivers/FUSB302/fusbpd.cpp b/workspace/TS100/Core/Drivers/FUSB302/fusbpd.cpp index f6bb58e1..b48c42fa 100644 --- a/workspace/TS100/Core/Drivers/FUSB302/fusbpd.cpp +++ b/workspace/TS100/Core/Drivers/FUSB302/fusbpd.cpp @@ -17,22 +17,13 @@ #include "int_n.h" #include "hard_reset.h" - - void fusb302_start_processing() { /* Initialize the FUSB302B */ - resetWatchdog(); fusb_setup(); - resetWatchdog(); - /* Create the policy engine thread. */ - PolicyEngine::init(); - - /* Create the protocol layer threads. */ - ProtocolReceive::init(); - ProtocolTransmit::init(); ResetHandler::init(); - resetWatchdog(); - /* Create the INT_N thread. */ + PolicyEngine::init(); + ProtocolTransmit::init(); + ProtocolReceive::init(); InterruptHandler::init(); } #endif diff --git a/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp b/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp index 52d7701b..1206928e 100644 --- a/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp +++ b/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp @@ -28,7 +28,7 @@ #include "task.h" #include "BSP.h" -osThreadId InterruptHandler::TaskHandle=NULL; +osThreadId InterruptHandler::TaskHandle = NULL; uint32_t InterruptHandler::TaskBuffer[InterruptHandler::TaskStackSize]; osStaticThreadDef_t InterruptHandler::TaskControlBlock; @@ -41,7 +41,7 @@ void InterruptHandler::init() { void InterruptHandler::Thread(const void *arg) { (void) arg; union fusb_status status; - volatile uint32_t events; + uint32_t events; bool notifSent = false; while (true) { /* If the INT_N line is low */ diff --git a/workspace/TS100/Core/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp index 89d2bc45..9c9da2dc 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -12,8 +12,6 @@ #include "Settings.h" #include "cmsis_os.h" uint8_t PCBVersion = 0; -// File local variables -bool usb_pd_available = false; bool settingsWereReset = false; // FreeRTOS variables @@ -32,44 +30,17 @@ uint32_t MOVTaskBuffer[MOVTaskStackSize]; osStaticThreadDef_t MOVTaskControlBlock; // End FreeRTOS - // Main sets up the hardware then hands over to the FreeRTOS kernel int main(void) { preRToSInit(); - setTipX10Watts(0); // force tip off resetWatchdog(); - OLED::initialize(); // start up the LCD OLED::setFont(0); // default to bigger font // Testing for which accelerometer is mounted - resetWatchdog(); - usb_pd_available = usb_pd_detect(); - resetWatchdog(); settingsWereReset = restoreSettings(); // load the settings from flash -#ifdef ACCEL_MMA - if (MMA8652FC::detect()) { - PCBVersion = 1; - MMA8652FC::initalize(); // this sets up the I2C registers - } else -#endif -#ifdef ACCEL_LIS - if (LIS2DH12::detect()) { - PCBVersion = 2; - // Setup the ST Accelerometer - LIS2DH12::initalize(); // startup the accelerometer - } else -#endif - { - PCBVersion = 3; - systemSettings.SleepTime = 0; - systemSettings.ShutdownTime = 0; // No accel -> disable sleep - systemSettings.sensitivity = 0; - } resetWatchdog(); - /* Create the thread(s) */ /* definition and creation of GUITask */ - osThreadStaticDef(GUITask, startGUITask, osPriorityBelowNormal, 0, GUITaskStackSize, GUITaskBuffer, &GUITaskControlBlock); GUITaskHandle = osThreadCreate(osThread(GUITask), NULL); diff --git a/workspace/TS100/Core/Threads/GUIThread.cpp b/workspace/TS100/Core/Threads/GUIThread.cpp index afeceeeb..77a22f9d 100644 --- a/workspace/TS100/Core/Threads/GUIThread.cpp +++ b/workspace/TS100/Core/Threads/GUIThread.cpp @@ -632,6 +632,7 @@ void showDebugMenu(void) { uint8_t idleScreenBGF[sizeof(idleScreenBG)]; /* StartGUITask function */ void startGUITask(void const *argument __unused) { + OLED::initialize(); // start up the LCD uint8_t tempWarningState = 0; bool buttonLockout = false; diff --git a/workspace/TS100/Core/Threads/MOVThread.cpp b/workspace/TS100/Core/Threads/MOVThread.cpp index 4ca5e54b..4ef12c21 100644 --- a/workspace/TS100/Core/Threads/MOVThread.cpp +++ b/workspace/TS100/Core/Threads/MOVThread.cpp @@ -23,8 +23,28 @@ uint8_t accelInit = 0; uint32_t lastMovementTime = 0; void startMOVTask(void const *argument __unused) { - OLED::setRotation(systemSettings.OrientationMode & 1); +#ifdef ACCEL_MMA + if (MMA8652FC::detect()) { + PCBVersion = 1; + MMA8652FC::initalize(); // this sets up the I2C registers + } else +#endif +#ifdef ACCEL_LIS + if (LIS2DH12::detect()) { + PCBVersion = 2; + // Setup the ST Accelerometer + LIS2DH12::initalize(); // startup the accelerometer + } else +#endif + { + PCBVersion = 3; + systemSettings.SleepTime = 0; + systemSettings.ShutdownTime = 0; // No accel -> disable sleep + systemSettings.sensitivity = 0; + } postRToSInit(); + OLED::setRotation(systemSettings.OrientationMode & 1); + lastMovementTime = 0; int16_t datax[MOVFilter] = { 0 }; int16_t datay[MOVFilter] = { 0 }; From 11e583be63a164b11d582d730c0721bd15bfbd1f Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 5 Sep 2020 20:19:03 +1000 Subject: [PATCH 3/6] Fix interrupt race --- .../TS100/Core/BSP/Miniware/fusb302b.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp b/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp index d7d7416f..ac1c5e83 100644 --- a/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp +++ b/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp @@ -143,21 +143,13 @@ void fusb_send_hardrst() { } void fusb_setup() { - GPIO_InitTypeDef GPIO_InitStruct; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Pin = GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; - GPIO_InitStruct.Pull = GPIO_PULLUP; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - HAL_NVIC_SetPriority(EXTI9_5_IRQn, 10, 0); - HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); if (!I2CBB::lock2()) { return; } /* Fully reset the FUSB302B */ - fusb_write_byte( FUSB_RESET, FUSB_RESET_SW_RES); - osDelay(2); +// fusb_write_byte( FUSB_RESET, FUSB_RESET_SW_RES); +// osDelay(2); if (!fusb_read_id()) { return; } @@ -200,6 +192,14 @@ void fusb_setup() { } I2CBB::unlock2(); fusb_reset(); + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Pin = GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + HAL_NVIC_SetPriority(EXTI9_5_IRQn, 10, 0); + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); } void fusb_get_status(union fusb_status *status) { From 12cf20233836f2f0d4f85d6571e4a9613f7146fd Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 5 Sep 2020 20:19:12 +1000 Subject: [PATCH 4/6] Remove reset handler --- .../TS100/Core/Drivers/FUSB302/fusbpd.cpp | 2 - .../TS100/Core/Drivers/FUSB302/hard_reset.cpp | 152 ------------------ .../TS100/Core/Drivers/FUSB302/hard_reset.h | 63 -------- .../TS100/Core/Drivers/FUSB302/int_n.cpp | 17 -- .../Core/Drivers/FUSB302/policy_engine.cpp | 11 +- 5 files changed, 2 insertions(+), 243 deletions(-) delete mode 100644 workspace/TS100/Core/Drivers/FUSB302/hard_reset.cpp delete mode 100644 workspace/TS100/Core/Drivers/FUSB302/hard_reset.h diff --git a/workspace/TS100/Core/Drivers/FUSB302/fusbpd.cpp b/workspace/TS100/Core/Drivers/FUSB302/fusbpd.cpp index b48c42fa..fb8c833c 100644 --- a/workspace/TS100/Core/Drivers/FUSB302/fusbpd.cpp +++ b/workspace/TS100/Core/Drivers/FUSB302/fusbpd.cpp @@ -15,12 +15,10 @@ #include "protocol_rx.h" #include "protocol_tx.h" #include "int_n.h" -#include "hard_reset.h" void fusb302_start_processing() { /* Initialize the FUSB302B */ fusb_setup(); - ResetHandler::init(); PolicyEngine::init(); ProtocolTransmit::init(); ProtocolReceive::init(); diff --git a/workspace/TS100/Core/Drivers/FUSB302/hard_reset.cpp b/workspace/TS100/Core/Drivers/FUSB302/hard_reset.cpp deleted file mode 100644 index 97ffdd71..00000000 --- a/workspace/TS100/Core/Drivers/FUSB302/hard_reset.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* - * PD Buddy Firmware Library - USB Power Delivery for everyone - * Copyright 2017-2018 Clayton G. Hobbs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "hard_reset.h" -#include "fusbpd.h" -#include -#include "policy_engine.h" -#include "protocol_rx.h" -#include "protocol_tx.h" -#include "fusb302b.h" - -osThreadId ResetHandler::TaskHandle = NULL; -uint32_t ResetHandler::TaskBuffer[ResetHandler::TaskStackSize]; -osStaticThreadDef_t ResetHandler::TaskControlBlock; - -/* - * PRL_HR_Reset_Layer state - */ -ResetHandler::hardrst_state ResetHandler::hardrst_reset_layer() { - /* First, wait for the signal to run a hard reset. */ - eventmask_t evt = waitForEvent( - PDB_EVT_HARDRST_RESET | PDB_EVT_HARDRST_I_HARDRST); - if (evt & (PDB_EVT_HARDRST_RESET | PDB_EVT_HARDRST_I_HARDRST)) { - /* Reset the Protocol RX machine */ - ProtocolReceive::notify( PDB_EVT_PRLRX_RESET); - taskYIELD(); - /* Reset the Protocol TX machine */ - ProtocolTransmit::notify( - ProtocolTransmit::Notifications::PDB_EVT_PRLTX_RESET); - taskYIELD(); - /* Continue the process based on what event started the reset. */ - if (evt & PDB_EVT_HARDRST_RESET) { - /* Policy Engine started the reset. */ - return PRLHRRequestHardReset; - } else { - /* PHY started the reset */ - return PRLHRIndicateHardReset; - } - } else { - return PRLHRResetLayer; - } -} - -ResetHandler::hardrst_state ResetHandler::hardrst_indicate_hard_reset() { - /* Tell the PE that we're doing a hard reset */ - PolicyEngine::notify( PDB_EVT_PE_RESET); - - return PRLHRWaitPE; -} - -ResetHandler::hardrst_state ResetHandler::hardrst_request_hard_reset() { - /* Tell the PHY to send a hard reset */ - fusb_send_hardrst(); - - return PRLHRWaitPHY; -} - -ResetHandler::hardrst_state ResetHandler::hardrst_wait_phy() { - /* Wait for the PHY to tell us that it's done sending the hard reset */ - waitForEvent(PDB_EVT_HARDRST_I_HARDSENT, PD_T_HARD_RESET_COMPLETE); - - /* Move on no matter what made us stop waiting. */ - return PRLHRHardResetRequested; -} - -ResetHandler::hardrst_state ResetHandler::hardrst_hard_reset_requested() { - /* Tell the PE that the hard reset was sent */ - PolicyEngine::notify( PDB_EVT_PE_HARD_SENT); - - return PRLHRWaitPE; -} - -ResetHandler::hardrst_state ResetHandler::hardrst_wait_pe() { - /* Wait for the PE to tell us that it's done */ - waitForEvent(PDB_EVT_HARDRST_DONE); - - return PRLHRComplete; -} - -ResetHandler::hardrst_state ResetHandler::hardrst_complete() { - /* I'm not aware of anything we have to tell the FUSB302B, so just finish - * the reset routine. */ - return PRLHRResetLayer; -} - -void ResetHandler::init() { - osThreadStaticDef(rstHand, Thread, PDB_PRIO_PRL, 0, TaskStackSize, - TaskBuffer, &TaskControlBlock); - TaskHandle = osThreadCreate(osThread(rstHand), NULL); -} - -void ResetHandler::notify(uint32_t notification) { - if (TaskHandle != NULL) { - xTaskNotify(TaskHandle, notification, eNotifyAction::eSetBits); - } -} - -void ResetHandler::Thread(const void *arg) { - (void) arg; - ResetHandler::hardrst_state state = PRLHRResetLayer; - - while (true) { - switch (state) { - case PRLHRResetLayer: - state = hardrst_reset_layer(); - break; - case PRLHRIndicateHardReset: - state = hardrst_indicate_hard_reset(); - break; - case PRLHRRequestHardReset: - state = hardrst_request_hard_reset(); - break; - case PRLHRWaitPHY: - state = hardrst_wait_phy(); - break; - case PRLHRHardResetRequested: - state = hardrst_hard_reset_requested(); - break; - case PRLHRWaitPE: - state = hardrst_wait_pe(); - break; - case PRLHRComplete: - state = hardrst_complete(); - break; - default: - /* This is an error. It really shouldn't happen. We might - * want to handle it anyway, though. */ - state = PRLHRResetLayer; - break; - } - } -} - -uint32_t ResetHandler::waitForEvent(uint32_t mask, uint32_t ticksToWait) { - uint32_t pulNotificationValue; - xTaskNotifyWait(0x00, mask, &pulNotificationValue, ticksToWait); - return pulNotificationValue; -} diff --git a/workspace/TS100/Core/Drivers/FUSB302/hard_reset.h b/workspace/TS100/Core/Drivers/FUSB302/hard_reset.h deleted file mode 100644 index 9466b33c..00000000 --- a/workspace/TS100/Core/Drivers/FUSB302/hard_reset.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * PD Buddy Firmware Library - USB Power Delivery for everyone - * Copyright 2017-2018 Clayton G. Hobbs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef PDB_HARD_RESET_H -#define PDB_HARD_RESET_H - -#include - -/* Events for the Hard Reset thread */ -#define PDB_EVT_HARDRST_RESET EVENT_MASK(0) -#define PDB_EVT_HARDRST_I_HARDRST EVENT_MASK(1) -#define PDB_EVT_HARDRST_I_HARDSENT EVENT_MASK(2) -#define PDB_EVT_HARDRST_DONE EVENT_MASK(3) - -class ResetHandler { -public: - static void init(); - static void notify(uint32_t notification); -private: - static void Thread(const void *arg); - static osThreadId TaskHandle; - static const size_t TaskStackSize = 1536 / 2; - static uint32_t TaskBuffer[TaskStackSize]; - static osStaticThreadDef_t TaskControlBlock; - static uint32_t waitForEvent(uint32_t mask, uint32_t ticksToWait = - portMAX_DELAY); - - /* - * Hard Reset machine states - */ - enum hardrst_state { - PRLHRResetLayer, - PRLHRIndicateHardReset, - PRLHRRequestHardReset, - PRLHRWaitPHY, - PRLHRHardResetRequested, - PRLHRWaitPE, - PRLHRComplete - }; - static hardrst_state hardrst_reset_layer(); - static hardrst_state hardrst_indicate_hard_reset(); - static hardrst_state hardrst_request_hard_reset(); - static hardrst_state hardrst_wait_phy(); - static hardrst_state hardrst_hard_reset_requested(); - static hardrst_state hardrst_wait_pe(); - static hardrst_state hardrst_complete(); -}; - -#endif /* PDB_HARD_RESET_H */ diff --git a/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp b/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp index 1206928e..7f5fd4bf 100644 --- a/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp +++ b/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp @@ -21,7 +21,6 @@ #include "fusb302b.h" #include "protocol_rx.h" #include "protocol_tx.h" -#include "hard_reset.h" #include "policy_engine.h" #include "protocol_rx.h" #include "protocol_tx.h" @@ -73,22 +72,6 @@ void InterruptHandler::Thread(const void *arg) { notifSent = true; } - /* If the I_HARDRST or I_HARDSENT flag is set, tell the Hard Reset - * thread */ - - if (notifSent == false) { - events = 0; - if (status.interrupta & FUSB_INTERRUPTA_I_HARDRST) { - events |= PDB_EVT_HARDRST_I_HARDRST; - notifSent = true; - } else if (status.interrupta & FUSB_INTERRUPTA_I_HARDSENT) { - events |= PDB_EVT_HARDRST_I_HARDSENT; - notifSent = true; - } - if (events) { - ResetHandler::notify(events); - } - } /* If the I_OCP_TEMP and OVRTEMP flags are set, tell the Policy * Engine thread */ if (status.interrupta & FUSB_INTERRUPTA_I_OCP_TEMP diff --git a/workspace/TS100/Core/Drivers/FUSB302/policy_engine.cpp b/workspace/TS100/Core/Drivers/FUSB302/policy_engine.cpp index 0e8464fc..4c2a5127 100644 --- a/workspace/TS100/Core/Drivers/FUSB302/policy_engine.cpp +++ b/workspace/TS100/Core/Drivers/FUSB302/policy_engine.cpp @@ -20,7 +20,6 @@ #include "int_n.h" #include #include "protocol_tx.h" -#include "hard_reset.h" #include "fusb302b.h" bool PolicyEngine::pdNegotiationComplete; int PolicyEngine::current_voltage_mv; @@ -516,11 +515,8 @@ PolicyEngine::policy_engine_state PolicyEngine::pe_sink_hard_reset() { if (_hard_reset_counter > PD_N_HARD_RESET_COUNT) { return PESinkSourceUnresponsive; } - - /* Generate a hard reset signal */ - ResetHandler::notify(PDB_EVT_HARDRST_RESET); - waitForEvent(PDB_EVT_PE_HARD_SENT); - + //So, we could send a hardreset here; however that will cause a power cycle on the PSU end.. Which will then reset this MCU + //So therefore we went get anywhere :) /* Increment HardResetCounter */ _hard_reset_counter++; @@ -537,9 +533,6 @@ PolicyEngine::policy_engine_state PolicyEngine::pe_sink_transition_default() { /* Since we never change our data role from UFP, there is no reason to set * it here. */ - /* Tell the protocol layer we're done with the reset */ - ResetHandler::notify( PDB_EVT_HARDRST_DONE); - return PESinkStartup; } From 8bacbe49fc722cd3b8479b3cf6101ea4d5c3b34f Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 5 Sep 2020 20:26:07 +1000 Subject: [PATCH 5/6] Bring back PD 3.0 --- .../Core/Drivers/FUSB302/policy_engine.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/workspace/TS100/Core/Drivers/FUSB302/policy_engine.cpp b/workspace/TS100/Core/Drivers/FUSB302/policy_engine.cpp index 4c2a5127..21eac827 100644 --- a/workspace/TS100/Core/Drivers/FUSB302/policy_engine.cpp +++ b/workspace/TS100/Core/Drivers/FUSB302/policy_engine.cpp @@ -188,15 +188,15 @@ PolicyEngine::policy_engine_state PolicyEngine::pe_sink_wait_cap() { && PD_NUMOBJ_GET(&tempMessage) > 0) { /* First, determine what PD revision we're using */ if ((hdr_template & PD_HDR_SPECREV) == PD_SPECREV_1_0) { -// /* If the other end is using at least version 3.0, we'll -// * use version 3.0. */ -// if ((tempMessage.hdr & PD_HDR_SPECREV) >= PD_SPECREV_3_0) { -// hdr_template |= PD_SPECREV_3_0; -// /* Otherwise, use 2.0. Don't worry about the 1.0 case -// * because we don't have hardware for PD 1.0 signaling. */ -// } else { - hdr_template |= PD_SPECREV_2_0; -// } + /* If the other end is using at least version 3.0, we'll + * use version 3.0. */ + if ((tempMessage.hdr & PD_HDR_SPECREV) >= PD_SPECREV_3_0) { + hdr_template |= PD_SPECREV_3_0; + /* Otherwise, use 2.0. Don't worry about the 1.0 case + * because we don't have hardware for PD 1.0 signaling. */ + } else { + hdr_template |= PD_SPECREV_2_0; + } } return PESinkEvalCap; /* If the message was a Soft_Reset, do the soft reset procedure */ From 023e176c87aeb5d32d3dee37f18d5a09ed61c63b Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 5 Sep 2020 20:29:57 +1000 Subject: [PATCH 6/6] Update int_n.cpp --- workspace/TS100/Core/Drivers/FUSB302/int_n.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp b/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp index 7f5fd4bf..a94e21b7 100644 --- a/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp +++ b/workspace/TS100/Core/Drivers/FUSB302/int_n.cpp @@ -40,8 +40,6 @@ void InterruptHandler::init() { void InterruptHandler::Thread(const void *arg) { (void) arg; union fusb_status status; - uint32_t events; - bool notifSent = false; while (true) { /* If the INT_N line is low */ if (xTaskNotifyWait(0x00, 0x0F, NULL, @@ -49,7 +47,6 @@ void InterruptHandler::Thread(const void *arg) { //delay slightly so we catch the crc with better timing osDelay(1); } - notifSent = false; /* Read the FUSB302B status and interrupt registers */ fusb_get_status(&status); /* If the I_TXSENT or I_RETRYFAIL flag is set, tell the Protocol TX @@ -57,19 +54,16 @@ void InterruptHandler::Thread(const void *arg) { if (status.interrupta & FUSB_INTERRUPTA_I_TXSENT) { ProtocolTransmit::notify( ProtocolTransmit::Notifications::PDB_EVT_PRLTX_I_TXSENT); - notifSent = true; } if (status.interrupta & FUSB_INTERRUPTA_I_RETRYFAIL) { ProtocolTransmit::notify( ProtocolTransmit::Notifications::PDB_EVT_PRLTX_I_RETRYFAIL); - notifSent = true; } /* If the I_GCRCSENT flag is set, tell the Protocol RX thread */ //This means a message was recieved with a good CRC if (status.interruptb & FUSB_INTERRUPTB_I_GCRCSENT) { ProtocolReceive::notify(PDB_EVT_PRLRX_I_GCRCSENT); - notifSent = true; } /* If the I_OCP_TEMP and OVRTEMP flags are set, tell the Policy @@ -77,7 +71,6 @@ void InterruptHandler::Thread(const void *arg) { if (status.interrupta & FUSB_INTERRUPTA_I_OCP_TEMP && status.status1 & FUSB_STATUS1_OVRTEMP) { PolicyEngine::notify(PDB_EVT_PE_I_OVRTEMP); - notifSent = true; } } }