亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? flash_org.c

?? 一個用于ARM的通用Flash下載軟件
?? C
?? 第 1 頁 / 共 2 頁
字號:
// ***************************************************************************
//
//  Filename:       flash.c
//
//  Created:        Louis Lai (6/20/2003)
//
//  Modified:       $Author: $ $Date: $
//
// ***************************************************************************


// ***************************************************************************
//  pragmas
// ***************************************************************************


// ***************************************************************************
//  includes
// ***************************************************************************
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "tht_memory_map_defines.h"
#include "common.h"


//#define DEBUG


#ifndef TRUE
    #define TRUE               (1 == 1)
#endif
#ifndef FALSE
    #define FALSE              (1 == 2)
#endif

// ***************************************************************************
//  macros
// ***************************************************************************
#define MIN(a,b)                ((a) < (b) ? (a) : (b))
#define MAX(a,b)                ((a) > (b) ? (a) : (b))

// ***************************************************************************
//  definitions
// ***************************************************************************
#define FLASH_DQ7_2X16      ((1 << (7 + 16)) | (1 << 7))
#define FLASH_DQ5_2X16      ((1 << (5 + 16)) | (1 << 5))
#define	TACC				55								// Asyn. Access Time 
#define TIACC				87	 							// Syn. Access Time#define	HCLK				66								// EIM CLK
#define FCLK				54								// Flash Burst CLK
#define	HCLK				66

#define MX21_MEM_ADDR_CS0	0xC8000000
#define MX21_MEM_ADDR_CS1	0xCC000000
#define MX21_MEM_ADDR_CS2	0xD0000000
#define MX21_MEM_ADDR_CS3	0xD1000000
#define MX21_MEM_ADDR_CS4	0xD2000000
#define MX21_MEM_ADDR_CS5	0xD3000000


	
// ***************************************************************************
//  types
// ***************************************************************************


// ***************************************************************************
//  structures
// ***************************************************************************


// ***************************************************************************
//  data
// ***************************************************************************
	

// ***************************************************************************
//  function implementations
// ***************************************************************************
	
// ***************************************************************************
//
//  Function:       FlashConfigBurst
//
//                  This function configures the flash burst mode parameters.
//
//  Parameters:     BOOL            bBurstMode      burst mode on/off
//                  BOOL            bRisingClock    use rising CLK edge?
//                  BOOL            bEarlyReady     RDY one CLK before data?
//                  U32             nWaitStates     wait states (2..7)
//					U32				sAddress		base Address of the Flash
//
//  Return Value:   void
//					BOOL            fBurst 			Burst Mode Status 
//													(True - Sync | False - Async) 
//
// ***************************************************************************
void FlashConfigBurst(BOOL bBurstMode, 
                      BOOL bRisingClock,
                      BOOL bEarlyReady,
                      U32  nClk,
                      U32  sAddress)
{
	volatile U32*       pBase;
    U32                 nAddr;
    U32 				fWsc;
    U32					nTiacc = TIACC;
    


        // Calculate Configuration Register address based on mode
        // ******************************************************
        if (bBurstMode)
        {
       		fWsc  = (((TIACC +10) * nClk + 999) / 1000);
            nAddr = (0 << 19) |                      	// synchronous mode
                    ((bEarlyReady ? 0 : 1) << 18) |  	// RDY one CLK before?
                    ((bRisingClock ? 1 : 0) << 17) | 	// CLK edge
                    (0 << 15) |                      	// continuous mode
                    ((fWsc - 2) << 12);       			// wait state bits                 
        }
        else
        {
            nAddr = (1 << 19) |                      	// asynchronous mode
                    0x555;                           	// fixed
        }


        // Reset flash devices before writing configuration sequence
        // *********************************************************
        pBase = (volatile U32*) sAddress;
        *(pBase + 0x000) = 0x00f000f0;
        *(pBase + 0x555) = 0x00aa00aa;
        *(pBase + 0x2aa) = 0x00550055;
        *(pBase + nAddr) = 0x00c000c0;

}





