mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 188:bcfe06ba3d64 1 /* mbed Microcontroller Library
AnnaBridge 188:bcfe06ba3d64 2 * (C)Copyright TOSHIBA ELECTRONIC DEVICES & STORAGE CORPORATION 2018 All rights reserved
AnnaBridge 188:bcfe06ba3d64 3 *
AnnaBridge 188:bcfe06ba3d64 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 188:bcfe06ba3d64 5 * you may not use this file except in compliance with the License.
AnnaBridge 188:bcfe06ba3d64 6 * You may obtain a copy of the License at
AnnaBridge 188:bcfe06ba3d64 7 *
AnnaBridge 188:bcfe06ba3d64 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 188:bcfe06ba3d64 9 *
AnnaBridge 188:bcfe06ba3d64 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 188:bcfe06ba3d64 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 188:bcfe06ba3d64 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 188:bcfe06ba3d64 13 * See the License for the specific language governing permissions and
AnnaBridge 188:bcfe06ba3d64 14 * limitations under the License.
AnnaBridge 188:bcfe06ba3d64 15 */
AnnaBridge 188:bcfe06ba3d64 16
AnnaBridge 188:bcfe06ba3d64 17 #include "flash_api.h"
AnnaBridge 188:bcfe06ba3d64 18 #include "mbed_critical.h"
AnnaBridge 188:bcfe06ba3d64 19 #include "tmpm4g9_fc.h"
AnnaBridge 188:bcfe06ba3d64 20
AnnaBridge 188:bcfe06ba3d64 21 #define PROGRAM_WIRTE_MAX (16U) // Page program could be written 16 bytes/4 words once
AnnaBridge 188:bcfe06ba3d64 22 #define SECTOR_SIZE (0x8000) // 32KB each sectors or block
AnnaBridge 188:bcfe06ba3d64 23 #define FLASH_CHIP_SIZE (0x00180000) // Flash chip size is 1536KByte
AnnaBridge 188:bcfe06ba3d64 24 #define MASK_CHIP_ID_FROM_ADD (0x00FFFFFFUL)
AnnaBridge 188:bcfe06ba3d64 25
AnnaBridge 188:bcfe06ba3d64 26 #define SUCCESS (0U)
AnnaBridge 188:bcfe06ba3d64 27 #define FAIL (-1)
AnnaBridge 188:bcfe06ba3d64 28 // IHOSC1EN
AnnaBridge 188:bcfe06ba3d64 29 #define CGOSCCR_IHOSC1EN_MASK ((uint32_t)0x00000001) // IHOSC1EN :Mask
AnnaBridge 188:bcfe06ba3d64 30 #define CGOSCCR_IHOSC1EN_RW_DISABLE ((uint32_t)0x00000000) // IHOSC1EN :[R/W] :Disable
AnnaBridge 188:bcfe06ba3d64 31 #define CGOSCCR_IHOSC1EN_RW_ENABLE ((uint32_t)0x00000001) // IHOSC1EN :[R/W] :Enable
AnnaBridge 188:bcfe06ba3d64 32
AnnaBridge 188:bcfe06ba3d64 33 static void internal_hosc_enable(void);
AnnaBridge 188:bcfe06ba3d64 34
AnnaBridge 188:bcfe06ba3d64 35 int32_t flash_init(flash_t *obj)
AnnaBridge 188:bcfe06ba3d64 36 {
AnnaBridge 188:bcfe06ba3d64 37 obj->flash_inited = 0;
AnnaBridge 188:bcfe06ba3d64 38 obj->flash_inited = 1;
AnnaBridge 188:bcfe06ba3d64 39 internal_hosc_enable(); // Internal HOSC enable
AnnaBridge 188:bcfe06ba3d64 40 return 0;
AnnaBridge 188:bcfe06ba3d64 41 }
AnnaBridge 188:bcfe06ba3d64 42
AnnaBridge 188:bcfe06ba3d64 43 int32_t flash_free(flash_t *obj)
AnnaBridge 188:bcfe06ba3d64 44 {
AnnaBridge 188:bcfe06ba3d64 45 obj->flash_inited = 0;
AnnaBridge 188:bcfe06ba3d64 46
AnnaBridge 188:bcfe06ba3d64 47 return 0;
AnnaBridge 188:bcfe06ba3d64 48 }
AnnaBridge 188:bcfe06ba3d64 49
AnnaBridge 188:bcfe06ba3d64 50 int32_t flash_erase_sector(flash_t *obj, uint32_t address)
AnnaBridge 188:bcfe06ba3d64 51 {
AnnaBridge 188:bcfe06ba3d64 52 int status = FAIL;
AnnaBridge 188:bcfe06ba3d64 53
AnnaBridge 188:bcfe06ba3d64 54 if (obj->flash_inited == 0) {
AnnaBridge 188:bcfe06ba3d64 55 flash_init(obj);
AnnaBridge 188:bcfe06ba3d64 56 }
AnnaBridge 188:bcfe06ba3d64 57
AnnaBridge 188:bcfe06ba3d64 58 // We need to prevent flash accesses during erase operation
AnnaBridge 188:bcfe06ba3d64 59 core_util_critical_section_enter();
AnnaBridge 188:bcfe06ba3d64 60
AnnaBridge 188:bcfe06ba3d64 61 if (TXZ_SUCCESS == fc_erase_block_code_flash((uint32_t*)FC_CODE_FLASH_ADDRESS_TOP, (uint32_t*)address)) {
AnnaBridge 188:bcfe06ba3d64 62 status = SUCCESS;
AnnaBridge 188:bcfe06ba3d64 63 } else {
AnnaBridge 188:bcfe06ba3d64 64 // Do nothing
AnnaBridge 188:bcfe06ba3d64 65 }
AnnaBridge 188:bcfe06ba3d64 66
AnnaBridge 188:bcfe06ba3d64 67 core_util_critical_section_exit();
AnnaBridge 188:bcfe06ba3d64 68
AnnaBridge 188:bcfe06ba3d64 69 return status;
AnnaBridge 188:bcfe06ba3d64 70 }
AnnaBridge 188:bcfe06ba3d64 71
AnnaBridge 188:bcfe06ba3d64 72 int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size)
AnnaBridge 188:bcfe06ba3d64 73 {
AnnaBridge 188:bcfe06ba3d64 74 int status = SUCCESS;
AnnaBridge 188:bcfe06ba3d64 75
AnnaBridge 188:bcfe06ba3d64 76 address &= MASK_CHIP_ID_FROM_ADD;
AnnaBridge 188:bcfe06ba3d64 77
AnnaBridge 188:bcfe06ba3d64 78 // We need to prevent flash accesses during program operation
AnnaBridge 188:bcfe06ba3d64 79 core_util_critical_section_enter();
AnnaBridge 188:bcfe06ba3d64 80
AnnaBridge 188:bcfe06ba3d64 81 if (TXZ_SUCCESS == fc_write_code_flash((uint32_t*)data, (uint32_t*)address, size)) {
AnnaBridge 188:bcfe06ba3d64 82 // Do nothing
AnnaBridge 188:bcfe06ba3d64 83 } else {
AnnaBridge 188:bcfe06ba3d64 84 status = FAIL;
AnnaBridge 188:bcfe06ba3d64 85 }
AnnaBridge 188:bcfe06ba3d64 86
AnnaBridge 188:bcfe06ba3d64 87 core_util_critical_section_exit();
AnnaBridge 188:bcfe06ba3d64 88
AnnaBridge 188:bcfe06ba3d64 89 return status;
AnnaBridge 188:bcfe06ba3d64 90 }
AnnaBridge 188:bcfe06ba3d64 91
AnnaBridge 188:bcfe06ba3d64 92 uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
AnnaBridge 188:bcfe06ba3d64 93 {
AnnaBridge 188:bcfe06ba3d64 94 if ((address >= FC_CODE_FLASH_ADDRESS_TOP) && (address < (FC_CODE_FLASH_ADDRESS_TOP + FLASH_CHIP_SIZE))) {
AnnaBridge 188:bcfe06ba3d64 95 return SECTOR_SIZE;
AnnaBridge 188:bcfe06ba3d64 96 } else {
AnnaBridge 188:bcfe06ba3d64 97 // Do nothing
AnnaBridge 188:bcfe06ba3d64 98 }
AnnaBridge 188:bcfe06ba3d64 99
AnnaBridge 188:bcfe06ba3d64 100 return MBED_FLASH_INVALID_SIZE;
AnnaBridge 188:bcfe06ba3d64 101 }
AnnaBridge 188:bcfe06ba3d64 102
AnnaBridge 188:bcfe06ba3d64 103 uint32_t flash_get_page_size(const flash_t *obj)
AnnaBridge 188:bcfe06ba3d64 104 {
AnnaBridge 188:bcfe06ba3d64 105 return PROGRAM_WIRTE_MAX;
AnnaBridge 188:bcfe06ba3d64 106 }
AnnaBridge 188:bcfe06ba3d64 107
AnnaBridge 188:bcfe06ba3d64 108 uint32_t flash_get_start_address(const flash_t *obj)
AnnaBridge 188:bcfe06ba3d64 109 {
AnnaBridge 188:bcfe06ba3d64 110 return FC_CODE_FLASH_ADDRESS_TOP;
AnnaBridge 188:bcfe06ba3d64 111 }
AnnaBridge 188:bcfe06ba3d64 112
AnnaBridge 188:bcfe06ba3d64 113 uint32_t flash_get_size(const flash_t *obj)
AnnaBridge 188:bcfe06ba3d64 114 {
AnnaBridge 188:bcfe06ba3d64 115 return FLASH_CHIP_SIZE;
AnnaBridge 188:bcfe06ba3d64 116 }
AnnaBridge 188:bcfe06ba3d64 117
AnnaBridge 188:bcfe06ba3d64 118 static void internal_hosc_enable(void)
AnnaBridge 188:bcfe06ba3d64 119 {
AnnaBridge 188:bcfe06ba3d64 120 uint32_t work;
AnnaBridge 188:bcfe06ba3d64 121 work = (uint32_t)(TSB_CG->OSCCR & ~CGOSCCR_IHOSC1EN_MASK);
AnnaBridge 188:bcfe06ba3d64 122 TSB_CG->OSCCR = (uint32_t)(work | CGOSCCR_IHOSC1EN_RW_ENABLE);
AnnaBridge 188:bcfe06ba3d64 123 }
AnnaBridge 189:f392fc9709a3 124
AnnaBridge 189:f392fc9709a3 125 uint8_t flash_get_erase_value(const flash_t *obj)
AnnaBridge 189:f392fc9709a3 126 {
AnnaBridge 189:f392fc9709a3 127 (void)obj;
AnnaBridge 189:f392fc9709a3 128
AnnaBridge 189:f392fc9709a3 129 return 0xFF;
AnnaBridge 189:f392fc9709a3 130 }