diff -urN at91bootstrap-2.3-0rig/driver/dataflash.c at91bootstrap-2.3.4/driver/dataflash.c --- at91bootstrap-2.3-0rig/driver/dataflash.c 2007-04-22 13:56:29.000000000 +0200 +++ at91bootstrap-2.3.4/driver/dataflash.c 2007-09-24 20:56:18.000000000 +0200 @@ -39,8 +39,12 @@ #include "../include/part.h" #include "../include/main.h" #include "../include/dataflash.h" +#include "../include/debug.h" #include +#define SUCCESS 1 +#define FAILURE 0 + #ifdef CFG_DATAFLASH extern div_t udiv(unsigned int numerator, unsigned int denominator); /* Write SPI register */ @@ -92,7 +96,7 @@ /* SPI_Enable */ write_spi(SPI_CR, AT91C_SPI_SPIEN); - return 0; + return SUCCESS; } /*------------------------------------------------------------------------------*/ @@ -134,12 +138,10 @@ /* Try to get the dataflash semaphore */ if ((pDataFlash->bSemaphore) != UNLOCKED) - return (char) 0; + return (char) FAILURE; pDataFlash->bSemaphore = LOCKED; - /* Compute command pattern */ dInternalAdr = (result.quot << AT91C_PAGE_OFFSET(pDataFlash)) + result.rem; - if (AT91C_DF_NB_PAGE(pDataFlash) >= 16384) { pDataFlash->command[0] = (bCmd & 0x000000FF) | \ @@ -178,7 +180,7 @@ while (df_is_busy(pDataFlash) == LOCKED); - return 1; + return SUCCESS; } /*------------------------------------------------------------------------------*/ @@ -194,13 +196,13 @@ if (df_get_status(pDataFlash)) { if (df_is_ready(pDataFlash)) - return 1; + return SUCCESS; } } - return 0; + return FAILURE; } - +volatile int loop; /*------------------------------------------------------------------------------*/ /* \fn df_read */ /* \brief Read a block in dataflash */ @@ -212,21 +214,30 @@ unsigned int size) { unsigned int SizeToRead; + int page_counter; + page_counter = 32; while (size) { - SizeToRead = (size < AT91C_MAX_PDC_SIZE)? size : AT91C_MAX_PDC_SIZE; - + SizeToRead = (size < 0x8000)? size : 0x8000; /* wait the dataflash ready status */ - df_wait_ready(pDf); - df_continuous_read(pDf, (char *)buffer, SizeToRead, addr); - - size -= SizeToRead; - addr += SizeToRead; - buffer += SizeToRead; + if(df_wait_ready(pDf) != 0) { + df_continuous_read(pDf, (char *)buffer, SizeToRead, addr); + dbg_print("."); + if(--page_counter <= 0) { + page_counter = 32; + dbg_print("\r\n"); + } + size -= SizeToRead; + addr += SizeToRead; + buffer += SizeToRead; + } else { + /* We got a timeout */ + dbg_print("Timeout while waiting for dataflash ready\n"); + return FAILURE; + } } - - return 0; + return SUCCESS; } /*----------------------------------------------------------------------*/ @@ -235,13 +246,19 @@ /*----------------------------------------------------------------------*/ static int df_download(AT91PS_DF pDf, unsigned int img_addr, unsigned int img_size, unsigned int img_dest) { + dbg_print(">Loading from Dataflash["); + dbg_print_hex(img_addr); + dbg_print("] to SDRAM["); + dbg_print_hex(img_dest); + dbg_print("]\r\n"); /* read bytes in the dataflash */ - df_read(pDf, img_addr,(unsigned char *)img_dest, img_size); - + if(df_read(pDf, img_addr,(unsigned char *)img_dest, img_size) == FAILURE) + return FAILURE; + dbg_print("\r\n>Loading complete, ["); + dbg_print_hex(IMG_SIZE); + dbg_print("] bytes\r\n"); /* wait the dataflash ready status */ - df_wait_ready(pDf); - - return 0; + return df_wait_ready(pDf); } /*----------------------------------------------------------------------*/ @@ -263,7 +280,7 @@ static int df_init (AT91PS_DF pDf) { int dfcode = 0; - int status = 1; + int status = SUCCESS; /* Default: AT45DB321B */ pDf->dfDescription.pages_number = 8192; @@ -302,18 +319,21 @@ pDf->dfDescription.pages_number = 4096; pDf->dfDescription.pages_size = 528; pDf->dfDescription.page_offset = 10; + dbg_print(">AT45DB161D detected\r\n"); break; case AT45DB321B: pDf->dfDescription.pages_number = 8192; pDf->dfDescription.pages_size = 528; pDf->dfDescription.page_offset = 10; + dbg_print(">AT45DB321D detected\r\n"); break; case AT45DB642: pDf->dfDescription.pages_number = 8192; pDf->dfDescription.pages_size = 1056; pDf->dfDescription.page_offset = 11; + dbg_print(">AT45DB642D detected\r\n"); break; /* case AT45DB1282: @@ -335,7 +355,7 @@ break; */ default: - status = 0; + status = FAILURE; break; } @@ -357,12 +377,12 @@ if (i != 23) { if ((buffer[i] != 0xEA) && (buffer[i] != 0xE5) ) - return -1; + return FAILURE; } i+=4; } - return 0; + return SUCCESS; } /*------------------------------------------------------------------------------*/ @@ -374,13 +394,14 @@ AT91S_DF sDF; AT91PS_DF pDf = (AT91PS_DF)&sDF; unsigned int rxBuffer[128]; + unsigned int status; pDf->bSemaphore = UNLOCKED; df_spi_init(pcs, DF_CS_SETTINGS); - if (!df_init(pDf)) - return -1; + if (df_init(pDf) == FAILURE) + return FAILURE; #ifdef AT91SAM9260 /* Test if a button has been pressed or not */ @@ -391,10 +412,13 @@ df_continuous_read(pDf, (char *)rxBuffer, 32, img_addr); df_wait_ready(pDf); - if (df_is_boot_valid((unsigned char*)rxBuffer)) - return -1; + if (df_is_boot_valid((unsigned char*)rxBuffer) == FAILURE) { + dbg_print(">Invalid Boot Area...\n\r"); + return FAILURE; + } - return df_download(pDf, img_addr, img_size, img_dest); + status = df_download(pDf, img_addr, img_size, img_dest); + return status; } #endif /* CFG_DATAFLASH */ diff -urN at91bootstrap-2.3-0rig/driver/debug.c at91bootstrap-2.3.4/driver/debug.c --- at91bootstrap-2.3-0rig/driver/debug.c 2006-12-05 11:27:24.000000000 +0100 +++ at91bootstrap-2.3.4/driver/debug.c 2007-09-24 20:38:01.000000000 +0200 @@ -85,4 +85,19 @@ } } +void dbg_print_hex(unsigned int data) +{ + unsigned char hex[11]; + int i=0; + hex[0]='0'; + hex[1]='x'; + for(i = 9 ;i >= 2;i--) { + hex[i] = "0123456789ABCDEF"[data & 0xF]; + data >>= 4; + } + hex[10]='\0'; + dbg_print((const char *) hex); +} + + #endif /* CFG_DEBUG */ diff -urN at91bootstrap-2.3-0rig/include/debug.h at91bootstrap-2.3.4/include/debug.h --- at91bootstrap-2.3-0rig/include/debug.h 2006-12-05 11:27:20.000000000 +0100 +++ at91bootstrap-2.3.4/include/debug.h 2007-09-24 18:26:37.000000000 +0200 @@ -45,5 +45,6 @@ /* Global functions */ extern void dbg_init(unsigned int); extern void dbg_print(const char *ptr); +extern void dbg_print_hex(unsigned int data); #endif /*_DEBUG_H_*/ diff -urN at91bootstrap-2.3-0rig/main.c at91bootstrap-2.3.4/main.c --- at91bootstrap-2.3-0rig/main.c 2007-09-24 18:26:10.000000000 +0200 +++ at91bootstrap-2.3.4/main.c 2007-09-24 20:56:20.000000000 +0200 @@ -41,6 +41,10 @@ #include "include/flash.h" #include "include/nandflash.h" +int test(void) +{ + +} /*------------------------------------------------------------------------------*/ /* Function Name : main */ /* Object : Main function */ @@ -49,6 +53,7 @@ /*------------------------------------------------------------------------------*/ int main(void) { + /* ================== 1st step: Hardware Initialization ================= */ /* Performs the hardware initialization */ #ifdef CFG_HW_INIT @@ -60,29 +65,35 @@ #ifdef CFG_DATAFLASH load_df(AT91C_SPI_PCS_DATAFLASH, IMG_ADDRESS, IMG_SIZE, JUMP_ADDR); #endif - #ifdef CFG_FLASH load_flash(IMG_ADDRESS, IMG_SIZE, JUMP_ADDR); + dbg_print(">Flash ready\r\n"); #endif /* Load from Nandflash in RAM */ #ifdef CFG_NANDFLASH load_nandflash(IMG_ADDRESS, IMG_SIZE, JUMP_ADDR); + dbg_print(">NANDflash ready\r\n"); #endif /* ==================== 3rd step: Process the Image =================== */ /* Uncompress the image */ #ifdef GUNZIP - decompress_image((void *)IMG_ADDRESS, (void *)JUMP_ADDR, IMG_SIZE); /* NOT IMPLEMENTED YET */ + decompress_image((void *)IMG_ADDRESS, (void *)JUMP_ADDR, IMG_SIZE); + /* NOT IMPLEMENTED YET */ + dbg_print(">Decompress ready\r\n"); #endif /* GUNZIP */ /* ==================== 4th step: Start the application =================== */ /* Set linux arguments */ #ifdef LINUX_ARG linux_arg(LINUX_ARG); /* NOT IMPLEMENTED YET */ + dbg_print(">Linux ready\r\n"); #endif /* LINUX_ARG */ - + dbg_print(">Start application at ["); + dbg_print_hex(JUMP_ADDR); + dbg_print("]\r\n"); + { volatile unsigned int loop; for(loop = 200000; loop > 0; loop--);} /* Jump to the Image Address */ return JUMP_ADDR; } - diff -urN at91bootstrap-2.3-0rig/Makefile at91bootstrap-2.3.4/Makefile --- at91bootstrap-2.3-0rig/Makefile 2007-09-24 18:26:10.000000000 +0200 +++ at91bootstrap-2.3.4/Makefile 2007-09-24 20:56:53.000000000 +0200 @@ -8,7 +8,7 @@ TOPDIR := $(CURDIR) -VERSION:=2.3.2 +VERSION:=2.3.4 include .config @@ -17,7 +17,7 @@ endif ifeq ($(CONFIG_SPI_CLK),) -CONFIG_SPI_CLK=5000000 +CONFIG_SPI_CLK=33000000 endif ifndef MEMORY