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

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

?? amd29f016.c

?? Coldfire MCF5282 DBug bootloader
?? C
字號:
/*
 * File:		amd29f016.c
 * Purpose:		Device driver for the AMD 29F016 Flash.
 *
 * Notes:       This driver supports a single type (AMD29F016) and
 *              width of FLASH.  The width support is done during
 *              compilation.  It can support multiple banks of
 *              same-width ADM29F016 FLASH.
 *
 *              If different types and width of FLASH are required,
 *              see driver amd29f0x0.c.
 *
 * Author:		Eric DeVolder
 * Date:		12-3-95
 *
 * Modifications:
 *
 */

#include "src/include/dbug.h"
#include "src/dev/flash/amd29f016.h"

/*
 * The AMD29F016 FLASH devices.  These devices are 2M x 8 devices.
 *
 * Note:  This driver supports one of the following configurations
 * for these devices.  Possible configurations are:
 *
 *      1 AMD29F016  as a single  8-bit memory device
 *      2 AMD29F016s as a single 16-bit memory device
 *      4 AMD29F016s as a single 32-bit memory device
 *
 * One of the following C pre-processor define statements must
 * exist prior to compilation:
 *
 * #define AMD29F016_8BIT_WIDE
 * #define AMD29F016_16BIT_WIDE
 * #define AMD29F016_32BIT_WIDE
 *
 * IMPORTANT:  It is not possible to execute any of these routines
 * if the code for these routines is in the FLASH itself.  This is
 * because these routines change the mode of the device so that reads
 * from it are not always possible.  The code must be executed out of
 * DRAM.
 */

/*
 * WARNING:  To eliminate playing alot of games with the linker
 * to properly treat this PIC driver, the two routines/symbols
 * amd29f016_start and amd29f016_end are used to determine the 
 * start and end of the FLASH PIC driver in ROM/FLASH so that it
 * can be copied out to DRAM and then executed.  In other words,
 * any modifications/additions must be between these two functions!
 */
/*****************************************************************/
void
amd29f016_start (void)
{
}

/*****************************************************************/
void
amd29f016_read (AMD29F016 *amd29f016)
{
	/*
	 * This routine places the FLASH in the read/reset mode.
	 */
	amd29f016->device.cmdreg1 = AMD29F016_READ_CMD1;
	amd29f016->device.cmdreg2 = AMD29F016_READ_CMD2;
	amd29f016->device.cmdreg1 = AMD29F016_READ_CMD3;
}

/*****************************************************************/
int
amd29f016_sector_erase (AMD29F016 *amd29f016, AMD29F016_SECTOR sector)
{
	/*
	 * This routine erases one sector in the FLASH.
	 */
	AMD29F016_CELL	*s;

	/*
	 * Point to beginning of the desired sector
	 */
	s = (AMD29F016_CELL *)&(amd29f016->sector[sector]);

	/*
	 * Perform the Sector Erase command sequence.
	 */
	amd29f016->device.cmdreg1 = AMD29F016_SECTORERASE_CMD1;
	amd29f016->device.cmdreg2 = AMD29F016_SECTORERASE_CMD2;
	amd29f016->device.cmdreg1 = AMD29F016_SECTORERASE_CMD3;
	amd29f016->device.cmdreg1 = AMD29F016_SECTORERASE_CMD4;
	amd29f016->device.cmdreg2 = AMD29F016_SECTORERASE_CMD5;
	*s = AMD29F016_SECTORERASE_CMD6;

	/*
	 * Wait for the device to erase the sector
	 */

	while ((*s & AMD29F016_SECTORERASE_DONE) != AMD29F016_SECTORERASE_DONE)
		;

	/*
	 * Place the device back in the Read/Reset mode.
	 */
	amd29f016_read (amd29f016);

	return 1;
}


/*****************************************************************/
int
amd29f016_id (AMD29F016 *amd29f016)
{
	/*
	 * This routine extracts from the FLASH the manufacturer and
	 * and device code.  If the codes match those for the AMD29F016,
	 * then 1 is returned, else 0.
	 */
	volatile unsigned int manuf, device;

	/*
	 * Perform the Autoselect command sequence.
	 */
	amd29f016->device.cmdreg1 = AMD29F016_AUTOSELECT_CMD1;
	amd29f016->device.cmdreg2 = AMD29F016_AUTOSELECT_CMD2;
	amd29f016->device.cmdreg1 = AMD29F016_AUTOSELECT_CMD3;

	/*
	 * Read the manufacturer and device id codes.
	 */
	manuf = amd29f016->device.manuf;
	device = amd29f016->device.id;

	/*
	 * Place the device back in the Read/Reset mode.
	 */
	amd29f016_read (amd29f016);

	/*
	 * Determine if an AMD29F016 or not.
	 */
	if (device == AMD29F016_DEVICE_CODE)
		return TRUE;
	else
		return FALSE;
}


