@@ -108,16 +108,28 @@ static int prv_write_nor(uint32_t addr, uint8_t *buf, uint32_t size) {
108108 uint32_t taddr , start , remain , fill ;
109109 uint8_t * tbuf ;
110110 int res ;
111-
112- __disable_irq ();
111+ uint8_t * local_buf = NULL ;
113112
114113 hflash = & spi_flash_handle .handle ;
115114
116- HAL_FLASH_SET_WDT (hflash , UINT16_MAX );
117115 if ((addr < hflash -> base ) || (addr > (hflash -> base + hflash -> size ))) return 0 ;
118116
117+ if (IS_SAME_FLASH_ADDR (buf , addr ) || IS_SPI_NONDMA_RAM_ADDR (buf )
118+ || (IS_DMA_ACCROSS_1M_BOUNDARY ((uint32_t )buf , size )))
119+ {
120+ local_buf = (uint8_t * )malloc (size );
121+ PBL_ASSERT (local_buf != NULL , "malloc failed" );
122+ memcpy (local_buf , buf , size );
123+ tbuf = local_buf ;
124+ }
125+ else
126+ {
127+ tbuf = buf ;
128+ }
129+
130+ __disable_irq ();
131+
119132 taddr = addr - hflash -> base ;
120- tbuf = (uint8_t * )buf ;
121133 remain = size ;
122134
123135 start = taddr & (QSPI_NOR_PAGE_SIZE - 1 );
@@ -129,22 +141,39 @@ static int prv_write_nor(uint32_t addr, uint8_t *buf, uint32_t size) {
129141 fill = size ;
130142 }
131143 res = HAL_QSPIEX_WRITE_PAGE (hflash , taddr , tbuf , fill );
132- if ((uint32_t )res != fill ) return 0 ;
144+
145+ if ((uint32_t )res != fill )
146+ {
147+ size = 0 ;
148+ goto __EXIT ;
149+ }
133150 taddr += fill ;
134151 tbuf += fill ;
135152 remain -= fill ;
136153 }
137154 while (remain > 0 ) {
138155 fill = remain > QSPI_NOR_PAGE_SIZE ? QSPI_NOR_PAGE_SIZE : remain ;
139156 res = HAL_QSPIEX_WRITE_PAGE (hflash , taddr , tbuf , fill );
140- if ((uint32_t )res != fill ) return 0 ;
157+ if ((uint32_t )res != fill )
158+ {
159+ size = 0 ;
160+ goto __EXIT ;
161+ }
162+
141163 taddr += fill ;
142164 tbuf += fill ;
143165 remain -= fill ;
144166 }
145167
168+
169+ __EXIT :
146170 __enable_irq ();
147-
171+
172+ if (local_buf )
173+ {
174+ free (local_buf );
175+ }
176+
148177 return size ;
149178}
150179
0 commit comments