Ejemplo n.º 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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 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;
}