// ***************************************************************************
//
//  Function:       BoardControlBurstMode
//
//                  This function enabled or disables burst mode with the
//                  MX1 processor and with the memory.
//
//  Parameters:     BOOL            bOnOff          burst mode on/off
//					U32				sAddress		Base Address of the Flash
//
//  Return Value:   BOOL            TRUE if successful, FALSE on error
//
// ***************************************************************************
BOOL BoardControlBurstMode(BOOL bOnOff, U32 sAddress)
{
  
    //BOOL                bResult;
    U32                 nWait;
    U32                 nCsHi;
    U32                 nCsLo;
    U32                 nWsc;
    U32                 nBcd = 0;
    U32                 nOea;
    U32 				nClk = 0;

        
        
        
    if (bOnOff)
    {
    	// Calculate MX1 burst clock divisor based on HCLK frequency and
    	// input memory clock frequency parameter. Adjust used memory clock.
    	// *************************************************************
    	nBcd = (HCLK + (FCLK - 1)) / FCLK;
    	nClk = (HCLK / nBcd);
    	
    	// Calculate number of CLK cycles required for delaying by Tacc
    	// in Tclk increments. 
    	// ************************************************************
    	nWsc  = (((TIACC + 10) * HCLK + 999) / 1000);
    	nWait = MAX(MIN(((TIACC * FCLK + 999) / 1000), 7), 2);

		// Enable OE only one half-clock before sampling data (one half
		// clock plus first CLK plus wait states minus one half clock)
		// ************************************************************
		nOea  = MIN((nWait + 1) * 2, 0x0f);
	}
	else
	{
	
		nWsc  = ((TACC * HCLK + 999) / 1000) + 40;
		nWait = 0;
	}

	
	// Configure burst mode with flash memory. Use the number of wait
	// states calculated above. For this board, we use the rising CLK
	// edge and configure the RDY pin to become active with the data.
	// **************************************************************
	FlashConfigBurst(bOnOff,TRUE,FALSE,nClk,sAddress);
     
     
     // Configure burst mode with MX1 (chip select registers)
     // *****************************************************
     if (bOnOff)
     {
     	// Chip select control register for synchronous mode
     	// *************************************************
     	nCsHi = (0          << (63 - 32)) |     // DTACK_SEL
     			((nBcd - 1) << (60 - 32)) |     // BCD
     			(0          << (56 - 32)) |     // BCS
                (0          << (54 - 32)) |     // PSZ
                (0          << (53 - 32)) |     // PME
                (1          << (52 - 32)) |     // SYNC
                (1          << (48 - 32)) |     // DOL
                (0          << (46 - 32)) |     // CNC
                ((nWsc - 1) << (40 - 32)) |     // WSC
                (0          << (36 - 32)) |     // WWS
                (1          << (32 - 32));      // EDC

       	nCsLo = (nOea       << 28) |            // OEA
                (0          << 24) |            // OEN
                (0          << 20) |            // WEA
                (0          << 16) |            // WEN
                (0          << 12) |            // CSA
                (1          << 11) |            // EBC
                (6          <<  8) |            // DSZ
                (0          <<  6) |            // SP
                (0          <<  4) |            // WP
                (0          <<  1) |            // PA
                (1          <<  0);             // CSEN
   	}
    else
    {
        // Chip select control register for asynchronous mode
        // **************************************************
        nCsHi = (0          << (63 - 32)) |     // DTACK_SEL
                (0          << (60 - 32)) |     // BCD
                (0          << (56 - 32)) |     // BCS
                (0          << (54 - 32)) |     // PSZ
                (0          << (53 - 32)) |     // PME
                (0          << (52 - 32)) |     // SYNC
                (0          << (48 - 32)) |     // DOL
                (0          << (46 - 32)) |     // CNC
                ((62) 		<< (40 - 32)) |		// WSC
                //((nWsc - 1)	<< (40 - 32)) |     // WSC
                (0          << (36 - 32)) |     // WWS
				(0          << (32 - 32));      // EDC
				//(1          << (32 - 32));      // EDC

        nCsLo = (0          << 28) |            // OEA
                (0          << 24) |            // OEN
                (0          << 20) |            // WEA
                (0          << 16) |            // WEN
                (0          << 12) |            // CSA
                (0          << 11) |            // EBC
           //     (1          << 11) |            // EBC
                (6          <<  8) |            // DSZ
                (0          <<  6) |            // SP
                (0          <<  4) |            // WP
                (0          <<  1) |            // PA
                (1          <<  0);             // CSEN
    } 
    
    *(volatile U32*)WEIM_CS0U = nCsHi;
    *(volatile U32*)WEIM_CS0L = nCsLo;

    return bOnOff;
}


        
        
