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:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /***************************************************************************//**
AnnaBridge 167:e84263d55307 2 * @file flash_api.c
AnnaBridge 167:e84263d55307 3 *******************************************************************************
AnnaBridge 167:e84263d55307 4 * @section License
AnnaBridge 167:e84263d55307 5 * <b>Copyright 2017 Silicon Laboratories, Inc. http://www.silabs.com</b>
AnnaBridge 167:e84263d55307 6 *******************************************************************************
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Licensed under the Apache License, Version 2.0 (the "License"); you may
AnnaBridge 167:e84263d55307 11 * not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 12 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 13 *
AnnaBridge 167:e84263d55307 14 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 15 *
AnnaBridge 167:e84263d55307 16 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 17 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
AnnaBridge 167:e84263d55307 18 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 19 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 20 * limitations under the License.
AnnaBridge 167:e84263d55307 21 *
AnnaBridge 167:e84263d55307 22 ******************************************************************************/
AnnaBridge 167:e84263d55307 23
AnnaBridge 167:e84263d55307 24 #include "device.h"
AnnaBridge 167:e84263d55307 25 #if DEVICE_FLASH
AnnaBridge 167:e84263d55307 26
AnnaBridge 167:e84263d55307 27 #include "flash_api.h"
AnnaBridge 167:e84263d55307 28 #include "em_msc.h"
AnnaBridge 167:e84263d55307 29
AnnaBridge 167:e84263d55307 30 /** Initialize the flash peripheral and the flash_t object
AnnaBridge 167:e84263d55307 31 *
AnnaBridge 167:e84263d55307 32 * @param obj The flash object
AnnaBridge 167:e84263d55307 33 * @return 0 for success, -1 for error
AnnaBridge 167:e84263d55307 34 */
AnnaBridge 167:e84263d55307 35 int32_t flash_init(flash_t *obj)
AnnaBridge 167:e84263d55307 36 {
AnnaBridge 167:e84263d55307 37 (void)obj;
AnnaBridge 181:57724642e740 38 MSC_Init();
AnnaBridge 167:e84263d55307 39 return 0;
AnnaBridge 167:e84263d55307 40 }
AnnaBridge 167:e84263d55307 41
AnnaBridge 167:e84263d55307 42 /** Uninitialize the flash peripheral and the flash_t object
AnnaBridge 167:e84263d55307 43 *
AnnaBridge 167:e84263d55307 44 * @param obj The flash object
AnnaBridge 167:e84263d55307 45 * @return 0 for success, -1 for error
AnnaBridge 167:e84263d55307 46 */
AnnaBridge 167:e84263d55307 47 int32_t flash_free(flash_t *obj)
AnnaBridge 167:e84263d55307 48 {
AnnaBridge 167:e84263d55307 49 (void)obj;
AnnaBridge 181:57724642e740 50 MSC_Deinit();
AnnaBridge 167:e84263d55307 51 return 0;
AnnaBridge 167:e84263d55307 52 }
AnnaBridge 167:e84263d55307 53
AnnaBridge 167:e84263d55307 54 /** Erase one sector starting at defined address
AnnaBridge 167:e84263d55307 55 *
AnnaBridge 167:e84263d55307 56 * The address should be at sector boundary. This function does not do any check for address alignments
AnnaBridge 167:e84263d55307 57 * @param obj The flash object
AnnaBridge 167:e84263d55307 58 * @param address The sector starting address
AnnaBridge 167:e84263d55307 59 * @return 0 for success, -1 for error
AnnaBridge 167:e84263d55307 60 */
AnnaBridge 167:e84263d55307 61 int32_t flash_erase_sector(flash_t *obj, uint32_t address)
AnnaBridge 167:e84263d55307 62 {
AnnaBridge 167:e84263d55307 63 (void)obj;
AnnaBridge 167:e84263d55307 64 MSC_Status_TypeDef mscStatus = MSC_ErasePage((uint32_t *)address);
AnnaBridge 167:e84263d55307 65
AnnaBridge 167:e84263d55307 66 return (mscStatus == mscReturnOk) ? 0 : -1;
AnnaBridge 167:e84263d55307 67 }
AnnaBridge 167:e84263d55307 68
AnnaBridge 167:e84263d55307 69 /** Program one page starting at defined address
AnnaBridge 167:e84263d55307 70 *
AnnaBridge 167:e84263d55307 71 * The page should be at page boundary, should not cross multiple sectors.
AnnaBridge 167:e84263d55307 72 * This function does not do any check for address alignments or if size is aligned to a page size.
AnnaBridge 167:e84263d55307 73 * @param obj The flash object
AnnaBridge 167:e84263d55307 74 * @param address The sector starting address
AnnaBridge 167:e84263d55307 75 * @param data The data buffer to be programmed
AnnaBridge 167:e84263d55307 76 * @param size The number of bytes to program
AnnaBridge 167:e84263d55307 77 * @return 0 for success, -1 for error
AnnaBridge 167:e84263d55307 78 */
AnnaBridge 167:e84263d55307 79 int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size)
AnnaBridge 167:e84263d55307 80 {
AnnaBridge 167:e84263d55307 81 (void)obj;
AnnaBridge 167:e84263d55307 82 MSC_Status_TypeDef mscStatus = MSC_WriteWord((uint32_t *)address, data, size);
AnnaBridge 167:e84263d55307 83
AnnaBridge 167:e84263d55307 84 return (mscStatus == mscReturnOk) ? 0 : -1;
AnnaBridge 167:e84263d55307 85 }
AnnaBridge 167:e84263d55307 86
AnnaBridge 167:e84263d55307 87 /** Get sector size
AnnaBridge 167:e84263d55307 88 *
AnnaBridge 167:e84263d55307 89 * @param obj The flash object
AnnaBridge 167:e84263d55307 90 * @param address The sector starting address
AnnaBridge 167:e84263d55307 91 * @return The size of a sector
AnnaBridge 167:e84263d55307 92 */
AnnaBridge 167:e84263d55307 93 uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
AnnaBridge 167:e84263d55307 94 {
AnnaBridge 167:e84263d55307 95 (void)obj;
AnnaBridge 167:e84263d55307 96 (void)address;
AnnaBridge 167:e84263d55307 97
AnnaBridge 179:b0033dcd6934 98 #if FLASH_BASE > 0
AnnaBridge 167:e84263d55307 99 if (address < FLASH_BASE || address >= FLASH_BASE + FLASH_SIZE) {
AnnaBridge 167:e84263d55307 100 // Address outside of flash -- invalid sector
AnnaBridge 167:e84263d55307 101 return MBED_FLASH_INVALID_SIZE;
AnnaBridge 167:e84263d55307 102 }
AnnaBridge 179:b0033dcd6934 103 #else
AnnaBridge 179:b0033dcd6934 104 if (address >= FLASH_BASE + FLASH_SIZE) {
AnnaBridge 179:b0033dcd6934 105 // Address outside of flash -- invalid sector
AnnaBridge 179:b0033dcd6934 106 return MBED_FLASH_INVALID_SIZE;
AnnaBridge 179:b0033dcd6934 107 }
AnnaBridge 179:b0033dcd6934 108 #endif
AnnaBridge 167:e84263d55307 109
AnnaBridge 167:e84263d55307 110 return FLASH_PAGE_SIZE;
AnnaBridge 167:e84263d55307 111 }
AnnaBridge 167:e84263d55307 112
AnnaBridge 167:e84263d55307 113 /** Get page size
AnnaBridge 167:e84263d55307 114 *
Anna Bridge 186:707f6e361f3e 115 * The page size defines the writable page size
AnnaBridge 167:e84263d55307 116 * @param obj The flash object
AnnaBridge 167:e84263d55307 117 * @return The size of a page
AnnaBridge 167:e84263d55307 118 */
AnnaBridge 167:e84263d55307 119 uint32_t flash_get_page_size(const flash_t *obj)
AnnaBridge 167:e84263d55307 120 {
AnnaBridge 167:e84263d55307 121 (void)obj;
Anna Bridge 186:707f6e361f3e 122 return sizeof(uint32_t);
AnnaBridge 167:e84263d55307 123 }
AnnaBridge 167:e84263d55307 124
AnnaBridge 167:e84263d55307 125 /** Get start address for the flash region
AnnaBridge 167:e84263d55307 126 *
AnnaBridge 167:e84263d55307 127 * @param obj The flash object
AnnaBridge 167:e84263d55307 128 * @return The start address for the flash region
AnnaBridge 167:e84263d55307 129 */
AnnaBridge 167:e84263d55307 130 uint32_t flash_get_start_address(const flash_t *obj)
AnnaBridge 167:e84263d55307 131 {
AnnaBridge 167:e84263d55307 132 (void)obj;
AnnaBridge 167:e84263d55307 133 return FLASH_BASE;
AnnaBridge 167:e84263d55307 134 }
AnnaBridge 167:e84263d55307 135
AnnaBridge 167:e84263d55307 136 /** Get the flash region size
AnnaBridge 167:e84263d55307 137 *
AnnaBridge 167:e84263d55307 138 * @param obj The flash object
AnnaBridge 167:e84263d55307 139 * @return The flash region size
AnnaBridge 167:e84263d55307 140 */
AnnaBridge 167:e84263d55307 141 uint32_t flash_get_size(const flash_t *obj)
AnnaBridge 167:e84263d55307 142 {
AnnaBridge 167:e84263d55307 143 (void)obj;
AnnaBridge 167:e84263d55307 144 return FLASH_SIZE;
AnnaBridge 167:e84263d55307 145 }
AnnaBridge 167:e84263d55307 146
AnnaBridge 189:f392fc9709a3 147 /** Get the flash erase value
AnnaBridge 189:f392fc9709a3 148 *
AnnaBridge 189:f392fc9709a3 149 * @param obj The flash object
AnnaBridge 189:f392fc9709a3 150 * @return The flash erase value
AnnaBridge 189:f392fc9709a3 151 */
AnnaBridge 189:f392fc9709a3 152 uint8_t flash_get_erase_value(const flash_t *obj)
AnnaBridge 189:f392fc9709a3 153 {
AnnaBridge 189:f392fc9709a3 154 (void)obj;
AnnaBridge 189:f392fc9709a3 155
AnnaBridge 189:f392fc9709a3 156 return 0xFF;
AnnaBridge 189:f392fc9709a3 157 }
AnnaBridge 189:f392fc9709a3 158
AnnaBridge 167:e84263d55307 159 #endif // DEVICE_FLASH