xref: /utopia/UTPA2-700.0.x/modules/flash/drv/flash/serial/drvSERFLASH.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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