/*****************************************************************/
int
amd29f016_write (AMD29F016 *amd29f016,
	void *data, unsigned length, AMD29F016_SECTOR sector, void (*func)(void))
{
	/*
	 * This routine programs the device beginning at 'sector' with
	 * 'data' for 'length' bytes.  This routine is capable of
	 * programming multiple consecutive sectors.
	 */
	int index, written, done;
	AMD29F016_CELL *source;
	AMD29F016_CELL *target;
	AMD29F016_CELL rdata;

	/*
	 * Step 1)  ID the flash as a AMD29F016.
	 */
	if (!amd29f016_id(amd29f016))
		return 0;

	/*
	 * Step 2)  Point to the beginning sector.
	 */
	target = (AMD29F016_CELL *)&(amd29f016->sector[sector]);

	source = (AMD29F016_CELL *)data;

	done = 0;
	written = 0;
	while (!done)
	{
		/*
		 * Step 3)  Erase the sector.
		 */
		if (!amd29f016_sector_erase (amd29f016, sector))
			return -1;

		/*
		 * Step 5)  Program the FLASH with the sector(s) contained in RAM.
		 */
		for (index = 0; (index < AMD29F016_SECTOR_SIZE) && (written < length);
			++index)
		{
			/*
			 * Perform the Byte Program command sequence.
			 */
			amd29f016->device.cmdreg1 = AMD29F016_BYTEPROG_CMD1;
			amd29f016->device.cmdreg2 = AMD29F016_BYTEPROG_CMD2;
			amd29f016->device.cmdreg1 = AMD29F016_BYTEPROG_CMD3;
			*target = *source;

			/*
			 * Poll to make sure it is done before continuing...
			 */
			while (1)
			{
				int timeouts;

				timeouts = 0;

				rdata = *(AMD29F016_CELL *)target;

				if ((rdata & AMD29F016_DATA_POLL_MASK) ==
					(*source & AMD29F016_DATA_POLL_MASK))
				{
					break;
				}
				else
				{
					rdata = *(AMD29F016_CELL *)target;

					if (rdata & AMD29F016_TIME_EXCEEDED)
					{
						rdata = *(AMD29F016_CELL *)target;

						if ((rdata & AMD29F016_DATA_POLL_MASK) ==
							(*source & AMD29F016_DATA_POLL_MASK))
						{
							break;
						}

						if (++timeouts > 1024)
						{
							break;
						}
					}
				}
			}

			/*
			 * Verify write and increment bytes written counter.
			 */
			if (*target == *source)
			{
				written += sizeof(AMD29F016_CELL);

				++target;
				++source;
			}
			else
			{
				done = 1;
				break;
			}
		}

		if (++sector >= AMD29F016_SECTORS)
			done = 1;

		if (written >= length)
			done = 1;
	}

	/*
	 * Step 6)  Place the device back in the read mode.
	 */
	amd29f016_read (amd29f016);

	if (func != NULL)
	{
		func();
	}

	return written;
}

