From 8f19097baf25f1ed6579a8460c3e2c017fe76af5 Mon Sep 17 00:00:00 2001 From: lihuanhuan Date: Fri, 14 Feb 2025 18:12:51 +0800 Subject: [PATCH] Fix camera reopening failure. --- core/embed/trezorhal/camera.c | 11 ++++++++++- core/embed/trezorhal/camera.h | 2 +- core/embed/trezorhal/camera_qrcode.c | 3 +-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/embed/trezorhal/camera.c b/core/embed/trezorhal/camera.c index c678ec5507..6c9d89bab7 100644 --- a/core/embed/trezorhal/camera.c +++ b/core/embed/trezorhal/camera.c @@ -266,14 +266,19 @@ void camera_resume(void) HAL_DCMI_Resume(&DCMI_Handle); } -void camera_capture_start(void) +bool camera_capture_start(void) { camera_power_on(); + if ( !camera_configured ) + { + return false; + } #if CAMERA_CAPTURE_MODE == 0 camera_start((uint8_t*)CAM_BUF_ADDRESS, DCMI_MODE_SNAPSHOT); #else camera_start((uint8_t*)CAM_BUF_ADDRESS, DCMI_MODE_CONTINUOUS); #endif + return true; } int camera_capture_done(void) @@ -338,6 +343,10 @@ void camera_power_on(void) camera_delay(10); CAMERA_RST_HIGH(); camera_delay(20); + if ( !camera_is_online() ) + { + return; + } camera_powered = true; } diff --git a/core/embed/trezorhal/camera.h b/core/embed/trezorhal/camera.h index c6ac098e58..e88c2777cd 100644 --- a/core/embed/trezorhal/camera.h +++ b/core/embed/trezorhal/camera.h @@ -33,7 +33,7 @@ unsigned char camera_sccb_read_reg(unsigned char reg_addr, unsigned char* data); unsigned char camera_sccb_write_reg(unsigned char reg_addr, unsigned char* data); bool camera_get_id(uint16_t* id); bool camera_is_online(void); -void camera_capture_start(void); +bool camera_capture_start(void); int camera_capture_done(void); void camera_power_off(void); void camera_power_on(void); diff --git a/core/embed/trezorhal/camera_qrcode.c b/core/embed/trezorhal/camera_qrcode.c index 5908db5525..091d548909 100644 --- a/core/embed/trezorhal/camera_qrcode.c +++ b/core/embed/trezorhal/camera_qrcode.c @@ -132,11 +132,10 @@ int camera_qr_decode(uint32_t x, uint32_t y, uint8_t* data, uint32_t data_len) { int len = 0; - if ( !camera_is_online() ) + if ( !camera_capture_start() ) { return 0; } - camera_capture_start(); if ( camera_capture_done() ) { dma2d_copy_buffer(