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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美福利一区二区| 91伊人久久大香线蕉| 4438x成人网最大色成网站| 亚洲国产欧美日韩另类综合 | 在线精品亚洲一区二区不卡| 亚洲色图第一区| 欧美视频在线一区| 美女视频一区在线观看| 337p日本欧洲亚洲大胆色噜噜| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲免费伊人电影| 欧美日韩黄色一区二区| 国内精品免费**视频| 欧美高清一级片在线观看| 日本精品免费观看高清观看| 男女男精品视频| 国产精品久久久久久一区二区三区| 色噜噜狠狠一区二区三区果冻| 五月婷婷综合在线| 久久久蜜臀国产一区二区| eeuss鲁片一区二区三区在线看| 一级特黄大欧美久久久| 亚洲精品在线电影| 欧美在线综合视频| 国产一区二区三区精品视频| 亚洲精品一二三四区| 欧美一级夜夜爽| 91日韩一区二区三区| 久久av中文字幕片| 亚洲精品欧美激情| 久久综合成人精品亚洲另类欧美| 日本乱码高清不卡字幕| 国产一区二区三区免费观看| 亚洲一级二级三级| 国产精品素人视频| 91精品国产丝袜白色高跟鞋| av电影在线观看不卡| 久久精品国产免费| 亚洲一区av在线| 国产精品美女久久久久久久网站| 日韩一级欧美一级| 91视频在线观看| 国产成人免费高清| 久久精品国产亚洲aⅴ| 亚洲一卡二卡三卡四卡| 1024国产精品| 国产日产亚洲精品系列| 8x8x8国产精品| 日本道色综合久久| 成人夜色视频网站在线观看| 美女www一区二区| 亚洲二区在线视频| 亚洲视频1区2区| 国产精品系列在线| 欧美不卡在线视频| 欧美一个色资源| 欧美精品色一区二区三区| 91蝌蚪porny| 成人app网站| 不卡视频免费播放| 成人免费va视频| 国产99久久久久| 国产91在线观看| 国产一区二区免费视频| 狠狠色丁香久久婷婷综合丁香| 亚洲.国产.中文慕字在线| 亚洲午夜私人影院| 亚洲最新视频在线观看| 伊人开心综合网| 亚洲女子a中天字幕| 日韩美女视频一区| 亚洲天堂a在线| 最近日韩中文字幕| 亚洲精选视频在线| 国产亚洲一区二区三区四区| 天天射综合影视| 久久免费国产精品| 久久伊99综合婷婷久久伊| 欧美xxxx老人做受| 久久免费美女视频| 国产欧美中文在线| 国产精品乱码久久久久久| 中文字幕精品一区| 亚洲欧洲www| 亚洲色图.com| 亚洲一区成人在线| 日欧美一区二区| 精品一区二区三区在线观看 | 色婷婷亚洲精品| 色狠狠桃花综合| 欧美色综合网站| 欧美一区二区三区不卡| 久久一日本道色综合| 国产精品网站在线播放| 亚洲国产一区二区在线播放| 日韩1区2区3区| 国产91精品露脸国语对白| 97精品视频在线观看自产线路二| 91福利国产精品| 日韩精品一区二区三区中文不卡 | 国产精品天天摸av网| 亚洲精品少妇30p| 日韩国产欧美一区二区三区| 黄色日韩三级电影| 99re这里都是精品| 欧美一区二区女人| 国产欧美综合在线观看第十页| 一区二区欧美国产| 久久av资源网| 色视频成人在线观看免| 日韩一区国产二区欧美三区| 欧美经典三级视频一区二区三区| 亚洲图片欧美视频| 高清国产一区二区三区| 欧美日韩国产综合一区二区| 久久久久久毛片| 亚洲一二三级电影| 成人少妇影院yyyy| 91精品国产综合久久小美女| 国产精品久久精品日日| 麻豆精品一二三| 欧美亚洲精品一区| 中文字幕电影一区| 日本不卡一二三区黄网| 色综合一区二区| 精品国产一区二区三区不卡 | 国内精品国产成人国产三级粉色 | 色哟哟亚洲精品| 久久人人97超碰com| 午夜视黄欧洲亚洲| 97超碰欧美中文字幕| 精品国产乱码久久久久久夜甘婷婷| 亚洲伦理在线精品| 成人美女视频在线观看18| 精品美女在线播放| 丝袜美腿亚洲一区| 欧美午夜宅男影院| 亚洲欧美日韩电影| 国产成人精品aa毛片| 精品国产伦一区二区三区观看体验| 夜夜爽夜夜爽精品视频| 99久久免费国产| 国产日韩欧美在线一区| 久久精品国产99久久6| 欧美日韩高清不卡| 亚洲电影激情视频网站| 日本久久一区二区| 亚洲视频狠狠干| 91小视频在线免费看| 欧美极品少妇xxxxⅹ高跟鞋 | 精品日韩一区二区三区免费视频| 一区二区三区.www| 91色综合久久久久婷婷| 中日韩免费视频中文字幕| 国产成人精品1024| 国产欧美日韩一区二区三区在线观看 | 色哟哟一区二区三区| 欧美国产成人精品| 成人动漫一区二区三区| 欧美国产精品久久| 成人国产在线观看| 中文字幕在线不卡一区二区三区 | 亚洲另类在线制服丝袜| 99精品视频在线观看| 1024国产精品| 色婷婷av一区二区三区大白胸| 国产精品三级在线观看| 成人免费视频一区二区| 亚洲视频免费观看| 欧美图区在线视频| 日日夜夜一区二区| 日韩色在线观看| 国内一区二区视频| 亚洲国产精品精华液ab| 99久久伊人精品| 一区二区久久久久| 欧美喷水一区二区| 九九国产精品视频| 国产无人区一区二区三区| 丰满白嫩尤物一区二区| 亚洲色图欧美在线| 国产成人夜色高潮福利影视| 亚洲欧美一区二区在线观看| 欧美影院精品一区| 久久黄色级2电影| 欧美国产精品专区| 在线精品视频免费播放| 美日韩一级片在线观看| 欧美激情在线看| 欧美色窝79yyyycom| 免费日韩伦理电影| 国产精品毛片久久久久久| 日本精品视频一区二区| 久久精品噜噜噜成人av农村| 中文字幕不卡在线| 欧美日高清视频| 国产一区在线观看视频| 一区二区三区欧美日| 精品理论电影在线| 色欧美88888久久久久久影院|