Пример #1
0
/*****************************************************************************
 ** Function name:	u32Bootloader_WriteCRC
 **
 ** Description:	Writes a 16-bit CRC value to the last location in flash
 ** 				memory, the bootloader uses this value to check for a valid
 ** 				application at startup.
 **
 ** Parameters:	    u16CRC - CRC value to be written to flash
 **
 ** Returned value: 1 if CRC written to flash successfully, otherwise 0.
 **
 *****************************************************************************/
static uint32_t u32Bootloader_WriteCRC(uint32_t fileSize,uint16_t u16CRC)
{
    uint32_t i;
    uint32_t u32Result = 0;
    uint32_t a32DummyData[IAP_FLASH_PAGE_SIZE_WORDS];
    uint32_t *pu32Mem = (uint32_t *)(APP_END_ADDR - IAP_FLASH_PAGE_SIZE_BYTES);

    /* First copy the data that is currently present in the last page of
       flash into a temporary buffer */
    for (i = 0 ; i < IAP_FLASH_PAGE_SIZE_WORDS; i++)
    {
        a32DummyData[i] = *pu32Mem++;
    }

    /* Set the CRC value to be written back */
    a32DummyData[IAP_FLASH_PAGE_SIZE_WORDS - 1] = (uint32_t)u16CRC;
    a32DummyData[IAP_FLASH_PAGE_SIZE_WORDS - 2] = (uint32_t)fileSize;

    if (u32IAP_PrepareSectors(APP_END_SECTOR, APP_END_SECTOR) == IAP_STA_CMD_SUCCESS)
    {
        /* Now write the data back, only the CRC bits have changed */
        if (u32IAP_CopyRAMToFlash((APP_END_ADDR - IAP_FLASH_PAGE_SIZE_BYTES),
                                  (uint32_t)a32DummyData,
                                  IAP_FLASH_PAGE_SIZE_BYTES) == IAP_STA_CMD_SUCCESS)
        {
            u32Result = 1;
        }
    }
    return (u32Result);
}
Пример #2
0
uint8_t    parseUploadReq(uint16_t ssid,uint32_t fileSiz)
{

    if(fileSiz > MAX_FILE_SIZE)
    {
        curSession = 0;
        buildAckPacket(CMD_UPLOAD_REQ,ERR_TOO_LARGE,ssid);
        return 0;
    }

    if (u32IAP_PrepareSectors(APP_START_SECTOR, APP_END_SECTOR) == IAP_STA_CMD_SUCCESS)
    {
        if (u32IAP_EraseSectors(APP_START_SECTOR, APP_END_SECTOR) == IAP_STA_CMD_SUCCESS)
        {
            //uint16_t u16CRC = 0;

            curSession  = ssid;
            totalSize   = fileSiz;
            totalPktNum = fileSiz / PACKET_SIZE;
            u32NextFlashWriteAddr = APP_START_ADDR;
            buildAckPacket(CMD_UPLOAD_REQ,ERR_OK,ssid);
            return 1;
        }
    }

    buildAckPacket(CMD_UPLOAD_REQ,ERR_ERASE,ssid);
    return 0;

}
Пример #3
0
/*****************************************************************************
 ** Function name:	u32BootLoader_ProgramFlash
 **
 ** Description:
 **
 ** Parameters:	    None
 **
 ** Returned value: 0 if programming failed, otherwise 1.
 **
 *****************************************************************************/
static uint32_t u32BootLoader_ProgramFlash(uint8_t *pu8Data, uint16_t u16Len)
{
    uint32_t u32Result = 0;

    if ((pu8Data != 0) && (u16Len != 0))
    {
        /* Prepare the flash application sectors for reprogramming */
        if (u32IAP_PrepareSectors(APP_START_SECTOR, APP_END_SECTOR) == IAP_STA_CMD_SUCCESS)
        {
            /* Ensure that amount of data written to flash is at minimum the
               size of a flash page */
            if (u16Len < IAP_FLASH_PAGE_SIZE_BYTES)
            {
                u16Len = IAP_FLASH_PAGE_SIZE_BYTES;
            }

            /* Write the data to flash */
            if (u32IAP_CopyRAMToFlash(u32NextFlashWriteAddr, (uint32_t)pu8Data, u16Len) == IAP_STA_CMD_SUCCESS)
            {
                /* Check that the write was successful */
                if (u32IAP_Compare(u32NextFlashWriteAddr, (uint32_t)pu8Data, u16Len, 0) == IAP_STA_CMD_SUCCESS)
                {
                    /* Write was successful */
                    u32NextFlashWriteAddr += u16Len;
                    u32Result = 1;
                }
            }
        }
    }
    return (u32Result);
}
Пример #4
0
int flash1788_erase_sector(int sectorNumber)
{
    if(sectorNumber<0||sectorNumber>=flash1788_section_address[0]) {
        ASSERT_MINE(0);
    }
    ASSERT_MINE(u32IAP_PrepareSectors(sectorNumber, sectorNumber) == IAP_STA_CMD_SUCCESS);
    ASSERT_MINE(u32IAP_EraseSectors  (sectorNumber, sectorNumber) == IAP_STA_CMD_SUCCESS);
    return 0;
}
Пример #5
0
void saveUtcOffsetToFlash()
{
	flashImage[0] = utcOffset;

	__disable_irq();
	if(u32IAP_PrepareSectors(16, 16) == IAP_STA_CMD_SUCCESS)
	{
		u32IAP_EraseSectors(16, 16);
		u32IAP_PrepareSectors(16, 16);
		if(u32IAP_CopyRAMToFlash(IMG_START_SECTOR, (uint32_t)flashImage, IAP_FLASH_PAGE_SIZE_BYTES) == IAP_STA_CMD_SUCCESS)
		{
			if(u32IAP_Compare(IMG_START_SECTOR, (uint32_t)flashImage, IAP_FLASH_PAGE_SIZE_BYTES, 0) == IAP_STA_CMD_SUCCESS)
			{
				__enable_irq();
				ledSetState(TASK_LED, LedOn);
				return;
			}
		}
	}
	__enable_irq();
	ledSetState(TASK_LED, LedBlink);
}
Пример #6
0
int flash1788_program(uint32 addrDest,uint8 *addrSrc)
{
    int i;
    int sectorNumber;

    for(i=0;; i++) {
        if(i>=flash1788_section_address[0]) {
            return -1;
        }
        if(flash1788_section_address[i+1]<=addrDest&&addrDest<flash1788_section_address[i+2]) {
            break;
        }
    }
    sectorNumber=i;
    ASSERT_MINE((addrDest&(FLASH1788_UNIT_PROG_LEN-1))==0);
    ASSERT_MINE(u32IAP_PrepareSectors(sectorNumber, sectorNumber) == IAP_STA_CMD_SUCCESS);
    ASSERT_MINE(u32IAP_CopyRAMToFlash(addrDest, (uint32_t)addrSrc, FLASH1788_UNIT_PROG_LEN) == IAP_STA_CMD_SUCCESS);
    return 0;
}