void
amd29f016_end(void)
{
	/*
	 * This function is empty and at the END of all code so that it
	 * can be used to compute the size of the code contained in this
	 * driver.
 	 */
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合天天综合网天天看片| 欧美成人性战久久| 国产精品网站在线观看| 精品一区二区三区免费毛片爱 | 91碰在线视频| 不卡影院免费观看| 久久久亚洲午夜电影| 极品销魂美女一区二区三区| 欧美mv日韩mv国产网站app| 精油按摩中文字幕久久| 日韩三级av在线播放| 久久99国产精品尤物| 国产亚洲综合在线| 色综合久久99| 肉肉av福利一精品导航| 精品国产污污免费网站入口| 国产精品白丝jk白祙喷水网站| 中文一区二区在线观看| 色哟哟一区二区三区| 久久超级碰视频| 亚洲欧洲日韩一区二区三区| 91久久线看在观草草青青| 午夜精品爽啪视频| 国产精品久久一级| 日本福利一区二区| 国产一区欧美一区| 一区二区三区中文字幕精品精品| 欧美群妇大交群的观看方式| 久久福利资源站| 亚洲亚洲精品在线观看| 久久久综合网站| 3751色影院一区二区三区| 成人在线视频首页| 久久66热偷产精品| 丝袜美腿成人在线| 一区二区三区精品在线观看| 久久久五月婷婷| 91精品欧美一区二区三区综合在| 国产成人福利片| 狠狠色丁香婷综合久久| 日韩精品亚洲专区| 天堂蜜桃91精品| 亚洲午夜羞羞片| 亚洲va国产天堂va久久en| 中文字幕视频一区| 亚洲激情自拍偷拍| 亚洲精品乱码久久久久久黑人| 久久日韩粉嫩一区二区三区| 日韩三级视频在线观看| 欧美精品 国产精品| 欧美日韩成人综合天天影院 | 亚洲婷婷在线视频| 中文成人综合网| 国产精品久久午夜夜伦鲁鲁| 国产亚洲精品中文字幕| 欧美激情一区二区三区蜜桃视频| 日韩欧美在线一区二区三区| 欧美tk—视频vk| 国产亚洲1区2区3区| 久久久精品蜜桃| 国产精品九色蝌蚪自拍| 亚洲欧美区自拍先锋| 亚洲成人免费看| 久久99精品久久久久久| 处破女av一区二区| 欧洲人成人精品| 欧美精品一区二区久久久| 久久精品欧美一区二区三区不卡| 国产精品美女久久久久久| 亚洲乱码一区二区三区在线观看| 午夜影视日本亚洲欧洲精品| 丝袜a∨在线一区二区三区不卡| 蜜臀久久久久久久| 波多野结衣91| 日韩亚洲欧美高清| 国产精品入口麻豆九色| 五月天婷婷综合| 99r精品视频| 欧美成人乱码一区二区三区| 国产精品久久久久久久久久免费看| 亚洲一二三四久久| 成人18视频日本| 日韩美女视频一区二区在线观看| 亚洲视频一区二区在线| 看片网站欧美日韩| 9191精品国产综合久久久久久| 中文av一区二区| 国内不卡的二区三区中文字幕| 色丁香久综合在线久综合在线观看| 久久综合久久久久88| 日韩精品午夜视频| 91精品国产一区二区三区蜜臀| 亚洲视频资源在线| 92精品国产成人观看免费| 久久久99久久精品欧美| 国产在线视频精品一区| 日韩免费一区二区三区在线播放| 亚洲精品高清在线| 色婷婷av一区二区三区软件| 国产欧美综合在线观看第十页 | 成人性色生活片| 国产女人18毛片水真多成人如厕 | 色久综合一二码| 亚洲精品视频在线观看网站| 波波电影院一区二区三区| 国产日韩欧美制服另类| 国产乱码精品一区二区三区忘忧草| 日韩女优电影在线观看| 国产做a爰片久久毛片 | 色婷婷久久一区二区三区麻豆| 亚洲视频一区二区免费在线观看| 95精品视频在线| 香蕉乱码成人久久天堂爱免费| 欧美日韩大陆一区二区| 日本亚洲电影天堂| 久久久久久电影| 99热99精品| 日韩高清在线电影| 中文字幕乱码日本亚洲一区二区| 一本色道久久加勒比精品| 美女精品自拍一二三四| 国产精品国产三级国产aⅴ无密码| 一本一本大道香蕉久在线精品| 一区二区三区毛片| 国产欧美久久久精品影院| 欧美日韩免费一区二区三区| 日本女优在线视频一区二区| 国产精品天天看| 日韩欧美一区二区三区在线| caoporen国产精品视频| 美女在线一区二区| 亚洲精品国产无天堂网2021| 2023国产精品| 欧美一区二区三区在线看| av电影一区二区| 粉嫩av亚洲一区二区图片| 日本欧美久久久久免费播放网| 综合久久久久久久| 国产精品日产欧美久久久久| 欧美一区二区三区免费观看视频| 91麻豆精品一区二区三区| 国产精品1区二区.| 国产综合久久久久久久久久久久| 亚洲国产精品欧美一二99| 亚洲人妖av一区二区| 欧美国产日韩一二三区| 亚洲精品一区二区三区蜜桃下载| 6080午夜不卡| 日韩欧美一区在线| 精品久久国产字幕高潮| 精品久久一区二区三区| 久久久久国产免费免费| 久久亚洲综合av| 亚洲国产岛国毛片在线| 国产精品国产三级国产普通话三级| 中文字幕第一区二区| 国产精品乱码一区二三区小蝌蚪| 中文字幕欧美日韩一区| 亚洲欧美一区二区在线观看| 自拍偷拍亚洲欧美日韩| 亚洲一区二区在线视频| 亚洲h精品动漫在线观看| 日本不卡在线视频| 国产一区二区中文字幕| 99精品偷自拍| 欧美久久久久久久久中文字幕| 777久久久精品| 国产校园另类小说区| 亚洲国产日韩精品| 国产乱人伦偷精品视频免下载| 国产成人午夜99999| 欧美日韩五月天| 国产清纯在线一区二区www| 夜夜揉揉日日人人青青一国产精品| 偷窥少妇高潮呻吟av久久免费| 国产久卡久卡久卡久卡视频精品| 97久久久精品综合88久久| 欧美妇女性影城| 亚洲三级免费观看| 丁香婷婷综合激情五月色| 717成人午夜免费福利电影| 亚洲三级电影全部在线观看高清| 视频在线在亚洲| 色激情天天射综合网| 欧美激情一二三区| 久久国产精品99久久久久久老狼| 在线视频一区二区三| 中文字幕精品三区| 国产福利精品导航| 精品国产精品一区二区夜夜嗨| 午夜a成v人精品| 欧美视频你懂的| 一区二区三区欧美激情| 91视频国产观看| 亚洲视频免费在线| 色偷偷一区二区三区| 国产精品三级视频| 91在线观看视频| 亚洲一区二区黄色| 91精品一区二区三区久久久久久|