各位大侠好!
小弟最近在做EBOOT中的OEMPreDownload函数,由于硬件条件所限暂时先用串口3下载映象,串口1打映消息,现在我已经用
SSCOM测试过OEMPreDownload函数中的SerialSendBootRequest已经通过3口发送bootme数据包,但是就是在WaitForBootAck中无法接受到pb的回应包,查明是在OEMSerialRecvRaw中超时才没有收到,然后我又开了一个SSCOM连上3口,就在等待pb的回音期间在SSCOM上任意发送了一个字符,发现可以受到,基本可以断定是pb的问题,没有对我发送的包作出回音!可是为什么呢?我照者真正EBOOT中的OEMPreDownload看了一边,发现它是通过tftp协议和eboot通讯的,可我这里的串口用不了tftp啊!
请大家帮忙啊!!
谢谢!!
OEMPreDownload函数:DWORD OEMPreDownload(void)
{
AT91PS_PIO pPIOA = (AT91PS_PIO)OALPAtoVA((DWORD) AT91C_BASE_PIOA,false);
bool fGotJump = FALSE;
// send boot requests indefinitely
do
{
myEdbgOutputDebugString("Sending boot request...\r\n");
if(!SerialSendBootRequest())
{
myEdbgOutputDebugString("Failed to send boot request\r\n");
return BL_ERROR;
}
}
while(!WaitForBootAck(&fGotJump));
myEdbgOutputDebugString("Received ack!!!...\r\n");
while(1)
{
pPIOA->PIO_SODR |=0x09000000;
pPIOA->PIO_CODR |=0x08000000;
}
// ack block zero to start the download
SerialSendBlockAck(0);
myEdbgOutputDebugString("Received boot request ack... starting download\r\n");
return fGotJump ? BL_JUMP : BL_DOWNLOAD;//0= BL_DOWNLOAD,1=BL_JUMP
}
OEMSerialRecvRaw函数:BOOL OEMSerialRecvRaw(LPBYTE pbFrame, PUSHORT pcbFrame, BOOLEAN bWaitInfinite)
//------------------------------------------------------------------------------
{
AT91PS_PIO pPIOA = (AT91PS_PIO)OALPAtoVA((DWORD) AT91C_BASE_PIOA,false);
USHORT ct = 0;
UINT64 tStart = 0;
UCHAR uStatus = 0;
AT91PS_USART usart0_BASE= (AT91PS_USART)OALPAtoVA((DWORD) AT91C_BASE_US0,false);
for(ct = 0; ct < *pcbFrame; ct++)
{
if (!bWaitInfinite)
{
tStart = OEMEthGetSecs();
}
while(!(AT91C_US_RXRDY & usart0_BASE->US_CSR))//Did we receive at least one byte ?
{
if(!bWaitInfinite && ((OEMEthGetSecs() - tStart)/1000 > TIMEOUT_RECV))//10秒
{
EdbgOutputDebugString("time out!!.\r\n");//总是运行到里
*pcbFrame = 0;
return FALSE;
}
}
EdbgOutputDebugString("received!!.\r\n");
// check and clear comm errors
if(LS_RX_ERRORS & usart0_BASE->US_CSR)
{
*pcbFrame = 0;
uStatus=LS_RX_ERRORS & usart0_BASE->US_CSR;
EdbgOutputDebugString("Comm errors have occurred; status = 0x%x\r\n", uStatus);
return FALSE;
}
pbFrame[ct]= usart0_BASE->US_RHR & 0x0FF;
}
return TRUE;
}
有进展!
刚点击了target里的attach device后可以收到pb发来的字符,且前4个就是kITL,但是后面的字符好象有点不对,大家指点一下啊
自己继续
从pb回应的字符来看,header中的crcData和crcHdr已经校验正确,但是不能象真正的eboot那样可以在target中的Active Device下明显地看到开发机已经成功的接受到了目标机发送的bootme信号,不知哪位高人可以指点一下啊??
继续!
现在已经可以从pb里返回kitl的包头,但是不能间隔接受kitl包,只能一次全部接受完,否则crc校验会出错!可照着cepc里SBOOT里看的是他那是可以间隔接受kitl包的,不知为呵??大家帮帮忙啊
自己继续