//------------------------------------------------------------------------------ /// Initialize EEPROM devices and transfer one or sevral modules from EEPROM to the /// target memory (SRAM/SDRAM). /// \param pTd Pointer to transfer descriptor array. /// \param nbTd Number of transfer descriptors. //------------------------------------------------------------------------------ int BOOT_EEPROM_CopyBin(const Tdesc *pTd, unsigned char nbTd) { unsigned char *pDest; // Dest pointer for copy unsigned int sizeToCopy; // remaining bytes number to copy unsigned int memoryOffset; // Dataflash read offset unsigned int packetSize; // Dataflash read size Async async; // Initialize EEPROM EepromInit(); // Check word alignment if (pTd->offset % PAGE_SIZE) { TRACE_ERROR("Offset not word aligned\n\r"); return BOOT_EEPROM_ERROR_GP; } // Transfert data from EEPROM to External RAM //------------------------------------------------------------------------- memset(&async, 0, sizeof(async)); async.callback = (void *) TestCallback; // Foreach module transfer data from EEPROM to memory while (nbTd--) { TRACE_INFO("Copy \"%s\" (%d bytes) from EEPROM 0x%08x to 0x%08x\n\r", pTd->strDescr, pTd->size, pTd->offset, pTd->dest ); pDest = (unsigned char*)pTd->dest; sizeToCopy = pTd->size; memoryOffset = pTd->offset; while (sizeToCopy > 0) { // Write packet after packets packetSize = (sizeToCopy < PAGE_SIZE) ? sizeToCopy : PAGE_SIZE; // Read the page and copy TWID_Read(&twid, AT24C_ADDRESS, memoryOffset, 2, pDest, PAGE_SIZE, &async); while (!ASYNC_IsFinished(&async)); // Update pointer memoryOffset += packetSize; pDest += packetSize; sizeToCopy -= packetSize; } ++pTd; } return BOOT_EEPROM_SUCCESS; }
extern int main( void ) { volatile uint32_t delay; uint8_t i; uint8_t SNo[16]; Async async; /* Disable watchdog */ WDT_Disable( WDT ) ; /* Enable I and D cache */ SCB_EnableICache(); SCB_EnableDCache(); CallBackFired = 0; /* Output example information */ printf("-- TWI EEPROM Example %s --\n\r", SOFTPACK_VERSION); printf("-- %s\n\r", BOARD_NAME); printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__); TimeTick_Configure(); /* Configure TWI pins. */ PIO_Configure(pins, PIO_LISTSIZE(pins)); PMC_EnablePeripheral(BOARD_ID_TWI_EEPROM); /* Configure TWI */ twi_dma.pTwid = malloc(sizeof(Twid)); twi_dma.pTwiDma = malloc(sizeof(sXdmad)); TWI_ConfigureMaster(BOARD_BASE_TWI_EEPROM, TWCK, BOARD_MCK); TWID_Initialize(&twid, BOARD_BASE_TWI_EEPROM); TWID_DmaInitialize(&twi_dma, BOARD_BASE_TWI_EEPROM, 0); TWID_Read(&twid, AT24MAC_SERIAL_NUM_ADD, 0x80, 1, SNo, PAGE_SIZE, 0); /* Erase all page */ memset(pData, 0, PAGE_SIZE); for(i=0; i< EEPROM_PAGES; i++) { printf("-I- Filling page #%d with zeroes ...\r\n", i); TWID_Write(&twid, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, 0); /* Wait at least 10 ms */ Wait(10); } printf("\r\n"); _fillBuffer(pData); /* Synchronous operation */ for(i=0; i< EEPROM_PAGES; i++) { printf("\n\r-I- Filling page #%d with checkerboard pattern ...\r", i); TWID_DmaWrite(&twi_dma, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, 0); /* Wait at least 10 ms */ Wait(10); } printf("\r\n"); /* Read back data */ memset(pData, 0, PAGE_SIZE); for(i=0; i< EEPROM_PAGES; i++) { printf("-I- Reading page #%d... ", i); TWID_DmaRead(&twi_dma, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, 0); /* Wait at least 10 ms */ Wait(10); _checkReadBuffer(pData); } printf("\r\n"); /* Configure TWI interrupts */ NVIC_ClearPendingIRQ(TWIHS0_IRQn); NVIC_EnableIRQ(TWIHS0_IRQn); /* Asynchronous operation */ printf("-I- Read/write on page #0 (IRQ mode)\n\r"); /* Write checkerboard pattern in first page */ _fillBuffer(pData); memset(&async, 0, sizeof(async)); async.callback = (void *) TestCallback; for(i=0; i< EEPROM_PAGES; i++) { printf("-I- Filling page #%d with checkerboard pattern ...\r", i); TWID_Write(&twid, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, &async); while (!ASYNC_IsFinished(&async)); /* Wait at least 10 ms */ Wait(10); } printf("\r\n"); /* Read back data */ memset(pData, 0, PAGE_SIZE); memset(&async, 0, sizeof(async)); async.callback = (void *) TestCallback; for(i=0; i< EEPROM_PAGES; i++) { printf("-I- Reading page # %d...\r", i); TWID_Read(&twid, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, &async); while ( !ASYNC_IsFinished( &async ) ) ; /* Wait at least 10 ms */ Wait(10); _checkReadBuffer(pData); } printf("\r\n Callback Fired %d times", CallBackFired); return 0 ; }