mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Improve bootloader timing
* Detect when VBUS is connected and wait for enumeration, the IDE timeout is only started after enumeration. * A 2s timeout for enumeration is used so the cam doesn't get stuck if it's connected to a charger or a power bank.
This commit is contained in:
parent
817de7ec2d
commit
cfc677ed40
@ -3,6 +3,8 @@
|
|||||||
#include "usbd_desc.h"
|
#include "usbd_desc.h"
|
||||||
#include "omv_boardconfig.h"
|
#include "omv_boardconfig.h"
|
||||||
|
|
||||||
|
#define IDE_TIMEOUT (1000)
|
||||||
|
#define CONFIG_TIMEOUT (2000)
|
||||||
USBD_HandleTypeDef USBD_Device;
|
USBD_HandleTypeDef USBD_Device;
|
||||||
extern USBD_CDC_ItfTypeDef USBD_CDC_fops;
|
extern USBD_CDC_ItfTypeDef USBD_CDC_fops;
|
||||||
|
|
||||||
@ -52,16 +54,33 @@ int main()
|
|||||||
/* Start Device Process */
|
/* Start Device Process */
|
||||||
USBD_Start(&USBD_Device);
|
USBD_Start(&USBD_Device);
|
||||||
|
|
||||||
// Wait for IDE to connect
|
// Note: The SRQINT interrupt is triggered when VBUS is in the valid range, I assume it's safe
|
||||||
|
// to use it to detect if USB is connected or not. The dev_connection_status is set in usbd_conf.c
|
||||||
|
// It wasn't used anywhere else, so again assuming it's safe to use it for connection status.
|
||||||
|
if (USBD_Device.dev_connection_status) {
|
||||||
uint32_t start = HAL_GetTick();
|
uint32_t start = HAL_GetTick();
|
||||||
while (!USBD_IDE_Connected() && (HAL_GetTick() - start) < 500) {
|
// Wait for device to be configured
|
||||||
|
while (USBD_Device.dev_state != USBD_STATE_CONFIGURED
|
||||||
|
// We still have to timeout because the camera
|
||||||
|
// might be connected to a power bank or charger
|
||||||
|
&& (HAL_GetTick() - start) < CONFIG_TIMEOUT) {
|
||||||
__flash_led();
|
__flash_led();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for new firmware image
|
// If the device is configured, wait for IDE to connect or timeout
|
||||||
|
if (USBD_Device.dev_state == USBD_STATE_CONFIGURED) {
|
||||||
|
uint32_t start = HAL_GetTick();
|
||||||
|
while (!USBD_IDE_Connected()
|
||||||
|
&& (HAL_GetTick() - start) < IDE_TIMEOUT) {
|
||||||
|
__flash_led();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for new firmware image if the IDE is connected
|
||||||
while (USBD_IDE_Connected()) {
|
while (USBD_IDE_Connected()) {
|
||||||
__flash_led();
|
__flash_led();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Deinit USB
|
// Deinit USB
|
||||||
USBD_DeInit(&USBD_Device);
|
USBD_DeInit(&USBD_Device);
|
||||||
|
|||||||
@ -239,6 +239,8 @@ void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
|
|||||||
*/
|
*/
|
||||||
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
|
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
|
||||||
{
|
{
|
||||||
|
USBD_HandleTypeDef *pdev = hpcd->pData;
|
||||||
|
pdev->dev_connection_status = 1;
|
||||||
USBD_LL_DevConnected(hpcd->pData);
|
USBD_LL_DevConnected(hpcd->pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,6 +251,8 @@ void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
|
|||||||
*/
|
*/
|
||||||
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
|
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
|
||||||
{
|
{
|
||||||
|
USBD_HandleTypeDef *pdev = hpcd->pData;
|
||||||
|
pdev->dev_connection_status = 0;
|
||||||
USBD_LL_DevDisconnected(hpcd->pData);
|
USBD_LL_DevDisconnected(hpcd->pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user