Skip to content

Commit b59f99d

Browse files
author
Wayne Ren
authored
Merge pull request #102 from IRISZZW/eflash_fix
board: iotdk: smic_eflash: bugs fix and code optimizes
2 parents c21fc39 + 3ae19d5 commit b59f99d

File tree

2 files changed

+42
-15
lines changed

2 files changed

+42
-15
lines changed

board/iotdk/drivers/smic/smic_eflash/smic_eflash.c

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,25 @@ int32_t smic_eflash_close(SMIC_EFLASH_DEF_PTR obj)
121121
int32_t smic_eflash_read(SMIC_EFLASH_DEF_PTR obj, uint32_t addr, uint32_t len, uint8_t *val)
122122
{
123123
int32_t ercd = E_OK;
124-
uint32_t i;
125-
uint8_t *p_addr = (uint8_t *)(obj->eflash_base_addr + addr);
126124

127125
SMIC_EFLASH_CHECK_EXP(obj != NULL, E_OBJ);
128126
SMIC_EFLASH_CHECK_EXP(obj->eflash_open_cnt != 0, E_OPNED);
129127

130-
for (i = 0; i < len; i++) {
131-
*val++ = *p_addr++;
128+
uint32_t *p_addr32 = (uint32_t *)(obj->eflash_base_addr + addr);
129+
uint32_t *p_val32 = (uint32_t *)(val);
130+
131+
if (!(addr & 0x03) && !((uint32_t)val & 0x03)) {
132+
while (len >= 4) {
133+
*p_val32++ = *p_addr32++;
134+
len -= 4;
135+
}
136+
}
137+
138+
uint8_t *p_addr = (uint8_t *)(p_addr32);
139+
uint8_t *p_val = (uint8_t *)(p_val32);
140+
141+
while (len--) {
142+
*p_val++ = *p_addr++;
132143
}
133144

134145
return (int32_t)(len);
@@ -140,14 +151,30 @@ int32_t smic_eflash_read(SMIC_EFLASH_DEF_PTR obj, uint32_t addr, uint32_t len, u
140151
int32_t smic_eflash_write_nocheck(SMIC_EFLASH_DEF_PTR obj, uint32_t addr, uint32_t len, uint8_t *val)
141152
{
142153
int32_t ercd = E_OK;
143-
uint32_t i;
144-
uint8_t *p_addr = (uint8_t *)(obj->eflash_base_addr + addr);
145154

146155
SMIC_EFLASH_CHECK_EXP(obj != NULL, E_OBJ);
147156
SMIC_EFLASH_CHECK_EXP(obj->eflash_open_cnt != 0, E_OPNED);
148157

149-
for (i = 0; i < len; i++) {
150-
*p_addr++ = *val++;
158+
uint32_t *p_addr32 = (uint32_t *)(obj->eflash_base_addr + addr);
159+
uint32_t *p_val32 = (uint32_t *)(val);
160+
161+
if (!(addr & 0x03) && !((uint32_t)val & 0x03)) {
162+
while (len >= 4) {
163+
*p_addr32++ = *p_val32++;
164+
while (1) {
165+
if ((obj->eflash_reg->FMCCON & FMC_BUSY_MASK) != FMC_BUSY_MASK) {
166+
break;
167+
}
168+
}
169+
len -= 4;
170+
}
171+
}
172+
173+
uint8_t *p_addr = (uint8_t *)(p_addr32);
174+
uint8_t *p_val = (uint8_t *)(p_val32);
175+
176+
while (len--) {
177+
*p_addr++ = *p_val++;
151178

152179
while (1) {
153180
if ((obj->eflash_reg->FMCCON & FMC_BUSY_MASK) != FMC_BUSY_MASK) {
@@ -278,18 +305,18 @@ int32_t smic_eflash_control(SMIC_EFLASH_DEF_PTR obj, uint32_t ctrl_cmd, void *pa
278305

279306
switch (ctrl_cmd) {
280307
case SMIC_EFLASH_SET_LOCK:
281-
SMIC_EFLASH_CHECK_EXP(*((E_FMC_LOCK *)param) != FMC_LOCK && \
282-
*((E_FMC_LOCK *)param) != FMC_UNLOCK, E_PAR);
283-
obj->eflash_reg->FMCLOCK = *((E_FMC_LOCK *)param);
284-
obj->eflash_lock = *((E_FMC_LOCK *)param);
308+
SMIC_EFLASH_CHECK_EXP((E_FMC_LOCK)param != FMC_LOCK && \
309+
(E_FMC_LOCK)param != FMC_UNLOCK, E_PAR);
310+
obj->eflash_lock = (E_FMC_LOCK)param;
311+
smic_eflash_set_lock(obj, (E_FMC_LOCK)param);
285312
break;
286313

287314
case SMIC_EFLASH_GET_LOCK:
288315
*((E_FMC_LOCK *)param) = obj->eflash_lock;
289316
break;
290317

291318
case SMIC_EFLASH_PAGE_ERASE:
292-
smic_eflash_page_erase(obj, *((uint32_t *)param));
319+
smic_eflash_page_erase(obj, (uint32_t)param);
293320
break;
294321

295322
case SMIC_EFLASH_MACRO_ERASE:

board/iotdk/drivers/smic/smic_eflash/smic_eflash.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
#define SMIC_EFLASH_MACRO_ERASE 3
4747
#define SMIC_EFLASH_GET_INFO 4
4848

49-
#define SMIC_EFLASH_PAGE_SIZE 1024
50-
#define SMIC_EFLASH_PAGE_CNT 256
49+
#define SMIC_EFLASH_PAGE_SIZE 512
50+
#define SMIC_EFLASH_PAGE_CNT 512
5151

5252
#ifdef __cplusplus
5353
extern "C" {

0 commit comments

Comments
 (0)