]> granicus.if.org Git - esp-idf/commitdiff
app_update: fix inconsistency between bootloader and OTA code
authortzx <tianzhongxing@espressif.com>
Thu, 1 Dec 2016 02:06:33 +0000 (10:06 +0800)
committerWu Jian Gang <wujiangang@espressif.com>
Thu, 1 Dec 2016 05:46:02 +0000 (13:46 +0800)
components/app_update/esp_ota_ops.c
components/bootloader/src/main/bootloader_start.c

index 14b1c8c0ade6de8d670c4dc9326d803ad101cd24..0c1a41337016f2c52141347e1e8ee8a527895298 100644 (file)
@@ -184,7 +184,7 @@ static esp_err_t rewrite_ota_seq(uint32_t seq, uint8_t sec_id, const esp_partiti
     if (sec_id == 0 || sec_id == 1) {
         s_ota_select[sec_id].ota_seq = seq;
         s_ota_select[sec_id].crc = ota_select_crc(&s_ota_select[sec_id]);
-        ret = spi_flash_erase_range(ota_data_partition->address, SPI_FLASH_SEC_SIZE);
+        ret = esp_partition_erase_range(ota_data_partition, sec_id * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE);
         if (ret != ESP_OK) {
             return ret;
         } else {
@@ -305,7 +305,7 @@ esp_err_t esp_ota_set_boot_partition(const esp_partition_t *partition)
         if (partition->subtype == ESP_PARTITION_SUBTYPE_APP_FACTORY) {
             find_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_OTA, NULL);
             if (find_partition != NULL) {
-                return esp_partition_erase_range(find_partition, find_partition->address, find_partition->size);
+                return esp_partition_erase_range(find_partition, 0, find_partition->size);
             } else {
                 return ESP_ERR_NOT_FOUND;
             }
index 6b92aaf3467c694159f26fcd1feb030b645aa19c..8dd163fe3391b48950988e130bebb025c3f710b6 100644 (file)
@@ -272,27 +272,31 @@ void bootloader_main()
         bootloader_munmap(ota_select_map);
 
         if(sa.ota_seq == 0xFFFFFFFF && sb.ota_seq == 0xFFFFFFFF) {
-            // init status flash
-            load_part_pos = bs.ota[0];
-            sa.ota_seq = 0x01;
-            sa.crc = ota_select_crc(&sa);
-            sb.ota_seq = 0x00;
-            sb.crc = ota_select_crc(&sb);
-
-            Cache_Read_Disable(0);  
-            spiRet1 = SPIEraseSector(bs.ota_info.offset/0x1000);
-            spiRet2 = SPIEraseSector(bs.ota_info.offset/0x1000+1);
-            if (spiRet1 != SPI_FLASH_RESULT_OK || spiRet2 != SPI_FLASH_RESULT_OK ) {  
-                ESP_LOGE(TAG, SPI_ERROR_LOG);
-                return;
-            } 
-            spiRet1 = SPIWrite(bs.ota_info.offset,(uint32_t *)&sa,sizeof(esp_ota_select_entry_t));
-            spiRet2 = SPIWrite(bs.ota_info.offset + 0x1000,(uint32_t *)&sb,sizeof(esp_ota_select_entry_t));
-            if (spiRet1 != SPI_FLASH_RESULT_OK || spiRet2 != SPI_FLASH_RESULT_OK ) {  
-                ESP_LOGE(TAG, SPI_ERROR_LOG);
-                return;
-            } 
-            Cache_Read_Enable(0);  
+            // init status flash 
+            if (bs.factory.offset != 0) {        // if have factory bin,boot factory bin
+                load_part_pos = bs.factory;
+            } else {
+                load_part_pos = bs.ota[0];
+                sa.ota_seq = 0x01;
+                sa.crc = ota_select_crc(&sa);
+                sb.ota_seq = 0x00;
+                sb.crc = ota_select_crc(&sb);
+
+                Cache_Read_Disable(0);  
+                spiRet1 = SPIEraseSector(bs.ota_info.offset/0x1000);
+                spiRet2 = SPIEraseSector(bs.ota_info.offset/0x1000+1);
+                if (spiRet1 != SPI_FLASH_RESULT_OK || spiRet2 != SPI_FLASH_RESULT_OK ) {  
+                    ESP_LOGE(TAG, SPI_ERROR_LOG);
+                    return;
+                } 
+                spiRet1 = SPIWrite(bs.ota_info.offset,(uint32_t *)&sa,sizeof(esp_ota_select_entry_t));
+                spiRet2 = SPIWrite(bs.ota_info.offset + 0x1000,(uint32_t *)&sb,sizeof(esp_ota_select_entry_t));
+                if (spiRet1 != SPI_FLASH_RESULT_OK || spiRet2 != SPI_FLASH_RESULT_OK ) {  
+                    ESP_LOGE(TAG, SPI_ERROR_LOG);
+                    return;
+                } 
+                Cache_Read_Enable(0);
+            }
             //TODO:write data in ota info
         } else  {
             if(ota_select_valid(&sa) && ota_select_valid(&sb)) {