Beispiel #1
0
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;
}
Beispiel #2
0
static Uint32 LOCAL_recvCommand(Uint32* bootCmd)
{
  if(UART_checkSequence("    CMD", TRUE) != E_PASS)
  {
    return E_FAIL;
  }

  if(UART_recvHexData(4,bootCmd) != E_PASS)
  {
    return E_FAIL;
  }

  return E_PASS;
}
Beispiel #3
0
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;
}