Skip to content

Commit fc4a1bc

Browse files
authored
Merge pull request #388 from lyq0717/rel_1.3.1
[AliOS][hal][ota] merge OTA patch from Realtek: chenwen
2 parents c4d06db + 250546b commit fc4a1bc

2 files changed

Lines changed: 95 additions & 6 deletions

File tree

board/mk3080/board.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ const hal_logic_partition_t hal_partitions[] =
4949
.partition_owner = HAL_FLASH_EMBEDDED,
5050
.partition_description = "OTA Storage",
5151
.partition_start_addr = 0x100000,
52-
.partition_length = 0x8E000, //568k bytes
52+
.partition_length = 0xF2000, //568k bytes
5353
.partition_options = PAR_OPT_READ_EN | PAR_OPT_WRITE_EN,
5454
},
5555
[HAL_PARTITION_PARAMETER_3] =

platform/mcu/rtl8710bn/hal/ota_port.c

Lines changed: 94 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <rtl8710b_ota.h>
77
#include <flash_api.h>
88
#include <device_lock.h>
9+
#include <hal/soc/flash.h>
910

1011
static u32 alinknewImg2Addr = 0xFFFFFFFF;
1112

@@ -17,7 +18,10 @@ u8 alink_signature[9] = {0};
1718
extern const update_file_img_id OtaImgId[2];
1819
uint32_t alink_ota_target_index = OTA_INDEX_2;
1920
update_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

2226
int 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+
3689
bool 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

Comments
 (0)