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

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

?? nand.c

?? TI DM6446 EVM 串口下載程序 使用環境:windows dos環境或者linux 使用前需安裝mono
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* --------------------------------------------------------------------------
    FILE        : nand.c 				                             	 	        
    PURPOSE     : NAND driver file
    PROJECT     : DaVinci User Boot-Loader and Flasher
    AUTHOR      : Daniel Allred
    DATE	    : Jan-22-2007
 
    HISTORY
 	     v1.0 completion 							 						      
 	          Daniel Allred - Jan-22-2007
 ----------------------------------------------------------------------------- */

#ifdef UBL_NAND

#include "ubl.h"
#include "dm644x.h"
#include "uart.h"
#include "nand.h"

static Uint8 gNandTx[MAX_PAGE_SIZE] __attribute__((section(".ddrram2")));
static Uint8 gNandRx[MAX_PAGE_SIZE] __attribute__((section(".ddrram2")));

// Symbol from linker script
extern Uint32 __NANDFlash;

// structure for holding details about the NAND device itself
volatile NAND_INFO gNandInfo;

// Table of ROM supported NAND devices
const NAND_DEVICE_INFO gNandDevInfo[] = 
{ // devID, numBlocks,  pagesPerBlock,  bytesPerPage
    {0x6E,  256,        16,             256+8},     /* 1 MB */
    {0x68,  256,        16,             256+8},     /* 1 MB */
    {0xEC,  256,        16,             256+8},     /* 1 MB */
    {0xE8,  256,        16,             256+8},     /* 1 MB */
    {0xEA,  512,        16,             256+8},     /* 2 MB */
    {0xE3,  512,        16,             512+16},	/* 4 MB */
    {0xE5,  512,        16,             512+16},	/* 4 MB */
    {0xE6,  1024,	    16,             512+16},	/* 8 MB */
    {0x39,  1024,   	16,             512+16},	/* 8 MB */
    {0x6B,  1024,       16,             512+16},	/* 8 MB */
    {0x73,  1024,       32,             512+16},	/* 16 MB */
    {0x33,  1024,       32,             512+16},	/* 16 MB */
    {0x75,  2048,       32,             512+16},	/* 32 MB */
    {0x35,  2048,       32,             512+16},	/* 32 MB */
    {0x43,  1024,       32,             512+16},    /* 16 MB 0x1243 */
    {0x45,  2048,       32,             512+16},    /* 32 MB 0x1245 */
    {0x53,  1024,       32,             512+16},    /* 16 MB 0x1253 */
    {0x55,  2048,       32,             512+16},    /* 32 MB 0x1255 */
    {0x36,  4096,       32,             512+16},	/* 64 MB */
    {0x46,  4096,       32,             512+16},    /* 64 MB 0x1346 */
    {0x56,  4096,       32,             512+16},    /* 64 MB 0x1356 */
    {0x76,  4096,       32,             512+16},	/* 64 MB */
    {0x74,  8192,       32,             512+16},    /* 128 MB 0x1374 */
    {0x79,  8192,       32,             512+16},	/* 128 MB */
    {0x71,  16384,      32,             512+16},	/* 256 MB */
    {0xF1,  1024,       64,             2048+64},   /* 128 MB - Big Block */
    {0xA1,  1024,       64,             2048+64},	/* 128 MB - Big Block */
    {0xAA,  2048,       64,             2048+64},	/* 256 MB - Big Block */
    {0xDA,  2048,       64,             2048+64},	/* 256 MB - Big Block */
    {0xDC,  4096,       64,             2048+64},	/* 512 MB - Big Block */
    {0xAC,  4096,       64,             2048+64},   /* 512 MB - Big Block */
    {0xB1,  1024,       64,             2048+64},   /* 128 MB - Big Block 0x22B1 */
    {0xC1,  1024,       64,             2048+64},   /* 128 MB - Big Block 0x22C1 */
    {0x00,	0,          0,              0}	        /* Dummy null entry to indicate end of table*/
};

VUint8 *flash_make_addr (Uint32 baseAddr, Uint32 offset)
{
	return ((VUint8 *) ( baseAddr + offset ));
}

void flash_write_data(PNAND_INFO pNandInfo, Uint32 offset, Uint32 data)
{
	volatile FLASHPtr addr;
	FLASHData dataword;
	dataword.l = data;

	addr.cp = flash_make_addr (pNandInfo->flashBase, offset);
	switch (pNandInfo->busWidth)
	{
	    case BUS_8BIT:
            *addr.cp = dataword.c;
            break;
        case BUS_16BIT:
            *addr.wp = dataword.w;
            break;
	}
}