// ***************************************************************************
//
//  Function:       FlashWrite
//
//                  This function programs data into flash memory. It is 
//                  assumed that the memory has been erased before calling
//                  this function.
//
//
//  Parameters:     U32             sAddress        start address for write
//                  U32*     	    pData           data to write
//                  U32             nData        	number of words to write
//                  
//  Return Value:   U32             number of bytes written or zero on error
//
// ***************************************************************************

/*U32 FlashWrite(U32 sAddress, 
               void* pData, 
               U32 nData)*/

void FlashWrite(U32 sAddress, 
               U32* pData, 
               U32 nData)
{


    volatile U32*       pBase;				// base address of the selected memory bank		
    volatile U32*       pWalk;				// flash programming pointer
    U32*                pWalkSrc;			// ram source pointer
    BOOL                bFailTotal;
    BOOL                bDone;
    BOOL                bFail;
    U32                 nWalk;
    U32                 nPoll;
    U32                 nDone;
    U32 				nAddress;  
    U32   			 	i=0;

        // Check the Flash Starting Address
        pBase = (volatile U32*)(sAddress & 0xFE000000);

		// Reset flash devices before starting programming sequence
    	// ********************************************************
        *(pBase + 0x000) = 0x00f000f0;


    	// execute unlock bypass sequence 
    	// ******************************************
        *(pBase + 0x555) = 0x00aa00aa;
        *(pBase + 0x2aa) = 0x00550055;
        *(pBase + 0x555) = 0x00200020;

		 
 	// start the flash programming algorithm
 	// **********************************************
 		nWalk      = sAddress;
        pWalk      = (U32*) sAddress;
        pWalkSrc   = (U32*) pData;

        
//        nAddress = (((nData - 1) / sizeof(*pBase)) + 1) * sizeof(*pBase) + sAddress;
		nAddress = sAddress + sizeof(*pData)*(nData - 1);
		#ifdef DEBUG	
 		printf("\nProgramming at [0x%08X - 0x%08X]...\n", sAddress, nAddress);
 		#endif
 		
 		while (nWalk <= nAddress)
 		{

          i++;
          
          //i = write 32bit each time
          // "P" => 0x10000 * 32bit
          if( (i&0xFFFF) == 0 )
          {
          	#ifdef DEBUG
            printf("P");
            #endif
          }
          
          
 					
        
    // Execute unlock bypass program algorithm
    // ***************************************
    		*(pBase + 0x555) = 0x00a000a0;
    		*(pWalk)         = *(pWalkSrc);
            
    // Data polling algorithm for program operation
    // ********************************************
    		bDone = FALSE;
    		bFail = FALSE;
    		bFailTotal = FALSE;
    		
    		while ((!bDone) && (!bFail))
    		{	
    			nPoll = *(pWalk);
    		if (((nPoll ^ *(pWalkSrc)) & FLASH_DQ7_2X16) == 0)
    			{
                    bDone = TRUE;
                }
    			else if ((nPoll & FLASH_DQ5_2X16) == FLASH_DQ5_2X16)
    			{
    				nPoll = *(pWalk);
    				if (((nPoll ^ *(pWalkSrc)) & FLASH_DQ7_2X16) == 0)
    				{
    					bDone = TRUE;
    				}
    				else
    				{
    					bFail      = TRUE;
    					bFailTotal = TRUE;
    				}
    			}
    		}
    		if (bDone == TRUE)
    		{
    			nDone += sizeof(*pWalk);
    		}
    		
    		nWalk += sizeof(*pWalk);
    		pWalk++;
    		pWalkSrc++;
    	}
    	
    	// Cancel unlock bypass mode
        // ************************************************
        *(pBase + 0x000) = 0x00900090;
       	*(pBase + 0x000) = 0x00000000;


        // Reset flash devices
        // *******************
        *(pBase + 0x000) = 0x00f000f0;
        #ifdef DEBUG
        printf("\nFlash Write Complete\n");
        #endif
        
//        return bFailTotal ? 0 : nDone;
}


