1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 // Software and any modification/derivatives thereof.
18 // No right, ownership, or interest to MStar Software and any
19 // modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 // supplied together with third party`s software and the use of MStar
23 // Software may require additional licenses from third parties.
24 // Therefore, you hereby agree it is your sole responsibility to separately
25 // obtain any and all third party right and license necessary for your use of
26 // such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 // MStar`s confidential information and you agree to keep MStar`s
30 // confidential information in strictest confidence and not disclose to any
31 // third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 // kind. Any warranties are hereby expressly disclaimed by MStar, including
35 // without limitation, any warranties of merchantability, non-infringement of
36 // intellectual property rights, fitness for a particular purpose, error free
37 // and in conformity with any international standard. You agree to waive any
38 // claim against MStar for any loss, damage, cost or expense that you may
39 // incur related to your use of MStar Software.
40 // In no event shall MStar be liable for any direct, indirect, incidental or
41 // consequential damages, including without limitation, lost of profit or
42 // revenues, lost or damage of data, and unauthorized system use.
43 // You agree that this Section 4 shall still apply without being affected
44 // even if MStar Software has been modified by MStar in accordance with your
45 // request or instruction for your use, except otherwise agreed by both
46 // parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 // services in relation with MStar Software to you for your use of
50 // MStar Software in conjunction with your or your customer`s product
51 // ("Services").
52 // You understand and agree that, except otherwise agreed by both parties in
53 // writing, Services are provided on an "AS IS" basis and the warranty
54 // disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 // or otherwise:
58 // (a) conferring any license or right to use MStar name, trademark, service
59 // mark, symbol or any other identification;
60 // (b) obligating MStar or any of its affiliates to furnish any person,
61 // including without limitation, you and your customers, any assistance
62 // of any kind whatsoever, or any information; or
63 // (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 // of Taiwan, R.O.C., excluding its conflict of law rules.
67 // Any and all dispute arising out hereof or related hereto shall be finally
68 // settled by arbitration referred to the Chinese Arbitration Association,
69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 // Rules of the Association by three (3) arbitrators appointed in accordance
71 // with the said Rules.
72 // The place of arbitration shall be in Taipei, Taiwan and the language shall
73 // be English.
74 // The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94
95 ///////////////////////////////////////////////////////////////////////////////////////////////////
96 ///
97 /// file drvSERFLASH.c
98 /// @brief Serial Flash Driver Interface
99 /// @author MStar Semiconductor Inc.
100 ///////////////////////////////////////////////////////////////////////////////////////////////////
101
102
103 //-------------------------------------------------------------------------------------------------
104 // Include Files
105 //-------------------------------------------------------------------------------------------------
106 #include <string.h>
107
108 // Common Definition
109 #include "MsCommon.h"
110 #include "MsVersion.h"
111 #include "drvSERFLASH.h"
112 #include "MsOS.h"
113
114 #include "ULog.h"
115
116 // Internal Definition
117 #include "regSERFLASH.h"
118 #include "halSERFLASH.h"
119 #include "drvBDMA.h"
120 #include "drvMMIO.h"
121 #include "utopia.h"
122
123 #define TAG_SERFLASH "SERFLASH"
124
125 #if defined(MSOS_TYPE_LINUX)
126 #include <sys/ioctl.h>
127 #include <unistd.h>
128 #include <fcntl.h>
129 #endif
130
131 // !!! Uranus Serial Flash Notes: !!!
132 // - The clock of DMA & Read via XIU operations must be < 3*CPU clock
133 // - The clock of DMA & Read via XIU operations are determined by only REG_ISP_CLK_SRC; other operations by REG_ISP_CLK_SRC only
134 // - DMA program can't run on DRAM, but in flash ONLY
135 // - DMA from SPI to DRAM => size/DRAM start/DRAM end must be 8-B aligned
136
137
138 //-------------------------------------------------------------------------------------------------
139 // Driver Compiler Options
140 //-------------------------------------------------------------------------------------------------
141 #define VER_CHECK_HEADER 'M','S','V','C','0','0'
142 #define SERFLASH_LIB_ID 'F','1' // F1: libFLASH.a
143 #define SERFLASH_INTERFACE_VER '0','1'
144 #define SERFLASH_BUILD_VER '0','0','0','1'
145 #define CHANGE_LIST_NUM '0','0','0','9','1','9','9','6'
146 #define PRODUCT_NAME 'A','E' // AE: T2
147 #define CUSTOMER_NAME '0' // 0: Mstar
148 #define DEVELOP_STAGE 'B','L','E','G'
149 #define OS_VERSION '0','0'
150 #define CHECK_SUM 'T'
151
152 ////////////////////////////////////////////////////////////////////////////////
153 // Local & Global Variables
154 ////////////////////////////////////////////////////////////////////////////////
155 static MSIF_Version _drv_spif_version = {
156 .DDI = { SPIF_DRV_VERSION },
157 };
158 static SPI_Attribute _SPI_Attri = E_SPI_ATTRI_USER_DRV;
159 static SERFLASH_Info _SERFLASHInfo;
160 static SERFLASH_DrvStatus _SERFLASHDrvStatus;
161
162 /// Ask 51 to select flash
163 ms_Mcu_ChipSelect_CB McuChipSelectCB = NULL;
164 ms_Flash_SetHWWP_CB FlashSetHWWPCB = NULL;
165
166 #if (SERFLASH_UTOPIA20)
167 void* pInstantSerFlash = NULL;
168 void* pAttributeSerFlash = NULL;
169 #endif
170
171 #if defined(MSOS_TYPE_LINUX)
172 #define SYS_IOCTL_MAGIC 'S'
173 #define IOCTL_SYS_SPI_READ _IOWR (SYS_IOCTL_MAGIC, 0x71, int)
174 #define IOCTL_SYS_SPI_WRITE _IOWR (SYS_IOCTL_MAGIC, 0x72, int)
175 #define IOCTL_SYS_SPI_ERASE _IOWR (SYS_IOCTL_MAGIC, 0x73, int)
176 #define IOCTL_SYS_SPI_SIZE_DETECT _IOWR (SYS_IOCTL_MAGIC, 0x74, int)
177 #define IOCTL_SYS_SPI_READ_STATUS _IOWR (SYS_IOCTL_MAGIC, 0x76, int)
178 #define IOCTL_SYS_SPI_WRITE_STATUS _IOWR (SYS_IOCTL_MAGIC, 0x77, int)
179 #define IOCTL_SYS_SPI_INIT _IO (SYS_IOCTL_MAGIC,0x78)
180 #define IOCTL_SYS_SPI_WRITE_PROTECT _IOWR (SYS_IOCTL_MAGIC, 0x79, int)
181 #define IOCTL_SYS_SPI_ERASE_ALL _IO (SYS_IOCTL_MAGIC,0x7A)
182 #define IOCTL_SYS_SPI_FLASH_INFO _IOWR (SYS_IOCTL_MAGIC, 0x7B, int)
183 #define IOCTL_SYS_SPI_SECTOR_ERASE _IOWR (SYS_IOCTL_MAGIC, 0x7C, int)
184
185 #define SPI_FW_NAME "/dev/system"
186 #endif
187 //-------------------------------------------------------------------------------------------------
188 // Debug Functions
189 //-------------------------------------------------------------------------------------------------
190
191
192 //-------------------------------------------------------------------------------------------------
193 // Local Functions
194 //-------------------------------------------------------------------------------------------------
195 #define DRV_FLASH_MS(x) (5955 * x)
196 #define FLASH_WAIT_TIME (DRV_FLASH_MS(100)*0x200)
197 #define FLASH_IS_TIMEOUT(x) ((x) ? FALSE : TRUE)
198
199 //-------------------------------------------------------------------------------------------------
200 // Global Functions
201 //-------------------------------------------------------------------------------------------------
202
203
204 //-------------------------------------------------------------------------------------------------
205 /// Get the information of Serial Flash
206 /// @return the pointer to the driver information
207 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_GetInfo(void)208 const SERFLASH_Info *MDrv_SERFLASH_GetInfo(void)
209 {
210 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
211 {
212 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_INFO,
213 ULOGD(TAG_SERFLASH,"MDrv_SERFLASH_GetInfo()\n"
214 "\tu32AccessWidth = %d\n"
215 "\tu32TotalSize = %d\n"
216 "\tu32SecNum = %d\n"
217 "\tu32SecSize = %d\n",
218 (int)(_SERFLASHInfo.u32AccessWidth),
219 (int)(_SERFLASHInfo.u32TotalSize),
220 (int)(_SERFLASHInfo.u32SecNum),
221 (int)(_SERFLASHInfo.u32SecSize)
222 )
223 );
224 }
225 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
226 {
227 #if defined(MSOS_TYPE_LINUX)
228 int fd = -1;
229 fd = open(SPI_FW_NAME, O_RDWR|O_EXCL);
230 if (fd == -1)
231 {
232 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("Cannot open fw descriptor"));
233 perror("");
234
235 }
236 else
237 {
238 if(-1 == ioctl(fd, IOCTL_SYS_SPI_FLASH_INFO,&_SERFLASHInfo))
239 {
240 perror("");
241 close(fd);
242 }
243 }
244 close(fd);
245 #endif
246 }
247
248 return &_SERFLASHInfo;
249 }
250
251 //------------------------------------------------------------------------------
252 /// Description : Show the SERFLASH driver version
253 /// @param ppVersion \b OUT: output SERFLASH driver version
254 /// @return TRUE : succeed
255 /// @return FALSE : failed
256 //------------------------------------------------------------------------------
MDrv_SERFLASH_GetLibVer(const MSIF_Version ** ppVersion)257 MS_BOOL MDrv_SERFLASH_GetLibVer(const MSIF_Version **ppVersion)
258 {
259 if (!ppVersion)
260 return FALSE;
261
262 *ppVersion = &_drv_spif_version;
263
264 return TRUE;
265 }
266
267 //------------------------------------------------------------------------------
268 /// Description : Get Serial Flash driver status
269 /// @param pDrvStatus \b OUT: poniter to store the returning driver status
270 /// @return TRUE : succeed
271 /// @return FALSE : failed to get the driver status
272 //------------------------------------------------------------------------------
MDrv_SERFLASH_GetStatus(SERFLASH_DrvStatus * pDrvStatus)273 MS_BOOL MDrv_SERFLASH_GetStatus(SERFLASH_DrvStatus* pDrvStatus)
274 {
275 memcpy(pDrvStatus, &_SERFLASHDrvStatus, sizeof(_SERFLASHDrvStatus));
276
277 return TRUE;
278 }
279
280 #if (SERFLASH_UTOPIA20)
281 //------------------------------------------------------------------------------
282 /// Description : Set detailed level of Parallel Flash driver debug message
283 /// @param u8DbgLevel \b IN debug level for Serial Flash driver
284 /// @return TRUE : succeed
285 /// @return FALSE : failed to set the debug level
286 //------------------------------------------------------------------------------
_MDrv_SERFLASH_SetDbgLevel(MS_U8 u8DbgLevel)287 MS_BOOL _MDrv_SERFLASH_SetDbgLevel(MS_U8 u8DbgLevel)
288 {
289 _u8SERFLASHDbgLevel = u8DbgLevel;
290
291 return TRUE;
292 }
293
294 //------------------------------------------------------------------------------
295 /// Description : Set WP pin info to driver
296 /// @param bWPInfo
297 /// @return TRUE : succeed
298 /// @return FALSE : failed to set the WP pin info
299 //------------------------------------------------------------------------------
_MDrv_SERFLASH_SetWPInfo(MS_BOOL bWPInfo)300 MS_BOOL _MDrv_SERFLASH_SetWPInfo(MS_BOOL bWPInfo)
301 {
302 _bWPPullHigh = bWPInfo;
303
304 return TRUE;
305 }
306
307 //------------------------------------------------------------------------------
308 /// Description : HK ask 8051 to select flash chip by call back function
309 /// @param ms_Mcu_ChipSelect_CB \b IN call back function
310 /// @return TRUE : succeed
311 /// @return NULL :
312 //------------------------------------------------------------------------------
_MDrv_SERFLASH_SetMcuCSCallBack(ms_Mcu_ChipSelect_CB ChipSel_cb)313 void _MDrv_SERFLASH_SetMcuCSCallBack(ms_Mcu_ChipSelect_CB ChipSel_cb)
314 {
315 McuChipSelectCB = ChipSel_cb;
316 }
317
_MDrv_SERFLASH_SetFlashWPCallBack(ms_Flash_SetHWWP_CB FlashWP_cb)318 void _MDrv_SERFLASH_SetFlashWPCallBack(ms_Flash_SetHWWP_CB FlashWP_cb)
319 {
320 FlashSetHWWPCB = FlashWP_cb;
321 }
322
323 //-------------------------------------------------------------------------------------------------
324 /// Description : Detect flash type by reading the MID and DID
325 /// @return TRUE : succeed
326 /// @return FALSE : unknown flash type
327 /// @note Not allowed in interrupt context
328 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_DetectType(void)329 MS_BOOL _MDrv_SERFLASH_DetectType(void)
330 {
331 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
332 return HAL_SERFLASH_DetectType();
333 }
334
335 //-------------------------------------------------------------------------------------------------
336 /// Description : Detect flash Size
337 /// @param u32FlashSize \b OUT: u32 ptr to store flash size
338 /// @return TRUE : succeed
339 /// @return FALSE : unknown flash size
340 /// @note Not allowed in interrupt context
341 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_DetectSize(MS_U32 * u32FlashSize)342 MS_BOOL _MDrv_SERFLASH_DetectSize(MS_U32 *u32FlashSize)
343 {
344 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
345 return HAL_SERFLASH_DetectSize(u32FlashSize);
346 }
347
348 //-------------------------------------------------------------------------------------------------
349 /// Description : Enable Flash 2XREAD mode, if support
350 /// @param b2XMode \b IN: ENABLE/DISABLE
351 /// @return TRUE : succeed
352 /// @return FALSE : not succeed
353 /// @note Please ref. sprc. to confirm Flash support or not
354 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_Set2XRead(MS_BOOL b2XMode)355 MS_BOOL _MDrv_SERFLASH_Set2XRead(MS_BOOL b2XMode)
356 {
357 MS_BOOL Ret = FALSE;
358 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
359
360 Ret = HAL_SERFLASH_Set2XREAD(b2XMode);
361 return Ret;
362 }
363
364 //-------------------------------------------------------------------------------------------------
365 /// Description : Set ckg_spi which flash supports (please ref. the spec. before using this function)
366 /// @param SPI_DrvCKG \b IN: enumerate the ckg_spi
367 /// @return TRUE : succeed
368 /// @return FALSE : not succeed
369 /// @note Please ref. sprc. to confirm Flash support or not. It is safty to run at 43M (Default).
370 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_SetCKG(SPI_DrvCKG eCKGspi)371 MS_BOOL _MDrv_SERFLASH_SetCKG(SPI_DrvCKG eCKGspi)
372 {
373 MS_BOOL Ret = FALSE;
374 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
375
376 Ret = HAL_SERFLASH_SetCKG(eCKGspi);
377
378 return Ret;
379 }
380
381 //-------------------------------------------------------------------------------------------------
382 /// Description : Set clock div such that spi clock = mcu clock /clock_div.
383 /// @param SPI_DrvClkDiv \b IN: enumerate the clock_div
384 /// @return TRUE : succeed
385 /// @return FALSE : not succeed
386 /// @note
387 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_ClkDiv(SPI_DrvClkDiv eClkDivspi)388 void _MDrv_SERFLASH_ClkDiv(SPI_DrvClkDiv eClkDivspi)
389 {
390 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
391
392 HAL_SERFLASH_ClkDiv(eClkDivspi);
393
394 }
395
396 //-------------------------------------------------------------------------------------------------
397 /// Description : Set XIU/RIU mode (Default : XIU)
398 /// @param bXiuRiu \b IN: 1 for XIU, 0 for RIU
399 /// @return TRUE : succeed
400 /// @return FALSE : not succeed
401 /// @note XIU mode is faster than RIU mode. It is stable to run by XIU (Default)
402 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_SetMode(MS_BOOL bXiuRiu)403 MS_BOOL _MDrv_SERFLASH_SetMode(MS_BOOL bXiuRiu)
404 {
405 MS_BOOL Ret = FALSE;
406 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
407
408 Ret = HAL_SERFLASH_SetMode(bXiuRiu);
409
410 return Ret;
411 }
412
413 //-------------------------------------------------------------------------------------------------
414 /// Description : Set active flash among multi-spi flashes
415 /// @param u8FlashIndex \b IN: The Flash index, 0 for external #1 spi flash, 1 for external #2 spi flash
416 /// @return TRUE : succeed
417 /// @return FALSE : not succeed
418 /// @note For Secure booting = 0, please check hw_strapping or e-fuse (the board needs to jump)
419 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_ChipSelect(MS_U8 u8FlashIndex)420 MS_BOOL _MDrv_SERFLASH_ChipSelect(MS_U8 u8FlashIndex)
421 {
422 MS_BOOL Ret = FALSE;
423 MS_ASSERT((u8FlashIndex < 4));
424 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
425
426 Ret = HAL_SERFLASH_ChipSelect(u8FlashIndex);
427
428 return Ret;
429 }
430
431 //-------------------------------------------------------------------------------------------------
432 /// Description : Erase all sectors in Serial Flash
433 /// @return TRUE : succeed
434 /// @return FALSE : fail before timeout
435 /// @note Not allowed in interrupt context
436 /// [NONOS_SUPPORT]
437 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_EraseChip(void)438 MS_BOOL _MDrv_SERFLASH_EraseChip(void)
439 {
440 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
441
442 return HAL_SERFLASH_EraseChip();
443
444 }
445
446
447 //-------------------------------------------------------------------------------------------------
448 /// Description : Get flash start block index of a flash address
449 /// @param u32FlashAddr \b IN: flash address
450 /// @param pu32BlockIndex \b IN: poniter to store the returning block index
451 /// @return TRUE : succeed
452 /// @return FALSE : illegal parameters
453 /// @note Not allowed in interrupt context
454 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_AddressToBlock(MS_U32 u32FlashAddr,MS_U32 * pu32BlockIndex)455 MS_BOOL _MDrv_SERFLASH_AddressToBlock(MS_U32 u32FlashAddr, MS_U32 *pu32BlockIndex)
456 {
457 MS_ASSERT(u32FlashAddr < _SERFLASHInfo.u32TotalSize);
458
459 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08X, %p)", __FUNCTION__, (int)u32FlashAddr, pu32BlockIndex));
460
461 return HAL_SERFLASH_AddressToBlock(u32FlashAddr, pu32BlockIndex);
462 }
463
464
465 //-------------------------------------------------------------------------------------------------
466 /// Description : Get flash start address of a block index
467 /// @param u32BlockIndex \b IN: block index
468 /// @param pu32FlashAddr \b IN: pointer to store the returning flash address
469 /// @return TRUE : succeed
470 /// @return FALSE : illegal parameters
471 /// @note Not allowed in interrupt context
472 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_BlockToAddress(MS_U32 u32BlockIndex,MS_U32 * pu32FlashAddr)473 MS_BOOL _MDrv_SERFLASH_BlockToAddress(MS_U32 u32BlockIndex, MS_U32 *pu32FlashAddr)
474 {
475 MS_ASSERT(u32BlockIndex < _SERFLASHInfo.u32SecNum);
476
477 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08X, %p)", __FUNCTION__, (int)u32BlockIndex, pu32FlashAddr));
478
479 return HAL_SERFLASH_BlockToAddress(u32BlockIndex, pu32FlashAddr);
480
481 }
482
483 //-------------------------------------------------------------------------------------------------
484 /// Description : Get Unique ID
485 /// @param None
486 /// @return the SPI Flash's Unique ID
487 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_ReadUID(void)488 MS_U64 _MDrv_SERFLASH_ReadUID(void)
489 {
490 MS_U64 u64Ret = 0;
491
492 u64Ret = HAL_SERFLASH_ReadUID();
493
494 if(u64Ret == 0)
495 {
496 ULOGE(TAG_SERFLASH,"warning: Don't surport Read UID \n");
497 }
498 return u64Ret;
499 }
500
501 //-------------------------------------------------------------------------------------------------
502 /// Description : Erase certain sectors given starting address and size in Serial Flash
503 /// @param u32StartAddr \b IN: start address at block boundry
504 /// @param u32EraseSize \b IN: size to erase
505 /// @param bWait \b IN: wait write done or not
506 /// @return TRUE : succeed
507 /// @return FALSE : fail before timeout or illegal parameters
508 /// @note Not allowed in interrupt context
509 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_AddressErase(MS_U32 u32StartAddr,MS_U32 u32EraseSize,MS_BOOL bWait)510 MS_BOOL _MDrv_SERFLASH_AddressErase(MS_U32 u32StartAddr, MS_U32 u32EraseSize, MS_BOOL bWait)
511 {
512 MS_U32 u32StartBlock = 0;
513 MS_U32 u32EndBlock = 0;
514
515 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08x, 0x%08x, %d)", __FUNCTION__,
516 (unsigned int)u32StartAddr, (unsigned int)u32EraseSize, (int)bWait));
517
518 if ( FALSE == MDrv_SERFLASH_AddressToBlock(u32StartAddr, &u32StartBlock)
519 || FALSE == MDrv_SERFLASH_AddressToBlock(u32StartAddr + u32EraseSize - 1, &u32EndBlock)
520 )
521 {
522 return FALSE;
523 }
524
525 return MDrv_SERFLASH_BlockErase(u32StartBlock, u32EndBlock, bWait);
526 }
527
528
529 //-------------------------------------------------------------------------------------------------
530 /// Description : Erase certain sectors in Serial Flash
531 /// @param u32StartBlock \b IN: start block
532 /// @param u32EndBlock \b IN: end block
533 /// @param bWait \b IN: wait write done or not
534 /// @return TRUE : succeed
535 /// @return FALSE : fail before timeout or illegal parameters
536 /// @note Not allowed in interrupt context
537 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_BlockErase(MS_U32 u32StartBlock,MS_U32 u32EndBlock,MS_BOOL bWait)538 MS_BOOL _MDrv_SERFLASH_BlockErase(MS_U32 u32StartBlock, MS_U32 u32EndBlock, MS_BOOL bWait)
539 {
540 MS_ASSERT( u32StartBlock<=u32EndBlock && u32EndBlock<NUMBER_OF_SERFLASH_SECTORS );
541
542 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08x, 0x%08x, %d)\n", __FUNCTION__, (unsigned int)u32StartBlock, (unsigned int)u32EndBlock, (int)bWait));
543
544 return HAL_SERFLASH_BlockErase(u32StartBlock, u32EndBlock, bWait);
545 }
546
547 //-------------------------------------------------------------------------------------------------
548 /// Description : Erase certain 4K sectors in Serial Flash
549 /// @param u32StartBlock \b IN: start address
550 /// @param u32EndBlock \b IN: end address
551 /// @return TRUE : succeed
552 /// @return FALSE : fail before timeout or illegal parameters
553 /// @note Not allowed in interrupt context
554 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_SectorErase(MS_U32 u32StartAddr,MS_U32 u32EndAddr)555 MS_BOOL _MDrv_SERFLASH_SectorErase(MS_U32 u32StartAddr, MS_U32 u32EndAddr)
556 {
557
558 MS_BOOL bRet = FALSE;
559 MS_U32 u32I = 0;
560 #define DRV_SERFLASH_SECTOR_SIZE 0x1000
561
562 for( u32I = u32StartAddr; u32I < u32EndAddr; )
563 {
564 HAL_SERFLASH_SectorErase(u32I);
565
566 if((u32EndAddr-u32I) <= DRV_SERFLASH_SECTOR_SIZE)
567 {
568 bRet = HAL_SERFLASH_SectorErase(u32EndAddr);
569 }
570
571 u32I+=DRV_SERFLASH_SECTOR_SIZE;
572 }
573 return bRet;
574
575 }
576
577 //-------------------------------------------------------------------------------------------------
578 /// Description : Check write done in Serial Flash
579 /// @return TRUE : done
580 /// @return FALSE : not done
581 /// @note Not allowed in interrupt context
582 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_CheckWriteDone(void)583 MS_BOOL _MDrv_SERFLASH_CheckWriteDone(void)
584 {
585 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
586
587 return HAL_SERFLASH_CheckWriteDone();
588 }
589
590
591 //-------------------------------------------------------------------------------------------------
592 /// Description : Write data to Serial Flash
593 /// @param u32FlashAddr \b IN: start address (4-B aligned)
594 /// @param u32FlashSize \b IN: size in Bytes (4-B aligned)
595 /// @param user_buffer \b IN: Virtual Buffer Address ptr to flash write data
596 /// @return TRUE : succeed
597 /// @return FALSE : fail before timeout or illegal parameters
598 /// @note Not allowed in interrupt context
599 /// [NONOS_SUPPORT]
600 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_Write(MS_U32 u32FlashAddr,MS_U32 u32FlashSize,MS_U8 * user_buffer)601 MS_BOOL _MDrv_SERFLASH_Write(MS_U32 u32FlashAddr, MS_U32 u32FlashSize, MS_U8 *user_buffer)
602 {
603 //MS_U8 *pu8BufAddr = (MS_U8*)MS_PA2KSEG1((MS_U32)pu8Data); // Physical Address to Virtual Address, non-cache.
604 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08X, %d, %p)\n", __FUNCTION__, (unsigned int)u32FlashAddr, (int)u32FlashSize, user_buffer));
605
606 MS_ASSERT( u32FlashAddr + u32FlashSize <= _SERFLASHInfo.u32TotalSize );
607
608 if( user_buffer == NULL )
609 {
610 return 0;
611 }
612 return HAL_SERFLASH_Write(u32FlashAddr, u32FlashSize, user_buffer);
613
614 }
615
616 //-------------------------------------------------------------------------------------------------
617 /// Description : Read data from Serial Flash
618 /// @param u32FlashAddr \b IN: Flash Address
619 /// @param u32FlashSize \b IN: Flash Size Data in Bytes
620 /// @param user_buffer \b OUT: Virtual Buffer Address ptr to store flash read data
621 /// @return TRUE : succeed
622 /// @return FALSE : fail before timeout or illegal parameters
623 /// @note Not allowed in interrupt context
624 /// [NONOS_SUPPORT]
625 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_Read(MS_U32 u32FlashAddr,MS_U32 u32FlashSize,MS_U8 * user_buffer)626 MS_BOOL _MDrv_SERFLASH_Read(MS_U32 u32FlashAddr, MS_U32 u32FlashSize, MS_U8 *user_buffer)
627 {
628 //MS_U8 *pu8BufAddr = (MS_U8*)MS_PA2KSEG0((MS_U32)pu8Data); // Physical Address to Virtual Address, cache.
629
630 MS_ASSERT( u32FlashSize > 0 );
631 MS_ASSERT( u32FlashAddr + u32FlashSize <= _SERFLASHInfo.u32TotalSize );
632
633 if( user_buffer == NULL )
634 {
635 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"USER BUFFER is NULL\n"));
636 return 0;
637 }
638
639 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08X, %d, %p)\n", __FUNCTION__, (unsigned int)u32FlashAddr, (int)u32FlashSize, user_buffer));
640 return HAL_SERFLASH_Read(u32FlashAddr, u32FlashSize, user_buffer);
641 }
642
643 //-------------------------------------------------------------------------------------------------
644 /// Description : Protect blocks in Serial Flash
645 /// @param bEnable \b IN: TRUE/FALSE: enable/disable protection
646 /// @return TRUE : succeed
647 /// @return FALSE : fail before timeout
648 /// @note Not allowed in interrupt context
649 /// @note
650 /// [NONOS_SUPPORT]
651 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_WriteProtect(MS_BOOL bEnable)652 MS_BOOL _MDrv_SERFLASH_WriteProtect(MS_BOOL bEnable)
653 {
654 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%d)\n", __FUNCTION__, (int)bEnable));
655
656
657 if ( _bIBPM == TRUE )
658 {
659 return HAL_SPI_GangBlockLock(bEnable);
660 }
661 else
662 {
663 return HAL_SERFLASH_WriteProtect(bEnable);
664 }
665 }
666
667
668 //-------------------------------------------------------------------------------------------------
669 /// Description : Enables all range of flash write protection
670 /// @return TRUE : succeed
671 /// @return FALSE : fail before timeout
672 /// @note Not allowed in interrupt context
673 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_WriteProtect_Enable_All_Range(void)674 MS_BOOL _MDrv_SERFLASH_WriteProtect_Enable_All_Range(void)
675 {
676 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
677
678 if ( _bIBPM == TRUE )
679 {
680 return HAL_SPI_GangBlockLock(TRUE);
681 }
682 else
683 {
684 return HAL_SERFLASH_WriteProtect_Area(TRUE, 0 << 2);
685 }
686 }
687
688
689 //-------------------------------------------------------------------------------------------------
690 /// Description : Disables all range of flash write protection
691 /// @return TRUE : succeed
692 /// @return FALSE : fail before timeout
693 /// @note Not allowed in interrupt context
694 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_WriteProtect_Disable_All_Range(void)695 MS_BOOL _MDrv_SERFLASH_WriteProtect_Disable_All_Range(void)
696 {
697 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
698
699 if ( _bIBPM == TRUE )
700 {
701 return HAL_SPI_GangBlockLock(FALSE);
702 }
703 else
704 {
705 return MDrv_SERFLASH_WriteProtect_Disable_Range_Set(0, _SERFLASHInfo.u32TotalSize);
706 }
707 }
708
709
710 //-------------------------------------------------------------------------------------------------
711 /// Description : Set flash disable lower bound and size
712 /// @param u32DisableLowerBound \b IN: the lower bound to disable write protect
713 /// @param u32DisableSize \b IN: size to disable write protect
714 /// @return TRUE : succeed
715 /// @return FALSE : fail before timeout or illegal parameters
716 /// @note Not allowed in interrupt context
717 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_WriteProtect_Disable_Range_Set(MS_U32 u32DisableLowerBound,MS_U32 u32DisableSize)718 MS_BOOL _MDrv_SERFLASH_WriteProtect_Disable_Range_Set(MS_U32 u32DisableLowerBound, MS_U32 u32DisableSize)
719 {
720 MS_U32 u32EnableLowerBound;
721 MS_U32 u32EnableUpperBound;
722 MS_U8 u8BlockProtectBit;
723
724 MS_U32 u32DisableUpperBound;
725 MS_U32 u32FlashIndexMax;
726
727 EN_WP_AREA_EXISTED_RTN enWpAreaExistedRtn;
728
729
730 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()", __FUNCTION__));
731
732 _SERFLASHDrvStatus.bIsBusy = TRUE;
733
734 u32DisableUpperBound = u32DisableLowerBound + u32DisableSize - 1;
735 u32FlashIndexMax = _SERFLASHInfo.u32TotalSize - 1;
736
737
738 if ( u32DisableLowerBound > u32FlashIndexMax
739 || u32DisableUpperBound > u32FlashIndexMax
740 || u32DisableLowerBound > u32DisableUpperBound
741 )
742 {
743 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_INFO, ULOGD(TAG_SERFLASH," = FALSE, u32DisableLowerBound(0x%08X), u32DisableUpperBound(0x%08X), u32FlashIndexMax(0x%08X)\n", (int)u32DisableLowerBound, (int)u32DisableUpperBound, (int)u32FlashIndexMax));
744
745 return FALSE;
746 }
747
748
749 // Step 1. decide u32DisableUpperBound // TODO: review, prefer to unprotect the end of the flash
750 if ( u32DisableUpperBound != u32FlashIndexMax
751 && u32DisableLowerBound != 0
752 )
753 {
754 u32DisableUpperBound = u32FlashIndexMax;
755 }
756
757
758 // Step 2. decide u32EnableLowerBound & u32EnableUpperBound
759 if ( (u32DisableUpperBound > (u32FlashIndexMax - _SERFLASHInfo.u32SecSize))
760 && (u32DisableLowerBound == 0)
761 )
762 {
763 // i.e. no protect
764 u32EnableLowerBound = 0xFFFFFFFF;
765 u32EnableUpperBound = 0xFFFFFFFF;
766 }
767 else if (u32DisableLowerBound == 0)
768 {
769 u32EnableUpperBound = u32FlashIndexMax;
770 u32EnableLowerBound = u32DisableUpperBound + 1;
771 }
772 else // i.e. (u32DisableUpperBound == u32FlashIndexMax) because of Step 1
773 {
774 u32EnableUpperBound = u32DisableLowerBound - 1;
775 u32EnableLowerBound = 0;
776 }
777
778
779 // Step 3. get u8BlockProtectBit
780 enWpAreaExistedRtn = HAL_SERFLASH_WP_Area_Existed(u32EnableUpperBound, u32EnableLowerBound, &u8BlockProtectBit);
781
782 switch (enWpAreaExistedRtn)
783 {
784 case WP_AREA_NOT_AVAILABLE:
785 case WP_TABLE_NOT_SUPPORT:
786 u8BlockProtectBit = 0;
787 break;
788
789 default:
790 /* DO NOTHING */
791 break;
792 }
793
794 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"\n"));
795
796 return HAL_SERFLASH_WriteProtect_Area(FALSE, u8BlockProtectBit);
797 }
798
799
800 //-------------------------------------------------------------------------------------------------
801 /// Description : Protect blocks in Serial Flash
802 /// @param bEnableAllArea \b IN: enable or disable protection
803 /// @param u8BlockProtectBits \b IN: block protection bits which stand for the area to enable write protect
804 /// @return TRUE : succeed
805 /// @return FALSE : fail before timeout
806 /// @note Not allowed in interrupt context
807 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_WriteProtect_Area(MS_BOOL bEnableAllArea,MS_U8 u8BlockProtectBits)808 MS_BOOL _MDrv_SERFLASH_WriteProtect_Area(MS_BOOL bEnableAllArea, MS_U8 u8BlockProtectBits)
809 {
810
811 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%d, 0x%02X)\n", __FUNCTION__, (int)bEnableAllArea, u8BlockProtectBits));
812 return HAL_SERFLASH_WriteProtect_Area(bEnableAllArea, u8BlockProtectBits);
813 }
814
815
816 //-------------------------------------------------------------------------------------------------
817 /// Description : Read ID from Serial Flash
818 /// @param pu8FlashID \b OUT: Virtual data ptr to store the read ID
819 /// @param u32IDSize \b IN: size in Bytes
820 /// @return TRUE : succeed
821 /// @return FALSE : fail before timeout
822 /// @note Not allowed in interrupt context
823 /// @note
824 /// [NONOS_SUPPORT]
825 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_ReadID(MS_U8 * pu8FlashID,MS_U32 u32IDSize)826 MS_BOOL _MDrv_SERFLASH_ReadID(MS_U8 *pu8FlashID, MS_U32 u32IDSize)
827 {
828 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%p, %d)\n", __FUNCTION__, pu8FlashID, (int)u32IDSize));
829 return HAL_SERFLASH_ReadID(pu8FlashID, u32IDSize);
830 }
831
832
833 //-------------------------------------------------------------------------------------------------
834 /// Description : Read data from Serial Flash to DRAM in DMA mode
835 /// @param u32FlashStart \b IN: src start address in flash (0 ~ flash size-1)
836 /// @param u32DRAMStart \b IN: dst start address in DRAM (16B-aligned) (0 ~ DRAM size-1)
837 /// @param u32Size \b IN: size in Bytes (8B-aligned) (>=8)
838 /// @return TRUE : succeed
839 /// @return FALSE : fail before timeout or illegal parameters
840 /// @note Not allowed in interrupt context
841 /// @note
842 /// [NONOS_SUPPORT]
843 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_DMA(MS_U32 u32FlashStart,MS_U32 u32DRAMStart,MS_U32 u32Size)844 MS_BOOL _MDrv_SERFLASH_DMA(MS_U32 u32FlashStart, MS_U32 u32DRAMStart, MS_U32 u32Size)
845 {
846 MS_ASSERT( u32FlashStart+u32Size <= _SERFLASHInfo.u32TotalSize);
847 MS_ASSERT( u32DRAMStart%8 ==0 );
848 MS_ASSERT( u32Size%8 ==0 );
849 MS_ASSERT( u32Size>=8 );
850
851 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
852 return HAL_SERFLASH_DMA(u32FlashStart, u32DRAMStart, u32Size);
853 }
854
855
856 //------- ------------------------------------------------------------------------------------------
857 /// Description : Read Status Register in Serial Flash
858 /// @param pu8StatusReg \b OUT: ptr to Status Register value
859 /// @return TRUE : succeed
860 /// @return FALSE : fail before timeout
861 /// @note Not allowed in interrupt context
862 /// @note
863 /// [NONOS_SUPPORT]
864 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_ReadStatusRegister(MS_U8 * pu8StatusReg)865 MS_BOOL _MDrv_SERFLASH_ReadStatusRegister(MS_U8 *pu8StatusReg)
866 {
867 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
868
869 return HAL_SERFLASH_ReadStatusReg(pu8StatusReg);
870 }
871
872 //------- ------------------------------------------------------------------------------------------
873 /// Description : Read Status Register2 in Serial Flash
874 /// @param pu8StatusReg \b OUT: ptr to Status Register value
875 /// @return TRUE : succeed
876 /// @return FALSE : fail before timeout
877 /// @note Not allowed in interrupt context
878 /// @note For Specific Flash IC with 16-bit status register (high-byte)
879 /// [NONOS_SUPPORT]
880 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_ReadStatusRegister2(MS_U8 * pu8StatusReg)881 MS_BOOL _MDrv_SERFLASH_ReadStatusRegister2(MS_U8 *pu8StatusReg)
882 {
883 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
884
885 return HAL_SERFLASH_ReadStatusReg2(pu8StatusReg);
886 }
887
888 //------- ------------------------------------------------------------------------------------------
889 /// Description : Write Status Register in Serial Flash
890 /// @param u16StatusReg \b IN: Status Register value
891 /// @return TRUE : succeed
892 /// @return FALSE : fail before timeout
893 /// @note Not allowed in interrupt context
894 /// @note For Specific Flash IC with 16-bit status register
895 /// [NONOS_SUPPORT]
896 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_WriteStatusRegister(MS_U16 u16StatusReg)897 MS_BOOL _MDrv_SERFLASH_WriteStatusRegister(MS_U16 u16StatusReg)
898 {
899 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
900
901 return HAL_SERFLASH_WriteStatusReg(u16StatusReg);
902 }
903
904 //------- ------------------------------------------------------------------------------------------
905 /// Description : Handle for BDMA copy data from ONLY Flash src to other dst
906 /// @param u32FlashAddr \b IN: Physical Source address in spi flash
907 /// @param u32DramAddr \b IN: Physical Dst address
908 /// @param u32Len \b IN: data length
909 /// @param eDstDev \b IN: The Dst Device of Flash BDMA
910 /// @param u8OpCfg \b IN: u8OpCfg: default is SPIDMA_OPCFG_DEF
911 /// - Bit0: inverse mode --> SPIDMA_OPCFG_INV_COPY
912 /// - Bit2: Copy & CRC check in wait mode --> SPIDMA_OPCFG_CRC_COPY
913 /// - Bit3: Copy without waiting --> SPIDMA_OPCFG_NOWAIT_COPY
914 /// @return \b MS_BOOL
915 /// [NONOS_SUPPORT]
916 /// [fw : drvBDMA ]
917 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_CopyHnd(MS_PHYADDR u32FlashAddr,MS_PHYADDR u32DstAddr,MS_U32 u32Len,SPIDMA_Dev eDstDev,MS_U8 u8OpCfg)918 MS_BOOL _MDrv_SERFLASH_CopyHnd(MS_PHYADDR u32FlashAddr,
919 MS_PHYADDR u32DstAddr,
920 MS_U32 u32Len,
921 SPIDMA_Dev eDstDev,
922 MS_U8 u8OpCfg)
923 {
924
925 #define BDMA_DEV_FLASH 5
926 MS_U16 CpyType = ((BDMA_DEV_FLASH & 0x0F) | _LShift((eDstDev &0x0F), 8));
927 MS_U32 u32Delay = FLASH_WAIT_TIME;
928
929 while (!HAL_SERFLASH_CheckWriteDone())
930 {
931 if (FLASH_IS_TIMEOUT(u32Delay))
932 {
933 ULOGE(TAG_SERFLASH,"%s() : DMA flash is busy!\n",__FUNCTION__);
934 return FALSE;
935 }
936 u32Delay--;
937 }
938
939 return MDrv_BDMA_CopyHnd(u32FlashAddr, u32DstAddr, u32Len, (BDMA_CpyType) CpyType, u8OpCfg);
940 }
941
942 //------- ------------------------------------------------------------------------------------------
943 /// Description : Switch SPI as GPIO Input
944 /// @param bSwitch \b IN: 1 for GPIO, 0 for NORMAL
945 /// @note Not allowed in interrupt context
946 /// @note For project's power consumption
947 /// [NONOS_SUPPORT]
948 //-------------------------------------------------------------------------------------------------
_MDrv_SERFLASH_SetGPIO(MS_BOOL bSwitch)949 void _MDrv_SERFLASH_SetGPIO(MS_BOOL bSwitch)
950 {
951 HAL_SERFLASH_SetGPIO(bSwitch);
952 }
953 #endif
954
955 //------------------------------------------------------------------------------
956 /// Description : Set detailed level of Parallel Flash driver debug message
957 /// @param u8DbgLevel \b IN debug level for Serial Flash driver
958 /// @return TRUE : succeed
959 /// @return FALSE : failed to set the debug level
960 //------------------------------------------------------------------------------
MDrv_SERFLASH_SetDbgLevel(MS_U8 u8DbgLevel)961 MS_BOOL MDrv_SERFLASH_SetDbgLevel(MS_U8 u8DbgLevel)
962 {
963 #if (SERFLASH_UTOPIA20)
964 {
965 PSERFLASH_SETDBGLEVEL pSetDbgLevelParam = NULL;
966 if (NULL == pInstantSerFlash)
967 return FALSE;
968 pSetDbgLevelParam = (PSERFLASH_SETDBGLEVEL)malloc(sizeof(SERFLASH_SETDBGLEVEL));
969 if (NULL == pSetDbgLevelParam)
970 return FALSE;
971 pSetDbgLevelParam->u8DbgLevel = u8DbgLevel;
972 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_SetDbgLevel,(void*)pSetDbgLevelParam) != UTOPIA_STATUS_SUCCESS)
973 {
974 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_SetDbgLevel fail\n");
975 return FALSE;
976 }
977 return TRUE;
978 }
979 #else
980 _u8SERFLASHDbgLevel = u8DbgLevel;
981
982 return TRUE;
983 #endif
984 }
985
986 //------------------------------------------------------------------------------
987 /// Description : Set WP pin info to driver
988 /// @param bWPInfo
989 /// @return TRUE : succeed
990 /// @return FALSE : failed to set the WP pin info
991 //------------------------------------------------------------------------------
MDrv_SERFLASH_SetWPInfo(MS_BOOL bWPInfo)992 MS_BOOL MDrv_SERFLASH_SetWPInfo(MS_BOOL bWPInfo)
993 {
994 #if (SERFLASH_UTOPIA20)
995 {
996 PSERFLASH_SETWPINFO pSetWPInfoParam = NULL;
997 if (NULL == pInstantSerFlash)
998 return FALSE;
999 pSetWPInfoParam = (PSERFLASH_SETWPINFO)malloc(sizeof(SERFLASH_SETWPINFO));
1000 if (NULL == pSetWPInfoParam)
1001 return FALSE;
1002 pSetWPInfoParam->bWPInfo = bWPInfo;
1003 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_SetWPInfo,(void*)pSetWPInfoParam) != UTOPIA_STATUS_SUCCESS)
1004 {
1005 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_SetWPInfo fail\n");
1006 return FALSE;
1007 }
1008 return TRUE;
1009 }
1010 #else
1011 _bWPPullHigh = bWPInfo;
1012
1013 return TRUE;
1014 #endif
1015 }
1016
1017 //------------------------------------------------------------------------------
1018 /// Description : HK ask 8051 to select flash chip by call back function
1019 /// @param ms_Mcu_ChipSelect_CB \b IN call back function
1020 /// @return TRUE : succeed
1021 /// @return NULL :
1022 //------------------------------------------------------------------------------
MDrv_SERFLASH_SetMcuCSCallBack(ms_Mcu_ChipSelect_CB ChipSel_cb)1023 void MDrv_SERFLASH_SetMcuCSCallBack(ms_Mcu_ChipSelect_CB ChipSel_cb)
1024 {
1025 #if (SERFLASH_UTOPIA20)
1026 {
1027 PSERFLASH_SETMCUCSCB pSetMcuCSCBParam = NULL;
1028 if (NULL == pInstantSerFlash)
1029 return;
1030 pSetMcuCSCBParam = (PSERFLASH_SETMCUCSCB)malloc(sizeof(SERFLASH_SETMCUCSCB));
1031 if (NULL == pSetMcuCSCBParam)
1032 return;
1033 pSetMcuCSCBParam->ChipSel_cb = ChipSel_cb;
1034 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_SetMcuCSCallBack,(void*)pSetMcuCSCBParam) != UTOPIA_STATUS_SUCCESS)
1035 {
1036 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_SetMcuCSCallBack fail\n");
1037 return;
1038 }
1039 return;
1040 }
1041 #else
1042
1043 McuChipSelectCB = ChipSel_cb;
1044 #endif
1045 }
1046
MDrv_SERFLASH_SetFlashWPCallBack(ms_Flash_SetHWWP_CB FlashWP_cb)1047 void MDrv_SERFLASH_SetFlashWPCallBack(ms_Flash_SetHWWP_CB FlashWP_cb)
1048 {
1049 #if (SERFLASH_UTOPIA20)
1050 {
1051 PSERFLASH_SETFLASHWPCB pSetFlashWPCBParam = NULL;
1052 if (NULL == pInstantSerFlash)
1053 return;
1054 pSetFlashWPCBParam = (PSERFLASH_SETFLASHWPCB)malloc(sizeof(SERFLASH_SETFLASHWPCB));
1055 if (NULL == pSetFlashWPCBParam)
1056 return;
1057 pSetFlashWPCBParam->FlashWP_cb = FlashWP_cb;
1058 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_SetFlashWPCallBack,(void*)pSetFlashWPCBParam) != UTOPIA_STATUS_SUCCESS)
1059 {
1060 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_SetFlashWPCallBack fail\n");
1061 return;
1062 }
1063 return;
1064 }
1065 #else
1066
1067 FlashSetHWWPCB = FlashWP_cb;
1068 #endif
1069 }
1070
1071 //-------------------------------------------------------------------------------------------------
1072 /// Description : Detect flash type by reading the MID and DID
1073 /// @return TRUE : succeed
1074 /// @return FALSE : unknown flash type
1075 /// @note Not allowed in interrupt context
1076 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_DetectType(void)1077 MS_BOOL MDrv_SERFLASH_DetectType(void)
1078 {
1079 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1080 #if (SERFLASH_UTOPIA20)
1081 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_DetectType,(void*)NULL) != UTOPIA_STATUS_SUCCESS)
1082 {
1083 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_DetectType fail\n");
1084 return FALSE;
1085 }
1086 return TRUE;
1087 #else
1088 return HAL_SERFLASH_DetectType();
1089 #endif
1090 }
1091
1092 //-------------------------------------------------------------------------------------------------
1093 /// Description : Detect flash Size
1094 /// @param u32FlashSize \b OUT: u32 ptr to store flash size
1095 /// @return TRUE : succeed
1096 /// @return FALSE : unknown flash size
1097 /// @note Not allowed in interrupt context
1098 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_DetectSize(MS_U32 * u32FlashSize)1099 MS_BOOL MDrv_SERFLASH_DetectSize(MS_U32 *u32FlashSize)
1100 {
1101 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1102 #if (SERFLASH_UTOPIA20)
1103 {
1104 PSERFLASH_DETECTSIZE pDetectSizeParam = NULL;
1105 if (NULL == pInstantSerFlash)
1106 return FALSE;
1107 pDetectSizeParam = (PSERFLASH_DETECTSIZE)malloc(sizeof(SERFLASH_DETECTSIZE));
1108 if (NULL == pDetectSizeParam)
1109 return FALSE;
1110 pDetectSizeParam->u32FlashSize = u32FlashSize;
1111 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_DetectSize,(void*)pDetectSizeParam) != UTOPIA_STATUS_SUCCESS)
1112 {
1113 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_DetectSize fail\n");
1114 return FALSE;
1115 }
1116 return TRUE;
1117 }
1118 #else
1119 return HAL_SERFLASH_DetectSize(u32FlashSize);
1120 #endif
1121 }
1122
1123 //-------------------------------------------------------------------------------------------------
1124 /// Description : Enable Flash 2XREAD mode, if support
1125 /// @param b2XMode \b IN: ENABLE/DISABLE
1126 /// @return TRUE : succeed
1127 /// @return FALSE : not succeed
1128 /// @note Please ref. sprc. to confirm Flash support or not
1129 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_Set2XRead(MS_BOOL b2XMode)1130 MS_BOOL MDrv_SERFLASH_Set2XRead(MS_BOOL b2XMode)
1131 {
1132 #if (SERFLASH_UTOPIA20)
1133 {
1134 PSERFLASH_SET2XREAD p2xModeParam = NULL;
1135 if (NULL == pInstantSerFlash)
1136 return FALSE;
1137 p2xModeParam = (PSERFLASH_SET2XREAD)malloc(sizeof(SERFLASH_SET2XREAD));
1138 if (NULL == p2xModeParam)
1139 return FALSE;
1140 p2xModeParam->b2XMode = b2XMode;
1141 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_Set2XRead,(void*)p2xModeParam) != UTOPIA_STATUS_SUCCESS)
1142 {
1143 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_Set2XRead fail\n");
1144 return FALSE;
1145 }
1146 return TRUE;
1147 }
1148 #else
1149 MS_BOOL Ret = FALSE;
1150 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1151
1152 Ret = HAL_SERFLASH_Set2XREAD(b2XMode);
1153 return Ret;
1154 #endif
1155 }
1156
1157 //-------------------------------------------------------------------------------------------------
1158 /// Description : Set ckg_spi which flash supports (please ref. the spec. before using this function)
1159 /// @param SPI_DrvCKG \b IN: enumerate the ckg_spi
1160 /// @return TRUE : succeed
1161 /// @return FALSE : not succeed
1162 /// @note Please ref. sprc. to confirm Flash support or not. It is safty to run at 43M (Default).
1163 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_SetCKG(SPI_DrvCKG eCKGspi)1164 MS_BOOL MDrv_SERFLASH_SetCKG(SPI_DrvCKG eCKGspi)
1165 {
1166 #if (SERFLASH_UTOPIA20)
1167 {
1168 PSERFLASH_SETCKG pSETCKGParam = NULL;
1169 if (NULL == pInstantSerFlash)
1170 return FALSE;
1171 pSETCKGParam = (PSERFLASH_SETCKG)malloc(sizeof(SERFLASH_SETCKG));
1172 if (NULL == pSETCKGParam)
1173 return FALSE;
1174 pSETCKGParam->eCKGspi = eCKGspi;
1175 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_SetCKG,(void*)pSETCKGParam) != UTOPIA_STATUS_SUCCESS)
1176 {
1177 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_SetCKG fail\n");
1178 return FALSE;
1179 }
1180 return TRUE;
1181 }
1182 #else
1183 MS_BOOL Ret = FALSE;
1184 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1185
1186 Ret = HAL_SERFLASH_SetCKG(eCKGspi);
1187 return Ret;
1188 #endif
1189 }
1190
1191 //-------------------------------------------------------------------------------------------------
1192 /// Description : Set clock div such that spi clock = mcu clock /clock_div.
1193 /// @param SPI_DrvClkDiv \b IN: enumerate the clock_div
1194 /// @return TRUE : succeed
1195 /// @return FALSE : not succeed
1196 /// @note
1197 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_ClkDiv(SPI_DrvClkDiv eClkDivspi)1198 void MDrv_SERFLASH_ClkDiv(SPI_DrvClkDiv eClkDivspi)
1199 {
1200 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1201 #if (SERFLASH_UTOPIA20)
1202 {
1203 PSERFLASH_CLKDIV pCLKDIVParam = NULL;
1204 if (NULL == pInstantSerFlash)
1205 return;
1206 pCLKDIVParam = (PSERFLASH_CLKDIV)malloc(sizeof(SERFLASH_CLKDIV));
1207 if (NULL == pCLKDIVParam)
1208 return;
1209 pCLKDIVParam->eClkDivspi = eClkDivspi;
1210 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_ClkDiv,(void*)pCLKDIVParam) != UTOPIA_STATUS_SUCCESS)
1211 {
1212 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_ClkDiv fail\n");
1213 return;
1214 }
1215 return;
1216 }
1217 #else
1218 HAL_SERFLASH_ClkDiv(eClkDivspi);
1219 #endif
1220 }
1221
1222 //-------------------------------------------------------------------------------------------------
1223 /// Description : Set XIU/RIU mode (Default : XIU)
1224 /// @param bXiuRiu \b IN: 1 for XIU, 0 for RIU
1225 /// @return TRUE : succeed
1226 /// @return FALSE : not succeed
1227 /// @note XIU mode is faster than RIU mode. It is stable to run by XIU (Default)
1228 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_SetMode(MS_BOOL bXiuRiu)1229 MS_BOOL MDrv_SERFLASH_SetMode(MS_BOOL bXiuRiu)
1230 {
1231 #if (SERFLASH_UTOPIA20)
1232 {
1233 PSERFLASH_SETMODE pSETMODEParam = NULL;
1234 if (NULL == pInstantSerFlash)
1235 return FALSE;
1236 pSETMODEParam = (PSERFLASH_SETMODE)malloc(sizeof(SERFLASH_SETMODE));
1237 if (NULL == pSETMODEParam)
1238 return FALSE;
1239 pSETMODEParam->bXiuRiu = bXiuRiu;
1240 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_SetMode,(void*)pSETMODEParam) != UTOPIA_STATUS_SUCCESS)
1241 {
1242 ULOGD(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_SetMode fail\n");
1243 return FALSE;
1244 }
1245 return TRUE;
1246 }
1247 #else
1248 MS_BOOL Ret = FALSE;
1249 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1250
1251 Ret = HAL_SERFLASH_SetMode(bXiuRiu);
1252 return Ret;
1253 #endif
1254 }
1255
1256 //-------------------------------------------------------------------------------------------------
1257 /// Description : Set active flash among multi-spi flashes
1258 /// @param u8FlashIndex \b IN: The Flash index, 0 for external #1 spi flash, 1 for external #2 spi flash
1259 /// @return TRUE : succeed
1260 /// @return FALSE : not succeed
1261 /// @note For Secure booting = 0, please check hw_strapping or e-fuse (the board needs to jump)
1262 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_ChipSelect(MS_U8 u8FlashIndex)1263 MS_BOOL MDrv_SERFLASH_ChipSelect(MS_U8 u8FlashIndex)
1264 {
1265 #if (SERFLASH_UTOPIA20)
1266 {
1267 PSERFLASH_CHIPSELECT pCHIPSELECTParam = NULL;
1268 if (NULL == pInstantSerFlash)
1269 return FALSE;
1270 pCHIPSELECTParam = (PSERFLASH_CHIPSELECT)malloc(sizeof(SERFLASH_CHIPSELECT));
1271 if (NULL == pCHIPSELECTParam)
1272 return FALSE;
1273 pCHIPSELECTParam->u8FlashIndex = u8FlashIndex;
1274 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_ChipSelect,(void*)pCHIPSELECTParam) != UTOPIA_STATUS_SUCCESS)
1275 {
1276 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_ChipSelect fail\n");
1277 return FALSE;
1278 }
1279 return TRUE;
1280 }
1281 #else
1282 MS_BOOL Ret = FALSE;
1283 MS_ASSERT((u8FlashIndex < 4));
1284 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1285
1286 Ret = HAL_SERFLASH_ChipSelect(u8FlashIndex);
1287 return Ret;
1288 #endif
1289 }
1290
1291 //-------------------------------------------------------------------------------------------------
1292 /// Description : Initialize Serial Flash
1293 /// @return None
1294 /// @note
1295 /// [NONOS_SUPPORT]
1296 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_Init(void)1297 void MDrv_SERFLASH_Init(void)
1298 {
1299 _u8SERFLASHDbgLevel = E_SERFLASH_DBGLV_INFO; // init debug level first //SERFLASH_DBGLV_DEBUG
1300
1301 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1302
1303 //
1304 // 1. HAL init
1305 //
1306 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
1307 {
1308 MS_VIRT VirtPMBank;
1309 MS_PHY u32PMBankSize;
1310 MS_VIRT VirtNonPMBank;
1311 MS_PHY u32NonPMBankSize;
1312 MS_VIRT VirtFlashBank0;
1313 MS_PHY u32FlashBank0Size;
1314
1315 if (!MDrv_MMIO_GetBASE( &VirtPMBank, &u32PMBankSize, MS_MODULE_ISP))
1316 {
1317 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_ERR, ULOGE(TAG_SERFLASH,"IOMap failure to get DRV_MMIO_PM_BANK\n"));
1318 }
1319
1320 if (!MDrv_MMIO_GetBASE( &VirtNonPMBank, &u32NonPMBankSize, MS_MODULE_MHEG5))
1321 {
1322 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_ERR, ULOGE(TAG_SERFLASH,"IOMap failure to get DRV_MMIO_NONPM_BANK\n"));
1323 }
1324
1325 if (!MDrv_MMIO_GetBASE( &VirtFlashBank0, &u32FlashBank0Size, MS_MODULE_FLASH))
1326 {
1327 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_ERR, ULOGE(TAG_SERFLASH,"IOMap failure to get DRV_MMIO_NONPM_BANK\n"));
1328 }
1329 #if (SERFLASH_UTOPIA20)
1330 if(UtopiaOpen(MODULE_FLASH, &pInstantSerFlash, 0, pAttributeSerFlash) != UTOPIA_STATUS_SUCCESS)
1331 {
1332 ULOGE(TAG_SERFLASH,"Open SERFLASH fail\n");
1333 return;
1334 }
1335 #endif
1336
1337 HAL_SERFLASH_Config(VirtPMBank, VirtNonPMBank, VirtFlashBank0);
1338
1339 HAL_SERFLASH_Init();
1340
1341 HAL_SERFLASH_DetectType();
1342
1343 //
1344 // 2. init SERFLASH_Info
1345 //
1346 _SERFLASHInfo.u32AccessWidth = 1;
1347 _SERFLASHInfo.u32SecNum = NUMBER_OF_SERFLASH_SECTORS;
1348 _SERFLASHInfo.u32SecSize = SERFLASH_SECTOR_SIZE;
1349
1350 if (_hal_SERFLASH.pSpecialBlocks == NULL)
1351 {
1352 _SERFLASHInfo.u32TotalSize = (NUMBER_OF_SERFLASH_SECTORS * SERFLASH_SECTOR_SIZE);
1353 }
1354 else
1355 {
1356 HAL_SERFLASH_DetectSize(&_SERFLASHInfo.u32TotalSize);
1357 }
1358
1359 //
1360 // 3. init other data structure of Serial Flash driver
1361 //
1362 _SERFLASHDrvStatus.bIsBusy = FALSE;
1363 }
1364 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
1365 {
1366 #if defined(MSOS_TYPE_LINUX)
1367 int fd = -1;
1368 fd = open(SPI_FW_NAME, O_RDWR|O_EXCL);
1369 if (fd == -1)
1370 {
1371 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("Cannot open fw descriptor"));
1372 perror("");
1373 return;
1374 }
1375 else
1376 {
1377 if(-1 == ioctl(fd, IOCTL_SYS_SPI_INIT))
1378 {
1379 printf("%s ioctl fail\n",__FUNCTION__);
1380
1381 }
1382 }
1383 close(fd);
1384 #endif
1385 }
1386 }
1387
1388
1389 //-------------------------------------------------------------------------------------------------
1390 /// Description : Erase all sectors in Serial Flash
1391 /// @return TRUE : succeed
1392 /// @return FALSE : fail before timeout
1393 /// @note Not allowed in interrupt context
1394 /// [NONOS_SUPPORT]
1395 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_EraseChip(void)1396 MS_BOOL MDrv_SERFLASH_EraseChip(void)
1397 {
1398 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1399 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
1400 {
1401 #if (SERFLASH_UTOPIA20)
1402 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_EraseChip,(void*)NULL) != UTOPIA_STATUS_SUCCESS)
1403 {
1404 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_ChipSelect fail\n");
1405 return FALSE;
1406 }
1407 return TRUE;
1408 #else
1409 return HAL_SERFLASH_EraseChip();
1410 #endif
1411 }
1412 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
1413 {
1414 #if defined(MSOS_TYPE_LINUX)
1415 int fd = -1;
1416
1417 fd = open(SPI_FW_NAME, O_RDWR|O_EXCL);
1418
1419 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, printf("%s()\n", __FUNCTION__));
1420 if(fd == -1)
1421 {
1422 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("Cannot open fw descriptor"));
1423 return FALSE;
1424 }
1425 else
1426 {
1427 if(-1 == ioctl(fd, IOCTL_SYS_SPI_ERASE_ALL))
1428 {
1429 close(fd);
1430 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("%s ioctl fail\n",__FUNCTION__));
1431 return FALSE;
1432 }
1433 }
1434 close(fd);
1435 #endif
1436 }
1437 return TRUE;
1438 }
1439
1440
1441 //-------------------------------------------------------------------------------------------------
1442 /// Description : Get flash start block index of a flash address
1443 /// @param u32FlashAddr \b IN: flash address
1444 /// @param pu32BlockIndex \b IN: poniter to store the returning block index
1445 /// @return TRUE : succeed
1446 /// @return FALSE : illegal parameters
1447 /// @note Not allowed in interrupt context
1448 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_AddressToBlock(MS_U32 u32FlashAddr,MS_U32 * pu32BlockIndex)1449 MS_BOOL MDrv_SERFLASH_AddressToBlock(MS_U32 u32FlashAddr, MS_U32 *pu32BlockIndex)
1450 {
1451 MS_ASSERT(u32FlashAddr < _SERFLASHInfo.u32TotalSize);
1452
1453 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08X, %p)", __FUNCTION__, (int)u32FlashAddr, pu32BlockIndex));
1454 #if (SERFLASH_UTOPIA20)
1455 {
1456 PSERFLASH_ADDRTOBLK pADDRTOBLKParam = NULL;
1457 if (NULL == pInstantSerFlash)
1458 return FALSE;
1459 pADDRTOBLKParam = (PSERFLASH_ADDRTOBLK)malloc(sizeof(SERFLASH_ADDRTOBLK));
1460 if (NULL == pADDRTOBLKParam)
1461 return FALSE;
1462 pADDRTOBLKParam->u32FlashAddr = u32FlashAddr;
1463 pADDRTOBLKParam->pu32BlockIndex = pu32BlockIndex;
1464 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_AddressToBlock,(void*)pADDRTOBLKParam) != UTOPIA_STATUS_SUCCESS)
1465 {
1466 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_AddressToBlock fail\n");
1467 return FALSE;
1468 }
1469 return TRUE;
1470 }
1471 #else
1472 return HAL_SERFLASH_AddressToBlock(u32FlashAddr, pu32BlockIndex);
1473 #endif
1474 }
1475
1476
1477 //-------------------------------------------------------------------------------------------------
1478 /// Description : Get flash start address of a block index
1479 /// @param u32BlockIndex \b IN: block index
1480 /// @param pu32FlashAddr \b IN: pointer to store the returning flash address
1481 /// @return TRUE : succeed
1482 /// @return FALSE : illegal parameters
1483 /// @note Not allowed in interrupt context
1484 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_BlockToAddress(MS_U32 u32BlockIndex,MS_U32 * pu32FlashAddr)1485 MS_BOOL MDrv_SERFLASH_BlockToAddress(MS_U32 u32BlockIndex, MS_U32 *pu32FlashAddr)
1486 {
1487 MS_ASSERT(u32BlockIndex < _SERFLASHInfo.u32SecNum);
1488
1489 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08X, %p)", __FUNCTION__, (int)u32BlockIndex, pu32FlashAddr));
1490 #if (SERFLASH_UTOPIA20)
1491 {
1492 PSERFLASH_BLKTOADDR pBLKTOADDRParam = NULL;
1493 if (NULL == pInstantSerFlash)
1494 return FALSE;
1495 pBLKTOADDRParam = (PSERFLASH_BLKTOADDR)malloc(sizeof(SERFLASH_BLKTOADDR));
1496 if (NULL == pBLKTOADDRParam)
1497 return FALSE;
1498 pBLKTOADDRParam->u32BlockIndex = u32BlockIndex;
1499 pBLKTOADDRParam->pu32FlashAddr = pu32FlashAddr;
1500 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_BlockToAddress,(void*)pBLKTOADDRParam) != UTOPIA_STATUS_SUCCESS)
1501 {
1502 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_BlockToAddress fail\n");
1503 return FALSE;
1504 }
1505 return TRUE;
1506 }
1507 #else
1508 return HAL_SERFLASH_BlockToAddress(u32BlockIndex, pu32FlashAddr);
1509 #endif
1510 }
1511
1512 //-------------------------------------------------------------------------------------------------
1513 /// Description : Get Unique ID
1514 /// @param None
1515 /// @return the SPI Flash's Unique ID
1516 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_ReadUID(void)1517 MS_U64 MDrv_SERFLASH_ReadUID(void)
1518 {
1519 MS_U64 u64Ret = 0;
1520 #if (SERFLASH_UTOPIA20)
1521 if (NULL == pInstantSerFlash)
1522 return FALSE;
1523 u64Ret = UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_ReadUID,(void*)NULL);
1524 #else
1525 u64Ret = HAL_SERFLASH_ReadUID();
1526 #endif
1527 if(u64Ret == 0)
1528 {
1529 ULOGE(TAG_SERFLASH,"warning: Don't surport Read UID \n");
1530 }
1531 return u64Ret;
1532 }
1533
1534 //-------------------------------------------------------------------------------------------------
1535 /// Description : Erase certain sectors given starting address and size in Serial Flash
1536 /// @param u32StartAddr \b IN: start address at block boundry
1537 /// @param u32EraseSize \b IN: size to erase
1538 /// @param bWait \b IN: wait write done or not
1539 /// @return TRUE : succeed
1540 /// @return FALSE : fail before timeout or illegal parameters
1541 /// @note Not allowed in interrupt context
1542 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_AddressErase(MS_U32 u32StartAddr,MS_U32 u32EraseSize,MS_BOOL bWait)1543 MS_BOOL MDrv_SERFLASH_AddressErase(MS_U32 u32StartAddr, MS_U32 u32EraseSize, MS_BOOL bWait)
1544 {
1545 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
1546 {
1547 #if (SERFLASH_UTOPIA20)
1548 {
1549 PSERFLASH_ADDRERASE pADDRERASEParam = NULL;
1550 if (NULL == pInstantSerFlash)
1551 return FALSE;
1552 pADDRERASEParam = (PSERFLASH_ADDRERASE)malloc(sizeof(SERFLASH_ADDRERASE));
1553 if (NULL == pADDRERASEParam)
1554 return FALSE;
1555
1556 pADDRERASEParam->u32StartAddr = u32StartAddr;
1557 pADDRERASEParam->u32EraseSize = u32EraseSize;
1558 pADDRERASEParam->bWait = bWait;
1559 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_AddressErase,(void*)pADDRERASEParam) != UTOPIA_STATUS_SUCCESS)
1560 {
1561 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_AddressErase fail\n");
1562 return FALSE;
1563 }
1564 return TRUE;
1565 }
1566 #else
1567 MS_U32 u32StartBlock = 0;
1568 MS_U32 u32EndBlock = 0;
1569
1570 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08x, 0x%08x, %d)", __FUNCTION__,
1571 (unsigned int)u32StartAddr, (unsigned int)u32EraseSize, (int)bWait));
1572
1573 if ( FALSE == MDrv_SERFLASH_AddressToBlock(u32StartAddr, &u32StartBlock)
1574 || FALSE == MDrv_SERFLASH_AddressToBlock(u32StartAddr + u32EraseSize - 1, &u32EndBlock)
1575 )
1576 {
1577 return FALSE;
1578 }
1579
1580 return MDrv_SERFLASH_BlockErase(u32StartBlock, u32EndBlock, bWait);
1581 #endif
1582 }
1583 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
1584 {
1585 #if defined(MSOS_TYPE_LINUX)
1586 int ret;
1587 int fd = -1;
1588 SERFLASH_EraseInfo spi;
1589
1590 fd = open(SPI_FW_NAME, O_RDWR|O_EXCL);
1591 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, printf("%s(0x%08x, 0x%08x, %d)", __FUNCTION__,
1592 (unsigned int)u32StartAddr, (unsigned int)u32EraseSize, (int)bWait));
1593 if(fd == -1)
1594 {
1595 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("Cannot open fw descriptor"));
1596 return FALSE;
1597 }
1598 else
1599 {
1600 spi.u32StartAddr = u32StartAddr;
1601 spi.u32EraseSize = u32EraseSize;
1602 spi.bWait = bWait;
1603 ret = ioctl(fd, IOCTL_SYS_SPI_ERASE, &spi);
1604 if(ret == -1)
1605 {
1606 close(fd);
1607 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("%s ioctl fail\n",__FUNCTION__));
1608 return FALSE;
1609 }
1610 }
1611 close(fd);
1612 #endif
1613 }
1614 return TRUE;
1615 }
1616
1617
1618 //-------------------------------------------------------------------------------------------------
1619 /// Description : Erase certain sectors in Serial Flash
1620 /// @param u32StartBlock \b IN: start block
1621 /// @param u32EndBlock \b IN: end block
1622 /// @param bWait \b IN: wait write done or not
1623 /// @return TRUE : succeed
1624 /// @return FALSE : fail before timeout or illegal parameters
1625 /// @note Not allowed in interrupt context
1626 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_BlockErase(MS_U32 u32StartBlock,MS_U32 u32EndBlock,MS_BOOL bWait)1627 MS_BOOL MDrv_SERFLASH_BlockErase(MS_U32 u32StartBlock, MS_U32 u32EndBlock, MS_BOOL bWait)
1628 {
1629 MS_ASSERT( u32StartBlock<=u32EndBlock && u32EndBlock<NUMBER_OF_SERFLASH_SECTORS );
1630
1631 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08x, 0x%08x, %d)\n", __FUNCTION__, (unsigned int)u32StartBlock, (unsigned int)u32EndBlock, (int)bWait));
1632 #if (SERFLASH_UTOPIA20)
1633 {
1634 PSERFLASH_BLKERASE pBLKERASEParam = NULL;
1635 if (NULL == pInstantSerFlash)
1636 return FALSE;
1637 pBLKERASEParam = (PSERFLASH_BLKERASE)malloc(sizeof(SERFLASH_BLKERASE));
1638 if (NULL == pBLKERASEParam)
1639 return FALSE;
1640
1641 pBLKERASEParam->u32StartBlock = u32StartBlock;
1642 pBLKERASEParam->u32EndBlock = u32EndBlock;
1643 pBLKERASEParam->bWait = bWait;
1644 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_BlockErase,(void*)pBLKERASEParam) != UTOPIA_STATUS_SUCCESS)
1645 {
1646 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_BlockErase fail\n");
1647 return FALSE;
1648 }
1649 return TRUE;
1650 }
1651 #else
1652 return HAL_SERFLASH_BlockErase(u32StartBlock, u32EndBlock, bWait);
1653 #endif
1654 }
1655
1656 //-------------------------------------------------------------------------------------------------
1657 /// Description : Erase certain 4K sectors in Serial Flash
1658 /// @param u32StartBlock \b IN: start address
1659 /// @param u32EndBlock \b IN: end address
1660 /// @return TRUE : succeed
1661 /// @return FALSE : fail before timeout or illegal parameters
1662 /// @note Not allowed in interrupt context
1663 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_SectorErase(MS_U32 u32StartAddr,MS_U32 u32EndAddr)1664 MS_BOOL MDrv_SERFLASH_SectorErase(MS_U32 u32StartAddr, MS_U32 u32EndAddr)
1665 {
1666 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
1667 {
1668 #if (SERFLASH_UTOPIA20)
1669 {
1670 PSERFLASH_SECERASE pSECERASEParam = NULL;
1671 if (NULL == pInstantSerFlash)
1672 return FALSE;
1673 pSECERASEParam = (PSERFLASH_SECERASE)malloc(sizeof(SERFLASH_SECERASE));
1674 if (NULL == pSECERASEParam)
1675 return FALSE;
1676
1677 pSECERASEParam->u32StartAddr = u32StartAddr;
1678 pSECERASEParam->u32EndAddr = u32EndAddr;
1679 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_SectorErase,(void*)pSECERASEParam) != UTOPIA_STATUS_SUCCESS)
1680 {
1681 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_SectorErase fail\n");
1682 return FALSE;
1683 }
1684 return TRUE;
1685 }
1686 #else
1687 MS_BOOL bRet = FALSE;
1688 MS_U32 u32I = 0;
1689 #define DRV_SERFLASH_SECTOR_SIZE 0x1000
1690
1691 for( u32I = u32StartAddr; u32I < u32EndAddr; )
1692 {
1693 HAL_SERFLASH_SectorErase(u32I);
1694
1695 if((u32EndAddr-u32I) <= DRV_SERFLASH_SECTOR_SIZE)
1696 {
1697 bRet = HAL_SERFLASH_SectorErase(u32EndAddr);
1698 }
1699
1700 u32I+=DRV_SERFLASH_SECTOR_SIZE;
1701 }
1702 return bRet;
1703 #endif
1704 }
1705 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
1706 {
1707 #if defined(MSOS_TYPE_LINUX)
1708
1709 int fd = -1;
1710 int ret = FALSE;
1711 SERFLASH_SectorEraseInfo spi;
1712
1713 fd = open(SPI_FW_NAME, O_RDWR|O_EXCL);
1714 if(fd == -1)
1715 {
1716 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("Cannot open fw descriptor"));
1717 return ret;
1718 }
1719 else
1720 {
1721 spi.u32StartAddr = u32StartAddr;
1722 spi.u32Endaddr = u32EndAddr;
1723 ret = ioctl(fd, IOCTL_SYS_SPI_SECTOR_ERASE, &spi);
1724 if(ret == -1)
1725 {
1726 close(fd);
1727 return ret;
1728 }
1729 }
1730 close(fd);
1731 #endif
1732 }
1733 return TRUE;
1734
1735 }
1736
1737 //-------------------------------------------------------------------------------------------------
1738 /// Description : Check write done in Serial Flash
1739 /// @return TRUE : done
1740 /// @return FALSE : not done
1741 /// @note Not allowed in interrupt context
1742 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_CheckWriteDone(void)1743 MS_BOOL MDrv_SERFLASH_CheckWriteDone(void)
1744 {
1745 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
1746 #if (SERFLASH_UTOPIA20)
1747 if (NULL == pInstantSerFlash)
1748 return FALSE;
1749
1750 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_CheckWriteDone,(void*)NULL) != UTOPIA_STATUS_SUCCESS)
1751 {
1752 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_CheckWriteDone fail\n");
1753 return FALSE;
1754 }
1755 return TRUE;
1756 #else
1757 return HAL_SERFLASH_CheckWriteDone();
1758 #endif
1759 }
1760
1761 //-------------------------------------------------------------------------------------------------
1762 /// Description : Write data to Serial Flash
1763 /// @param u32FlashAddr \b IN: start address (4-B aligned)
1764 /// @param u32FlashSize \b IN: size in Bytes (4-B aligned)
1765 /// @param user_buffer \b IN: Virtual Buffer Address ptr to flash write data
1766 /// @return TRUE : succeed
1767 /// @return FALSE : fail before timeout or illegal parameters
1768 /// @note Not allowed in interrupt context
1769 /// [NONOS_SUPPORT]
1770 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_Write(MS_U32 u32FlashAddr,MS_U32 u32FlashSize,MS_U8 * user_buffer)1771 MS_BOOL MDrv_SERFLASH_Write(MS_U32 u32FlashAddr, MS_U32 u32FlashSize, MS_U8 *user_buffer)
1772 {
1773 //MS_U8 *pu8BufAddr = (MS_U8*)MS_PA2KSEG1((MS_U32)pu8Data); // Physical Address to Virtual Address, non-cache.
1774 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08X, %d, %p)\n", __FUNCTION__, (unsigned int)u32FlashAddr, (int)u32FlashSize, user_buffer));
1775
1776 MS_ASSERT( u32FlashAddr + u32FlashSize <= _SERFLASHInfo.u32TotalSize );
1777 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
1778 {
1779 #if (SERFLASH_UTOPIA20)
1780 {
1781 PSERFLASH_WRITE pWRITEParam = NULL;
1782 if (NULL == pInstantSerFlash)
1783 return FALSE;
1784 pWRITEParam = (PSERFLASH_WRITE)malloc(sizeof(SERFLASH_WRITE));
1785 if (NULL == pWRITEParam)
1786 return FALSE;
1787
1788 pWRITEParam->u32FlashAddr = u32FlashAddr;
1789 pWRITEParam->u32FlashSize = u32FlashSize;
1790 pWRITEParam->user_buffer = user_buffer;
1791 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_Write,(void*)pWRITEParam) != UTOPIA_STATUS_SUCCESS)
1792 {
1793 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_Write fail\n");
1794 return FALSE;
1795 }
1796 return TRUE;
1797 }
1798 #else
1799
1800 if( user_buffer == NULL )
1801 {
1802 return 0;
1803 }
1804 return HAL_SERFLASH_Write(u32FlashAddr, u32FlashSize, user_buffer);
1805 #endif
1806 }
1807 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
1808 {
1809 #if defined(MSOS_TYPE_LINUX)
1810 int fd = -1;
1811 SERFLASH_AccessInfo spi;
1812 int ret;
1813
1814 fd = open(SPI_FW_NAME, O_RDWR);
1815
1816 //MS_U8 *pu8BufAddr = (MS_U8*)MS_PA2KSEG1((MS_U32)pu8Data); // Physical Address to Virtual Address, non-cache.
1817 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, printf("%s(0x%08X, %d, %p)\n", __FUNCTION__, (unsigned int)u32FlashAddr, (int)u32FlashSize, user_buffer));
1818 if (fd == -1)
1819 {
1820 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("MDrv_SERFLASH_Write Cannot open fw descriptor\n"));
1821 return FALSE;
1822 }
1823 else
1824 {
1825 spi.u32Start = u32FlashAddr;
1826 spi.u32Len = u32FlashSize;
1827 spi.u8data = user_buffer;
1828 ret = ioctl(fd, IOCTL_SYS_SPI_WRITE, &spi);
1829 if(ret == -1)
1830 {
1831 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("%s ioctl fail\n",__FUNCTION__));
1832 close(fd);
1833 return FALSE;
1834 }
1835 }
1836 close(fd);
1837 #endif
1838 }
1839 return TRUE;
1840 }
1841
1842 //-------------------------------------------------------------------------------------------------
1843 /// Description : Read data from Serial Flash
1844 /// @param u32FlashAddr \b IN: Flash Address
1845 /// @param u32FlashSize \b IN: Flash Size Data in Bytes
1846 /// @param user_buffer \b OUT: Virtual Buffer Address ptr to store flash read data
1847 /// @return TRUE : succeed
1848 /// @return FALSE : fail before timeout or illegal parameters
1849 /// @note Not allowed in interrupt context
1850 /// [NONOS_SUPPORT]
1851 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_Read(MS_U32 u32FlashAddr,MS_U32 u32FlashSize,MS_U8 * user_buffer)1852 MS_BOOL MDrv_SERFLASH_Read(MS_U32 u32FlashAddr, MS_U32 u32FlashSize, MS_U8 *user_buffer)
1853 {
1854 //MS_U8 *pu8BufAddr = (MS_U8*)MS_PA2KSEG0((MS_U32)pu8Data); // Physical Address to Virtual Address, cache.
1855 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
1856 {
1857 MS_ASSERT( u32FlashSize > 0 );
1858 MS_ASSERT( u32FlashAddr + u32FlashSize <= _SERFLASHInfo.u32TotalSize );
1859
1860 if( user_buffer == NULL )
1861 {
1862 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"USER BUFFER is NULL\n"));
1863 return 0;
1864 }
1865 #if (SERFLASH_UTOPIA20)
1866 {
1867 PSERFLASH_READ pREADParam = NULL;
1868 if (NULL == pInstantSerFlash)
1869 return FALSE;
1870 pREADParam = (PSERFLASH_READ)malloc(sizeof(SERFLASH_READ));
1871 if (NULL == pREADParam)
1872 return FALSE;
1873
1874 pREADParam->u32FlashAddr = u32FlashAddr;
1875 pREADParam->u32FlashSize = u32FlashSize;
1876 pREADParam->user_buffer = user_buffer;
1877 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_Read,(void*)pREADParam) != UTOPIA_STATUS_SUCCESS)
1878 {
1879 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_Write fail\n");
1880 return FALSE;
1881 }
1882 return TRUE;
1883 }
1884 #else
1885
1886 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08X, %d, %p)\n", __FUNCTION__, (unsigned int)u32FlashAddr, (int)u32FlashSize, user_buffer));
1887 return HAL_SERFLASH_Read(u32FlashAddr, u32FlashSize, user_buffer);
1888 #endif
1889 }
1890 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
1891 {
1892 #if defined(MSOS_TYPE_LINUX)
1893 int fd = -1;
1894 int ret;
1895 SERFLASH_AccessInfo spi;
1896 fd = open(SPI_FW_NAME, O_RDWR|O_EXCL);
1897 if(fd == -1)
1898 {
1899 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("MDrv_SERFLASH_Read Cannot open fw descriptor\n"));
1900 return FALSE;
1901 }
1902 else
1903 {
1904 spi.u32Start = u32FlashAddr;
1905 spi.u32Len = u32FlashSize;
1906 spi.u8data = user_buffer;
1907 ret = ioctl(fd, IOCTL_SYS_SPI_READ, &spi);
1908 if(ret == -1)
1909 {
1910 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("%s ioctl fail\n",__FUNCTION__));
1911 close(fd);
1912 return FALSE;
1913 }
1914 }
1915 close(fd);
1916 #endif
1917 }
1918 return TRUE;
1919 }
1920
1921 //-------------------------------------------------------------------------------------------------
1922 /// Description : Protect blocks in Serial Flash
1923 /// @param bEnable \b IN: TRUE/FALSE: enable/disable protection
1924 /// @return TRUE : succeed
1925 /// @return FALSE : fail before timeout
1926 /// @note Not allowed in interrupt context
1927 /// @note
1928 /// [NONOS_SUPPORT]
1929 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_WriteProtect(MS_BOOL bEnable)1930 MS_BOOL MDrv_SERFLASH_WriteProtect(MS_BOOL bEnable)
1931 {
1932 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%d)\n", __FUNCTION__, (int)bEnable));
1933 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
1934 {
1935 #if (SERFLASH_UTOPIA20)
1936 {
1937 PSERFLASH_WP pWPParam = NULL;
1938 if (NULL == pInstantSerFlash)
1939 return FALSE;
1940 pWPParam = (PSERFLASH_WP)malloc(sizeof(SERFLASH_WP));
1941 if (NULL == pWPParam)
1942 return FALSE;
1943
1944 pWPParam->bEnable = bEnable;
1945 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_WriteProtect,(void*)pWPParam) != UTOPIA_STATUS_SUCCESS)
1946 {
1947 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_WriteProtect fail\n");
1948 return FALSE;
1949 }
1950 return TRUE;
1951 }
1952 #else
1953
1954 if ( _bIBPM == TRUE )
1955 {
1956 return HAL_SPI_GangBlockLock(bEnable);
1957 }
1958 else
1959 {
1960 return HAL_SERFLASH_WriteProtect(bEnable);
1961 }
1962 #endif
1963 }
1964 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
1965 {
1966 #if defined(MSOS_TYPE_LINUX)
1967
1968 int fd = -1;
1969 int ret;
1970
1971 fd = open(SPI_FW_NAME, O_RDWR|O_EXCL);
1972
1973 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, printf("%s(%d)\n", __FUNCTION__, (int)bEnable));
1974 if (fd == -1)
1975 {
1976 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("Cannot open fw descriptor"));
1977 return FALSE;
1978 }
1979 else
1980 {
1981 ret = ioctl(fd, IOCTL_SYS_SPI_WRITE_PROTECT, &bEnable);
1982 if(ret == -1)
1983 {
1984 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("%s ioctl fail\n",__FUNCTION__));
1985 close(fd);
1986 return FALSE;
1987 }
1988 }
1989 close(fd);
1990 #endif
1991 }
1992 return TRUE;
1993 }
1994
1995
1996 //-------------------------------------------------------------------------------------------------
1997 /// Description : Enables all range of flash write protection
1998 /// @return TRUE : succeed
1999 /// @return FALSE : fail before timeout
2000 /// @note Not allowed in interrupt context
2001 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_WriteProtect_Enable_All_Range(void)2002 MS_BOOL MDrv_SERFLASH_WriteProtect_Enable_All_Range(void)
2003 {
2004 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2005 #if (SERFLASH_UTOPIA20)
2006 if (NULL == pInstantSerFlash)
2007 return FALSE;
2008
2009 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_WriteProtect_Enable_All_Range,(void*)NULL) != UTOPIA_STATUS_SUCCESS)
2010 {
2011 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_WriteProtect_Enable_All_Range fail\n");
2012 return FALSE;
2013 }
2014 return TRUE;
2015 #else
2016
2017 if ( _bIBPM == TRUE )
2018 {
2019 return HAL_SPI_GangBlockLock(TRUE);
2020 }
2021 else
2022 {
2023 return HAL_SERFLASH_WriteProtect_Area(TRUE, 0 << 2);
2024 }
2025 #endif
2026 }
2027
2028
2029 //-------------------------------------------------------------------------------------------------
2030 /// Description : Disables all range of flash write protection
2031 /// @return TRUE : succeed
2032 /// @return FALSE : fail before timeout
2033 /// @note Not allowed in interrupt context
2034 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_WriteProtect_Disable_All_Range(void)2035 MS_BOOL MDrv_SERFLASH_WriteProtect_Disable_All_Range(void)
2036 {
2037 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2038 #if (SERFLASH_UTOPIA20)
2039 if (NULL == pInstantSerFlash)
2040 return FALSE;
2041
2042 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_WriteProtect_Disable_All_Range,(void*)NULL) != UTOPIA_STATUS_SUCCESS)
2043 {
2044 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_WriteProtect_Disable_All_Range fail\n");
2045 return FALSE;
2046 }
2047 return TRUE;
2048 #else
2049
2050 if ( _bIBPM == TRUE )
2051 {
2052 return HAL_SPI_GangBlockLock(FALSE);
2053 }
2054 else
2055 {
2056 return MDrv_SERFLASH_WriteProtect_Disable_Range_Set(0, _SERFLASHInfo.u32TotalSize);
2057 }
2058 #endif
2059 }
2060
2061
2062 //-------------------------------------------------------------------------------------------------
2063 /// Description : Set flash disable lower bound and size
2064 /// @param u32DisableLowerBound \b IN: the lower bound to disable write protect
2065 /// @param u32DisableSize \b IN: size to disable write protect
2066 /// @return TRUE : succeed
2067 /// @return FALSE : fail before timeout or illegal parameters
2068 /// @note Not allowed in interrupt context
2069 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_WriteProtect_Disable_Range_Set(MS_U32 u32DisableLowerBound,MS_U32 u32DisableSize)2070 MS_BOOL MDrv_SERFLASH_WriteProtect_Disable_Range_Set(MS_U32 u32DisableLowerBound, MS_U32 u32DisableSize)
2071 {
2072 #if (SERFLASH_UTOPIA20)
2073 {
2074 PSERFLASH_WPDISABLERANGESET pWPDisableRangeSetParam = NULL;
2075 if (NULL == pInstantSerFlash)
2076 return FALSE;
2077 pWPDisableRangeSetParam = (PSERFLASH_WPDISABLERANGESET)malloc(sizeof(SERFLASH_WPDISABLERANGESET));
2078 if (NULL == pWPDisableRangeSetParam)
2079 return FALSE;
2080
2081 pWPDisableRangeSetParam->u32DisableLowerBound = u32DisableLowerBound;
2082 pWPDisableRangeSetParam->u32DisableSize = u32DisableSize;
2083 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_WriteProtect_Disable_Range_Set,(void*)pWPDisableRangeSetParam) != UTOPIA_STATUS_SUCCESS)
2084 {
2085 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_WriteProtect_Disable_Range_Set fail\n");
2086 return FALSE;
2087 }
2088 return TRUE;
2089 }
2090 #else
2091
2092 MS_U32 u32EnableLowerBound;
2093 MS_U32 u32EnableUpperBound;
2094 MS_U8 u8BlockProtectBit;
2095
2096 MS_U32 u32DisableUpperBound;
2097 MS_U32 u32FlashIndexMax;
2098
2099 EN_WP_AREA_EXISTED_RTN enWpAreaExistedRtn;
2100
2101
2102 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()", __FUNCTION__));
2103
2104 _SERFLASHDrvStatus.bIsBusy = TRUE;
2105
2106 u32DisableUpperBound = u32DisableLowerBound + u32DisableSize - 1;
2107 u32FlashIndexMax = _SERFLASHInfo.u32TotalSize - 1;
2108
2109
2110 if ( u32DisableLowerBound > u32FlashIndexMax
2111 || u32DisableUpperBound > u32FlashIndexMax
2112 || u32DisableLowerBound > u32DisableUpperBound
2113 )
2114 {
2115 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_INFO, ULOGI(TAG_SERFLASH," = FALSE, u32DisableLowerBound(0x%08X), u32DisableUpperBound(0x%08X), u32FlashIndexMax(0x%08X)\n", (int)u32DisableLowerBound, (int)u32DisableUpperBound, (int)u32FlashIndexMax));
2116
2117 return FALSE;
2118 }
2119
2120
2121 // Step 1. decide u32DisableUpperBound // TODO: review, prefer to unprotect the end of the flash
2122 if ( u32DisableUpperBound != u32FlashIndexMax
2123 && u32DisableLowerBound != 0
2124 )
2125 {
2126 u32DisableUpperBound = u32FlashIndexMax;
2127 }
2128
2129
2130 // Step 2. decide u32EnableLowerBound & u32EnableUpperBound
2131 if ( (u32DisableUpperBound > (u32FlashIndexMax - _SERFLASHInfo.u32SecSize))
2132 && (u32DisableLowerBound == 0)
2133 )
2134 {
2135 // i.e. no protect
2136 u32EnableLowerBound = 0xFFFFFFFF;
2137 u32EnableUpperBound = 0xFFFFFFFF;
2138 }
2139 else if (u32DisableLowerBound == 0)
2140 {
2141 u32EnableUpperBound = u32FlashIndexMax;
2142 u32EnableLowerBound = u32DisableUpperBound + 1;
2143 }
2144 else // i.e. (u32DisableUpperBound == u32FlashIndexMax) because of Step 1
2145 {
2146 u32EnableUpperBound = u32DisableLowerBound - 1;
2147 u32EnableLowerBound = 0;
2148 }
2149
2150
2151 // Step 3. get u8BlockProtectBit
2152 enWpAreaExistedRtn = HAL_SERFLASH_WP_Area_Existed(u32EnableUpperBound, u32EnableLowerBound, &u8BlockProtectBit);
2153
2154 switch (enWpAreaExistedRtn)
2155 {
2156 case WP_AREA_NOT_AVAILABLE:
2157 case WP_TABLE_NOT_SUPPORT:
2158 u8BlockProtectBit = 0;
2159 break;
2160
2161 default:
2162 /* DO NOTHING */
2163 break;
2164 }
2165
2166 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"\n"));
2167
2168 return HAL_SERFLASH_WriteProtect_Area(FALSE, u8BlockProtectBit);
2169 #endif
2170 }
2171
2172
2173 //-------------------------------------------------------------------------------------------------
2174 /// Description : Protect blocks in Serial Flash
2175 /// @param bEnableAllArea \b IN: enable or disable protection
2176 /// @param u8BlockProtectBits \b IN: block protection bits which stand for the area to enable write protect
2177 /// @return TRUE : succeed
2178 /// @return FALSE : fail before timeout
2179 /// @note Not allowed in interrupt context
2180 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_WriteProtect_Area(MS_BOOL bEnableAllArea,MS_U8 u8BlockProtectBits)2181 MS_BOOL MDrv_SERFLASH_WriteProtect_Area(MS_BOOL bEnableAllArea, MS_U8 u8BlockProtectBits)
2182 {
2183 #if (SERFLASH_UTOPIA20)
2184 {
2185 PSERFLASH_WPAREA pWPAreaParam = NULL;
2186 if (NULL == pInstantSerFlash)
2187 return FALSE;
2188 pWPAreaParam = (PSERFLASH_WPAREA)malloc(sizeof(SERFLASH_WPAREA));
2189 if (NULL == pWPAreaParam)
2190 return FALSE;
2191
2192 pWPAreaParam->bEnableAllArea = bEnableAllArea;
2193 pWPAreaParam->u8BlockProtectBits = u8BlockProtectBits;
2194 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_WriteProtect_Area,(void*)pWPAreaParam) != UTOPIA_STATUS_SUCCESS)
2195 {
2196 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_WriteProtect_Area fail\n");
2197 return FALSE;
2198 }
2199 return TRUE;
2200 }
2201 #else
2202 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%d, 0x%02X)\n", __FUNCTION__, (int)bEnableAllArea, u8BlockProtectBits));
2203 return HAL_SERFLASH_WriteProtect_Area(bEnableAllArea, u8BlockProtectBits);
2204 #endif
2205 }
2206
2207
2208 //-------------------------------------------------------------------------------------------------
2209 /// Description : Read ID from Serial Flash
2210 /// @param pu8FlashID \b OUT: Virtual data ptr to store the read ID
2211 /// @param u32IDSize \b IN: size in Bytes
2212 /// @return TRUE : succeed
2213 /// @return FALSE : fail before timeout
2214 /// @note Not allowed in interrupt context
2215 /// @note
2216 /// [NONOS_SUPPORT]
2217 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_ReadID(MS_U8 * pu8FlashID,MS_U32 u32IDSize)2218 MS_BOOL MDrv_SERFLASH_ReadID(MS_U8 *pu8FlashID, MS_U32 u32IDSize)
2219 {
2220 #if (SERFLASH_UTOPIA20)
2221 {
2222
2223 PSERFLASH_READID pReadIDParam = NULL;
2224 if (NULL == pInstantSerFlash)
2225 return FALSE;
2226 pReadIDParam = (PSERFLASH_READID)malloc(sizeof(SERFLASH_READID));
2227 if (NULL == pReadIDParam)
2228 return FALSE;
2229
2230 pReadIDParam->pu8FlashID = pu8FlashID;
2231 pReadIDParam->u32IDSize = u32IDSize;
2232 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_ReadID,(void*)pReadIDParam) != UTOPIA_STATUS_SUCCESS)
2233 {
2234 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_WriteProtect fail\n");
2235 return FALSE;
2236 }
2237 return TRUE;
2238 }
2239 #else
2240
2241 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%p, %d)\n", __FUNCTION__, pu8FlashID, (int)u32IDSize));
2242 return HAL_SERFLASH_ReadID(pu8FlashID, u32IDSize);
2243 #endif
2244 }
2245
2246
2247 //-------------------------------------------------------------------------------------------------
2248 /// Description : Read data from Serial Flash to DRAM in DMA mode
2249 /// @param u32FlashStart \b IN: src start address in flash (0 ~ flash size-1)
2250 /// @param u32DRAMStart \b IN: dst start address in DRAM (16B-aligned) (0 ~ DRAM size-1)
2251 /// @param u32Size \b IN: size in Bytes (8B-aligned) (>=8)
2252 /// @return TRUE : succeed
2253 /// @return FALSE : fail before timeout or illegal parameters
2254 /// @note Not allowed in interrupt context
2255 /// @note
2256 /// [NONOS_SUPPORT]
2257 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_DMA(MS_U32 u32FlashStart,MS_U32 u32DRAMStart,MS_U32 u32Size)2258 MS_BOOL MDrv_SERFLASH_DMA(MS_U32 u32FlashStart, MS_U32 u32DRAMStart, MS_U32 u32Size)
2259 {
2260 #if (SERFLASH_UTOPIA20)
2261 {
2262 PSERFLASH_DMA pDMAParam = NULL;
2263 if (NULL == pInstantSerFlash)
2264 return FALSE;
2265 pDMAParam = (PSERFLASH_DMA)malloc(sizeof(SERFLASH_DMA));
2266 if (NULL == pDMAParam)
2267 return FALSE;
2268
2269 pDMAParam->u32FlashStart = u32FlashStart;
2270 pDMAParam->u32DRAMStart = u32DRAMStart;
2271 pDMAParam->u32Size = u32Size;
2272 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_DMA,(void*)pDMAParam) != UTOPIA_STATUS_SUCCESS)
2273 {
2274 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_DMA fail\n");
2275 return FALSE;
2276 }
2277 return TRUE;
2278 }
2279 #else
2280
2281 MS_ASSERT( u32FlashStart+u32Size <= _SERFLASHInfo.u32TotalSize);
2282 MS_ASSERT( u32DRAMStart%8 ==0 );
2283 MS_ASSERT( u32Size%8 ==0 );
2284 MS_ASSERT( u32Size>=8 );
2285
2286 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2287 return HAL_SERFLASH_DMA(u32FlashStart, u32DRAMStart, u32Size);
2288 #endif
2289 }
2290
2291
2292 //------- ------------------------------------------------------------------------------------------
2293 /// Description : Read Status Register in Serial Flash
2294 /// @param pu8StatusReg \b OUT: ptr to Status Register value
2295 /// @return TRUE : succeed
2296 /// @return FALSE : fail before timeout
2297 /// @note Not allowed in interrupt context
2298 /// @note
2299 /// [NONOS_SUPPORT]
2300 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_ReadStatusRegister(MS_U8 * pu8StatusReg)2301 MS_BOOL MDrv_SERFLASH_ReadStatusRegister(MS_U8 *pu8StatusReg)
2302 {
2303 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
2304 {
2305 #if (SERFLASH_UTOPIA20)
2306 {
2307 PSERFLASH_READSTATUSREG pReadStatusRegParam = NULL;
2308 if (NULL == pInstantSerFlash)
2309 return FALSE;
2310 pReadStatusRegParam = (PSERFLASH_READSTATUSREG)malloc(sizeof(SERFLASH_READSTATUSREG));
2311 if (NULL == pReadStatusRegParam)
2312 return FALSE;
2313
2314 pReadStatusRegParam->pu8StatusReg = pu8StatusReg;
2315 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_ReadStatusRegister,(void*)pReadStatusRegParam) != UTOPIA_STATUS_SUCCESS)
2316 {
2317 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_ReadStatusRegister fail\n");
2318 return FALSE;
2319 }
2320 return TRUE;
2321 }
2322 #else
2323
2324 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2325
2326 return HAL_SERFLASH_ReadStatusReg(pu8StatusReg);
2327 #endif
2328 }
2329 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
2330 {
2331 #if defined(MSOS_TYPE_LINUX)
2332 int fd = -1;
2333 int ret;
2334
2335 fd = open(SPI_FW_NAME, O_RDWR|O_EXCL);
2336
2337 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, printf("%s\n", __FUNCTION__));
2338 if (fd == -1)
2339 {
2340 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("Cannot open fw descriptor"));
2341 return FALSE;
2342 }
2343 else
2344 {
2345 ret = ioctl(fd, IOCTL_SYS_SPI_READ_STATUS, pu8StatusReg);
2346 if(ret == -1)
2347 {
2348 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("%s ioctl fail\n",__FUNCTION__));
2349 close(fd);
2350 return FALSE;
2351 }
2352 }
2353 close(fd);
2354 #endif
2355 }
2356 return TRUE;
2357 }
2358
2359 //------- ------------------------------------------------------------------------------------------
2360 /// Description : Read Status Register2 in Serial Flash
2361 /// @param pu8StatusReg \b OUT: ptr to Status Register value
2362 /// @return TRUE : succeed
2363 /// @return FALSE : fail before timeout
2364 /// @note Not allowed in interrupt context
2365 /// @note For Specific Flash IC with 16-bit status register (high-byte)
2366 /// [NONOS_SUPPORT]
2367 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_ReadStatusRegister2(MS_U8 * pu8StatusReg)2368 MS_BOOL MDrv_SERFLASH_ReadStatusRegister2(MS_U8 *pu8StatusReg)
2369 {
2370 #if (SERFLASH_UTOPIA20)
2371 {
2372 PSERFLASH_READSTATUSREG2 pReadStatusReg2Param = NULL;
2373 if (NULL == pInstantSerFlash)
2374 return FALSE;
2375 pReadStatusReg2Param = (PSERFLASH_READSTATUSREG2)malloc(sizeof(SERFLASH_READSTATUSREG2));
2376 if (NULL == pReadStatusReg2Param)
2377 return FALSE;
2378
2379 pReadStatusReg2Param->pu8StatusReg = pu8StatusReg;
2380 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_ReadStatusRegister2,(void*)pReadStatusReg2Param) != UTOPIA_STATUS_SUCCESS)
2381 {
2382 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_ReadStatusRegister2 fail\n");
2383 return FALSE;
2384 }
2385 return TRUE;
2386 }
2387 #else
2388
2389 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2390
2391 return HAL_SERFLASH_ReadStatusReg2(pu8StatusReg);
2392 #endif
2393 }
2394
2395 //------- ------------------------------------------------------------------------------------------
2396 /// Description : Write Status Register in Serial Flash
2397 /// @param u16StatusReg \b IN: Status Register value
2398 /// @return TRUE : succeed
2399 /// @return FALSE : fail before timeout
2400 /// @note Not allowed in interrupt context
2401 /// @note For Specific Flash IC with 16-bit status register
2402 /// [NONOS_SUPPORT]
2403 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_WriteStatusRegister(MS_U16 u16StatusReg)2404 MS_BOOL MDrv_SERFLASH_WriteStatusRegister(MS_U16 u16StatusReg)
2405 {
2406 if(_SPI_Attri == E_SPI_ATTRI_USER_DRV)
2407 {
2408 #if (SERFLASH_UTOPIA20)
2409 {
2410 PSERFLASH_WRITESTATUSREG pWriteStatusRegParam = NULL;
2411 if (NULL == pInstantSerFlash)
2412 return FALSE;
2413 pWriteStatusRegParam = (PSERFLASH_WRITESTATUSREG)malloc(sizeof(SERFLASH_WRITESTATUSREG));
2414 if (NULL == pWriteStatusRegParam)
2415 return FALSE;
2416
2417 pWriteStatusRegParam->u16StatusReg = u16StatusReg;
2418
2419 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_WriteStatusRegister,(void*)pWriteStatusRegParam) != UTOPIA_STATUS_SUCCESS)
2420 {
2421 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_WriteStatusRegister fail\n");
2422 return FALSE;
2423 }
2424 return TRUE;
2425 }
2426 #else
2427
2428 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2429
2430 return HAL_SERFLASH_WriteStatusReg(u16StatusReg);
2431 #endif
2432 }
2433 else if(_SPI_Attri == E_SPI_ATTRI_KERNEL_DRV)
2434 {
2435 #if defined(MSOS_TYPE_LINUX)
2436 int fd = -1;
2437 int ret;
2438
2439 fd = open(SPI_FW_NAME, O_RDWR|O_EXCL);
2440
2441 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, printf("%s(%d)\n", __FUNCTION__, (int)u16StatusReg));
2442 if (fd == -1)
2443 {
2444 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("Cannot open fw descriptor"));
2445 return FALSE;
2446 }
2447 else
2448 {
2449 ret = ioctl(fd, IOCTL_SYS_SPI_WRITE_STATUS, &u16StatusReg);
2450 if(ret == -1)
2451 {
2452 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_WARNING,printf("%s ioctl fail\n",__FUNCTION__));
2453 close(fd);
2454 return FALSE;
2455 }
2456 }
2457 close(fd);
2458 #endif
2459 }
2460 return TRUE;
2461 }
2462
2463 //------- ------------------------------------------------------------------------------------------
2464 /// Description : Handle for BDMA copy data from ONLY Flash src to other dst
2465 /// @param u32FlashAddr \b IN: Physical Source address in spi flash
2466 /// @param u32DramAddr \b IN: Physical Dst address
2467 /// @param u32Len \b IN: data length
2468 /// @param eDstDev \b IN: The Dst Device of Flash BDMA
2469 /// @param u8OpCfg \b IN: u8OpCfg: default is SPIDMA_OPCFG_DEF
2470 /// - Bit0: inverse mode --> SPIDMA_OPCFG_INV_COPY
2471 /// - Bit2: Copy & CRC check in wait mode --> SPIDMA_OPCFG_CRC_COPY
2472 /// - Bit3: Copy without waiting --> SPIDMA_OPCFG_NOWAIT_COPY
2473 /// @return \b MS_BOOL
2474 /// [NONOS_SUPPORT]
2475 /// [fw : drvBDMA ]
2476 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_CopyHnd(MS_PHYADDR u32FlashAddr,MS_PHYADDR u32DstAddr,MS_U32 u32Len,SPIDMA_Dev eDstDev,MS_U8 u8OpCfg)2477 MS_BOOL MDrv_SERFLASH_CopyHnd(MS_PHYADDR u32FlashAddr,
2478 MS_PHYADDR u32DstAddr,
2479 MS_U32 u32Len,
2480 SPIDMA_Dev eDstDev,
2481 MS_U8 u8OpCfg)
2482 {
2483 #if (SERFLASH_UTOPIA20)
2484 {
2485 PSERFLASH_COPYHND pCopyHndParam = NULL;
2486 if (NULL == pInstantSerFlash)
2487 return FALSE;
2488 pCopyHndParam = (PSERFLASH_COPYHND)malloc(sizeof(SERFLASH_COPYHND));
2489 if (NULL == pCopyHndParam)
2490 return FALSE;
2491
2492 pCopyHndParam->u32FlashAddr = u32FlashAddr;
2493 pCopyHndParam->u32DstAddr = u32DstAddr;
2494 pCopyHndParam->u32Len = u32Len;
2495 pCopyHndParam->eDstDev = eDstDev;
2496 pCopyHndParam->u8OpCfg = u8OpCfg;
2497 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_CopyHnd,(void*)pCopyHndParam) != UTOPIA_STATUS_SUCCESS)
2498 {
2499 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_CopyHnd fail\n");
2500 return FALSE;
2501 }
2502 return TRUE;
2503 }
2504 #else
2505
2506 #define BDMA_DEV_FLASH 5
2507 MS_U16 CpyType = ((BDMA_DEV_FLASH & 0x0F) | _LShift((eDstDev &0x0F), 8));
2508 MS_U32 u32Delay = FLASH_WAIT_TIME;
2509
2510 while (!HAL_SERFLASH_CheckWriteDone())
2511 {
2512 if (FLASH_IS_TIMEOUT(u32Delay))
2513 {
2514 ULOGE(TAG_SERFLASH,"%s() : DMA flash is busy!\n",__FUNCTION__);
2515 return FALSE;
2516 }
2517 u32Delay--;
2518 }
2519
2520 return MDrv_BDMA_CopyHnd(u32FlashAddr, u32DstAddr, u32Len, (BDMA_CpyType) CpyType, u8OpCfg);
2521 #endif
2522 }
2523
2524 //------- ------------------------------------------------------------------------------------------
2525 /// Description : Switch SPI as GPIO Input
2526 /// @param bSwitch \b IN: 1 for GPIO, 0 for NORMAL
2527 /// @note Not allowed in interrupt context
2528 /// @note For project's power consumption
2529 /// [NONOS_SUPPORT]
2530 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_SetGPIO(MS_BOOL bSwitch)2531 void MDrv_SERFLASH_SetGPIO(MS_BOOL bSwitch)
2532 {
2533 #if (SERFLASH_UTOPIA20)
2534 {
2535 PSERFLASH_SETGPIO pSetGPIOParam = NULL;
2536 if (NULL == pInstantSerFlash)
2537 return;
2538 pSetGPIOParam = (PSERFLASH_SETGPIO)malloc(sizeof(SERFLASH_SETGPIO));
2539 if (NULL == pSetGPIOParam)
2540 return;
2541
2542 pSetGPIOParam->bSwitch = bSwitch;
2543 if(UtopiaIoctl(pInstantSerFlash,MDrv_CMD_SERFLASH_SetGPIO,(void*)pSetGPIOParam) != UTOPIA_STATUS_SUCCESS)
2544 {
2545 ULOGE(TAG_SERFLASH,"Ioctl MDrv_SERFLASH_WriteProtect fail\n");
2546 return;
2547 }
2548 return;
2549 }
2550 #else
2551
2552 HAL_SERFLASH_SetGPIO(bSwitch);
2553 #endif
2554 }
2555
2556 #ifdef MXIC_IBPM
2557 //------- ------------------------------------------------------------------------------------------
2558 /// Description : Enable Individual block protection mode, only MXIC support
2559 /// @note This is OTP mode, and then blocks are default individual protected after power up
2560 /// @note Customization
2561 /// [NONOS_SUPPORT]
2562 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_EnterIBPM(void)2563 void MDrv_SERFLASH_EnterIBPM(void)
2564 {
2565 _bIBPM = HAL_SPI_EnterIBPM();
2566 }
2567
2568 //------- ------------------------------------------------------------------------------------------
2569 /// Description : Read the individual block Protected status, only MXIC support
2570 /// @param u32FlashAddr \b IN: the flash's address of the block
2571 /// @return 0xFF : Protected Lock
2572 /// @return 0x00 : Protected UnLock
2573 /// @note it will activate after calling MDrv_SERFLASH_EnterIBPM.
2574 /// @note Customization
2575 /// [NONOS_SUPPORT]
2576 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_ReadBlockStatus(MS_PHYADDR u32FlashAddr)2577 MS_U8 MDrv_SERFLASH_ReadBlockStatus(MS_PHYADDR u32FlashAddr)
2578 {
2579 return HAL_SPI_ReadBlockStatus(u32FlashAddr);
2580 }
2581
2582 //------- ------------------------------------------------------------------------------------------
2583 /// Description : Protect (or not) the special address of the block, only MXIC support
2584 /// @param u32FlashAddr \b IN: the flash's address of the block
2585 /// @param bLock \b IN: True: Lock ; False: Unlock
2586 /// @return TRUE : succeed
2587 /// @return FALSE : fail before timeout
2588 /// @note it will activate after calling MDrv_SERFLASH_EnterIBPM.
2589 /// @note Customization
2590 /// [NONOS_SUPPORT]
2591 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_SingleBlockProtect(MS_PHYADDR u32FlashAddr,MS_BOOL bLock)2592 MS_BOOL MDrv_SERFLASH_SingleBlockProtect(MS_PHYADDR u32FlashAddr,MS_BOOL bLock)
2593 {
2594 return HAL_SPI_SingleBlockLock(u32FlashAddr, bLock);
2595 }
2596
2597 //------- ------------------------------------------------------------------------------------------
2598 /// Description : Protect (or not) the continuous block, only MXIC support
2599 /// @param u32StartBlock \b IN: the flash's block
2600 /// @param u32EndBlock \b IN: the flash's block
2601 /// @param bLock \b IN: True: Lock ; False: Unlock
2602 /// @return u32PassCnt : the successful blocks number
2603 /// @note it will activate after calling MDrv_SERFLASH_EnterIBPM.
2604 /// @note Customization
2605 /// [NONOS_SUPPORT]
2606 //-------------------------------------------------------------------------------------------------
MDrv_SERFLASH_MultiBlockProtect(MS_U32 u32StartBlock,MS_U32 u32EndBlock,MS_BOOL bLock)2607 MS_U32 MDrv_SERFLASH_MultiBlockProtect(MS_U32 u32StartBlock, MS_U32 u32EndBlock, MS_BOOL bLock)
2608 {
2609 MS_U32 u32InBlock = 0;
2610 MS_U32 u32PassCnt = 0;
2611
2612 for ( u32InBlock = u32StartBlock; u32InBlock < u32StartBlock; u32InBlock++ )
2613 {
2614 if(HAL_SPI_SingleBlockLock((u32InBlock*SIZE_64KB), bLock))
2615 {
2616 u32PassCnt++;
2617 }
2618 }
2619 return u32PassCnt;
2620 }
2621 #endif
2622
2623 //-------------------------------------------------------------------------------------------------
2624 // WRAPPER FOR CHAKRA
2625 //-------------------------------------------------------------------------------------------------
MDrv_FLASH_Write(MS_U32 u32FlashAddr,MS_U32 u32FlashSize,MS_U8 * user_buffer)2626 MS_BOOL MDrv_FLASH_Write(MS_U32 u32FlashAddr, MS_U32 u32FlashSize, MS_U8 *user_buffer)
2627 {
2628 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s( 0x%x, 0x%x, %p)\n", __FUNCTION__, (unsigned int)u32FlashAddr, (unsigned int)u32FlashSize, user_buffer));
2629 return MDrv_SERFLASH_Write(u32FlashAddr, u32FlashSize, user_buffer);
2630
2631 }
2632
MDrv_FLASH_Read(MS_U32 u32FlashAddr,MS_U32 u32FlashSize,MS_U8 * user_buffer)2633 MS_BOOL MDrv_FLASH_Read(MS_U32 u32FlashAddr, MS_U32 u32FlashSize, MS_U8 *user_buffer)
2634 {
2635 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s( 0x%x, 0x%x, %p)\n", __FUNCTION__, (unsigned int)u32FlashAddr, (unsigned int)u32FlashSize, user_buffer));
2636 return MDrv_SERFLASH_Read(u32FlashAddr, u32FlashSize, user_buffer);
2637 }
2638
MDrv_FLASH_WriteProtect(MS_BOOL bEnable)2639 MS_BOOL MDrv_FLASH_WriteProtect(MS_BOOL bEnable)
2640 {
2641 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%d)\n", __FUNCTION__, (int)bEnable));
2642 return MDrv_SERFLASH_WriteProtect(bEnable);
2643 }
2644
MDrv_FLASH_WriteProtect_Enable_All_Range(void)2645 MS_BOOL MDrv_FLASH_WriteProtect_Enable_All_Range(void)
2646 {
2647 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2648 return MDrv_SERFLASH_WriteProtect_Enable_All_Range();
2649 }
2650
MDrv_FLASH_WriteProtect_Disable_All_Range(void)2651 MS_BOOL MDrv_FLASH_WriteProtect_Disable_All_Range(void)
2652 {
2653 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2654 return MDrv_SERFLASH_WriteProtect_Disable_All_Range();
2655 }
2656
MDrv_FLASH_WriteProtect_Disable_Range_Set(MS_U32 DisableLowerBound,MS_U32 DisableSize)2657 MS_BOOL MDrv_FLASH_WriteProtect_Disable_Range_Set(MS_U32 DisableLowerBound, MS_U32 DisableSize)
2658 {
2659 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%x, 0x%x)\n", __FUNCTION__, (unsigned int)DisableLowerBound, (unsigned int)DisableSize));
2660 return MDrv_SERFLASH_WriteProtect_Disable_Range_Set(DisableLowerBound, DisableSize);
2661 }
2662
MDrv_FLASH_WriteProtect_Area(MS_BOOL bEnableAllArea,MS_U8 BlockProtectBits)2663 MS_BOOL MDrv_FLASH_WriteProtect_Area(MS_BOOL bEnableAllArea, MS_U8 BlockProtectBits)
2664 {
2665 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%d, 0x%02x)\n", __FUNCTION__, (int)bEnableAllArea, BlockProtectBits));
2666 return MDrv_SERFLASH_WriteProtect_Area(bEnableAllArea, BlockProtectBits);
2667 }
2668
MDrv_FLASH_ReadStatusRegister(MS_U8 * pu8StatusReg)2669 MS_BOOL MDrv_FLASH_ReadStatusRegister(MS_U8 *pu8StatusReg)
2670 {
2671 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%p)\n", __FUNCTION__, pu8StatusReg));
2672 return MDrv_SERFLASH_ReadStatusRegister(pu8StatusReg);
2673 }
2674
MDrv_FLASH_ReadStatusRegister2(MS_U8 * pu8StatusReg)2675 MS_BOOL MDrv_FLASH_ReadStatusRegister2(MS_U8 *pu8StatusReg)
2676 {
2677 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(%p)\n", __FUNCTION__, pu8StatusReg));
2678 return MDrv_SERFLASH_ReadStatusRegister2(pu8StatusReg);
2679 }
2680
MDrv_FLASH_WriteStatusRegister(MS_U16 u16StatusReg)2681 MS_BOOL MDrv_FLASH_WriteStatusRegister(MS_U16 u16StatusReg)
2682 {
2683 return MDrv_SERFLASH_WriteStatusRegister(u16StatusReg);
2684 }
MDrv_FLASH_DetectType(void)2685 MS_BOOL MDrv_FLASH_DetectType(void)
2686 {
2687 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2688 return MDrv_SERFLASH_DetectType();
2689 }
2690
MDrv_FLASH_DetectSize(MS_U32 * u32FlashSize)2691 MS_BOOL MDrv_FLASH_DetectSize(MS_U32 *u32FlashSize)
2692 {
2693 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2694 return MDrv_SERFLASH_DetectSize(u32FlashSize);
2695 }
MDrv_FLASH_AddressToBlock(MS_U32 u32FlashAddr,MS_U32 * pu32BlockIndex)2696 MS_BOOL MDrv_FLASH_AddressToBlock(MS_U32 u32FlashAddr, MS_U32 *pu32BlockIndex)
2697 {
2698 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08x, %p)\n", __FUNCTION__, (unsigned int)u32FlashAddr, pu16BlockIndex));
2699 return MDrv_SERFLASH_AddressToBlock(u32FlashAddr, pu32BlockIndex);
2700 }
2701
MDrv_FLASH_BlockToAddress(MS_U32 u32BlockIndex,MS_U32 * pu32FlashAddr)2702 MS_BOOL MDrv_FLASH_BlockToAddress(MS_U32 u32BlockIndex, MS_U32 *pu32FlashAddr)
2703 {
2704 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%04x, %p)\n", __FUNCTION__, u16BlockIndex, pu32FlashAddr));
2705 return MDrv_SERFLASH_BlockToAddress(u32BlockIndex, pu32FlashAddr);
2706 }
2707
MDrv_FLASH_AddressErase(MS_U32 u32StartAddr,MS_U32 u32EraseSize,MS_BOOL bWait)2708 MS_BOOL MDrv_FLASH_AddressErase(MS_U32 u32StartAddr, MS_U32 u32EraseSize, MS_BOOL bWait)
2709 {
2710 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08x, 0x%08x, %d)\n", __FUNCTION__, (unsigned int)u32StartAddr, (unsigned int)u32Size, (int)bWait));
2711 return MDrv_SERFLASH_AddressErase(u32StartAddr, u32EraseSize, bWait);
2712 }
2713
MDrv_FLASH_BlockErase(MS_U16 u16StartBlock,MS_U16 u16EndBlock,MS_BOOL bWait)2714 MS_BOOL MDrv_FLASH_BlockErase(MS_U16 u16StartBlock, MS_U16 u16EndBlock, MS_BOOL bWait)
2715 {
2716 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%04x, 0x%04x, %d)\n", __FUNCTION__, u16StartBlock, u16EndBlock, (int)bWait));
2717 return MDrv_SERFLASH_BlockErase(u16StartBlock, u16EndBlock, bWait);
2718 }
2719
MDrv_FLASH_CheckWriteDone(void)2720 MS_BOOL MDrv_FLASH_CheckWriteDone(void)
2721 {
2722 //DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s()\n", __FUNCTION__));
2723 return MDrv_SERFLASH_CheckWriteDone();
2724 }
2725
2726 #ifdef MUNINN_ENABLE
2727 //-------------------------------------------------------------------------------------------------
2728 /// Get the Flash Status(register) of the Muninn
2729 /// @param u8ByteAddr \b IN: Register Address
2730 /// @return Flash Status
2731 /// @note
2732 //-------------------------------------------------------------------------------------------------
MDrv_OTP_ReadStatusReg(MS_U8 u8ByteAddr)2733 MS_U8 MDrv_OTP_ReadStatusReg(MS_U8 u8ByteAddr)
2734 {
2735 return HAL_OTP_ReadStatusReg(u8ByteAddr);
2736 }
2737
2738 //-------------------------------------------------------------------------------------------------
2739 /// Set the Flash Status(register) of the Muninn
2740 /// @param u8ByteAddr \b IN: Register Address
2741 /// @param u8ByteReg \b IN: Register Value
2742 /// @note
2743 //-------------------------------------------------------------------------------------------------
MDrv_OTP_WriteStatusReg(MS_U8 u8ByteAddr,MS_U8 u8ByteReg)2744 void MDrv_OTP_WriteStatusReg(MS_U8 u8ByteAddr, MS_U8 u8ByteReg)
2745 {
2746 HAL_OTP_WriteStatusReg(u8ByteAddr,u8ByteReg);
2747 }
2748
2749 //-------------------------------------------------------------------------------------------------
2750 /// Description : Read data from Muninn
2751 /// @param u32FlashAddr \b IN: Flash Address
2752 /// @param u32FlashSize \b IN: Flash Size Data in Bytes
2753 /// @param user_buffer \b OUT: Virtual Buffer Address ptr to store flash read data
2754 /// @return MS_PHYADDR : the Address of the done address
2755 /// @note Not allowed in interrupt context; Normal Read@only 12M Hz
2756 /// [NONOS_SUPPORT]
2757 //-------------------------------------------------------------------------------------------------
MDrv_OTP_Read(MS_U32 u32FlashAddr,MS_U32 u32FlashSize,MS_U8 * user_buffer)2758 MS_PHYADDR MDrv_OTP_Read(MS_U32 u32FlashAddr, MS_U32 u32FlashSize, MS_U8 *user_buffer)
2759 {
2760 return HAL_OTP_Read(u32FlashAddr, u32FlashSize, user_buffer);
2761 }
2762
2763 //-------------------------------------------------------------------------------------------------
2764 /// Description : Read data from Muninn
2765 /// @param u32FlashAddr \b IN: Flash Address
2766 /// @param u32FlashSize \b IN: Flash Size Data in Bytes
2767 /// @param user_buffer \b OUT: Virtual Buffer Address ptr to store flash read data
2768 /// @return MS_PHYADDR : the Address of the done address
2769 /// @note Not allowed in interrupt context; Fast Read@over 12M Hz
2770 /// [NONOS_SUPPORT]
2771 //-------------------------------------------------------------------------------------------------
MDrv_OTP_FastRead(MS_U32 u32FlashAddr,MS_U32 u32FlashSize,MS_U8 * user_buffer)2772 MS_PHYADDR MDrv_OTP_FastRead(MS_U32 u32FlashAddr, MS_U32 u32FlashSize, MS_U8 *user_buffer)
2773 {
2774 return HAL_OTP_FastRead(u32FlashAddr, u32FlashSize, user_buffer);
2775 }
2776
2777 //-------------------------------------------------------------------------------------------------
2778 /// Description : Write data into Muninn's array (OTP)
2779 /// @param u32FlashAddr \b IN: Flash Address
2780 /// @param u32FlashSize \b IN: Flash Size Data in Bytes
2781 /// @param user_buffer \b OUT: Virtual Buffer Address ptr to store flash read data
2782 /// @return MS_PHYADDR : the Address of the done address
2783 /// @note Not allowed in interrupt context; Write@only 12M Hz
2784 /// [NONOS_SUPPORT]
2785 //-------------------------------------------------------------------------------------------------
MDrv_OTP_Write(MS_U32 u32FlashAddr,MS_U32 u32FlashSize,MS_U8 * user_buffer)2786 MS_PHYADDR MDrv_OTP_Write(MS_U32 u32FlashAddr, MS_U32 u32FlashSize, MS_U8 *user_buffer)
2787 {
2788 MS_PHYADDR u32RetAddr = (MS_PHYADDR)u32FlashAddr;
2789 MS_U32 i;
2790
2791 for( i = 0; i < u32FlashSize; i++ )
2792 {
2793 HAL_OTP_Write(u32FlashAddr+i,*(user_buffer+i));
2794 u32RetAddr++;
2795 }
2796 return u32RetAddr;
2797 }
2798
2799 //-------------------------------------------------------------------------------------------------
2800 /// Description : Write data into Muninn's test-mode array (OTP)
2801 /// @param u32FlashAddr \b IN: Flash Address
2802 /// @param user_buffer \b IN: flash write data
2803 /// @return TRUE : succeed
2804 /// @return FALSE : fail before timeout
2805 /// @note Not allowed in interrupt context; Write@only 12M Hz
2806 /// [NONOS_SUPPORT]
2807 //-------------------------------------------------------------------------------------------------
MDrv_OTP_WriteTestMode(MS_U32 u32FlashAddr,MS_U8 ByteData)2808 MS_BOOL MDrv_OTP_WriteTestMode(MS_U32 u32FlashAddr, MS_U8 ByteData)
2809 {
2810 return HAL_OTP_WriteTest(u32FlashAddr, ByteData);
2811 }
2812 #endif
2813
2814
MDrv_SERFLASH_WriteProtect_Area_Lookup(MS_U32 u32ProtectSpace,MS_U32 u32NonProtectSpace,MS_U8 * pu8BlockProtectBits)2815 MS_BOOL MDrv_SERFLASH_WriteProtect_Area_Lookup(MS_U32 u32ProtectSpace, MS_U32 u32NonProtectSpace, MS_U8 *pu8BlockProtectBits)
2816 {
2817 return HAL_SERFLASH_WriteProtect_Area_Lookup(u32ProtectSpace, u32NonProtectSpace, pu8BlockProtectBits);
2818 }
2819
MDrv_SERFLASH_WriteProtect_Area_Boundary(void)2820 MS_U32 MDrv_SERFLASH_WriteProtect_Area_Boundary(void)
2821 {
2822 return HAL_SERFLASH_WriteProtect_Area_Boundary();
2823 }
2824
2825
2826 //FSP Driver =====
2827
MDrv_FSP_WriteData(MS_U32 u32Addr,MS_U32 u32DataSize,MS_U8 * pu8Data)2828 MS_BOOL MDrv_FSP_WriteData(MS_U32 u32Addr, MS_U32 u32DataSize, MS_U8 *pu8Data)
2829 {
2830 return HAL_FSP_Write(u32Addr, u32DataSize, pu8Data);
2831 }
2832
MDrv_FSP_ReadData(MS_U32 u32Addr,MS_U32 u32DataSize,MS_U8 * pu8Data)2833 MS_BOOL MDrv_FSP_ReadData(MS_U32 u32Addr, MS_U32 u32DataSize, MS_U8 *pu8Data)
2834 {
2835 //ULOGE(TAG_SERFLASH,"%s( 0x%x, 0x%x, %p)\n", __FUNCTION__, (unsigned int)u32Addr, (unsigned int)u8DataSize, pu8Data);
2836 return HAL_FSP_Read(u32Addr, u32DataSize, pu8Data);
2837 }
2838
MDrv_FSP_BlockErase(MS_U32 u32StartBlock,MS_U32 u32EndBlock,MS_BOOL bWait)2839 MS_BOOL MDrv_FSP_BlockErase(MS_U32 u32StartBlock, MS_U32 u32EndBlock, MS_BOOL bWait)
2840 {
2841 MS_BOOL bRet = TRUE;
2842 MS_U32 u32Idx;
2843 MS_U32 u32FlashAddr = 0;
2844 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, ULOGD(TAG_SERFLASH,"%s(0x%08x, 0x%08x, %d)\n", __FUNCTION__, (unsigned int)u32StartBlock, (unsigned int)u32EndBlock, (int)bWait));
2845 MS_ASSERT( u32StartBlock<=u32EndBlock && u32EndBlock<NUMBER_OF_SERFLASH_SECTORS );
2846 HAL_FSP_Entry();
2847 for( u32Idx = u32StartBlock; u32Idx <= u32EndBlock; u32Idx++ )
2848 {
2849 bRet &= HAL_SERFLASH_BlockToAddress(u32Idx, &u32FlashAddr);
2850 bRet &= HAL_FSP_BlockErase(u32FlashAddr,FLASH_ERASE_64K);
2851 }
2852 HAL_FSP_Exit();
2853 return bRet;
2854
2855 }
2856
MDrv_FSP_AddressErase(MS_U32 u32StartAddr,MS_U32 u32EraseSize,MS_BOOL bWait)2857 MS_BOOL MDrv_FSP_AddressErase(MS_U32 u32StartAddr, MS_U32 u32EraseSize, MS_BOOL bWait)
2858 {
2859 MS_U32 u32StartBlock;
2860 MS_U32 u32EndBlock;
2861
2862 u32StartBlock = u32StartAddr / SERFLASH_BLOCK_SIZE;
2863 u32EndBlock = u32StartBlock + u32EraseSize - 1;
2864 return MDrv_FSP_BlockErase(u32StartBlock, u32EndBlock, bWait);
2865 }
2866
MDrv_SERFLASH_SetPowerState(EN_POWER_MODE u16PowerState)2867 MS_U32 MDrv_SERFLASH_SetPowerState(EN_POWER_MODE u16PowerState)
2868 {
2869 static EN_POWER_MODE _prev_u16PowerState = E_POWER_MECHANICAL;
2870 MS_U16 u16Return = UTOPIA_STATUS_FAIL;
2871
2872 if (u16PowerState == E_POWER_SUSPEND)
2873 {
2874 _prev_u16PowerState = u16PowerState;
2875 u16Return = UTOPIA_STATUS_SUCCESS;//SUSPEND_OK;
2876 }
2877 else if (u16PowerState == E_POWER_RESUME)
2878 {
2879
2880 if (_prev_u16PowerState == E_POWER_SUSPEND)
2881 {
2882 MDrv_SERFLASH_Init();
2883
2884 _prev_u16PowerState = u16PowerState;
2885 u16Return = UTOPIA_STATUS_SUCCESS;//RESUME_OK;
2886 }
2887 else
2888 {
2889 ULOGD(TAG_SERFLASH,"[%s,%5d]It is not suspended yet. We shouldn't resume\n",__FUNCTION__,__LINE__);
2890 u16Return = UTOPIA_STATUS_FAIL;//SUSPEND_FAILED;
2891 }
2892 }
2893 else
2894 {
2895 ULOGE(TAG_SERFLASH,"[%s,%5d]Do Nothing: %d\n",__FUNCTION__,__LINE__,u16PowerState);
2896 u16Return = UTOPIA_STATUS_FAIL;
2897 }
2898
2899 return u16Return;// for success
2900 }
2901
MDrv_FLASH_Attribute(SPI_Attribute SpiAttri)2902 MS_BOOL MDrv_FLASH_Attribute(SPI_Attribute SpiAttri)
2903 {
2904 switch (SpiAttri)
2905 {
2906 case E_SPI_ATTRI_USER_DRV:
2907 _SPI_Attri = E_SPI_ATTRI_USER_DRV;
2908 break;
2909 case E_SPI_ATTRI_KERNEL_DRV:
2910 _SPI_Attri = E_SPI_ATTRI_KERNEL_DRV;
2911 break;
2912 case E_SPI_ATTRI_UNKNOWN:
2913
2914 default:
2915 DEBUG_SER_FLASH(E_SERFLASH_DBGLV_DEBUG, printf("%s()\n", __FUNCTION__));
2916 return FALSE;
2917
2918 break;
2919 }
2920 return TRUE;
2921 }
2922
2923
2924
2925