@@ -121,14 +121,25 @@ int32_t smic_eflash_close(SMIC_EFLASH_DEF_PTR obj)
121121int32_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
140151int32_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 :
0 commit comments