场景:自己画的板子,OMAP-L138,通过硬件测试发现:NAND FLASH和网口都有问题,也就是说UBL和U-BOOT都不能烧写到NAND FLASH中,并且不能使用网络服务(TFTP、NFS)。所以考虑用UART启动方式,用“UART Boot Host Utility”这个工具把UBL(AIS格式)下载到Shared RAM空间。接着,按大家所说,应该是UBL从串口读取U-BOOT到DDR空间,并跳转到该地址运行U-BOOT。
问题:用什么工具把U-BOOT下载到DDR空间?
下面是UBL源码从串口读取U-BOOT的相关函数:
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;
}
很明显,UBL在从串口接收数据(U-BOOT),那么是谁发给它的呢?
另外,在NAND FLASH 和 网口 都挂掉的情况下,有没有可能移植 kernel 和 文件系统呢?