⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataflash.c

📁 U-boot源码 ARM7启动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* LowLevel function for ATMEL DataFlash support * Author : Hamid Ikdoumi (Atmel) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * */#include <common.h>#include <config.h>#ifdef CONFIG_HAS_DATAFLASH#include <asm/hardware.h>#include <dataflash.h>AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS];static AT91S_DataFlash DataFlashInst;#ifdef CONFIG_AT91SAM9260EKint cs[][CFG_MAX_DATAFLASH_BANKS] = {	{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0},	/* Logical adress, CS */	{CFG_DATAFLASH_LOGIC_ADDR_CS1, 1}};#elif defined(CONFIG_AT91SAM9263EK)int cs[][CFG_MAX_DATAFLASH_BANKS] = {	{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}	/* Logical adress, CS */};#elseint cs[][CFG_MAX_DATAFLASH_BANKS] = {	{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0},	/* Logical adress, CS */	{CFG_DATAFLASH_LOGIC_ADDR_CS3, 3}};#endif/*define the area offsets*/#if defined(CONFIG_AT91SAM9261EK) || defined(CONFIG_AT91SAM9260EK) || defined(CONFIG_AT91SAM9263EK)#if	defined(CONFIG_NEW_PARTITION)dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {	{0x00000000,	0x00003FFF, 	FLAG_PROTECT_SET,	0,    		"Bootstrap"},  	/* ROM code */	{0x00004200,	0x000083FF, 	FLAG_PROTECT_CLEAR,	0,    		"Environment"},	/* u-boot environment */	{0x00008400,	0x0003DDFF,	FLAG_PROTECT_SET,	0,    		"U-Boot"},     	/* u-boot code */	{0x0003DE00,	0x00041FFF,	FLAG_PROTECT_CLEAR,	FLAG_SETENV,	"MON"},	       	/* Room for alternative boot monitor */	{0x00042000,	0x0018BFFF,	FLAG_PROTECT_CLEAR,	FLAG_SETENV,	"OS"},	       	/* data area size to tune */	{0x0018C000,	0xFFFFFFFF,	FLAG_PROTECT_CLEAR,	FLAG_SETENV,	"FS"},	       	/* data area size to tune */};#elsedataflash_protect_t area_list[NB_DATAFLASH_AREA] = {	{0, 0x3fff, FLAG_PROTECT_SET},			/* ROM code */	{0x4000, 0x7fff, FLAG_PROTECT_CLEAR},		/* u-boot environment */	{0x8000, 0x37fff, FLAG_PROTECT_SET},		/* u-boot code */	{0x38000, 0x1fffff, FLAG_PROTECT_CLEAR},	/* data area size to tune */};#endif#elif defined(CONFIG_NEW_PARTITION)/*define the area offsets*//* Invalid partitions should be defined with start > end */dataflash_protect_t area_list[NB_DATAFLASH_AREA*CFG_MAX_DATAFLASH_BANKS] = {	{0x00000000, 0x000083ff, FLAG_PROTECT_SET,	0,		"Bootstrap"},	/* ROM code */	{0x00008400, 0x00020fff, FLAG_PROTECT_SET,	0,		"U-Boot"},	/* u-boot code */	{0x00021000, 0x000293ff, FLAG_PROTECT_CLEAR,	0,		"Environment"},	/* u-boot environment 8Kb */	{0x00029400, 0x00041fff, FLAG_PROTECT_INVALID,	0,		"<Unused>"},	/* Rest of Sector 1 */	{0x00042000, 0x0018Bfff, FLAG_PROTECT_CLEAR,	FLAG_SETENV,	"OS"},	/* data area size to tune */	{0x0018C000, 0xffffffff, FLAG_PROTECT_CLEAR,	FLAG_SETENV,	"FS"},	/* data area size to tune */	{0x00000000, 0xffffffff, FLAG_PROTECT_CLEAR,	FLAG_SETENV,	"Data"},	/* data area */	{0xffffffff, 0x00000000, FLAG_PROTECT_INVALID,	0,		"<Invalid>"},	/* Invalid */	{0xffffffff, 0x00000000, FLAG_PROTECT_INVALID,	0,		"<Invalid>"},	/* Invalid */	{0xffffffff, 0x00000000, FLAG_PROTECT_INVALID,	0,		"<Invalid>"},	/* Invalid */	{0xffffffff, 0x00000000, FLAG_PROTECT_INVALID,	0,		"<Invalid>"},	/* Invalid */	{0xffffffff, 0x00000000, FLAG_PROTECT_INVALID,	0,		"<Invalid>"},	/* Invalid */};#elsedataflash_protect_t area_list[NB_DATAFLASH_AREA] = {	{0, 0x7fff, FLAG_PROTECT_SET},			/* ROM code */	{0x8000, 0x1ffff, FLAG_PROTECT_SET},		/* u-boot code */	{0x20000, 0x27fff, FLAG_PROTECT_CLEAR},		/* u-boot environment */	{0x28000, 0x1fffff, FLAG_PROTECT_CLEAR},	/* data area size to tune */};#endifextern void AT91F_SpiInit (void);extern int AT91F_DataflashProbe (int i, AT91PS_DataflashDesc pDesc);extern int AT91F_DataFlashRead (AT91PS_DataFlash pDataFlash,				unsigned long addr,				unsigned long size, char *buffer);extern int AT91F_DataFlashWrite( AT91PS_DataFlash pDataFlash,				unsigned char *src,				int dest,				int size );int AT91F_DataflashInit (void){	int i, j;	int dfcode;	int part = 0;	int last_part;	int found[CFG_MAX_DATAFLASH_BANKS];	unsigned char protected;	AT91F_SpiInit ();	for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++) {		found[i] = 0;		dataflash_info[i].Desc.state = IDLE;		dataflash_info[i].id = 0;		dataflash_info[i].Device.pages_number = 0;		dfcode = AT91F_DataflashProbe (cs[i][1],				&dataflash_info[i].Desc);		switch (dfcode) {		case AT45DB161:			dataflash_info[i].Device.pages_number = 4096;			dataflash_info[i].Device.pages_size = 528;			dataflash_info[i].Device.page_offset = 10;			dataflash_info[i].Device.byte_mask = 0x300;			dataflash_info[i].Device.cs = cs[i][1];			dataflash_info[i].Desc.DataFlash_state = IDLE;			dataflash_info[i].logical_address = cs[i][0];			dataflash_info[i].id = dfcode;			found[i] += dfcode;;			break;		case AT45DB321:			dataflash_info[i].Device.pages_number = 8192;			dataflash_info[i].Device.pages_size = 528;			dataflash_info[i].Device.page_offset = 10;			dataflash_info[i].Device.byte_mask = 0x300;			dataflash_info[i].Device.cs = cs[i][1];			dataflash_info[i].Desc.DataFlash_state = IDLE;			dataflash_info[i].logical_address = cs[i][0];			dataflash_info[i].id = dfcode;			found[i] += dfcode;;			break;		case AT45DB642:			dataflash_info[i].Device.pages_number = 8192;			dataflash_info[i].Device.pages_size = 1056;			dataflash_info[i].Device.page_offset = 11;			dataflash_info[i].Device.byte_mask = 0x700;			dataflash_info[i].Device.cs = cs[i][1];			dataflash_info[i].Desc.DataFlash_state = IDLE;			dataflash_info[i].logical_address = cs[i][0];			dataflash_info[i].id = dfcode;			found[i] += dfcode;;			break;		case AT45DB128:			dataflash_info[i].Device.pages_number = 16384;			dataflash_info[i].Device.pages_size = 1056;			dataflash_info[i].Device.page_offset = 11;			dataflash_info[i].Device.byte_mask = 0x700;			dataflash_info[i].Device.cs = cs[i][1];			dataflash_info[i].Desc.DataFlash_state = IDLE;			dataflash_info[i].logical_address = cs[i][0];			dataflash_info[i].id = dfcode;			found[i] += dfcode;;			break;		default:			dfcode = 0;			break;		}		/* set the last area end to the dataflash size*/		area_list[NB_DATAFLASH_AREA -1].end =				(dataflash_info[i].Device.pages_number *				dataflash_info[i].Device.pages_size)-1;		last_part=0;		/* set the area addresses */		for(j = 0; j<NB_DATAFLASH_AREA; j++) {			if(found[i]!=0) {				dataflash_info[i].Device.area_list[j].start =					area_list[part].start +					dataflash_info[i].logical_address;				if(area_list[part].end == 0xffffffff) {					dataflash_info[i].Device.area_list[j].end =						dataflash_info[i].end_address +						dataflash_info	[i].logical_address;					last_part = 1;				} else {					dataflash_info[i].Device.area_list[j].end =						area_list[part].end +						dataflash_info[i].logical_address;				}				protected = area_list[part].protected;				/* Set the environment according to the label...*/				if(protected == FLAG_PROTECT_INVALID) {					dataflash_info[i].Device.area_list[j].protected =						FLAG_PROTECT_INVALID;				} else {					dataflash_info[i].Device.area_list[j].protected =						protected;				}				strcpy((char*)(dataflash_info[i].Device.area_list[j].label),						(const char *)area_list[part].label);			}			part++;		}	}	return found[0];}#ifdef	CONFIG_NEW_DF_PARTITIONint AT91F_DataflashSetEnv (void){	int i, j;	int part;	unsigned char env;	unsigned char s[32];	/* Will fit a long int in hex */	unsigned long start;	for (i = 0, part= 0; i < CFG_MAX_DATAFLASH_BANKS; i++) {		for(j = 0; j<NB_DATAFLASH_AREA; j++) {			env = area_list[part].setenv;			/* Set the environment according to the label...*/			if((env & FLAG_SETENV) == FLAG_SETENV) {				start =				dataflash_info[i].Device.area_list[j].start;				sprintf(s,"%X",start);				setenv(area_list[part].label,s);			}			part++;		}	}}#endifvoid dataflash_print_info (void){	int i, j;	for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++) {		if (dataflash_info[i].id != 0) {			printf("DataFlash:");			switch (dataflash_info[i].id) {			case AT45DB161:				printf("AT45DB161\n");				break;			case AT45DB321:				printf("AT45DB321\n");				break;			case AT45DB642:				printf("AT45DB642\n");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -