コード例 #1
0
BOOL	Flash_InPage_Save( uint16_t const * Buffer, uint16_t Count )
{
    uint16_t	i;

    Flash_Unlock();

    if ( !Flash_Page_Erase( EBASE_PAGE0 )) {
        return  FALSE;
    }

    if ( Flash_isBusy( ProgramTimeout )) {
        return  FALSE;
    }

    SET_BIT( FLASH->CR, FLASH_CR_PG );

    for ( i = 0; i < Count; ++i )
    {
        (( __IO uint16_t * )EBASE_PAGE0)[i] = ~ Buffer[i];
        if ( Flash_isBusy( ProgramTimeout )) {
            return  FALSE;
        }
    }

    CLEAR_BIT( FLASH->CR, FLASH_CR_PG );

    Flash_Lock();

    return	TRUE;
}
コード例 #2
0
BOOL	STM32_Flash_Save( uint16_t VirtualAddress, void const * Buffer, uint16_t Count )
{
    if ( ! Flash_Page_Check( EBASE_PAGE0 ))
    {
        Flash_Unlock();
        Flash_Page_Write( EBASE_PAGE0, VirtualAddress, Buffer, Count );
        if ( Flash_Page_Check( EBASE_PAGE0 ))
        {
            Flash_Page_Erase( EBASE_PAGE1 );
            Flash_Lock();
            return	TRUE;
        }
        else
        {
            ;	//	校验失败,保留当前数据
            Flash_Lock();
            return	FALSE;
        }
    }
    else
    {
        Flash_Unlock();
        Flash_Page_Write( EBASE_PAGE1, VirtualAddress, Buffer, Count );
        if ( Flash_Page_Check( EBASE_PAGE1 ))
        {
            Flash_Page_Erase( EBASE_PAGE0 );
            Flash_Lock();
            return	TRUE;
        }
        else
        {
            ;	//	校验失败,保留当前数据
            Flash_Lock();
            return	FALSE;
        }
    }
}
コード例 #3
0
ファイル: Fls.c プロジェクト: miaozhendaoren/PWC-Demonstrator
/**
 * Erase flash sectors
 *
 * @param TargetAddress Always from 0 to FLS_TOTAL_SIZE
 * @param Length
 * @return
 */
Std_ReturnType Fls_Erase(Fls_AddressType TargetAddress, Fls_LengthType Length) {
#if FLS_BASE_ADDRESS > 0
	/* Avoid compiler warning */
	TargetAddress += FLS_BASE_ADDRESS;
#endif

	/** @req SWS_Fls_00218  */
	/** @req SWS_Fls_00220 */
	/** @req SWS_Fls_00327 */

	/** @req SWS_Fls_00065 */
	VALIDATE_W_RV( Fls_Global.status != MEMIF_UNINIT, FLS_ERASE_ID, FLS_E_UNINIT, E_NOT_OK );
	/** @req SWS_Fls_00023 */
	VALIDATE_W_RV( Fls_Global.status != MEMIF_BUSY, FLS_ERASE_ID, FLS_E_BUSY, E_NOT_OK );
    /** @req SWS_Fls_00020 */
	VALIDATE_W_RV( E_OK == sectorAligned( TargetAddress ),
	        FLS_ERASE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK );
    /** @req SWS_Fls_00021  */
    VALIDATE_W_RV( (Length != 0) && (EE_OK == sectorAligned( TargetAddress + Length)),
            FLS_ERASE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK );
#if defined(CFG_MPC5777M)
    VALIDATE_W_RV((E_OK == checkValidChunk(TargetAddress, TargetAddress + Length - 1)), FLS_ERASE_ID, FLS_E_INVALID_AREA, E_NOT_OK);
#endif

	Fls_Global.status = MEMIF_BUSY;				    /** @req SWS_Fls_00328 */
	Fls_Global.jobResultType = MEMIF_JOB_PENDING;   /** @req SWS_Fls_00329 */
	Fls_Global.jobType = FLS_JOB_ERASE;
	Fls_Global.flashAddr = TargetAddress;
	Fls_Global.length = Length;

	LOG_HEX2("Fls_Erase() ",TargetAddress," ", Length);

	/* Unlock */
	Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK,TargetAddress, Length );

	/** @req SWS_Fls_00145 */
	if (EE_OK != Flash_Erase(Fls_Global.config->FlsInfo,TargetAddress, Length, NULL )) {
	    return E_NOT_OK;
	}

	return E_OK;	/** @req SWS_Fls_00330 */
}
コード例 #4
0
ファイル: Fls.c プロジェクト: uincore/OpenSAR
/**
 * Erase flash sectors
 *
 * @param TargetAddress Always from 0 to FLS_TOTAL_SIZE
 * @param Length
 * @return
 */
Std_ReturnType Fls_Erase(Fls_AddressType TargetAddress, Fls_LengthType Length) {
	TargetAddress += FLS_BASE_ADDRESS;

	/** @req FLS250 3.0/4.0 */
	/** @req FLS218 3.0/4.0 */
	/** @req FLS220 3.0/4.0 */
	/** @req FLS327 4.0     */

	/** @req FLS065 */
	VALIDATE_W_RV( Fls_Global.status != MEMIF_UNINIT, FLS_ERASE_ID, FLS_E_UNINIT, E_NOT_OK );
	/** @req FLS023 */
	VALIDATE_W_RV( Fls_Global.status != MEMIF_BUSY, FLS_ERASE_ID, FLS_E_BUSY, E_NOT_OK );
    /** @req FLS020 3.0/4.0 */
	VALIDATE_W_RV( E_OK == fls_SectorAligned( TargetAddress ),
	        FLS_ERASE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK );
    /** @req FLS021 3.0/4.0 */
    VALIDATE_W_RV( (Length != 0) && (EE_OK == fls_SectorAligned( TargetAddress + Length)),
            FLS_ERASE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK );

	// Check if we trying to erase a partition that we are executing in
#if 0
	pc = fls_GetPc();
#endif


	Fls_Global.status = MEMIF_BUSY;				    /** @req FLS219 3.0 */ /** @req FLS328 4.0 */
	Fls_Global.jobResultType = MEMIF_JOB_PENDING;   /** @req FLS329 4.0 */
	Fls_Global.jobType = FLS_JOB_ERASE;
	Fls_Global.flashAddr = TargetAddress;
	Fls_Global.length = Length;

	LOG_HEX2("Fls_Erase() ",TargetAddress," ", Length);

	/* Unlock */
	Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK,TargetAddress, Length );

	/** @req FLS145 */
	Flash_Erase(Fls_Global.config->FlsInfo,TargetAddress, Length, NULL );

	return E_OK;	/** @req FLS330 4.0 */
}
コード例 #5
0
ファイル: Fls.c プロジェクト: miaozhendaoren/PWC-Demonstrator
Std_ReturnType Fls_Write(Fls_AddressType TargetAddress,
		const uint8 *SourceAddressPtr, Fls_LengthType Length) {
#if FLS_BASE_ADDRESS > 0
	/* Avoid compiler warning */
	TargetAddress += FLS_BASE_ADDRESS;
#endif

	/** @req SWS_Fls_00223 */
	/** @req SWS_Fls_00225 */
	/** @req SWS_Fls_00226 */

	/** @req SWS_Fls_00066 */
	VALIDATE_W_RV(Fls_Global.status != MEMIF_UNINIT,FLS_WRITE_ID, FLS_E_UNINIT,E_NOT_OK );
	/** @req SWS_Fls_00030 */
	VALIDATE_W_RV(Fls_Global.status != MEMIF_BUSY,FLS_WRITE_ID, FLS_E_BUSY,E_NOT_OK );
	/** @req SWS_Fls_00157 */
	VALIDATE_W_RV(SourceAddressPtr != NULL,FLS_WRITE_ID, FLS_E_PARAM_DATA,E_NOT_OK );
	/** @req SWS_Fls_00026 */
	VALIDATE_W_RV( ((TargetAddress % FLASH_PAGE_SIZE) == 0) && (E_OK == checkValidAddress(TargetAddress)),
			FLS_WRITE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK );
	/** @req SWS_Fls_00027 */
	VALIDATE_W_RV( ((Length != 0) && ((((TargetAddress + Length) % FLASH_PAGE_SIZE) == 0) && (E_OK == checkValidAddress(TargetAddress + Length -1 )))),
			FLS_WRITE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK );
#if defined(CFG_MPC5777M)
    VALIDATE_W_RV((E_OK == checkValidChunk(TargetAddress, TargetAddress + Length - 1)), FLS_WRITE_ID, FLS_E_INVALID_AREA, E_NOT_OK);
#endif
	// Destination is FLS_BASE_ADDRESS + TargetAddress
	/** @req SWS_Fls_333 */
	Fls_Global.jobResultType = MEMIF_JOB_PENDING;
	/** @req SWS_Fls_332  */
	Fls_Global.status = MEMIF_BUSY;
	Fls_Global.jobType = FLS_JOB_WRITE;

	// Fill in the required fields for programming...
	/** @req SWS_Fls_331 */
	Fls_Global.flashWriteInfo.source = (uint32)SourceAddressPtr;  /*lint !e923 Intended use */
	Fls_Global.flashWriteInfo.dest = TargetAddress;
	Fls_Global.flashWriteInfo.left = Length;

	if( Fls_Global.mode == MEMIF_MODE_FAST ) {
		Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteFastMode;
	} else {
		Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteNormalMode;
	}

	// unlock flash for the entire range.
	Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK, TargetAddress, Length );

	LOG_HEX2("Fls_Write() ",Fls_Global.flashWriteInfo.dest," ", Fls_Global.flashWriteInfo.left);

    /* Save to original request */
    Fls_Global.flashWriteInfo.pDest = TargetAddress;
    Fls_Global.flashWriteInfo.pLeft = Length;

    /** @req SWS_Fls_146  */
    if (EE_OK != Flash_ProgramPageStart(	Fls_Global.config->FlsInfo,
							&Fls_Global.flashWriteInfo.dest,
							&Fls_Global.flashWriteInfo.source,
							&Fls_Global.flashWriteInfo.left,
							NULL)) {
        return E_NOT_OK;
    }

    return E_OK; /** @req SWS_Fls_334 */
}
コード例 #6
0
ファイル: Fls.c プロジェクト: uincore/OpenSAR
Std_ReturnType Fls_Write(Fls_AddressType TargetAddress,
		const uint8 *SourceAddressPtr, Fls_LengthType Length) {
	TargetAddress += FLS_BASE_ADDRESS;

	/** @req FLS251 3.0 */
	/** @req FLS223 3.0 */
	/** @req FLS225 3.0/4.0 */
	/** @req FLS226 3.0/4.0 */

	/** @req FLS066 3.0/4.0 */
	/** @req FLS030 3.0/4.0 */
	/** @req FLS157 3.0/4.0 */
	/** @req FLS026 3.0/4.0 */
	/** @req FLS027 3.0/4.0 */
	VALIDATE_W_RV(Fls_Global.status != MEMIF_UNINIT,FLS_WRITE_ID, FLS_E_UNINIT,E_NOT_OK );
	VALIDATE_W_RV(Fls_Global.status != MEMIF_BUSY,FLS_WRITE_ID, FLS_E_BUSY,E_NOT_OK );
	VALIDATE_W_RV(SourceAddressPtr != ((void *)0),FLS_WRITE_ID, FLS_E_PARAM_DATA,E_NOT_OK );
	VALIDATE_W_RV( (TargetAddress % FLASH_PAGE_SIZE == 0) && (E_OK == fls_CheckValidAddress(TargetAddress)),
			FLS_WRITE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK );
	VALIDATE_W_RV( (Length != 0) && (((TargetAddress + Length) % FLASH_PAGE_SIZE) == 0 && (E_OK == fls_CheckValidAddress(TargetAddress + Length))),
			FLS_WRITE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK );

	// Destination is FLS_BASE_ADDRESS + TargetAddress
	/** @req FLS224 3.0 */ /** @req FLS333 4.0 */
	Fls_Global.jobResultType = MEMIF_JOB_PENDING;
	/** @req FLS332 4.0 */
	Fls_Global.status = MEMIF_BUSY;
	Fls_Global.jobType = FLS_JOB_WRITE;

	// Fill in the required fields for programming...
	/** @req FLS331 4.0 */
	Fls_Global.flashWriteInfo.source = (uint32) SourceAddressPtr;
	Fls_Global.flashWriteInfo.dest = TargetAddress;
	Fls_Global.flashWriteInfo.left = Length;

	if( Fls_Global.mode == MEMIF_MODE_FAST ) {
		Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteFastMode;
	} else {
		Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteNormalMode;
	}

	// unlock flash for the entire range.
	Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK, TargetAddress, Length );

	LOG_HEX2("Fls_Write() ",Fls_Global.flashWriteInfo.dest," ", Fls_Global.flashWriteInfo.left);

#if defined(CFG_FLS_EXTRA_CHECKS)
	for( int i=0;i<Fls_Global.flashWriteInfo.left;i++) {
		if( *((uint8 *)Fls_Global.flashWriteInfo.dest + i) != 0xff ) {
			while(1) {};
		}
	}
#endif

    /* Save to original request */
    Fls_Global.flashWriteInfo.pDest = TargetAddress;
    Fls_Global.flashWriteInfo.pLeft = Length;

    /** @req FLS146 3.0/4.0 */
    Flash_ProgramPageStart(	Fls_Global.config->FlsInfo,
							&Fls_Global.flashWriteInfo.dest,
							&Fls_Global.flashWriteInfo.source,
							&Fls_Global.flashWriteInfo.left,
							NULL);

	return E_OK; /** @req FLS334 4.0 */
}