// ***************************************************************************
//
//  Function:       FlashChipErase
//
//                  This function erases all flash memory sectors 
//
//
//  Parameters:     U32             sAddress        start address for erase
//
//  Return Value:   BOOL           	chip erase success?
//                                  
//
// ***************************************************************************
BOOL FlashChipErase(U32 sAddress)
{
    volatile U32*       pBase;
    BOOL               	bDone;
    BOOL                bFail;
    U32                 nPoll;
    U32					i = 0;

        // Check the Flash Starting Address
        pBase = (volatile U32*)(sAddress & 0xFE000000);
    			
		// Reset flash devices before chip erase
		// ***************************************
		*(pBase + 0x000) = 0x00f000f0;

        // Execute "normal" chip erase algorithm
        // ***************************************
        *(pBase + 0x555) = 0x00aa00aa;
        *(pBase + 0x2aa) = 0x00550055;
        *(pBase + 0x555) = 0x00800080;
        *(pBase + 0x555) = 0x00aa00aa;
        *(pBase + 0x2aa) = 0x00550055;
        *(pBase + 0x555) = 0x00100010;

		#ifdef DEBUG
		printf("Chip Erasing...\n");
		#endif
		
        // Data polling algorithm for erase operation
        // ******************************************
        bDone = FALSE;
        bFail = FALSE;

        while ((!bDone) && (!bFail))
        {
        	i++;
        	if ((i & 0xFFFF) == 0)
        	{
        		#ifdef DEBUG
        		printf(".");
        		#endif
        	}
            nPoll = *(pBase);
            if (((~nPoll) & FLASH_DQ7_2X16) == 0)
            {
                bDone = TRUE;
            }
            else if ((nPoll & FLASH_DQ5_2X16) == FLASH_DQ5_2X16)
            {
                nPoll = *(pBase);
                if (((~nPoll) & FLASH_DQ7_2X16) == 0)
                {
                    bDone = TRUE;
                }
                else
                {
                    bFail      = TRUE;
                }
            }

        }


        // Reset flash evices
        // *******************
        *(pBase + 0x000) = 0x00f000f0;
        
        #ifdef DEBUG
        printf("\nChip Erase Complete\n");
		#endif
		
    return bFail;
}


