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

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

?? atmel.c

?? 最新版的u-boot,2008-10-18發布
?? C
字號:
/* * Atmel SPI DataFlash support * * Copyright (C) 2008 Atmel Corporation */#define DEBUG#include <common.h>#include <malloc.h>#include <spi_flash.h>#include "spi_flash_internal.h"/* AT45-specific commands */#define CMD_AT45_READ_STATUS		0xd7#define CMD_AT45_ERASE_PAGE		0x81#define CMD_AT45_LOAD_PROG_BUF1		0x82#define CMD_AT45_LOAD_BUF1		0x84#define CMD_AT45_LOAD_PROG_BUF2		0x85#define CMD_AT45_LOAD_BUF2		0x87#define CMD_AT45_PROG_BUF1		0x88#define CMD_AT45_PROG_BUF2		0x89/* AT45 status register bits */#define AT45_STATUS_P2_PAGE_SIZE	(1 << 0)#define AT45_STATUS_READY		(1 << 7)/* DataFlash family IDs, as obtained from the second idcode byte */#define DF_FAMILY_AT26F			0#define DF_FAMILY_AT45			1#define DF_FAMILY_AT26DF		2	/* AT25DF and AT26DF */struct atmel_spi_flash_params {	u8		idcode1;	/* Log2 of page size in power-of-two mode */	u8		l2_page_size;	u8		pages_per_block;	u8		blocks_per_sector;	u8		nr_sectors;	const char	*name;};struct atmel_spi_flash {	const struct atmel_spi_flash_params *params;	struct spi_flash flash;};static inline struct atmel_spi_flash *to_atmel_spi_flash(struct spi_flash *flash){	return container_of(flash, struct atmel_spi_flash, flash);}static const struct atmel_spi_flash_params atmel_spi_flash_table[] = {	{		.idcode1		= 0x28,		.l2_page_size		= 10,		.pages_per_block	= 8,		.blocks_per_sector	= 32,		.nr_sectors		= 32,		.name			= "AT45DB642D",	},};static int at45_wait_ready(struct spi_flash *flash, unsigned long timeout){	struct spi_slave *spi = flash->spi;	unsigned long timebase;	int ret;	u8 cmd = CMD_AT45_READ_STATUS;	u8 status;	timebase = get_timer(0);	ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);	if (ret)		return -1;	do {		ret = spi_xfer(spi, 8, NULL, &status, 0);		if (ret)			return -1;		if (status & AT45_STATUS_READY)			break;	} while (get_timer(timebase) < timeout);	/* Deactivate CS */	spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);	if (status & AT45_STATUS_READY)		return 0;	/* Timed out */	return -1;}/* * Assemble the address part of a command for AT45 devices in * non-power-of-two page size mode. */static void at45_build_address(struct atmel_spi_flash *asf, u8 *cmd, u32 offset){	unsigned long page_addr;	unsigned long byte_addr;	unsigned long page_size;	unsigned int page_shift;	/*	 * The "extra" space per page is the power-of-two page size	 * divided by 32.	 */	page_shift = asf->params->l2_page_size;	page_size = (1 << page_shift) + (1 << (page_shift - 5));	page_shift++;	page_addr = offset / page_size;	byte_addr = offset % page_size;	cmd[0] = page_addr >> (16 - page_shift);	cmd[1] = page_addr << (page_shift - 8) | (byte_addr >> 8);	cmd[2] = byte_addr;}static int dataflash_read_fast_p2(struct spi_flash *flash,		u32 offset, size_t len, void *buf){	u8 cmd[5];	cmd[0] = CMD_READ_ARRAY_FAST;	cmd[1] = offset >> 16;	cmd[2] = offset >> 8;	cmd[3] = offset;	cmd[4] = 0x00;	return spi_flash_read_common(flash, cmd, sizeof(cmd), buf, len);}static int dataflash_read_fast_at45(struct spi_flash *flash,		u32 offset, size_t len, void *buf){	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);	u8 cmd[5];	cmd[0] = CMD_READ_ARRAY_FAST;	at45_build_address(asf, cmd + 1, offset);	cmd[4] = 0x00;	return spi_flash_read_common(flash, cmd, sizeof(cmd), buf, len);}static int dataflash_write_at45(struct spi_flash *flash,		u32 offset, size_t len, const void *buf){	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);	unsigned long page_addr;	unsigned long byte_addr;	unsigned long page_size;	unsigned int page_shift;	size_t chunk_len;	size_t actual;	int ret;	u8 cmd[4];	page_shift = asf->params->l2_page_size;	page_size = (1 << page_shift) + (1 << (page_shift - 5));	page_shift++;	page_addr = offset / page_size;	byte_addr = offset % page_size;	ret = spi_claim_bus(flash->spi);	if (ret) {		debug("SF: Unable to claim SPI bus\n");		return ret;	}	for (actual = 0; actual < len; actual += chunk_len) {		chunk_len = min(len - actual, page_size - byte_addr);		/* Use the same address bits for both commands */		cmd[0] = CMD_AT45_LOAD_BUF1;		cmd[1] = page_addr >> (16 - page_shift);		cmd[2] = page_addr << (page_shift - 8) | (byte_addr >> 8);		cmd[3] = byte_addr;		ret = spi_flash_cmd_write(flash->spi, cmd, 4,				buf + actual, chunk_len);		if (ret < 0) {			debug("SF: Loading AT45 buffer failed\n");			goto out;		}		cmd[0] = CMD_AT45_PROG_BUF1;		ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0);		if (ret < 0) {			debug("SF: AT45 page programming failed\n");			goto out;		}		ret = at45_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);		if (ret < 0) {			debug("SF: AT45 page programming timed out\n");			goto out;		}		page_addr++;		byte_addr = 0;	}	debug("SF: AT45: Successfully programmed %zu bytes @ 0x%x\n",			len, offset);	ret = 0;out:	spi_release_bus(flash->spi);	return ret;}int dataflash_erase_at45(struct spi_flash *flash, u32 offset, size_t len){	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);	unsigned long page_addr;	unsigned long page_size;	unsigned int page_shift;	size_t actual;	int ret;	u8 cmd[4];	/*	 * TODO: This function currently uses page erase only. We can	 * probably speed things up by using block and/or sector erase	 * when possible.	 */	page_shift = asf->params->l2_page_size;	page_size = (1 << page_shift) + (1 << (page_shift - 5));	page_shift++;	page_addr = offset / page_size;	if (offset % page_size || len % page_size) {		debug("SF: Erase offset/length not multiple of page size\n");		return -1;	}	cmd[0] = CMD_AT45_ERASE_PAGE;	cmd[3] = 0x00;	ret = spi_claim_bus(flash->spi);	if (ret) {		debug("SF: Unable to claim SPI bus\n");		return ret;	}	for (actual = 0; actual < len; actual += page_size) {		cmd[1] = page_addr >> (16 - page_shift);		cmd[2] = page_addr << (page_shift - 8);		ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0);		if (ret < 0) {			debug("SF: AT45 page erase failed\n");			goto out;		}		ret = at45_wait_ready(flash, SPI_FLASH_PAGE_ERASE_TIMEOUT);		if (ret < 0) {			debug("SF: AT45 page erase timed out\n");			goto out;		}		page_addr++;	}	debug("SF: AT45: Successfully erased %zu bytes @ 0x%x\n",			len, offset);	ret = 0;out:	spi_release_bus(flash->spi);	return ret;}struct spi_flash *spi_flash_probe_atmel(struct spi_slave *spi, u8 *idcode){	const struct atmel_spi_flash_params *params;	unsigned long page_size;	unsigned int family;	struct atmel_spi_flash *asf;	unsigned int i;	int ret;	u8 status;	for (i = 0; i < ARRAY_SIZE(atmel_spi_flash_table); i++) {		params = &atmel_spi_flash_table[i];		if (params->idcode1 == idcode[1])			break;	}	if (i == ARRAY_SIZE(atmel_spi_flash_table)) {		debug("SF: Unsupported DataFlash ID %02x\n",				idcode[1]);		return NULL;	}	asf = malloc(sizeof(struct atmel_spi_flash));	if (!asf) {		debug("SF: Failed to allocate memory\n");		return NULL;	}	asf->params = params;	asf->flash.spi = spi;	asf->flash.name = params->name;	/* Assuming power-of-two page size initially. */	page_size = 1 << params->l2_page_size;	family = idcode[1] >> 5;	switch (family) {	case DF_FAMILY_AT45:		/*		 * AT45 chips have configurable page size. The status		 * register indicates which configuration is active.		 */		ret = spi_flash_cmd(spi, CMD_AT45_READ_STATUS, &status, 1);		if (ret)			goto err;		debug("SF: AT45 status register: %02x\n", status);		if (!(status & AT45_STATUS_P2_PAGE_SIZE)) {			asf->flash.read = dataflash_read_fast_at45;			asf->flash.write = dataflash_write_at45;			asf->flash.erase = dataflash_erase_at45;			page_size += 1 << (params->l2_page_size - 5);		} else {			asf->flash.read = dataflash_read_fast_p2;		}		break;	case DF_FAMILY_AT26F:	case DF_FAMILY_AT26DF:		asf->flash.read = dataflash_read_fast_p2;		break;	default:		debug("SF: Unsupported DataFlash family %u\n", family);		goto err;	}	asf->flash.size = page_size * params->pages_per_block				* params->blocks_per_sector				* params->nr_sectors;	debug("SF: Detected %s with page size %lu, total %u bytes\n",			params->name, page_size, asf->flash.size);	return &asf->flash;err:	free(asf);	return NULL;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av电影天堂一区二区在线 | 丝袜国产日韩另类美女| 男人的天堂久久精品| 久久网这里都是精品| 国产成人鲁色资源国产91色综| 538在线一区二区精品国产| 婷婷开心久久网| 日韩西西人体444www| 蜜臀99久久精品久久久久久软件| 91精品欧美久久久久久动漫 | 亚洲美女免费在线| 99re免费视频精品全部| 亚洲精品伦理在线| 欧美日韩国产经典色站一区二区三区| 亚洲一区二区三区视频在线播放| 色久优优欧美色久优优| 亚洲1区2区3区4区| 欧美一级黄色片| 国产一区二区三区四区五区入口| 国产无遮挡一区二区三区毛片日本| 国产.欧美.日韩| 日韩黄色免费网站| 亚洲欧洲美洲综合色网| 日韩女优av电影| 欧美亚洲动漫另类| 精品在线免费视频| 图片区小说区区亚洲影院| 亚洲欧美aⅴ...| 国产日韩视频一区二区三区| 日韩一二三四区| 欧美精品在线观看播放| 91香蕉视频污在线| 国产精品自拍三区| 狠狠色狠狠色综合日日91app| 亚洲成人精品一区| 亚洲欧美激情一区二区| 国产日韩欧美一区二区三区乱码 | 国产日韩精品一区二区浪潮av| 欧美午夜电影一区| 91精品福利在线| 一本色道久久综合亚洲91| 国产999精品久久久久久绿帽| 狠狠色丁香久久婷婷综合_中 | 日韩精品一区国产麻豆| 欧美日韩在线精品一区二区三区激情 | 91精品国产91综合久久蜜臀| 欧美精品粉嫩高潮一区二区| 欧美一区二区三区白人| 欧美一级久久久久久久大片| 欧美一区二区久久久| 欧美日韩在线直播| 欧美日韩激情在线| 91精品国产麻豆| 欧美成人欧美edvon| 在线中文字幕不卡| 久久成人精品无人区| 亚洲欧美激情一区二区| 专区另类欧美日韩| 一区二区三区在线观看欧美| 国产婷婷色一区二区三区 | 亚洲国产精品久久久久婷婷884| 亚洲女人****多毛耸耸8| 亚洲欧美国产77777| 亚洲一二三区视频在线观看| 视频一区二区欧美| 国内精品国产成人国产三级粉色 | 国产网红主播福利一区二区| 国产精品久久久久一区二区三区| 亚洲乱码国产乱码精品精可以看| 亚洲综合激情网| 免费在线观看不卡| 国产激情一区二区三区四区| 色婷婷综合久久久中文一区二区| 91精品欧美综合在线观看最新| 久久久91精品国产一区二区三区| 亚洲欧美综合另类在线卡通| 日韩在线卡一卡二| 国产高清无密码一区二区三区| 91视视频在线观看入口直接观看www| 欧美日韩国产另类不卡| 亚洲乱码中文字幕| 亚洲国产精品视频| 国产精品影视在线观看| 在线观看亚洲精品| 精品国产污网站| 亚洲欧美激情小说另类| 久久99热99| 欧美综合一区二区| 欧美精品一区二区在线观看| 亚洲精品精品亚洲| 国产一区二区三区精品视频| 欧美三区在线视频| 国产亚洲成年网址在线观看| 亚洲伊人色欲综合网| 国产一区二区三区av电影 | 亚洲超碰精品一区二区| 国产91丝袜在线播放九色| 欧美系列日韩一区| 国产蜜臀97一区二区三区| 五月天一区二区| 99久久夜色精品国产网站| 日韩欧美国产系列| 亚洲综合色在线| 丁香激情综合国产| 91麻豆精品国产自产在线| 自拍偷拍亚洲欧美日韩| 国产在线播精品第三| 欧美精品久久一区| 一区二区三区在线播放| 成人性色生活片| 26uuu久久天堂性欧美| 丝袜诱惑亚洲看片| 日本黄色一区二区| 中文字幕欧美一| 中文字幕不卡在线播放| 中文字幕在线一区| 久久se精品一区二区| 欧美丰满一区二区免费视频| 亚洲综合视频在线观看| 91亚洲国产成人精品一区二区三| 日本一区二区三级电影在线观看| 国产一区二区三区香蕉| 欧美大片在线观看一区| 免费精品视频在线| 4438成人网| 日韩在线播放一区二区| 欧美肥妇free| 亚洲超丰满肉感bbw| 欧美日韩亚洲综合| 亚洲国产精品麻豆| 欧美日韩一区不卡| 日日夜夜精品免费视频| 欧美性色综合网| 亚洲h动漫在线| 欧美军同video69gay| 污片在线观看一区二区| 欧美一级日韩不卡播放免费| 日韩 欧美一区二区三区| 555www色欧美视频| 老司机免费视频一区二区三区| 欧美tickling网站挠脚心| 久久66热偷产精品| 国产色爱av资源综合区| 波波电影院一区二区三区| 亚洲欧洲精品天堂一级| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美电影免费观看完整版| 久久99国内精品| 亚洲国产精品激情在线观看| 国产成人免费av在线| 亚洲欧洲精品成人久久奇米网| 91丝袜高跟美女视频| 夜夜嗨av一区二区三区四季av| 欧美日韩精品一区二区在线播放| 亚洲高清久久久| 日韩欧美国产综合一区| 国产成人综合视频| 综合av第一页| 欧美精品99久久久**| 激情综合色综合久久综合| 中文字幕av一区二区三区免费看| 97久久精品人人做人人爽| 亚洲成人在线网站| 精品国产露脸精彩对白| 不卡一区在线观看| 亚洲电影一级黄| 精品成人佐山爱一区二区| 久久久久久夜精品精品免费| 国产精品一级片在线观看| 成人免费视频在线观看| 欧美日韩精品电影| 国产另类ts人妖一区二区| 亚洲日本护士毛茸茸| 91精品久久久久久久99蜜桃| 国内不卡的二区三区中文字幕| 亚洲免费av高清| 欧美成人国产一区二区| bt欧美亚洲午夜电影天堂| 日韩和欧美一区二区三区| 日本一二三不卡| 欧美丰满一区二区免费视频| 国产成人福利片| 亚洲成人av一区二区三区| 国产婷婷一区二区| 欧美高清视频不卡网| 不卡视频免费播放| 欧美a一区二区| 亚洲日本韩国一区| 久久久久综合网| 91精品在线麻豆| 色综合网站在线| 国产激情视频一区二区三区欧美| 亚洲午夜久久久久久久久久久| 欧美精品一区二区久久婷婷| 欧美性色综合网| 成人av影院在线| 国产专区综合网| 日本亚洲电影天堂| 亚洲在线免费播放| 中文字幕精品三区|