66#include <rtl8710b_ota.h>
77#include <flash_api.h>
88#include <device_lock.h>
9+ #include <hal/soc/flash.h>
910
1011static u32 alinknewImg2Addr = 0xFFFFFFFF ;
1112
@@ -17,7 +18,10 @@ u8 alink_signature[9] = {0};
1718extern const update_file_img_id OtaImgId [2 ];
1819uint32_t alink_ota_target_index = OTA_INDEX_2 ;
1920update_ota_target_hdr OtaTargetHdr ;
20-
21+ hal_logic_partition_t * partition_info = NULL ;
22+ #ifndef OTA2_DEFAULT_ADDR
23+ #define OTA2_DEFAULT_ADDR (0x08100000)
24+ #endif
2125
2226int check_ota_index ()
2327{
@@ -33,9 +37,81 @@ int check_ota_index()
3337 return ota_index ;
3438}
3539
40+ bool prepare_ota_address (u32 ota_target_index , u32 * new_addr )
41+ {
42+ IMAGE_HEADER * OTA1Hdr = NULL ;
43+ uint32_t OTA1Len = 0 ;
44+ IMAGE_HEADER * FlashImgDataHdr = NULL ;
45+ uint32_t ota2_addr ;
46+
47+ ota2_addr = HAL_READ32 (SPI_FLASH_BASE , OFFSET_DATA );
48+
49+ printf ("ota2_addr = %x\n" , ota2_addr );
50+
51+ /*if the OTA2 address is not programmed in system data zone, the default OTA2
52+ address is used. This operation is just used in the local OTA update demo. For the
53+ cloud OTA upgrade based on this demo, this operation may not be used.*/
54+ if (ota2_addr == 0xffffffff ) {
55+ ota_write_ota2_addr (OTA2_DEFAULT_ADDR );
56+ ota2_addr = HAL_READ32 (SPI_FLASH_BASE , OFFSET_DATA );
57+ }
58+
59+ if ((ota2_addr %4096 ) != 0 ) {
60+ printf ("\n\r[%s] ota addr in sys data space not 4k aligned 0x%x" , __FUNCTION__ , ota2_addr );
61+ goto error ;
62+ }
63+
64+ if (ota_target_index == OTA_INDEX_2 ) {
65+ /* OAT2 address should not in OTA1 image & should 4K alignment */
66+ OTA1Hdr = (IMAGE_HEADER * )(OTA1_ADDR );
67+ OTA1Len = OTA1Hdr -> image_size ;
68+ FlashImgDataHdr = (IMAGE_HEADER * )((u32 )OTA1Hdr + OTA1Len + IMAGE_HEADER_LEN );
69+ if ((ota2_addr < ((u32 )FlashImgDataHdr + FlashImgDataHdr -> image_size + IMAGE_HEADER_LEN )) && ((ota2_addr & 0xfff ) == 0 )) {
70+ printf ("\n\r[%s] illegal ota addr 0x%x" , __FUNCTION__ , ota2_addr );
71+ goto error ;
72+ }
73+ * new_addr = ota2_addr ;
74+ } else {
75+ * new_addr = OTA1_ADDR ;
76+ }
77+
78+ if (* new_addr == 0xFFFFFFFF ) {
79+ printf ("\n\r[%s] update address is invalid \n" , __FUNCTION__ );
80+ goto error ;
81+ }
82+ printf ("OTA update address: 0x%x\n" , * new_addr );
83+ return TRUE;
84+
85+ error :
86+ return FALSE;
87+ }
88+
3689bool rtl8710bn_ota_prepare ()
3790{
91+ uint32_t part = HAL_PARTITION_OTA_TEMP ;
3892 alink_ota_target_index = check_ota_index ();
93+ if (prepare_ota_address (alink_ota_target_index , & alinknewImg2Addr ) != TRUE){
94+ printf ("\n get OTA address failed\n" );
95+ return FALSE;
96+ }
97+
98+ if (alink_ota_target_index == OTA_INDEX_1 ) {
99+ part = HAL_PARTITION_APPLICATION ;
100+ }else if (alink_ota_target_index == OTA_INDEX_2 ) {
101+ part = HAL_PARTITION_OTA_TEMP ;
102+ }else {
103+ printf ("flash INDEX failed\n" );
104+ return FALSE;
105+ }
106+
107+ partition_info = hal_flash_get_info (part );
108+ if (partition_info == NULL ) {
109+ printf ("hal_flash_get_info failed\n" );
110+ return FALSE;
111+ }
112+
113+ /*-------------------erase flash space for new firmware--------------*/
114+ erase_ota_target_flash (alinknewImg2Addr , partition_info -> partition_length );
39115 DBG_INFO_MSG_OFF (_DBG_SPI_FLASH_ );
40116 HeadBuffer = rtw_malloc (OTA_HEADER_BUF_SIZE );
41117 if (HeadBuffer == NULL ) {
@@ -109,17 +185,30 @@ static int rtl8710bn_ota_write_ota_cb(hal_ota_module_t *m, volatile uint32_t* of
109185 goto update_ota_exit ;
110186 }
111187
112- /*get new image addr and check new address validity*/
113- if (!get_ota_address (alink_ota_target_index , & alinknewImg2Addr , & OtaTargetHdr )) {
114- printf ("\n get OTA address failed\n" );
115- goto update_ota_exit ;
188+ if (alinknewImg2Addr == 0xFFFFFFFF ) {
189+ /*get new image addr and check new address validity*/
190+ if (!get_ota_address (alink_ota_target_index , & alinknewImg2Addr , & OtaTargetHdr )) {
191+ printf ("\n get OTA address failed\n" );
192+ goto update_ota_exit ;
193+ }
194+ } else {
195+ /*Image size should not bigger than OTA_SIZE_MAX */
196+ if (partition_info != NULL ) {
197+ if (OtaTargetHdr .FileImgHdr .ImgLen > partition_info -> partition_length ){
198+ printf ("\n\r[%s] illegal new image length 0x%x" , __FUNCTION__ , OtaTargetHdr .FileImgHdr .ImgLen );
199+ goto update_ota_exit ;
200+ }
201+ }
116202 }
117203 /*get new image length from the firmware header*/
118204 uint32_t NewImg2Len = 0 , NewImg2BlkSize = 0 ;
119205 NewImg2Len = OtaTargetHdr .FileImgHdr .ImgLen ;
120206 NewImg2BlkSize = ((NewImg2Len - 1 )/4096 ) + 1 ;
207+ #if 0
208+ //It takes too long to erase flash ?
121209 /*-------------------erase flash space for new firmware--------------*/
122210 erase_ota_target_flash (alinknewImg2Addr , NewImg2Len );
211+ #endif
123212
124213 /*the upgrade space should be masked, because the encrypt firmware is used
125214 for checksum calculation*/
0 commit comments