33#include <libretiny.h>
44#include <sdk_private.h>
55
6+ // private utilities from realtek-amb core
7+ extern bool lt_ota_dual_get_offset (uint8_t index , uint32_t * offset );
8+ extern uint8_t lt_ota_dual_get_stored_by_flag ();
9+ extern bool lt_ota_dual_switch_flag ();
10+
611lt_ota_type_t lt_ota_get_type () {
712 return OTA_TYPE_DUAL ;
813}
914
1015bool lt_ota_is_valid (uint8_t index ) {
1116 uint32_t offset ;
12- switch (index ) {
13- case 1 :
14- offset = FLASH_OTA1_OFFSET ;
15- break ;
16- case 2 :
17- offset = FLASH_OTA2_OFFSET ;
18- break ;
19- default :
20- return false;
21- }
17+ if (!lt_ota_dual_get_offset (index , & offset ))
18+ return false;
2219 uint8_t * address = (uint8_t * )(SPI_FLASH_BASE + offset );
2320 return memcmp (address , "81958711" , 8 ) == 0 ;
2421}
@@ -34,16 +31,7 @@ uint8_t lt_ota_dual_get_stored() {
3431 uint32_t * ota_address = (uint32_t * )0x8009000 ;
3532 if (* ota_address == 0xFFFFFFFF )
3633 return 1 ;
37- uint32_t ota_counter = * ((uint32_t * )0x8009004 );
38- // even count of zero-bits means OTA1, odd count means OTA2
39- // this allows to switch OTA images by simply clearing next bits,
40- // without needing to erase the flash
41- uint8_t count = 0 ;
42- for (uint8_t i = 0 ; i < 32 ; i ++ ) {
43- if ((ota_counter & (1 << i )) == 0 )
44- count ++ ;
45- }
46- return 1 + (count % 2 );
34+ return lt_ota_dual_get_stored_by_flag ();
4735}
4836
4937bool lt_ota_switch (bool revert ) {
@@ -55,24 +43,5 @@ bool lt_ota_switch(bool revert) {
5543 if (!lt_ota_is_valid (stored ^ 0b11 ))
5644 return false;
5745
58- // - read current OTA switch value from 0x9004
59- // - reset OTA switch to 0xFFFFFFFE if it's 0x0
60- // - else check first non-zero bit of OTA switch
61- // - write OTA switch with first non-zero bit cleared
62-
63- uint32_t value = HAL_READ32 (SPI_FLASH_BASE , FLASH_SYSTEM_OFFSET + 4 );
64- if (value == 0 ) {
65- uint8_t * system = (uint8_t * )malloc (64 );
66- lt_flash_read (FLASH_SYSTEM_OFFSET , system , 64 );
67- // reset OTA switch
68- ((uint32_t * )system )[1 ] = -2 ;
69- lt_flash_erase_block (FLASH_SYSTEM_OFFSET );
70- return lt_flash_write (FLASH_SYSTEM_OFFSET , system , 64 );
71- }
72-
73- // clear first non-zero bit
74- value <<= 1 ;
75- // write OTA switch to flash
76- flash_write_word (NULL , FLASH_SYSTEM_OFFSET + 4 , value );
77- return true;
46+ return lt_ota_dual_switch_flag ();
7847}
0 commit comments