pb5.0通过串口回应EBOOT发送的bootme问题

lishixin   2009-2-18 10:19 楼主
各位大侠好!
   小弟最近在做EBOOT中的OEMPreDownload函数,由于硬件条件所限暂时先用串口3下载映象,串口1打映消息,现在我已经用
SSCOM测试过OEMPreDownload函数中的SerialSendBootRequest已经通过3口发送bootme数据包,但是就是在WaitForBootAck中无法接受到pb的回应包,查明是在OEMSerialRecvRaw中超时才没有收到,然后我又开了一个SSCOM连上3口,就在等待pb的回音期间在SSCOM上任意发送了一个字符,发现可以受到,基本可以断定是pb的问题,没有对我发送的包作出回音!可是为什么呢?我照者真正EBOOT中的OEMPreDownload看了一边,发现它是通过tftp协议和eboot通讯的,可我这里的串口用不了tftp啊!

请大家帮忙啊!!
谢谢!!

回复评论 (7)

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;
}
点赞  2009-2-18 10:27
请大家帮帮忙啊
希望请作过的指点一下,谢谢了
点赞  2009-2-18 12:29
没人理我啊,郁闷!
点赞  2009-2-18 13:01
没做过,不知道,关注
点赞  2009-2-18 14:40
有进展!
刚点击了target里的attach device后可以收到pb发来的字符,且前4个就是kITL,但是后面的字符好象有点不对,大家指点一下啊
自己继续
点赞  2009-2-18 14:55
从pb回应的字符来看,header中的crcData和crcHdr已经校验正确,但是不能象真正的eboot那样可以在target中的Active Device下明显地看到开发机已经成功的接受到了目标机发送的bootme信号,不知哪位高人可以指点一下啊??

继续!
点赞  2009-2-18 16:17
现在已经可以从pb里返回kitl的包头,但是不能间隔接受kitl包,只能一次全部接受完,否则crc校验会出错!可照着cepc里SBOOT里看的是他那是可以间隔接受kitl包的,不知为呵??大家帮帮忙啊
自己继续
点赞  2009-2-19 10:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复