void flash_write_cmd (PNAND_INFO pNandInfo, Uint32 cmd)
{
	flash_write_data(pNandInfo, NAND_CLE_OFFSET, cmd);
}

void flash_write_addr (PNAND_INFO pNandInfo, Uint32 addr)
{
	flash_write_data(pNandInfo, NAND_ALE_OFFSET, addr);
}

void flash_write_bytes(PNAND_INFO pNandInfo, void* pSrc, Uint32 numBytes)
{
    volatile FLASHPtr destAddr, srcAddr;
	Uint32 i;
	
	srcAddr.cp = (VUint8*) pSrc;
	destAddr.cp = flash_make_addr (pNandInfo->flashBase, NAND_DATA_OFFSET );
	switch (pNandInfo->busWidth)
	{
    case BUS_8BIT:
        for(i=0;i<( numBytes );i++)
	        *destAddr.cp = *srcAddr.cp++;
        break;
    case BUS_16BIT:
        for(i=0;i<( numBytes >> 1);i++)
	        *destAddr.wp = *srcAddr.wp++;
        break;
    }

}

void flash_write_addr_cycles(PNAND_INFO pNandInfo, Uint32 block, Uint32 page)
{
    flash_write_addr_bytes(pNandInfo, pNandInfo->numColAddrBytes, 0x00000000);
    flash_write_row_addr_bytes(pNandInfo, block, page);
}

void flash_write_addr_bytes(PNAND_INFO pNandInfo, Uint32 numAddrBytes, Uint32 addr)
{    
    Uint32 i;
    for (i=0; i<numAddrBytes; i++)
    {
        flash_write_addr(pNandInfo, ( (addr >> (8*i) ) & 0xff) );
	}
}

void flash_write_row_addr_bytes(PNAND_INFO pNandInfo, Uint32 block, Uint32 page)
{
    Uint32 row_addr;
	row_addr = (block << (pNandInfo->blkShift - pNandInfo->pageShift)) | page;
	flash_write_addr_bytes(pNandInfo, pNandInfo->numRowAddrBytes, row_addr);
}

Uint32 flash_read_data (PNAND_INFO pNandInfo)
{
	volatile FLASHPtr addr;
	FLASHData cmdword;
	cmdword.l = 0x0;

	addr.cp = flash_make_addr (pNandInfo->flashBase, NAND_DATA_OFFSET );
	switch (gNandInfo.busWidth)
	{
	    case BUS_8BIT:
            cmdword.c = *addr.cp;
            break;
        case BUS_16BIT:
            cmdword.w = *addr.wp;
            break;
	}
	return cmdword.l;
}

void flash_read_bytes(PNAND_INFO pNandInfo, void* pDest, Uint32 numBytes)
{
    volatile FLASHPtr destAddr, srcAddr;
	Uint32 i;
	
	destAddr.cp = (VUint8*) pDest;
	srcAddr.cp = flash_make_addr (pNandInfo->flashBase, NAND_DATA_OFFSET );
	switch (pNandInfo->busWidth)
	{
    case BUS_8BIT:
        for(i=0;i<( numBytes );i++)
	        *destAddr.cp++ = *srcAddr.cp;
        break;
    case BUS_16BIT:
        for(i=0;i<( numBytes >> 1);i++)
	        *destAddr.wp++ = *srcAddr.wp;
        break;
    }
}

void flash_swap_data(PNAND_INFO pNandInfo, Uint32* data)
{
    Uint32 i,temp = *data;
    volatile FLASHPtr  dataAddr, tempAddr;
    
    dataAddr.cp = flash_make_addr((Uint32) data, 3);
    tempAddr.cp = flash_make_addr((Uint32) &temp,0);
        
    switch (gNandInfo.busWidth)
	{
    case BUS_8BIT:
        for(i=0; i<4; i++)
	        *dataAddr.cp-- = *tempAddr.cp++;
        break;
    case BUS_16BIT:
        for(i=0; i<2; i++)
	        *dataAddr.wp-- = *tempAddr.wp++;
        break;
    }
}

