📄 dataflash.c
字号:
/* 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 + -