// ***************************************************************************
//
//  Function:       FlashSectorErase

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品亲子伦对白| 国产高清在线精品| 亚洲激情校园春色| 亚洲视频香蕉人妖| 最新不卡av在线| 中文字幕亚洲一区二区av在线| 久久精品夜夜夜夜久久| 日韩欧美一区二区在线视频| 欧美一卡2卡3卡4卡| 欧美一区二区三区视频在线 | 亚洲美腿欧美偷拍| 国产精品黄色在线观看| 国产精品对白交换视频| 国产精品久久久久国产精品日日 | 亚洲一二三四区| 亚洲久本草在线中文字幕| 亚洲视频电影在线| 亚洲成国产人片在线观看| 日韩精品久久久久久| 麻豆精品视频在线观看视频| 经典三级一区二区| 国产精品一区三区| 99re热这里只有精品视频| 色婷婷综合久久久中文字幕| 91麻豆精品国产| 精品久久久久久综合日本欧美 | 国产精品久久久久婷婷二区次| 国产精品免费网站在线观看| 一区二区三区在线看| 日韩电影免费在线看| 国产99一区视频免费| 91色视频在线| 91精品国产综合久久久久久漫画 | 91在线精品一区二区三区| 在线免费观看视频一区| 91精品国产日韩91久久久久久| 久久看人人爽人人| 一区二区三区在线视频免费| 经典三级在线一区| 在线观看亚洲成人| 国产亚洲一区二区在线观看| 亚洲一区二区不卡免费| 国产一区二区0| 欧美日韩一区二区三区四区五区| 精品久久久久久久久久久院品网| 亚洲视频一区在线观看| 精品在线观看免费| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | xfplay精品久久| 一区二区三区鲁丝不卡| 国产成人啪午夜精品网站男同| 欧美精选在线播放| 亚洲女爱视频在线| 国产成人免费xxxxxxxx| 91精品国产综合久久久久久久| 亚洲欧美影音先锋| 国产精品自拍一区| 欧美sm极限捆绑bd| 日本欧洲一区二区| 欧美丝袜丝交足nylons| 自拍视频在线观看一区二区| 国产麻豆成人精品| 日韩三级av在线播放| 午夜精品视频在线观看| 日本久久电影网| 国产精品剧情在线亚洲| 成人做爰69片免费看网站| 久久久久久一二三区| 麻豆91在线播放免费| 91精品国产手机| 五月天激情综合网| 欧美日韩国产高清一区二区三区 | 偷窥国产亚洲免费视频| 在线免费观看不卡av| 中文字幕在线免费不卡| 成人美女视频在线看| 国产欧美va欧美不卡在线| 国产一区二区伦理片| 国产亚洲成av人在线观看导航 | 国产精品蜜臀在线观看| 丁香桃色午夜亚洲一区二区三区| 精品成人一区二区三区四区| 精东粉嫩av免费一区二区三区| 精品精品国产高清a毛片牛牛 | 怡红院av一区二区三区| av在线不卡免费看| 亚洲男人的天堂网| 欧美三级一区二区| 日韩激情一二三区| 精品久久久久一区| 国产69精品一区二区亚洲孕妇| 中文天堂在线一区| 色婷婷亚洲婷婷| 午夜精品福利视频网站 | 免费欧美在线视频| 精品国产99国产精品| 国产suv一区二区三区88区| 亚洲四区在线观看| 欧美日韩亚洲综合一区二区三区| 日韩精品一卡二卡三卡四卡无卡| 欧美一区二区女人| 高清日韩电视剧大全免费| 一区在线播放视频| 欧美精品久久99久久在免费线| 久久99久久99小草精品免视看| 国产人成一区二区三区影院| 色综合久久久久综合体桃花网| 日韩高清在线一区| 欧美激情一区在线观看| 在线观看亚洲成人| 国产一区二区电影| 亚洲.国产.中文慕字在线| 精品欧美一区二区久久| av一区二区不卡| 麻豆91免费看| 一区二区三区在线免费视频| 欧美精品一区二区三区很污很色的| www.欧美日韩| 亚洲丶国产丶欧美一区二区三区| 国产亚洲福利社区一区| 91精品一区二区三区久久久久久 | 亚洲综合色成人| 2024国产精品| 欧洲亚洲国产日韩| 99在线热播精品免费| 天天色图综合网| 国产精品久久毛片av大全日韩| 欧美一级国产精品| 日本高清不卡一区| 岛国一区二区三区| 美国毛片一区二区| 亚洲成人自拍网| 欧美国产丝袜视频| 日韩久久久精品| 欧美视频一区二区三区在线观看 | 色妞www精品视频| 国产精品亚洲一区二区三区在线| 日韩激情视频网站| 婷婷中文字幕综合| 一区二区三区小说| ...xxx性欧美| 欧美国产日本视频| 久久久久亚洲综合| 久久综合色之久久综合| 日韩午夜在线观看| 91精品国产综合久久久久久 | 美女视频黄频大全不卡视频在线播放| 亚洲人午夜精品天堂一二香蕉| 亚洲国产精品激情在线观看| 精品不卡在线视频| 亚洲精品在线三区| 欧美成人免费网站| 欧美不卡视频一区| 欧美成人三级在线| 337p日本欧洲亚洲大胆精品| 欧美一级一区二区| 日韩午夜精品视频| 欧美刺激脚交jootjob| 精品国产一区二区三区四区四 | 中文字幕一区二区三区乱码在线| 久久亚洲精精品中文字幕早川悠里| 日韩视频免费直播| 26uuu色噜噜精品一区二区| 精品国产亚洲一区二区三区在线观看| 日韩视频一区二区在线观看| 欧美大片日本大片免费观看| 精品少妇一区二区| 久久久天堂av| 国产精品女主播在线观看| 国产精品毛片a∨一区二区三区| 国产精品久久夜| 一个色综合av| 奇米影视7777精品一区二区| 麻豆成人91精品二区三区| 国产sm精品调教视频网站| 91亚洲永久精品| 欧美精品v日韩精品v韩国精品v| 精品日本一线二线三线不卡| 亚洲国产精品t66y| 亚洲综合在线免费观看| 首页欧美精品中文字幕| 国内国产精品久久| 成人aa视频在线观看| 欧美视频一二三区| 欧美www视频| 亚洲欧洲另类国产综合| 亚洲一级二级在线| 国产激情一区二区三区桃花岛亚洲| 粉嫩高潮美女一区二区三区| 欧美午夜在线一二页| 欧美精品一区视频| 一区二区三区影院| 国产乱理伦片在线观看夜一区| 色猫猫国产区一区二在线视频| 欧美一级欧美三级| 亚洲精品国产一区二区精华液| 久久精品国产99国产| 在线观看日韩毛片| 久久久久久麻豆| 肉丝袜脚交视频一区二区|