// Poll bit of NANDFSR to indicate ready
Uint32 NAND_WaitForRdy(Uint32 timeout) {
	VUint32 cnt;
	cnt = timeout;

	waitloop(200);

	while( !(AEMIF->NANDFSR & NAND_NANDFSR_READY) && ((cnt--) > 0) )

    if(cnt == 0)
	{
		UARTSendData((Uint8 *)"NANDWaitForRdy() Timeout!\n", FALSE);
		return E_FAIL;
	}

    return E_PASS;
}


// Wait for the status to be ready in NAND register
//      There were some problems reported in DM320 with Ready/Busy pin
//      not working with all NANDs. So this check has also been added.
Uint32 NAND_WaitForStatus(Uint32 timeout) {
	VUint32 cnt;
	Uint32 status;
	cnt = timeout;

    do
    {
	    flash_write_cmd((PNAND_INFO)&gNandInfo,NAND_STATUS);
	    status = flash_read_data((PNAND_INFO)&gNandInfo) & (NAND_STATUS_ERROR | NAND_STATUS_BUSY);
        cnt--;
  	}
  	while((cnt>0) && !status);

	if(cnt == 0)
	{
		UARTSendData((Uint8 *)"NANDWaitForStatus() Timeout!\n", FALSE);
		return E_FAIL;
	}

	return E_PASS;
}

// Read the current ECC calculation and restart process
Uint32 NAND_ECCReadAndRestart (PNAND_INFO pNandInfo)
{
    Uint32 retval;
    // Read and mask appropriate (based on CSn space flash is in) ECC regsiter
    retval = ((Uint32*)(&(AEMIF->NANDF1ECC)))[pNandInfo->CSOffset] & pNandInfo->ECCMask;
    // Write appropriate bit to start ECC calcualtions 
    AEMIF->NANDFCR |= (1<<(8 + (pNandInfo->CSOffset)));   
    return retval;
}

// Initialze NAND interface and find the details of the NAND used
Uint32 NAND_Init()
{
    Uint32 width, *CSRegs;
	UARTSendData((Uint8 *) "Initializing NAND flash...\r\n", FALSE);
	
    // Set NAND flash base address
    gNandInfo.flashBase = (Uint32) &(__NANDFlash);
    
    //Get the CSOffset (can be 0 through 3 - corresponds with CS2 through CS5)
    gNandInfo.CSOffset = (gNandInfo.flashBase >> 25) - 1;
    
    // Setting the nand_width = 0(8 bit NAND) or 1(16 bit NAND). AEMIF CS2 bus Width
	//   is given by the BOOTCFG(bit no.5)
    width = ( ( (SYSTEM->BOOTCFG) & 0x20) >> 5);
    gNandInfo.busWidth = (width)?BUS_16BIT:BUS_8BIT;

    // Setup AEMIF registers for NAND    
    CSRegs = (Uint32*) &(AEMIF->AB1CR);
    CSRegs[gNandInfo.CSOffset] = 0x3FFFFFFC | width;        // Set correct ABxCR reg
    AEMIF->NANDFCR |= (0x1 << (gNandInfo.CSOffset));        // NAND enable for CSx
    NAND_ECCReadAndRestart((PNAND_INFO)&gNandInfo); 
                         
	// Send reset command to NAND
	flash_write_cmd( (PNAND_INFO)&gNandInfo, NAND_RESET );

	if ( NAND_WaitForRdy(NAND_TIMEOUT) != E_PASS )
        return E_FAIL;
		
	return NAND_GetDetails();
}

