From 4550b4bb118ea49764fe878c79e50f2e00a30c4d Mon Sep 17 00:00:00 2001 From: Bruno Vetel Date: Wed, 17 Dec 2008 12:01:07 +0100 Subject: [PATCH] We can now have u-boot on the second flash The memory size detection has also to be updated Fix a bug a un the dump of the dataflash Clean the display. All flash devices are now displayed --- at45.cpp | 20 +++++++++++++++++++- dataflash.cpp | 21 ++++++++++++++++----- dataflash.h | 9 +++++++-- init.cpp | 5 ++++- main.cpp | 16 ++++++++++++++-- 5 files changed, 60 insertions(+), 11 deletions(-) diff --git a/at45.cpp b/at45.cpp index 39426dc..3d65b93 100644 --- a/at45.cpp +++ b/at45.cpp @@ -21,7 +21,9 @@ #define AT91C_SPI_CLK 8000000 #define AT91C_SPI_PCS0_SERIAL_DATAFLASH 0xE /* Chip Select 0 : NPCS0 %1110 */ -#define AT91C_SPI_PCS3_DATAFLASH_CARD 0x7 /* Chip Select 3 : NPCS3 %0111 */ +#define AT91C_SPI_PCS1_SERIAL_DATAFLASH 0xD /* Chip Select 0 : NPCS0 %1101 */ +#define AT91C_SPI_PCS2_SERIAL_DATAFLASH 0xB /* Chip Select 0 : NPCS0 %1011 */ +#define AT91C_SPI_PCS3_SERIAL_DATAFLASH 0x7 /* Chip Select 0 : NPCS0 %0111 */ /*----------------------------------------------------------------------------*/ /* \fn AT91F_SpiInit */ @@ -44,6 +46,8 @@ void AT91F_SpiInit(void) { /* Configure CS0 and CS3 */ *(AT91C_SPI_CSR + 0) = AT91C_SPI_NCPHA | (AT91C_SPI_DLYBS & 0x100000) | ((AT91C_MASTER_CLOCK / (2*AT91C_SPI_CLK)) << 8); + *(AT91C_SPI_CSR + 1) = AT91C_SPI_NCPHA | (AT91C_SPI_DLYBS & 0x100000) | ((AT91C_MASTER_CLOCK / (2*AT91C_SPI_CLK)) << 8); + *(AT91C_SPI_CSR + 2) = AT91C_SPI_NCPHA | (AT91C_SPI_DLYBS & 0x100000) | ((AT91C_MASTER_CLOCK / (2*AT91C_SPI_CLK)) << 8); *(AT91C_SPI_CSR + 3) = AT91C_SPI_NCPHA | (AT91C_SPI_DLYBS & 0x100000) | ((AT91C_MASTER_CLOCK / (2*AT91C_SPI_CLK)) << 8); } @@ -59,6 +63,19 @@ void AT91F_SpiEnable(int cs) { AT91C_BASE_SPI->SPI_MR &= 0xFFF0FFFF; AT91C_BASE_SPI->SPI_MR |= ((AT91C_SPI_PCS0_SERIAL_DATAFLASH<<16) & AT91C_SPI_PCS); break; + case 1: /* Configure SPI CS1 for Serial DataFlash AT45DBxx */ + AT91C_BASE_SPI->SPI_MR &= 0xFFF0FFFF; + AT91C_BASE_SPI->SPI_MR |= ((AT91C_SPI_PCS1_SERIAL_DATAFLASH<<16) & AT91C_SPI_PCS); + break; + case 2: /* Configure SPI CS2 for Serial DataFlash AT45DBxx */ + AT91C_BASE_SPI->SPI_MR &= 0xFFF0FFFF; + AT91C_BASE_SPI->SPI_MR |= ((AT91C_SPI_PCS2_SERIAL_DATAFLASH<<16) & AT91C_SPI_PCS); + break; + case 3: /* Configure SPI CS3 for Serial DataFlash AT45DBxx */ + AT91C_BASE_SPI->SPI_MR &= 0xFFF0FFFF; + AT91C_BASE_SPI->SPI_MR |= ((AT91C_SPI_PCS3_SERIAL_DATAFLASH<<16) & AT91C_SPI_PCS); + break; +#if 0 case 3: /* Configure SPI CS3 for Serial DataFlash Card */ /* Set up PIO SDC_TYPE to switch on DataFlash Card and not MMC/SDCard */ AT91C_BASE_PIOB->PIO_PER = AT91C_PIO_PB7; /* Set in PIO mode */ @@ -69,6 +86,7 @@ void AT91F_SpiEnable(int cs) { AT91C_BASE_SPI->SPI_MR &= 0xFFF0FFFF; AT91C_BASE_SPI->SPI_MR |= ((AT91C_SPI_PCS3_DATAFLASH_CARD<<16) & AT91C_SPI_PCS); break; +#endif } /* SPI_Enable */ diff --git a/dataflash.cpp b/dataflash.cpp index b4a5247..2e48b8a 100644 --- a/dataflash.cpp +++ b/dataflash.cpp @@ -20,9 +20,15 @@ static AT91S_DataFlash DataFlashInst; int cs[][CFG_MAX_DATAFLASH_BANKS] = { {CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ + {CFG_DATAFLASH_LOGIC_ADDR_CS1, 1}, /* Logical adress, CS */ + {CFG_DATAFLASH_LOGIC_ADDR_CS2, 2}, /* Logical adress, CS */ {CFG_DATAFLASH_LOGIC_ADDR_CS3, 3} }; +#define SIZE_REGS_64M 0x2188c159 +#define SIZE_REGS_128M 0x2188c15a + + int AT91F_DataflashInit (void) { int i; @@ -87,6 +93,15 @@ int AT91F_DataflashInit (void) return (1); } +int get_size_reg() +{ + if ((dataflash_info[0].id != 0) && (dataflash_info[1].id != 0 )){ + return SIZE_REGS_128M; + } + else { + return SIZE_REGS_64M; + } +} void AT91F_DataflashPrintInfo(void) { @@ -124,10 +139,6 @@ void AT91F_DataflashPrintInfo(void) (unsigned int) dataflash_info[i].logical_address); } } - if ((dataflash_info[0].id != 0) && (dataflash_info[1].id != 0 )){ - pregister = (int *)0xffffff98; - *pregister = 0x2188c15a; - } } @@ -184,7 +195,7 @@ int addr_dataflash (unsigned long addr) int read_dataflash (unsigned long addr, unsigned long size, char *result) { unsigned int AddrToRead = addr; - AT91F_DataflashPrintInfo(); + // AT91F_DataflashPrintInfo(); AT91PS_DataFlash pFlash = &DataFlashInst; pFlash = AT91F_DataflashSelect (pFlash, &AddrToRead); diff --git a/dataflash.h b/dataflash.h index 4ad272a..b161570 100644 --- a/dataflash.h +++ b/dataflash.h @@ -18,9 +18,11 @@ #ifndef _DataFlash_h #define _DataFlash_h -#define CFG_MAX_DATAFLASH_BANKS 2 +#define CFG_MAX_DATAFLASH_BANKS 4 #define CFG_DATAFLASH_LOGIC_ADDR_CS0 0xC0000000 -#define CFG_DATAFLASH_LOGIC_ADDR_CS3 0xD0000000 +#define CFG_DATAFLASH_LOGIC_ADDR_CS1 0xC1000000 +#define CFG_DATAFLASH_LOGIC_ADDR_CS2 0xC2000000 +#define CFG_DATAFLASH_LOGIC_ADDR_CS3 0xC3000000 typedef struct { @@ -162,5 +164,8 @@ extern int addr_dataflash (unsigned long addr); extern int read_dataflash (unsigned long addr, unsigned long size, char *result); extern int write_dataflash (unsigned long addr_dest, unsigned int addr_src, unsigned int size); +int get_size_reg(void); + + #endif diff --git a/init.cpp b/init.cpp index 1b91fbc..1356f84 100644 --- a/init.cpp +++ b/init.cpp @@ -15,6 +15,7 @@ #include #include +#include "dataflash.h" #include @@ -113,7 +114,7 @@ void AT91F_InitSdram() /*Init SDRAM */ pRegister = (volatile int *)0xFFFFFF98; - *pRegister = 0x2188c159; + *pRegister = (volatile int)get_size_reg; pRegister = (volatile int *)0xFFFFFF90; *pRegister = 0x2; pRegister = (volatile int *)0x20000000; @@ -181,6 +182,8 @@ void AT91F_InitMemories() pEbi = (int *)0xFFFFFF70; *pEbi = 0x00003284; + AT91F_DataflashInit(); + AT91F_InitSdram(); } diff --git a/main.cpp b/main.cpp index b2b53d5..ca05c25 100644 --- a/main.cpp +++ b/main.cpp @@ -20,7 +20,7 @@ #define AT91C_UBOOT_ADDR 0x21F00000 #define AT91C_UBOOT_SIZE 512*1024 -#define AT91C_UBOOT_DATAFLASH_ADDR 0xC0008400 +#define AT91C_UBOOT_DATAFLASH_ADDR 0xC1000000 // crystal= 18.432MHz #define AT91C_PLLA_VALUE 0x20263E04 // -> 179.712MHz @@ -672,13 +672,25 @@ int main(void) switch(DeviceAddress & 0xFF000000) { case CFG_DATAFLASH_LOGIC_ADDR_CS0: + printf("Download Dataflash 0 [0x%x]\n\r", DeviceAddress & 0xFF000000); device = 0; break; - case CFG_DATAFLASH_LOGIC_ADDR_CS3: + case CFG_DATAFLASH_LOGIC_ADDR_CS1: + printf("Download Dataflash 1 [0x%x]\n\r", DeviceAddress & 0xFF000000); device = 1; break; + case CFG_DATAFLASH_LOGIC_ADDR_CS2: + printf("Download Dataflash 2 [0x%x]\n\r", DeviceAddress & 0xFF000000); + device = 2; + break; + + case CFG_DATAFLASH_LOGIC_ADDR_CS3: + printf("Download Dataflash 3 [0x%x]\n\r", DeviceAddress & 0xFF000000); + device = 3; + break; + default: command = 0; break; -- 2.11.4.GIT