| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #include "stm32f10x.h"
- #include "stm32_eval_spi_flash.h"
- #include "stm3210e_eval.h"
- /**
- * Description :
- * Initilize the MCU Clock, the GPIO Pins corresponding to the
- * device and initilize the FSMC with the chosen configuration
- * Inputs :
- * None
- * outputs :
- * R0 : "1" : Operation succeeded
- * "0" : Operation failure
- * Note: Mandatory for all types of device
- */
- int Init (void)
- {
- SystemInit();
- sFLASH_Init();
- return 1;
- }
-
- /**
- * Description :
- * Read data from the device
- * Inputs :
- * Address : Write location
- * Size : Length in bytes
- * buffer : Address where to get the data to write
- * outputs :
- * R0 : "1" : Operation succeeded
- * "0" : Operation failure
- * Note: Mandatory for all types except SRAM and PSRAM
- */
- int Read (uint32_t Address, uint32_t Size, uint8_t* buffer)
- {
- sFLASH_ReadBuffer(buffer, Address, Size);
- return 1;
- }
-
- /**
- * Description :
- * Write data from the device
- * Inputs :
- * Address : Write location
- * Size : Length in bytes
- * buffer : Address where to get the data to write
- * outputs :
- * R0 : "1" : Operation succeeded
- * "0" : Operation failure
- * Note: Mandatory for all types except SRAM and PSRAM
- */
- int Write (uint32_t Address, uint32_t Size, uint8_t* buffer)
- {
- sFLASH_WriteBuffer(buffer, Address, Size);
- return 1;
- }
- /**
- * Description :
- * Erase a full sector in the device
- * Inputs :
- * None
- * outputs :
- * R0 : "1" : Operation succeeded
- * "0" : Operation failure
- * Note: Not Mandatory for SRAM PSRAM and NOR_FLASH
- */
- int MassErase (void)
- {
- sFLASH_EraseBulk();
- return 1;
- }
- /**
- * Description :
- * Erase a full sector in the device
- * Inputs :
- * SectrorAddress : Start of sector
- * Size : Size (in WORD)
- * InitVal : Initial CRC value
- * outputs :
- * R0 : "1" : Operation succeeded
- * "0" : Operation failure
- * Note: Not Mandatory for SRAM PSRAM and NOR_FLASH
- */
- int SectorErase (uint32_t EraseStartAddress ,uint32_t EraseEndAddress)
- {
- EraseStartAddress = EraseStartAddress - EraseStartAddress%0x10000;
- while (EraseEndAddress>=EraseStartAddress)
- {
- sFLASH_EraseSector(EraseStartAddress);
- EraseStartAddress += 0x10000;
- }
- return 1;
- }
- /**
- * Description :
- * Calculates checksum value of the memory zone
- * Inputs :
- * StartAddress : Flash start address
- * Size : Size (in WORD)
- * InitVal : Initial CRC value
- * outputs :
- * R0 : Checksum value
- * Note: Optional for all types of device
- */
- uint32_t CheckSum(uint32_t StartAddress, uint32_t Size, uint32_t InitVal)
- {
- uint8_t missalignementAddress = StartAddress%4;
- uint8_t missalignementSize = Size ;
- int cnt;
- uint32_t Val;
- uint8_t value;
-
- StartAddress-=StartAddress%4;
- Size += (Size%4==0)?0:4-(Size%4);
-
- for(cnt=0; cnt<Size ; cnt+=4)
- {
- sFLASH_ReadBuffer(&value, StartAddress ,1);
- Val = value;
- sFLASH_ReadBuffer(&value, StartAddress + 1,1);
- Val+= value<<8;
- sFLASH_ReadBuffer(&value, StartAddress + 2,1);
- Val+= value<<16;
- sFLASH_ReadBuffer(&value, StartAddress + 3,1);
- Val+= value<<24;
- if(missalignementAddress)
- {
- switch (missalignementAddress)
- {
- case 1:
- InitVal += (uint8_t) (Val>>8 & 0xff);
- InitVal += (uint8_t) (Val>>16 & 0xff);
- InitVal += (uint8_t) (Val>>24 & 0xff);
- missalignementAddress-=1;
- break;
- case 2:
- InitVal += (uint8_t) (Val>>16 & 0xff);
- InitVal += (uint8_t) (Val>>24 & 0xff);
- missalignementAddress-=2;
- break;
- case 3:
- InitVal += (uint8_t) (Val>>24 & 0xff);
- missalignementAddress-=3;
- break;
- }
- }
- else if((Size-missalignementSize)%4 && (Size-cnt) <=4)
- {
- switch (Size-missalignementSize)
- {
- case 1:
- InitVal += (uint8_t) Val;
- InitVal += (uint8_t) (Val>>8 & 0xff);
- InitVal += (uint8_t) (Val>>16 & 0xff);
- missalignementSize-=1;
- break;
- case 2:
- InitVal += (uint8_t) Val;
- InitVal += (uint8_t) (Val>>8 & 0xff);
- missalignementSize-=2;
- break;
- case 3:
- InitVal += (uint8_t) Val;
- missalignementSize-=3;
- break;
- }
- }
- else
- {
- InitVal += (uint8_t) Val;
- InitVal += (uint8_t) (Val>>8 & 0xff);
- InitVal += (uint8_t) (Val>>16 & 0xff);
- InitVal += (uint8_t) (Val>>24 & 0xff);
- }
- StartAddress+=4;
- }
-
- return (InitVal);
- }
- /**
- * Description :
- * Verify flash memory with RAM buffer and calculates checksum value of
- * the programmed memory
- * Inputs :
- * FlashAddr : Flash address
- * RAMBufferAddr : RAM buffer address
- * Size : Size (in WORD)
- * InitVal : Initial CRC value
- * outputs :
- * R0 : Operation failed (address of failure)
- * R1 : Checksum value
- * Note: Optional for all types of device
- */
- uint64_t Verify (uint32_t MemoryAddr, uint32_t RAMBufferAddr, uint32_t Size, uint32_t missalignement)
- {
- uint32_t InitVal = 0;
- uint32_t VerifiedData = 0;
- uint8_t TmpBuffer = 0x00;
- uint64_t checksum;
- Size*=4;
-
- checksum = CheckSum((uint32_t)MemoryAddr + (missalignement & 0xf), Size - ((missalignement >> 16) & 0xF), InitVal);
-
- while (Size>VerifiedData)
- {
- sFLASH_ReadBuffer(&TmpBuffer, MemoryAddr+VerifiedData, 1);
-
- if (TmpBuffer != *((uint8_t*)RAMBufferAddr+VerifiedData))
- return ((checksum<<32) + MemoryAddr+VerifiedData);
-
- VerifiedData++;
- }
-
- return (checksum<<32);
- }
|