// Get details of the NAND flash used from the id and the table of NAND devices
Uint32 NAND_GetDetails()
{
	Uint32 deviceID,i,j;
	
	// Issue device read ID command
    flash_write_cmd( (PNAND_INFO)&gNandInfo, NAND_RDID);
    flash_write_addr( (PNAND_INFO)&gNandInfo, NAND_RDIDADD);
    
	// Read ID bytes
	j        = flash_read_data( (PNAND_INFO)&gNandInfo ) & 0xFF;
	deviceID = flash_read_data( (PNAND_INFO)&gNandInfo ) & 0xFF;
	j        = flash_read_data( (PNAND_INFO)&gNandInfo ) & 0xFF;
	j        = flash_read_data( (PNAND_INFO)&gNandInfo ) & 0xFF;

	i=0;
	while (gNandDevInfo[i].devID != 0x00)
	{
		if(deviceID == gNandDevInfo[i].devID)
		{
			gNandInfo.devID             = (Uint8) gNandDevInfo[i].devID;
			gNandInfo.pagesPerBlock     = gNandDevInfo[i].pagesPerBlock;
			gNandInfo.numBlocks         = gNandDevInfo[i].numBlocks;
			gNandInfo.bytesPerPage      = NANDFLASH_PAGESIZE(gNandDevInfo[i].bytesPerPage);
			gNandInfo.spareBytesPerPage = gNandDevInfo[i].bytesPerPage - gNandInfo.bytesPerPage;
					
			// Assign the big_block flag
			gNandInfo.bigBlock = (gNandInfo.bytesPerPage == 2048)?TRUE:FALSE;
			
			// Setup address shift values	
			j = 0;
			while( (gNandInfo.pagesPerBlock >> j) > 1)
			{
				j++;
			}
			gNandInfo.blkShift = j;        
			gNandInfo.pageShift = (gNandInfo.bigBlock)?16:8;
			gNandInfo.blkShift += gNandInfo.pageShift;
			
			// Set number of column address bytes needed
			gNandInfo.numColAddrBytes = gNandInfo.pageShift >> 3;
			
			j = 0;
			while( (gNandInfo.numBlocks >> j) > 1)
			{
				j++;
			}
						
			// Set number of row address bytes needed
			if ( (gNandInfo.blkShift + j) <= 24 )
			{
			    gNandInfo.numRowAddrBytes = 3 - gNandInfo.numColAddrBytes;
			}
			else if ((gNandInfo.blkShift + j) <= 32)
			{
			    gNandInfo.numRowAddrBytes = 4 - gNandInfo.numColAddrBytes;
			}
			else
			{
			    gNandInfo.numRowAddrBytes = 5 - gNandInfo.numColAddrBytes;
			}
			
			// Set the ECC bit mask
			if (gNandInfo.bytesPerPage < 512)
			    gNandInfo.ECCMask = 0x07FF07FF;
			else

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一级在线观看| 亚洲国产色一区| 一区二区高清视频在线观看| 日韩精品福利网| 风流少妇一区二区| 在线播放欧美女士性生活| 中文天堂在线一区| 日韩高清国产一区在线| www.综合网.com| 精品久久久三级丝袜| 一区二区三区精密机械公司| 国产麻豆成人精品| 欧美喷潮久久久xxxxx| 亚洲欧美综合在线精品| 国产伦精一区二区三区| 91精品国产乱| 亚洲一二三四在线观看| 91在线观看视频| 国产欧美日韩亚州综合 | 美女脱光内衣内裤视频久久网站| a美女胸又www黄视频久久| 精品国产乱码久久久久久浪潮 | 老色鬼精品视频在线观看播放| 色欲综合视频天天天| 国产性天天综合网| 麻豆精品久久精品色综合| 欧美日韩一级片在线观看| 亚洲欧美日韩成人高清在线一区| 高清成人免费视频| 国产欧美一区二区在线| 国产精品一线二线三线精华| 精品美女在线播放| 另类成人小视频在线| 日韩欧美你懂的| 捆绑调教一区二区三区| 精品国产人成亚洲区| 麻豆精品久久久| 久久麻豆一区二区| 国产成人在线看| 国产精品久久久久久久岛一牛影视| 国产在线乱码一区二区三区| www国产精品av| 国产精品69毛片高清亚洲| 亚洲国产精品传媒在线观看| 国产成人精品综合在线观看| 国产精品对白交换视频 | 色老汉av一区二区三区| 亚洲影院久久精品| 欧美精品久久一区| 久久成人免费日本黄色| 日本一区二区不卡视频| 色成年激情久久综合| 日韩精品五月天| 欧美精品一区二区三区蜜臀| 成人av第一页| 午夜视频在线观看一区二区三区| 欧美一区二区视频网站| 国产麻豆精品久久一二三| 亚洲三级电影网站| 日韩一区二区三区三四区视频在线观看| 麻豆成人久久精品二区三区小说| 久久久久久久久久久久久女国产乱 | 久久久精品国产99久久精品芒果 | 日日骚欧美日韩| 久久综合国产精品| www.在线欧美| 欧美aaaaa成人免费观看视频| 国产亚洲精品aa| 欧美在线一区二区| 精品一区二区三区的国产在线播放 | 成人av在线播放网址| 亚洲一区二区三区在线看| 日韩欧美亚洲国产精品字幕久久久| 国产成人av影院| 香蕉久久一区二区不卡无毒影院 | 日韩一区二区电影| 成人激情动漫在线观看| 婷婷中文字幕综合| 国产丝袜欧美中文另类| 欧美日韩国产影片| 成人综合婷婷国产精品久久| 五月天国产精品| 国产精品久久久久影院| 日韩欧美精品在线视频| 在线日韩av片| 成人一区二区三区视频在线观看| 亚洲va欧美va国产va天堂影院| 国产精品麻豆99久久久久久| 91麻豆精品国产91久久久久久久久| 成人理论电影网| 久88久久88久久久| 天天射综合影视| 亚洲精选免费视频| 国产精品久久久久久久久免费相片 | 成人午夜碰碰视频| 免费看欧美女人艹b| 一区二区三区免费在线观看| 中文字幕av一区二区三区| 日韩一区二区免费在线观看| av午夜一区麻豆| 国产乱码精品一区二区三| 美洲天堂一区二卡三卡四卡视频| 亚洲欧美视频在线观看| 中文字幕的久久| 久久日韩粉嫩一区二区三区| 欧美一区二区三区的| 欧美性生活一区| aaa亚洲精品一二三区| 久久er99热精品一区二区| 亚洲va欧美va天堂v国产综合| 亚洲精品日日夜夜| 成人欧美一区二区三区1314| 国产精品久久影院| 国产精品久久久久婷婷二区次| 欧美v日韩v国产v| 日韩精品一区二区三区四区| 4438x亚洲最大成人网| 在线播放一区二区三区| 91麻豆精品国产自产在线| 欧美性猛交xxxxxx富婆| 欧美日韩免费一区二区三区视频| 欧美午夜不卡视频| 欧美日韩精品系列| 日韩欧美aaaaaa| wwwwxxxxx欧美| 中文字幕欧美日韩一区| 国产精品久久久久影院老司| 亚洲色图丝袜美腿| 亚洲狠狠爱一区二区三区| 性欧美大战久久久久久久久| 日本人妖一区二区| 久久97超碰色| 成人av免费在线| 在线中文字幕不卡| 欧美一区二区在线播放| 久久色成人在线| 中文字幕日韩欧美一区二区三区| 亚洲日本丝袜连裤袜办公室| 亚洲综合无码一区二区| 男男gaygay亚洲| 国产成人在线视频播放| 日本道色综合久久| 91精品啪在线观看国产60岁| 久久久久综合网| 亚洲伦在线观看| 麻豆成人久久精品二区三区小说| 国产精品一区二区久激情瑜伽| 色综合天天视频在线观看| 91精品国产91热久久久做人人| 久久综合久久综合久久| 亚洲女与黑人做爰| 久久99精品久久久久久| 99久久久精品| 欧美一级高清片在线观看| 国产亚洲人成网站| 午夜欧美2019年伦理| 国产成人一级电影| 在线一区二区三区四区五区| 精品国产乱码久久久久久老虎 | 亚洲国产精品一区二区久久恐怖片 | 天天色综合天天| 成人免费毛片高清视频| 欧美另类高清zo欧美| 国产精品理论在线观看| 奇米影视一区二区三区小说| a美女胸又www黄视频久久| 欧美成人官网二区| 一区二区三区视频在线看| 狠狠狠色丁香婷婷综合激情| 日本二三区不卡| 国产精品久久三| 久久激情五月婷婷| 欧美体内she精视频| 中文字幕成人在线观看| 久久成人精品无人区| 欧美视频你懂的| 亚洲三级电影网站| 国产91对白在线观看九色| 日韩一区二区免费视频| 亚洲乱码国产乱码精品精98午夜 | 精品国产乱码久久久久久久久| 一区二区三区不卡在线观看| 懂色av一区二区在线播放| 日韩一区二区免费高清| 日韩和欧美的一区| 欧美色图一区二区三区| 综合电影一区二区三区| 成人丝袜18视频在线观看| 精品国产乱码久久久久久夜甘婷婷| 丝袜a∨在线一区二区三区不卡| 99久久婷婷国产综合精品电影 | 国产精品久久久久一区二区三区共| 麻豆精品一二三| 正在播放亚洲一区| 亚洲高清不卡在线观看| 欧美日韩一二区| 五月婷婷另类国产| 欧美日韩国产首页| 五月激情六月综合| 欧美日韩成人综合|