mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Thu Nov 23 11:57:25 2017 +0000
Revision:
178:79309dc6340a
Parent:
173:e131a1973e81
Child:
179:b0033dcd6934
mbed-dev library. Release version 156

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 173:e131a1973e81 1 /* mbed Microcontroller Library
AnnaBridge 173:e131a1973e81 2 * Copyright (c) 2013-2017 Realtek Semiconductor Corp.
AnnaBridge 173:e131a1973e81 3 *
AnnaBridge 173:e131a1973e81 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 173:e131a1973e81 5 * you may not use this file except in compliance with the License.
AnnaBridge 173:e131a1973e81 6 * You may obtain a copy of the License at
AnnaBridge 173:e131a1973e81 7 *
AnnaBridge 173:e131a1973e81 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 173:e131a1973e81 9 *
AnnaBridge 173:e131a1973e81 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 173:e131a1973e81 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 173:e131a1973e81 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 173:e131a1973e81 13 * See the License for the specific language governing permissions and
AnnaBridge 173:e131a1973e81 14 * limitations under the License.
AnnaBridge 173:e131a1973e81 15 */
AnnaBridge 173:e131a1973e81 16 #include <stdio.h>
AnnaBridge 173:e131a1973e81 17 #include <string.h>
AnnaBridge 173:e131a1973e81 18
AnnaBridge 173:e131a1973e81 19 #include "mbed_wait_api.h"
AnnaBridge 173:e131a1973e81 20
AnnaBridge 173:e131a1973e81 21 #include "rtl8195a.h"
AnnaBridge 178:79309dc6340a 22 #include "ota_api.h"
AnnaBridge 173:e131a1973e81 23 #include "flash_ext.h"
AnnaBridge 173:e131a1973e81 24
AnnaBridge 173:e131a1973e81 25 static flash_t flash_obj;
AnnaBridge 173:e131a1973e81 26
AnnaBridge 173:e131a1973e81 27 void OTA_GetImageInfo(imginfo_t *info)
AnnaBridge 173:e131a1973e81 28 {
AnnaBridge 173:e131a1973e81 29 uint32_t ver_hi, ver_lo;
AnnaBridge 173:e131a1973e81 30
AnnaBridge 173:e131a1973e81 31 flash_ext_read_word(&flash_obj, info->base + TAG_OFS, &info->tag);
AnnaBridge 173:e131a1973e81 32 flash_ext_read_word(&flash_obj, info->base + VER_OFS, &ver_lo);
AnnaBridge 173:e131a1973e81 33 flash_ext_read_word(&flash_obj, info->base + VER_OFS + 4, &ver_hi);
AnnaBridge 173:e131a1973e81 34
AnnaBridge 173:e131a1973e81 35 if (info->tag == TAG_DOWNLOAD) {
AnnaBridge 173:e131a1973e81 36 info->ver = ((uint64_t)ver_hi << 32) | (uint64_t) ver_lo;
AnnaBridge 173:e131a1973e81 37 } else {
AnnaBridge 173:e131a1973e81 38 info->ver = 0;
AnnaBridge 173:e131a1973e81 39 }
AnnaBridge 173:e131a1973e81 40 }
AnnaBridge 173:e131a1973e81 41
AnnaBridge 173:e131a1973e81 42 uint32_t OTA_GetBase(void)
AnnaBridge 173:e131a1973e81 43 {
AnnaBridge 173:e131a1973e81 44 static uint32_t ota_base = 0;
AnnaBridge 173:e131a1973e81 45 imginfo_t region1, region2;
AnnaBridge 173:e131a1973e81 46
AnnaBridge 173:e131a1973e81 47 if (ota_base == OTA_REGION1 || ota_base == OTA_REGION2) {
AnnaBridge 173:e131a1973e81 48 return ota_base;
AnnaBridge 173:e131a1973e81 49 }
AnnaBridge 173:e131a1973e81 50
AnnaBridge 173:e131a1973e81 51 region1.base = OTA_REGION1;
AnnaBridge 173:e131a1973e81 52 region2.base = OTA_REGION2;
AnnaBridge 173:e131a1973e81 53
AnnaBridge 173:e131a1973e81 54 OTA_GetImageInfo(&region1);
AnnaBridge 173:e131a1973e81 55 OTA_GetImageInfo(&region2);
AnnaBridge 173:e131a1973e81 56
AnnaBridge 173:e131a1973e81 57 if (region1.ver >= region2.ver) {
AnnaBridge 173:e131a1973e81 58 ota_base = region2.base;
AnnaBridge 173:e131a1973e81 59 } else {
AnnaBridge 173:e131a1973e81 60 ota_base = region1.base;
AnnaBridge 173:e131a1973e81 61 }
AnnaBridge 173:e131a1973e81 62 return ota_base;
AnnaBridge 173:e131a1973e81 63 }
AnnaBridge 173:e131a1973e81 64
AnnaBridge 173:e131a1973e81 65 uint32_t OTA_MarkUpdateDone(void)
AnnaBridge 173:e131a1973e81 66 {
AnnaBridge 173:e131a1973e81 67 uint32_t addr = OTA_GetBase() + TAG_OFS;
AnnaBridge 173:e131a1973e81 68
AnnaBridge 173:e131a1973e81 69 return flash_ext_write_word(&flash_obj, addr, TAG_DOWNLOAD);
AnnaBridge 173:e131a1973e81 70 }
AnnaBridge 173:e131a1973e81 71
AnnaBridge 173:e131a1973e81 72 uint32_t OTA_UpdateImage(uint32_t offset, uint32_t len, uint8_t *data)
AnnaBridge 173:e131a1973e81 73 {
AnnaBridge 173:e131a1973e81 74 uint32_t addr, start, end, count, shift;
AnnaBridge 173:e131a1973e81 75 uint8_t *pdata = data;
AnnaBridge 173:e131a1973e81 76 uint8_t buf[FLASH_SECTOR_SIZE];
AnnaBridge 173:e131a1973e81 77
AnnaBridge 173:e131a1973e81 78 start = OTA_GetBase() + offset;
AnnaBridge 173:e131a1973e81 79 end = start + len;
AnnaBridge 173:e131a1973e81 80
AnnaBridge 173:e131a1973e81 81 if (data == NULL || start > FLASH_TOP || end > FLASH_TOP) {
AnnaBridge 173:e131a1973e81 82 return 0;
AnnaBridge 173:e131a1973e81 83 }
AnnaBridge 173:e131a1973e81 84
AnnaBridge 173:e131a1973e81 85 addr = start & FLASH_SECTOR_MASK;
AnnaBridge 173:e131a1973e81 86 if (addr != start) {
AnnaBridge 173:e131a1973e81 87 shift = start - addr;
AnnaBridge 173:e131a1973e81 88 count = MIN(FLASH_SECTOR_SIZE - shift, len);
AnnaBridge 173:e131a1973e81 89 flash_ext_stream_read(&flash_obj, addr, shift, buf);
AnnaBridge 173:e131a1973e81 90 memcpy((void *)(buf + shift), (void *)pdata, count);
AnnaBridge 173:e131a1973e81 91
AnnaBridge 173:e131a1973e81 92 flash_ext_erase_sector(&flash_obj, addr);
AnnaBridge 173:e131a1973e81 93 flash_ext_stream_write(&flash_obj, addr, FLASH_SECTOR_SIZE, buf);
AnnaBridge 173:e131a1973e81 94 addr += FLASH_SECTOR_SIZE;
AnnaBridge 173:e131a1973e81 95 pdata += count;
AnnaBridge 173:e131a1973e81 96 }
AnnaBridge 173:e131a1973e81 97
AnnaBridge 173:e131a1973e81 98 while (addr < end) {
AnnaBridge 173:e131a1973e81 99 printf("OTA: update addr=0x%lx, len=%ld\r\n", addr, len);
AnnaBridge 173:e131a1973e81 100 count = MIN(FLASH_SECTOR_SIZE, end - addr);
AnnaBridge 173:e131a1973e81 101 flash_ext_erase_sector(&flash_obj, addr);
AnnaBridge 173:e131a1973e81 102 flash_ext_stream_write(&flash_obj, addr, count, pdata);
AnnaBridge 173:e131a1973e81 103 addr += FLASH_SECTOR_SIZE;
AnnaBridge 173:e131a1973e81 104 pdata += count;
AnnaBridge 173:e131a1973e81 105 }
AnnaBridge 173:e131a1973e81 106 return len;
AnnaBridge 173:e131a1973e81 107 }
AnnaBridge 173:e131a1973e81 108
AnnaBridge 173:e131a1973e81 109 uint32_t OTA_ReadImage(uint32_t offset, uint32_t len, uint8_t *data)
AnnaBridge 173:e131a1973e81 110 {
AnnaBridge 173:e131a1973e81 111 uint32_t addr, endaddr;
AnnaBridge 173:e131a1973e81 112
AnnaBridge 173:e131a1973e81 113 addr = OTA_GetBase() + offset;
AnnaBridge 173:e131a1973e81 114 endaddr = addr + len;
AnnaBridge 173:e131a1973e81 115
AnnaBridge 173:e131a1973e81 116 if (data == NULL || addr > FLASH_TOP || endaddr > FLASH_TOP) {
AnnaBridge 173:e131a1973e81 117 return 0;
AnnaBridge 173:e131a1973e81 118 }
AnnaBridge 173:e131a1973e81 119
AnnaBridge 173:e131a1973e81 120 printf("OTA: read addr=0x%lx\r\n", addr);
AnnaBridge 173:e131a1973e81 121 return flash_ext_stream_read(&flash_obj, addr, len, data);
AnnaBridge 173:e131a1973e81 122 }
AnnaBridge 173:e131a1973e81 123
AnnaBridge 173:e131a1973e81 124 void OTA_ResetTarget(void)
AnnaBridge 173:e131a1973e81 125 {
AnnaBridge 173:e131a1973e81 126 __RTK_CTRL_WRITE32(0x14, 0x00000021);
AnnaBridge 173:e131a1973e81 127 wait(1);
AnnaBridge 173:e131a1973e81 128
AnnaBridge 173:e131a1973e81 129 // write SCB->AIRCR
AnnaBridge 173:e131a1973e81 130 HAL_WRITE32(0xE000ED00, 0x0C,
AnnaBridge 173:e131a1973e81 131 (0x5FA << 16) | // VECTKEY
AnnaBridge 173:e131a1973e81 132 (HAL_READ32(0xE000ED00, 0x0C) & (7 << 8)) | // PRIGROUP
AnnaBridge 173:e131a1973e81 133 (1 << 2)); // SYSRESETREQ
AnnaBridge 173:e131a1973e81 134
AnnaBridge 173:e131a1973e81 135 // not reached
AnnaBridge 173:e131a1973e81 136 while (1);
AnnaBridge 173:e131a1973e81 137 }