diff -urN romboot.old/init.cpp romboot/init.cpp --- romboot.old/init.cpp 2007-03-24 13:34:19.000000000 +0100 +++ romboot/init.cpp 2007-03-24 12:23:19.000000000 +0100 @@ -207,9 +207,10 @@ AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_DBGU); /* Enable PIO to access the LEDs */ - AT91C_BASE_PIOB->PIO_PER = AT91C_PIO_PB2; - AT91C_BASE_PIOB->PIO_OER = AT91C_PIO_PB2; - AT91C_BASE_PIOB->PIO_CODR = AT91C_PIO_PB2; + AT91C_BASE_PIOC->PIO_PER = AT91C_PIO_PC7 | AT91C_PIO_PC8 | AT91C_PIO_PC14 | AT91C_PIO_PC15; + AT91C_BASE_PIOC->PIO_OER = AT91C_PIO_PC7 | AT91C_PIO_PC8 | AT91C_PIO_PC14 | AT91C_PIO_PC15; + AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC7 | AT91C_PIO_PC15; + AT91C_BASE_PIOC->PIO_SODR = AT91C_PIO_PC8 | AT91C_PIO_PC14; // AT91F_DBGU_Printk("\n\rAT91F_LowLevelInit(): Debug channel initialized\n\r"); } diff -urN romboot.old/main.cpp romboot/main.cpp --- romboot.old/main.cpp 2007-03-24 13:34:19.000000000 +0100 +++ romboot/main.cpp 2007-03-24 12:28:55.000000000 +0100 @@ -13,6 +13,7 @@ //*---------------------------------------------------------------------------- #include #include +#include #include "com.h" #include "main.h" @@ -39,16 +40,31 @@ extern void AT91F_DBGU_Printk(char *); extern "C" void AT91F_ST_ASM_Handler(void); extern "C" void Jump(unsigned int addr); -extern int mci_main(void); +extern int AT91F_MCI_Init(void); +#define TRUE 1 +#define FALSE 0 + +/* from trxhdr.h */ + +#define TRX_MAGIC 0x30524448 /* "HDR0" */ +#define TRX_VERSION 1 + +struct trx_header { + unsigned int magic; + unsigned int len; + unsigned int crc32; + unsigned int flag_version; + unsigned int offsets[3]; +}; //const char *menu_separ = "*----------------------------------------*\n\r"; const char *menu_dataflash = { - "1: DL DF [ad]\n\r" - "2: RD DF [ad]\n\r" - "3: CP SD\n\r" - "4: U-BOOT\n\r" - "5: RM BL in DF\n\r" + "1: Download DF [addr]\n\r" + "2: Read DF [addr]\n\r" + "3: Copy SD-Card\n\r" + "4: Start U-BOOT\n\r" + "5: Clear bootloder\n\r" }; //* Globales variables @@ -155,14 +171,15 @@ //*----------------------------------------------------------------------------- void AT91F_DisplayMenu(void) { - printf("\n\rFDL SD-Card LOADER %s %s %s\n\r", AT91C_VERSION, __DATE__, __TIME__); -// printf(menu_separ); - AT91F_DataflashPrintInfo(); -// printf(menu_separ); printf(menu_dataflash); -// printf(menu_separ); } +void AT91F_DisplayIntro(void) +{ + printf("\n\rFDL LOADER %s %s %s\n\r", AT91C_VERSION, __DATE__, __TIME__); + AT91F_DataflashPrintInfo(); +} + //*----------------------------------------------------------------------------- //* Function Name : AsciiToHex() //* Object : ascii to hexa conversion @@ -311,23 +328,24 @@ AT91F_SetPLL(); } -/*void LedCode(void) +/* +void LedCode(void) { int *pRegister; pRegister = (int *)0xFFFFF800; // Enable port C peripheral reg - *pRegister = 0x3c00; + *pRegister = (AT91C_PIO_PC7 | AT91C_PIO_PC8 | AT91C_PIO_PC14 | AT91C_PIO_PC15); pRegister = (int *)0xFFFFF810; // Output Enable reg - *pRegister = 0x3c00; + *pRegister = (AT91C_PIO_PC7 | AT91C_PIO_PC8 | AT91C_PIO_PC14 | AT91C_PIO_PC15); pRegister = (int *)0xFFFFF830; // Set data - *pRegister = 0x1400; + *pRegister = AT91C_PIO_PC7 | AT91C_PIO_PC15; pRegister = (int *)0xFFFFF834; // Clear bits - *pRegister = 0x2800; + *pRegister = AT91C_PIO_PC8 | AT91C_PIO_PC14; } */ + void AT91F_StartUboot(unsigned int dummy, void *pvoid) { - //printf("Load U-BOOT from dataflash[%x] to SDRAM[%x]\n\r", AT91C_UBOOT_DATAFLASH_ADDR, AT91C_UBOOT_ADDR); read_dataflash(AT91C_UBOOT_DATAFLASH_ADDR, AT91C_UBOOT_SIZE, (char *)(AT91C_UBOOT_ADDR)); //printf("Set PLLA to 180Mhz and Master clock to 60Mhz and start U-BOOT\n\r"); //* Reset registers @@ -337,6 +355,67 @@ while(1); } +#define AT91C_MCI_TIMEOUT 1000000 + +extern AT91S_MciDevice MCI_Device; + +extern void AT91F_MCIDeviceWaitReady(unsigned int); +extern int AT91F_MCI_ReadBlockSwab(AT91PS_MciDevice, int, unsigned int *, int); + + +int Program_From_MCI(void) +{ + int i; + unsigned int Max_Read_DataBlock_Length; + int block = 0; + int buffer = AT91C_DOWNLOAD_BASE_ADDRESS; + int bufpos = AT91C_DOWNLOAD_BASE_ADDRESS; + int NbPage = 0; + struct trx_header *p; + unsigned int data; + + p = (struct trx_header *)bufpos; + + Max_Read_DataBlock_Length = MCI_Device.pMCI_DeviceFeatures->Max_Read_DataBlock_Length; + + AT91F_MCIDeviceWaitReady(AT91C_MCI_TIMEOUT); + + AT91F_MCI_ReadBlockSwab(&MCI_Device, block*Max_Read_DataBlock_Length, (unsigned int *)bufpos, Max_Read_DataBlock_Length); + + if (p->magic != TRX_MAGIC) + return FALSE; + + printf("Read SD-Card\n\r"); + AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC7 | AT91C_PIO_PC15 | AT91C_PIO_PC8 | AT91C_PIO_PC14; + for (i=0; i<(p->len/512); i++) { + AT91F_MCI_ReadBlockSwab(&MCI_Device, block*Max_Read_DataBlock_Length, (unsigned int *)bufpos, Max_Read_DataBlock_Length); + block++; + bufpos += Max_Read_DataBlock_Length; + } + + NbPage = 0; + i = dataflash_info[0].Device.pages_number; + while(i >>= 1) + NbPage++; + i = ((p->offsets[1] - p->offsets[0])/ 512) + 1 + (NbPage << 13) + (dataflash_info[0].Device.pages_size << 17); + *(int *)(buffer + p->offsets[0] + AT91C_OFFSET_VECT6) = i; + + printf("Write romboot\n\r"); + AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC7 | AT91C_PIO_PC15 | AT91C_PIO_PC14; + AT91C_BASE_PIOC->PIO_SODR = AT91C_PIO_PC8; + write_dataflash(0xc0000000, buffer + p->offsets[0], p->offsets[1] - p->offsets[0]); + printf("Write u-boot\n\r"); + AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC7 | AT91C_PIO_PC15; + AT91C_BASE_PIOC->PIO_SODR = AT91C_PIO_PC8 | AT91C_PIO_PC14; + write_dataflash(0xc0008000, buffer + p->offsets[1], p->offsets[2] - p->offsets[1]); + printf("Write knl/root\n\r"); + AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC8 | AT91C_PIO_PC15; + AT91C_BASE_PIOC->PIO_SODR = AT91C_PIO_PC7 | AT91C_PIO_PC14; + write_dataflash(0xc0042000, buffer + p->offsets[2], p->len - p->offsets[2]); + AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC8 | AT91C_PIO_PC14; + AT91C_BASE_PIOC->PIO_SODR = AT91C_PIO_PC7 | AT91C_PIO_PC15; + return TRUE; + } //*---------------------------------------------------------------------------- //* Function Name : main @@ -357,6 +436,7 @@ unsigned int crc1 = 0, crc2 = 0; volatile int device; int NbPage; + int mci_present; stdin = fopen(0, at91_dbgu_getc); stdout = fopen(at91_dbgu_putc, 0); @@ -387,6 +467,15 @@ // DataFlash on SPI Configuration AT91F_DataflashInit (); + AT91F_DisplayIntro(); + mci_present = AT91F_MCI_Init(); + +#ifdef PRODTEST + if (mci_present) { + Program_From_MCI(); + AT91F_StartUboot(0, (void *)0); + } +#endif // start tempo to start Uboot in a delay of 1 sec if no key pressed svcUbootTempo.Start(&svcUbootTempo, 1000, 0, AT91F_StartUboot, (void *)0); @@ -396,7 +485,7 @@ // stop tempo svcUbootTempo.Stop(&svcUbootTempo); - + while(1) { while(command == 0) { AddressToDownload = AT91C_DOWNLOAD_BASE_ADDRESS; @@ -444,7 +533,8 @@ #endif case '3': - mci_main(); + if (mci_present) + Program_From_MCI(); command=0; break; @@ -461,7 +551,6 @@ *i = 0; } write_dataflash(0xc0000000, 0x20000000, 0x4000); - printf("BL CLR\r\n"); command = 0; break; diff -urN romboot.old/main.h romboot/main.h --- romboot.old/main.h 2007-03-24 13:34:19.000000000 +0100 +++ romboot/main.h 2007-03-23 19:06:52.000000000 +0100 @@ -27,7 +27,7 @@ #define AT91C_OFFSET_VECT6 0x14 //* Offset for ARM vector 6 -#define AT91C_VERSION "VER 1.02" +#define AT91C_VERSION "VER 1.03" // Global variables and functions definition extern unsigned int GetTickCount(void); #endif diff -urN romboot.old/Makefile romboot/Makefile --- romboot.old/Makefile 2007-03-24 13:34:19.000000000 +0100 +++ romboot/Makefile 2007-03-24 10:45:38.000000000 +0100 @@ -1,12 +1,17 @@ LINKFLAGS= -T elf32-littlearm.lds -Ttext 0 COMPILEFLAGS= -Os TARGET=romboot +TARGET2=rbptest + OBJFILES=cstartup_ram.o asm_isr.o asm_mci_isr.o jump.o at45.o com.o dataflash.o \ - mci_device.o mci_main.o init.o main.o stdio.o _udivsi3.o _umodsi3.o div0.o + mci_device.o init.o main.o stdio.o _udivsi3.o _umodsi3.o div0.o +OBJFILES2=cstartup_ram.o asm_isr.o asm_mci_isr.o jump.o at45.o com.o dataflash.o \ + mci_device.o init.o ptmain.o stdio.o _udivsi3.o _umodsi3.o div0.o + LIBRARIES= INCLUDES= -Iinclude -all:$(TARGET) +all:$(TARGET) $(TARGET2) $(TARGET): $(OBJFILES) $(LD) $(OBJFILES) -o $(TARGET).out $(LINKFLAGS) -n @@ -14,6 +19,12 @@ $(OBJDUMP) -h -s $(TARGET).out > $(TARGET).lss $(NM) -n $(TARGET).out | grep -v '\( [aUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $(TARGET).map +$(TARGET2): $(OBJFILES2) + $(LD) $(OBJFILES2) -o $(TARGET2).out $(LINKFLAGS) -n + $(OBJCOPY) $(TARGET2).out -O binary $(TARGET2).bin + $(OBJDUMP) -h -s $(TARGET2).out > $(TARGET2).lss + $(NM) -n $(TARGET2).out | grep -v '\( [aUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $(TARGET2).map + asm_isr.o: asm_isr.S $(CC) -c -Iinclude -o $@ $< @@ -32,6 +43,12 @@ _umodsi3.o: _umodsi3.S $(CC) -c $< +main.o: main.cpp + $(CC) -c $(COMPILEFLAGS) $(INCLUDES) -o main.o $< + +ptmain.o: main.cpp + $(CC) -c $(COMPILEFLAGS) $(INCLUDES) -D PRODTEST -o ptmain.o $< + #%.o: %.S # $(CC) -c $(INCLUDES) -o $@ $< diff -urN romboot.old/mci_device.cpp romboot/mci_device.cpp --- romboot.old/mci_device.cpp 2007-03-24 13:34:19.000000000 +0100 +++ romboot/mci_device.cpp 2007-03-24 11:23:38.000000000 +0100 @@ -16,14 +16,28 @@ #include #include "com.h" -#define ENABLE_WRITE 1 +#define AT91C_MCI_TIMEOUT 1000000 /* For AT91F_MCIDeviceWaitReady */ +#define BUFFER_SIZE_MCI_DEVICE 512 +#define MASTER_CLOCK 60000000 +#define FALSE 0 +#define TRUE 1 + +//* External Functions +extern "C" void AT91F_ASM_MCI_Handler(void); +extern "C" void AT91F_MCI_Device_Handler(AT91PS_MciDevice,unsigned int); +//* Global Variables +AT91S_MciDeviceFeatures MCI_Device_Features; +AT91S_MciDeviceDesc MCI_Device_Desc; +AT91S_MciDevice MCI_Device; + +#undef ENABLE_WRITE #undef MMC //*---------------------------------------------------------------------------- //* \fn AT91F_MCI_SendCommand //* \brief Generic function to send a command to the MMC or SDCard //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_SendCommand ( +int AT91F_MCI_SendCommand ( AT91PS_MciDevice pMCI_Device, unsigned int Cmd, unsigned int Arg) @@ -63,7 +77,7 @@ //* \fn AT91F_MCI_SDCard_SendAppCommand //* \brief Specific function to send a specific command to the SDCard //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_SDCard_SendAppCommand ( +int AT91F_MCI_SDCard_SendAppCommand ( AT91PS_MciDevice pMCI_Device, unsigned int Cmd_App, unsigned int Arg ) @@ -98,7 +112,7 @@ //* \fn AT91F_MCI_GetStatus //* \brief Addressed card sends its status register //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_GetStatus(AT91PS_MciDevice pMCI_Device,unsigned int relative_card_address) +int AT91F_MCI_GetStatus(AT91PS_MciDevice pMCI_Device,unsigned int relative_card_address) { if (AT91F_MCI_SendCommand(pMCI_Device, AT91C_SEND_STATUS_CMD, @@ -139,10 +153,25 @@ } //*---------------------------------------------------------------------------- +//* \fn AT91F_MCI_Handler +//* \brief MCI Handler +//*---------------------------------------------------------------------------- +extern "C" void AT91F_MCI_Handler(void); + +void AT91F_MCI_Handler(void) +{ + int status; + + status = ( AT91C_BASE_MCI->MCI_SR & AT91C_BASE_MCI->MCI_IMR ); + + AT91F_MCI_Device_Handler(&MCI_Device,status); +} + +//*---------------------------------------------------------------------------- //* \fn AT91F_MCI_ReadBlock //* \brief Read an ENTIRE block or PARTIAL block //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_ReadBlock( +int AT91F_MCI_ReadBlock( AT91PS_MciDevice pMCI_Device, int src, unsigned int *dataBuffer, @@ -205,7 +234,7 @@ //* \fn AT91F_MCI_WriteBlock //* \brief Write an ENTIRE block but not always PARTIAL block !!! //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_WriteBlock( +int AT91F_MCI_WriteBlock( AT91PS_MciDevice pMCI_Device, int dest, unsigned int *dataBuffer, @@ -268,7 +297,7 @@ //* \fn AT91F_MCI_MMC_SelectCard //* \brief Toggles a card between the Stand_by and Transfer states or between Programming and Disconnect states //*------------------------------------------------------------------------------------------------------------ -AT91S_MCIDeviceStatus AT91F_MCI_MMC_SelectCard(AT91PS_MciDevice pMCI_Device, unsigned int relative_card_address) +int AT91F_MCI_MMC_SelectCard(AT91PS_MciDevice pMCI_Device, unsigned int relative_card_address) { int status; @@ -302,7 +331,7 @@ //* \fn AT91F_MCI_GetCSD //* \brief Asks to the specified card to send its CSD //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_GetCSD (AT91PS_MciDevice pMCI_Device, unsigned int relative_card_address , unsigned int * response) +int AT91F_MCI_GetCSD (AT91PS_MciDevice pMCI_Device, unsigned int relative_card_address , unsigned int * response) { if(AT91F_MCI_SendCommand(pMCI_Device, @@ -322,7 +351,7 @@ //* \fn AT91F_MCI_SetBlocklength //* \brief Select a block length for all following block commands (R/W) //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_SetBlocklength(AT91PS_MciDevice pMCI_Device,unsigned int length) +int AT91F_MCI_SetBlocklength(AT91PS_MciDevice pMCI_Device,unsigned int length) { return( AT91F_MCI_SendCommand(pMCI_Device, AT91C_SET_BLOCKLEN_CMD, length) ); } @@ -332,7 +361,7 @@ //* \fn AT91F_MCI_MMC_GetAllOCR //* \brief Asks to all cards to send their operations conditions //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_MMC_GetAllOCR (AT91PS_MciDevice pMCI_Device) +int AT91F_MCI_MMC_GetAllOCR (AT91PS_MciDevice pMCI_Device) { unsigned int response =0x0; @@ -357,7 +386,7 @@ //* \fn AT91F_MCI_MMC_GetAllCID //* \brief Asks to the MMC on the chosen slot to send its CID //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_MMC_GetAllCID (AT91PS_MciDevice pMCI_Device, unsigned int *response) +int AT91F_MCI_MMC_GetAllCID (AT91PS_MciDevice pMCI_Device, unsigned int *response) { int Nb_Cards_Found=-1; @@ -391,7 +420,7 @@ //* \fn AT91F_MCI_MMC_Init //* \brief Return the MMC initialisation status //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_MMC_Init (AT91PS_MciDevice pMCI_Device) +int AT91F_MCI_MMC_Init (AT91PS_MciDevice pMCI_Device) { unsigned int tab_response[4]; unsigned int mult,blocknr; @@ -454,7 +483,7 @@ //* \fn AT91F_MCI_SDCard_GetOCR //* \brief Asks to all cards to send their operations conditions //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_SDCard_GetOCR (AT91PS_MciDevice pMCI_Device) +int AT91F_MCI_SDCard_GetOCR (AT91PS_MciDevice pMCI_Device) { unsigned int response =0x0; @@ -479,7 +508,7 @@ //* \fn AT91F_MCI_SDCard_GetCID //* \brief Asks to the SDCard on the chosen slot to send its CID //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_SDCard_GetCID (AT91PS_MciDevice pMCI_Device, unsigned int *response) +int AT91F_MCI_SDCard_GetCID (AT91PS_MciDevice pMCI_Device, unsigned int *response) { if(AT91F_MCI_SendCommand(pMCI_Device, AT91C_ALL_SEND_CID_CMD, @@ -498,7 +527,7 @@ //* \fn AT91F_MCI_SDCard_SetBusWidth //* \brief Set bus width for SDCard //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_SDCard_SetBusWidth(AT91PS_MciDevice pMCI_Device) +int AT91F_MCI_SDCard_SetBusWidth(AT91PS_MciDevice pMCI_Device) { volatile int ret_value; char bus_width; @@ -529,7 +558,7 @@ //* \fn AT91F_MCI_SDCard_Init //* \brief Return the SDCard initialisation status //*---------------------------------------------------------------------------- -AT91S_MCIDeviceStatus AT91F_MCI_SDCard_Init (AT91PS_MciDevice pMCI_Device) +int AT91F_MCI_SDCard_Init (AT91PS_MciDevice pMCI_Device) { unsigned int tab_response[4]; unsigned int mult,blocknr; @@ -567,7 +596,7 @@ pMCI_Device->pMCI_DeviceFeatures->Memory_Capacity = pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length * blocknr; //// End of Compute Memory Capacity - printf("BLK 0x%x", pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length); + printf("SD-Card: %d Bytes\n\r", pMCI_Device->pMCI_DeviceFeatures->Memory_Capacity); if( AT91F_MCI_SDCard_SetBusWidth(pMCI_Device) == AT91C_CMD_SEND_OK ) { @@ -579,3 +608,141 @@ } return AT91C_INIT_ERROR; } + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CfgDevice +//* \brief This function is used to initialise MMC or SDCard Features +//*---------------------------------------------------------------------------- +void AT91F_CfgDevice(void) +{ + // Init Device Structure + + MCI_Device_Features.Relative_Card_Address = 0; + MCI_Device_Features.Card_Inserted = AT91C_CARD_REMOVED; + MCI_Device_Features.Max_Read_DataBlock_Length = 0; + MCI_Device_Features.Max_Write_DataBlock_Length = 0; + MCI_Device_Features.Read_Partial = 0; + MCI_Device_Features.Write_Partial = 0; + MCI_Device_Features.Erase_Block_Enable = 0; + MCI_Device_Features.Sector_Size = 0; + MCI_Device_Features.Memory_Capacity = 0; + + MCI_Device_Desc.state = AT91C_MCI_IDLE; + MCI_Device_Desc.SDCard_bus_width = AT91C_MCI_SCDBUS; + + // Init AT91S_DataFlash Global Structure, by default AT45DB choosen !!! + MCI_Device.pMCI_DeviceDesc = &MCI_Device_Desc; + MCI_Device.pMCI_DeviceFeatures = &MCI_Device_Features; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MCI_Init +//* \brief Initialsise Card +//*---------------------------------------------------------------------------- +int AT91F_MCI_Init(void) +{ + +/////////////////////////////////////////////////////////////////////////////////////////// +// MCI Init : common to MMC and SDCard +/////////////////////////////////////////////////////////////////////////////////////////// + + // Set up PIO SDC_TYPE to switch on MMC/SDCard and not DataFlash Card + AT91F_PIO_CfgOutput(AT91C_BASE_PIOB,AT91C_PIO_PB7); + AT91F_PIO_SetOutput(AT91C_BASE_PIOB,AT91C_PIO_PB7); + + // Init MCI for MMC and SDCard interface + AT91F_MCI_CfgPIO(); + AT91F_MCI_CfgPMC(); + AT91F_PDC_Open(AT91C_BASE_PDC_MCI); + + // Disable all the interrupts + AT91C_BASE_MCI->MCI_IDR = 0xFFFFFFFF; + + // Init MCI Device Structures + AT91F_CfgDevice(); + + // Configure MCI interrupt + AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, + AT91C_ID_MCI, + AT91C_AIC_PRIOR_HIGHEST, + AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, + AT91F_ASM_MCI_Handler); + + // Enable MCI interrupt + AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_MCI); + + // Enable Receiver + AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU); + + AT91F_MCI_Configure(AT91C_BASE_MCI, + AT91C_MCI_DTOR_1MEGA_CYCLES, + AT91C_MCI_MR_PDCMODE, // 15MHz for MCK = 60MHz (CLKDIV = 1) + AT91C_MCI_SDCARD_4BITS_SLOTA); + + if(AT91F_MCI_SDCard_Init(&MCI_Device) != AT91C_INIT_OK) + return FALSE; + else + return TRUE; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MCIDeviceWaitReady +//* \brief Wait for MCI Device ready +//*---------------------------------------------------------------------------- +void AT91F_MCIDeviceWaitReady(unsigned int timeout) +{ + volatile int status; + + do + { + status = AT91C_BASE_MCI->MCI_SR; + timeout--; + } + while( !(status & AT91C_MCI_NOTBUSY) && (timeout>0) ); +} + +unsigned int swab32(unsigned int data) +{ + unsigned int res = 0; + + res = (data & 0x000000ff) << 24 | + (data & 0x0000ff00) << 8 | + (data & 0x00ff0000) >> 8 | + (data & 0xff000000) >> 24; + + return res; +} + +//*-------------------------------------------------------------------- +//* \fn AT91F_MCI_ReadBlockSwab +//* \brief Read Block and swap byte order +//*-------------------------------------------------------------------- +int AT91F_MCI_ReadBlockSwab( + AT91PS_MciDevice pMCI_Device, + int src, + unsigned int *databuffer, + int sizeToRead) +{ + int i; + unsigned char *buf = (unsigned char *)databuffer; + + //* Read Block 1 + for(i=0;i - -#define AT91C_MCI_TIMEOUT 1000000 /* For AT91F_MCIDeviceWaitReady */ -#define BUFFER_SIZE_MCI_DEVICE 512 -#define MASTER_CLOCK 60000000 -#define FALSE -1 -#define TRUE 1 - -//* External Functions -extern "C" void AT91F_ASM_MCI_Handler(void); -extern "C" void AT91F_MCI_Device_Handler(AT91PS_MciDevice,unsigned int); -extern AT91S_MCIDeviceStatus AT91F_MCI_SDCard_Init (AT91PS_MciDevice); -extern AT91S_MCIDeviceStatus AT91F_MCI_SetBlocklength(AT91PS_MciDevice,unsigned int); -extern AT91S_MCIDeviceStatus AT91F_MCI_ReadBlock(AT91PS_MciDevice,int,unsigned int *,int); -extern AT91S_MCIDeviceStatus AT91F_MCI_WriteBlock(AT91PS_MciDevice,int,unsigned int *,int); -//* Global Variables -AT91S_MciDeviceFeatures MCI_Device_Features; -AT91S_MciDeviceDesc MCI_Device_Desc; -AT91S_MciDevice MCI_Device; - -unsigned int dlBuffer = 0x20000000; -#undef MCI_TEST -#ifdef MCI_TEST -char TestString[] = "\r\nHello Hamish\r\n"; -#endif - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCIDeviceWaitReady -//* \brief Wait for MCI Device ready -//*---------------------------------------------------------------------------- -void AT91F_MCIDeviceWaitReady(unsigned int timeout) -{ - volatile int status; - - do - { - status = AT91C_BASE_MCI->MCI_SR; - timeout--; - } - while( !(status & AT91C_MCI_NOTBUSY) && (timeout>0) ); -} - -unsigned int swab32(unsigned int data) -{ - unsigned int res = 0; - - res = (data & 0x000000ff) << 24 | - (data & 0x0000ff00) << 8 | - (data & 0x00ff0000) >> 8 | - (data & 0xff000000) >> 24; - - return res; -} - -AT91S_MCIDeviceStatus readblock( - AT91PS_MciDevice pMCI_Device, - int src, - unsigned int *databuffer, - int sizeToRead) -{ - int i; - unsigned char *buf = (unsigned char *)databuffer; - - //* Read Block 1 - for(i=0;i 0); - } -#endif -//extern char message[40]; - -int notnull(int bufpos, unsigned int len) -{ - int i; - unsigned char * bp = (unsigned char *)bufpos; - - for (i=0; iMax_Read_DataBlock_Length; - - //* ReadBlock & WriteBlock Test -> Entire Block - - //* Wait MCI Device Ready - AT91F_MCIDeviceWaitReady(AT91C_MCI_TIMEOUT); - -#ifdef MCI_TEST - //* Read Block 1 - for(i=0;i>=1) - NbPage++; - i = lastvalid + (NbPage << 13) + (dataflash_info[0].Device.pages_size << 17); - *(int *)(dlBuffer + 0x14) = i; - - for(i=0; i<4688; i++) { - readblock(&MCI_Device, block*Max_Read_DataBlock_Length, (unsigned int *)bufpos, Max_Read_DataBlock_Length); - block++; - bufpos += 512; - } - write_dataflash(0xc0000000, dlBuffer, 512 * block); - //* End Of Test - printf("DONE %d\n\r", lastvalid); - -// printf(Buffer); - - return TRUE; -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_CfgDevice -//* \brief This function is used to initialise MMC or SDCard Features -//*---------------------------------------------------------------------------- -void AT91F_CfgDevice(void) -{ - // Init Device Structure - - MCI_Device_Features.Relative_Card_Address = 0; - MCI_Device_Features.Card_Inserted = AT91C_CARD_REMOVED; - MCI_Device_Features.Max_Read_DataBlock_Length = 0; - MCI_Device_Features.Max_Write_DataBlock_Length = 0; - MCI_Device_Features.Read_Partial = 0; - MCI_Device_Features.Write_Partial = 0; - MCI_Device_Features.Erase_Block_Enable = 0; - MCI_Device_Features.Sector_Size = 0; - MCI_Device_Features.Memory_Capacity = 0; - - MCI_Device_Desc.state = AT91C_MCI_IDLE; - MCI_Device_Desc.SDCard_bus_width = AT91C_MCI_SCDBUS; - - // Init AT91S_DataFlash Global Structure, by default AT45DB choosen !!! - MCI_Device.pMCI_DeviceDesc = &MCI_Device_Desc; - MCI_Device.pMCI_DeviceFeatures = &MCI_Device_Features; - -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_Test_SDCard -//* \brief Configure MCI for SDCard and complete SDCard init, then jump to Test Functions -//*---------------------------------------------------------------------------- -int AT91F_Test_SDCard(void) -{ - ////////////////////////////////////////////////////////// - //* For SDCard Init - ////////////////////////////////////////////////////////// - - AT91F_MCI_Configure(AT91C_BASE_MCI, - AT91C_MCI_DTOR_1MEGA_CYCLES, - AT91C_MCI_MR_PDCMODE, // 15MHz for MCK = 60MHz (CLKDIV = 1) - AT91C_MCI_SDCARD_4BITS_SLOTA); - - if(AT91F_MCI_SDCard_Init(&MCI_Device) != AT91C_INIT_OK) - return FALSE; - - printf("\n\rINI OK: TST\n\r"); - - // Enter Main Tests - return(AT91F_Test()); -} - -//*---------------------------------------------------------------------------- -//* \fn AT91F_MCI_Handler -//* \brief MCI Handler -//*---------------------------------------------------------------------------- -extern "C" void AT91F_MCI_Handler(void); - -void AT91F_MCI_Handler(void) -{ - int status; - - status = ( AT91C_BASE_MCI->MCI_SR & AT91C_BASE_MCI->MCI_IMR ); - - AT91F_MCI_Device_Handler(&MCI_Device,status); -} - -//*---------------------------------------------------------------------------- -//* \fn main -//* \brief main function -//*---------------------------------------------------------------------------- -int mci_main(void) -{ -// printf("MCI Test\n\r"); - -/////////////////////////////////////////////////////////////////////////////////////////// -// MCI Init : common to MMC and SDCard -/////////////////////////////////////////////////////////////////////////////////////////// - -// printf("\n\rInit MCI Interface\n\r"); - - // Set up PIO SDC_TYPE to switch on MMC/SDCard and not DataFlash Card - AT91F_PIO_CfgOutput(AT91C_BASE_PIOB,AT91C_PIO_PB7); - AT91F_PIO_SetOutput(AT91C_BASE_PIOB,AT91C_PIO_PB7); - - // Init MCI for MMC and SDCard interface - AT91F_MCI_CfgPIO(); - AT91F_MCI_CfgPMC(); - AT91F_PDC_Open(AT91C_BASE_PDC_MCI); - - // Disable all the interrupts - AT91C_BASE_MCI->MCI_IDR = 0xFFFFFFFF; - - // Init MCI Device Structures - AT91F_CfgDevice(); - - // Configure MCI interrupt - AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, - AT91C_ID_MCI, - AT91C_AIC_PRIOR_HIGHEST, - AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, - AT91F_ASM_MCI_Handler); - - // Enable MCI interrupt - AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_MCI); - -/////////////////////////////////////////////////////////////////////////////////////////// -// Enter Test Menu -/////////////////////////////////////////////////////////////////////////////////////////// - - // Enable Receiver - AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU); - - if(AT91F_Test_SDCard() == TRUE) - printf("\n\rTST OK\n\r"); - else - printf("\n\rTST Fail\n\r"); - return(1); -}