Skip to content

Commit 113ee13

Browse files
Merge pull request #4472 from c1728p9/workshop_rebase_4037
Silicon Labs: Add flash API support
2 parents 5c49dba + 0d1bd37 commit 113ee13

File tree

3 files changed

+151
-8
lines changed

3 files changed

+151
-8
lines changed

targets/TARGET_Silicon_Labs/TARGET_EFM32/common/objects.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ typedef enum {
147147
} sleepstate_enum;
148148
#endif
149149

150+
#if DEVICE_FLASH
151+
struct flash_s {
152+
MSC_TypeDef *msc;
153+
};
154+
#endif
150155

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

targets/targets.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2052,7 +2052,7 @@
20522052
"EFM32GG_STK3700": {
20532053
"inherits": ["EFM32GG990F1024"],
20542054
"progen": {"target": "efm32gg-stk"},
2055-
"device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
2055+
"device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "FLASH"],
20562056
"forced_reset_timeout": 2,
20572057
"config": {
20582058
"hf_clock_src": {
@@ -2105,7 +2105,7 @@
21052105
},
21062106
"EFM32LG_STK3600": {
21072107
"inherits": ["EFM32LG990F256"],
2108-
"device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
2108+
"device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "FLASH"],
21092109
"forced_reset_timeout": 2,
21102110
"device_name": "EFM32LG990F256",
21112111
"config": {
@@ -2160,7 +2160,7 @@
21602160
"EFM32WG_STK3800": {
21612161
"inherits": ["EFM32WG990F256"],
21622162
"progen": {"target": "efm32wg-stk"},
2163-
"device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
2163+
"device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "FLASH"],
21642164
"forced_reset_timeout": 2,
21652165
"config": {
21662166
"hf_clock_src": {
@@ -2321,7 +2321,7 @@
23212321
},
23222322
"EFM32PG_STK3401": {
23232323
"inherits": ["EFM32PG1B100F256GM32"],
2324-
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
2324+
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "FLASH"],
23252325
"forced_reset_timeout": 2,
23262326
"config": {
23272327
"hf_clock_src": {
@@ -2384,7 +2384,7 @@
23842384
},
23852385
"EFR32MG1_BRD4150": {
23862386
"inherits": ["EFR32MG1P132F256GM48"],
2387-
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
2387+
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "FLASH"],
23882388
"forced_reset_timeout": 2,
23892389
"config": {
23902390
"hf_clock_src": {
@@ -2427,7 +2427,7 @@
24272427
},
24282428
"TB_SENSE_1": {
24292429
"inherits": ["EFR32MG1P233F256GM48"],
2430-
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
2430+
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "FLASH"],
24312431
"forced_reset_timeout": 5,
24322432
"config": {
24332433
"hf_clock_src": {
@@ -2474,7 +2474,7 @@
24742474
},
24752475
"EFM32PG12_STK3402": {
24762476
"inherits": ["EFM32PG12B500F1024GL125"],
2477-
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "TRNG"],
2477+
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "TRNG", "FLASH"],
24782478
"forced_reset_timeout": 2,
24792479
"config": {
24802480
"hf_clock_src": {
@@ -2526,7 +2526,7 @@
25262526
},
25272527
"TB_SENSE_12": {
25282528
"inherits": ["EFR32MG12P332F1024GL125"],
2529-
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "TRNG"],
2529+
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "TRNG", "FLASH"],
25302530
"forced_reset_timeout": 5,
25312531
"config": {
25322532
"hf_clock_src": {

0 commit comments

Comments
 (0)