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

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

?? flash.c

?? freescale mx21系列ARM芯片9328的WINCE5.0下的Nor Flash下載程序
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
// ***************************************************************************
//
//  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;

	U32 Flash_Write			= 0x27272727;
 
       // 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
            
            CheckFlashComplete(Flash_Write);
          }
          
          
 					
        
    // 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
//
//                  This function erases all flash memory sectors overlapping
//                  the address range specified in the parameters.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美xxxx老人做受| 丁香网亚洲国际| 亚洲欧洲日韩av| 欧美激情一区二区三区全黄| 久久精品人人爽人人爽| 欧美伦理电影网| 欧美色偷偷大香| 91精品国产高清一区二区三区| 在线观看国产一区二区| 欧美日韩久久一区二区| 91 com成人网| 欧美成人精品高清在线播放| 久久精品夜色噜噜亚洲aⅴ| 国产精品每日更新在线播放网址 | 国产精品激情偷乱一区二区∴| 欧美大片在线观看一区| 欧美哺乳videos| 国产精品无码永久免费888| 最新中文字幕一区二区三区| 亚洲国产成人91porn| 蜜桃精品在线观看| 国产成人午夜视频| 日本高清不卡视频| 欧美成人一区二区三区片免费| 精品国产sm最大网站免费看| 国产精品久久久久一区| 亚洲电影第三页| 国产真实精品久久二三区| 97国产一区二区| 欧美肥大bbwbbw高潮| 久久久91精品国产一区二区精品| 亚洲精品久久嫩草网站秘色| 久久国产福利国产秒拍| 色婷婷久久99综合精品jk白丝| 欧美一区日韩一区| 中文字幕一区二区三区四区不卡 | 国产精品视频一区二区三区不卡| 1024成人网| 秋霞影院一区二区| 91麻豆自制传媒国产之光| 欧美老肥妇做.爰bbww| 国产日产欧美一区二区三区| 天天综合色天天| 成人精品电影在线观看| 日韩精品一区二区三区老鸭窝| 中文字幕的久久| 免费视频最近日韩| 91色.com| 国产精品女主播在线观看| 日本不卡123| 欧美无乱码久久久免费午夜一区| 欧美国产精品专区| 激情五月激情综合网| 欧美丰满高潮xxxx喷水动漫| 尤物av一区二区| 成人精品在线视频观看| 精品国产乱子伦一区| 亚洲成人综合在线| 色婷婷综合久久久久中文一区二区 | 91麻豆产精品久久久久久 | 中文字幕一区二区不卡| 极品少妇xxxx偷拍精品少妇| 6080午夜不卡| 午夜精品久久久久久久久久| 欧美怡红院视频| 亚洲欧洲韩国日本视频| 高清不卡一区二区| 国产视频一区在线播放| 国产精品77777竹菊影视小说| 日韩一区二区三区视频在线观看 | 日韩一卡二卡三卡四卡| 午夜久久久久久电影| 欧美日韩一区二区在线观看| 一区二区在线观看免费视频播放| 99视频热这里只有精品免费| 国产欧美一区视频| 成人动漫一区二区在线| 中文字幕第一区综合| 99re在线精品| 亚洲一区在线播放| 欧美伊人久久久久久午夜久久久久| 一区二区三区色| 欧美日韩视频在线第一区| 午夜精品123| 日韩欧美黄色影院| 亚洲精品高清在线观看| 欧美伦理电影网| 经典三级在线一区| 国产精品久久久久婷婷二区次| 大美女一区二区三区| 国产精品乱人伦| 欧美在线三级电影| 麻豆国产91在线播放| 91精品国产综合久久国产大片| 久久97超碰国产精品超碰| 中文字幕乱码亚洲精品一区| 色综合一区二区三区| 国产精品白丝在线| 欧美顶级少妇做爰| 国产高清精品久久久久| 亚洲欧美区自拍先锋| 欧美浪妇xxxx高跟鞋交| 国产在线精品一区二区不卡了| 国产片一区二区三区| 欧美日韩一区二区不卡| 国产一区视频导航| 亚洲一线二线三线视频| 欧美一级片在线观看| www.日韩精品| 美女一区二区视频| 亚洲视频一二三区| 欧美不卡一区二区三区| 91免费版pro下载短视频| 毛片一区二区三区| 亚洲激情欧美激情| 26uuu国产在线精品一区二区| av中文字幕不卡| 久久 天天综合| 亚洲国产成人porn| 亚洲天堂a在线| 2021中文字幕一区亚洲| 欧美视频在线一区二区三区| 国产精品原创巨作av| 午夜激情久久久| 一区二区三区中文在线观看| 国产色产综合产在线视频| 欧美一区二区三区不卡| 91亚洲精品乱码久久久久久蜜桃| 精品一区二区三区在线观看| 亚洲国产aⅴ天堂久久| 中文字幕一区二区三区av| 日韩免费看网站| 91精品国产一区二区| 欧美日韩国产一二三| 91蜜桃婷婷狠狠久久综合9色| 国产精品一区二区你懂的| 日本人妖一区二区| 午夜久久久久久久久久一区二区| 亚洲欧洲精品天堂一级| 国产精品伦理一区二区| 久久精品亚洲精品国产欧美| 日韩欧美美女一区二区三区| 777色狠狠一区二区三区| 日本韩国精品一区二区在线观看| 欧美久久久久久久久| 国内精品嫩模私拍在线| 中文字幕一区二区三区蜜月| 欧美一区二区三区在线| 欧美日韩国产综合一区二区| 99久久精品免费精品国产| 国产69精品一区二区亚洲孕妇| 精品在线免费视频| 国内成人自拍视频| 日韩欧美国产小视频| 欧美mv和日韩mv国产网站| 日韩一本二本av| 精品国产露脸精彩对白| 久久久久久久久久看片| 精品国产乱码久久久久久蜜臀| 精品少妇一区二区三区在线播放| 欧美xxxxxxxx| 久久精品一二三| 最近日韩中文字幕| 亚洲免费av网站| 国产精品无码永久免费888| 中文字幕av一区二区三区高 | 麻豆极品一区二区三区| 久久国产精品99精品国产| 国产激情一区二区三区| 免费一级欧美片在线观看| 久久国产麻豆精品| 成人免费毛片嘿嘿连载视频| 一本色道久久综合亚洲精品按摩| 91啪亚洲精品| 欧美一区二区黄| 国产欧美一区视频| 亚洲一二三区在线观看| 麻豆精品久久精品色综合| 岛国精品在线观看| 欧美精品色一区二区三区| 久久久久久影视| 一区二区三区产品免费精品久久75| 亚洲韩国一区二区三区| 国内精品国产三级国产a久久| 99在线精品一区二区三区| 欧美日韩激情一区二区| 久久综合国产精品| 亚洲综合视频在线| 国产精品1024| 欧美裸体bbwbbwbbw| 国产精品女同互慰在线看| 亚洲超碰精品一区二区| 国产精品996| 欧美老女人在线| 亚洲男人的天堂av| 精品在线播放免费| 欧美伊人久久久久久久久影院 | 精品视频资源站| 国产日韩精品一区二区三区在线| 亚洲丰满少妇videoshd|