static Uint32 LOCAL_recvHeaderAndData(UARTBOOT_HeaderHandle ackHeader) { Uint32 error = E_FAIL, recvLen; // Recv ACK command error = UART_checkSequence(" ACK", TRUE); if(error != E_PASS) { return E_FAIL; } // Get the ACK header elements error = UART_recvHexData( 4, (Uint32 *) &(ackHeader->magicNum) ); error |= UART_recvHexData( 4, (Uint32 *) &(ackHeader->startAddr) ); error |= UART_recvHexData( 4, (Uint32 *) &(ackHeader->byteCnt) ); error |= UART_checkSequence("0000", FALSE); if(error != E_PASS) { return E_FAIL; } // Verify that the data size is appropriate if((ackHeader->byteCnt == 0) || (ackHeader->byteCnt > APP_IMAGE_SIZE)) { LOCAL_sendSequence(" BADCNT"); // trailing /0 will come along return E_FAIL; } // Verify application start address is in RAM (lower 16bit of appStartAddr also used // to hold UBL entry point if this header describes a UBL) if( (ackHeader->startAddr < DEVICE_DDR2_START_ADDR) || (ackHeader->startAddr > DEVICE_DDR2_END_ADDR) ) { LOCAL_sendSequence("BADADDR"); // trailing /0 will come along return E_FAIL; } // Send BEGIN command if (LOCAL_sendSequence(" BEGIN") != E_PASS) return E_FAIL; // Receive the data over UART recvLen = ackHeader->byteCnt; error = UART_recvStringN((String)(ackHeader->loadAddr), &recvLen, FALSE ); if ( (error != E_PASS) || (recvLen != ackHeader->byteCnt) ) { DEBUG_printString("\r\nUART Receive Error\r\n"); return E_FAIL; } // Return DONE when all data arrives if ( LOCAL_sendSequence(" DONE") != E_PASS ) return E_FAIL; return E_PASS; }
Uint32 UARTBOOT_copy(UART_InfoHandle hUartInfo) { Uint32 status = E_FAIL; Uint32 descriptor[5]; Uint32 magicNum; SDMMC_Boot sdMMCBootDesc; SDMMC_MEM_InfoHandle hSDMMCMemInfo; Uint32 dataBytesPerBlk; Uint32 len, bytes2read; do { hSDMMCMemInfo = SDMMC_MEM_open(0,NULL); if (hSDMMCMemInfo == NULL) { DEBUG_printString("Failed to initialize MMC\r\n"); break; } dataBytesPerBlk = hSDMMCMemInfo->hSDMMCInfo->dataBytesPerBlk; // read from the UART first 5 words len = sizeof(descriptor); status = UART_recvStringN(hUartInfo, (char*)descriptor, &len, 0); if ((status == E_FAIL) ||(len != sizeof(descriptor))) { DEBUG_printString("Failed to read descriptor\r\n"); break; } magicNum = descriptor[0]; if((magicNum & 0xFFFFFF00) != (UBL_MAGIC_BIN_IMG & 0xFFFFFF00)) { DEBUG_printString("Magic number failed\r\n"); break; } sdMMCBootDesc.magicNum = magicNum; sdMMCBootDesc.entryPoint = descriptor[1]; sdMMCBootDesc.numBlock = descriptor[2]; sdMMCBootDesc.startBlock = descriptor[3]; sdMMCBootDesc.ldAddress = descriptor[4]; DEBUG_printString("Got descriptor\r\n"); bytes2read = dataBytesPerBlk*sdMMCBootDesc.numBlock; len = bytes2read; status = UART_recvStringN(hUartInfo, ((char*)&DDR_START), &len, 0); if ((status == E_FAIL) || (len != bytes2read)) { DEBUG_printString("Failed to read data to the external RAM\r\n"); break; } // all the data is in the RAM - program the MMC status = SDMMC_MEM_writeBytes (hSDMMCMemInfo, dataBytesPerBlk*sdMMCBootDesc.startBlock, bytes2read, (Uint8*)&DDR_START); if (status == E_FAIL) { DEBUG_printString("Failed to write MMC\r\n"); break; } status = E_PASS; } while (0); return status; }
static Uint32 LOCAL_recvHeaderAndData(UARTBOOT_HeaderHandle ackHeader) { Uint32 error = E_PASS, recvLen; Bool imageIsUBL; Uint32 maxImageSize,minStartAddr,maxStartAddr; // Issue command to host to send image if ( LOCAL_sendSequence("SENDIMG") != E_PASS) { return E_FAIL; } // Recv ACK command if(UART_checkSequence(" ACK", TRUE) != E_PASS) { return E_FAIL; } // Get the ACK header elements error = UART_recvHexData( 4, (Uint32 *) &(ackHeader->magicNum) ); error |= UART_recvHexData( 4, (Uint32 *) &(ackHeader->startAddr) ); error |= UART_recvHexData( 4, (Uint32 *) &(ackHeader->byteCnt) ); error |= UART_recvHexData( 4, (Uint32 *) &(ackHeader->loadAddr) ); error |= UART_checkSequence("0000", FALSE); if(error != E_PASS) { return E_FAIL; } // Check if this is a UBL or APP image if (ackHeader->loadAddr == 0x00000020) { imageIsUBL = TRUE; maxImageSize = UBL_IMAGE_SIZE; minStartAddr = 0x0100; maxStartAddr = UBL_IMAGE_SIZE; } else { imageIsUBL = FALSE; maxImageSize = APP_IMAGE_SIZE; minStartAddr = DEVICE_DDR2_START_ADDR; maxStartAddr = DEVICE_DDR2_END_ADDR; } // Verify that the data size is appropriate if((ackHeader->byteCnt == 0) || (ackHeader->byteCnt > maxImageSize)) { LOCAL_sendSequence(" BADCNT"); // trailing /0 will come along return E_FAIL; } // Verify application start address is in RAM (lower 16bit of appStartAddr also used // to hold UBL entry point if this header describes a UBL) if( (ackHeader->startAddr < minStartAddr) || (ackHeader->startAddr > maxStartAddr) ) { LOCAL_sendSequence("BADADDR"); // trailing /0 will come along return E_FAIL; } // Allocate space in DDR to store image ackHeader->imageBuff = (Uint8 *) UTIL_allocMem(ackHeader->byteCnt); // Send BEGIN command if (LOCAL_sendSequence(" BEGIN") != E_PASS) return E_FAIL; // Receive the data over UART recvLen = ackHeader->byteCnt; error = UART_recvStringN((String)ackHeader->imageBuff, &recvLen, FALSE ); if ( (error != E_PASS) || (recvLen != ackHeader->byteCnt) ) { DEBUG_printString("\r\nUART Receive Error\r\n"); return E_FAIL; } // Return DONE when all data arrives if ( LOCAL_sendSequence(" DONE") != E_PASS ) return E_FAIL; return E_PASS; }