mirror of
				https://github.com/thelsing/knx.git
				synced 2025-10-26 10:26:25 +01:00 
			
		
		
		
	add support for external flash system by using callbacks
This commit is contained in:
		
							parent
							
								
									15bf1c0a9d
								
							
						
					
					
						commit
						3202b33fcb
					
				| @ -140,6 +140,10 @@ uint8_t* Platform::getNonVolatileMemoryStart() | |||||||
| { | { | ||||||
|     if(_memoryType == Flash) |     if(_memoryType == Flash) | ||||||
|         return userFlashStart(); |         return userFlashStart(); | ||||||
|  | #ifdef KNX_FLASH_CALLBACK | ||||||
|  |     else if(_memoryType == Callback) | ||||||
|  |         return _callbackFlashRead(); | ||||||
|  | #endif | ||||||
|     else |     else | ||||||
|         return getEepromBuffer(KNX_FLASH_SIZE); |         return getEepromBuffer(KNX_FLASH_SIZE); | ||||||
| } | } | ||||||
| @ -148,6 +152,10 @@ size_t Platform::getNonVolatileMemorySize() | |||||||
| { | { | ||||||
|     if(_memoryType == Flash) |     if(_memoryType == Flash) | ||||||
|         return userFlashSizeEraseBlocks() * flashEraseBlockSize() * flashPageSize(); |         return userFlashSizeEraseBlocks() * flashEraseBlockSize() * flashPageSize(); | ||||||
|  | #ifdef KNX_FLASH_CALLBACK | ||||||
|  |     else if(_memoryType == Callback) | ||||||
|  |         return _callbackFlashSize(); | ||||||
|  | #endif | ||||||
|     else |     else | ||||||
|         return KNX_FLASH_SIZE; |         return KNX_FLASH_SIZE; | ||||||
| } | } | ||||||
| @ -165,6 +173,10 @@ void Platform::commitNonVolatileMemory() | |||||||
|             _bufferedEraseblockNumber = -1;  // does that make sense?
 |             _bufferedEraseblockNumber = -1;  // does that make sense?
 | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | #ifdef KNX_FLASH_CALLBACK | ||||||
|  |     else if(_memoryType == Callback) | ||||||
|  |         return _callbackFlashCommit(); | ||||||
|  | #endif | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         commitToEeprom(); |         commitToEeprom(); | ||||||
| @ -194,6 +206,10 @@ uint32_t Platform::writeNonVolatileMemory(uint32_t relativeAddress, uint8_t* buf | |||||||
|         } |         } | ||||||
|         return relativeAddress; |         return relativeAddress; | ||||||
|     } |     } | ||||||
|  | #ifdef KNX_FLASH_CALLBACK | ||||||
|  |     else if(_memoryType == Callback) | ||||||
|  |         return _callbackFlashWrite(relativeAddress, buffer, size); | ||||||
|  | #endif | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         memcpy(getEepromBuffer(KNX_FLASH_SIZE)+relativeAddress, buffer, size); |         memcpy(getEepromBuffer(KNX_FLASH_SIZE)+relativeAddress, buffer, size); | ||||||
| @ -283,3 +299,38 @@ void Platform::bufferEraseBlock(int32_t eraseBlockNumber) | |||||||
|     _bufferedEraseblockNumber = eraseBlockNumber; |     _bufferedEraseblockNumber = eraseBlockNumber; | ||||||
|     _bufferedEraseblockDirty = false; |     _bufferedEraseblockDirty = false; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef KNX_FLASH_CALLBACK | ||||||
|  | void Platform::registerFlashCallbacks( | ||||||
|  |     FlashCallbackSize callbackFlashSize, | ||||||
|  |     FlashCallbackRead callbackFlashRead, | ||||||
|  |     FlashCallbackWrite callbackFlashWrite, | ||||||
|  |     FlashCallbackCommit callbackFlashCommit) | ||||||
|  |     { | ||||||
|  |         println("Set Callback"); | ||||||
|  |         _memoryType = Callback; | ||||||
|  |         _callbackFlashSize = callbackFlashSize; | ||||||
|  |         _callbackFlashRead = callbackFlashRead; | ||||||
|  |         _callbackFlashWrite = callbackFlashWrite; | ||||||
|  |         _callbackFlashCommit = callbackFlashCommit; | ||||||
|  |         _callbackFlashSize(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | FlashCallbackSize Platform::callbackFlashSize() | ||||||
|  | { | ||||||
|  |    return _callbackFlashSize; | ||||||
|  | } | ||||||
|  | FlashCallbackRead Platform::callbackFlashRead() | ||||||
|  | { | ||||||
|  |    return _callbackFlashRead; | ||||||
|  | } | ||||||
|  | FlashCallbackWrite Platform::callbackFlashWrite() | ||||||
|  | { | ||||||
|  |    return _callbackFlashWrite; | ||||||
|  | } | ||||||
|  | FlashCallbackCommit Platform::callbackFlashCommit() | ||||||
|  | { | ||||||
|  |    return _callbackFlashCommit; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | |||||||
| @ -4,15 +4,28 @@ | |||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| #include "save_restore.h" | #include "save_restore.h" | ||||||
| 
 | 
 | ||||||
|  | #ifndef KNX_FLASH_CALLBACK | ||||||
| #ifndef KNX_FLASH_SIZE | #ifndef KNX_FLASH_SIZE | ||||||
| #define KNX_FLASH_SIZE 1024 | #define KNX_FLASH_SIZE 1024 | ||||||
| #pragma warning "KNX_FLASH_SIZE not defined, using 1024" | #pragma warning "KNX_FLASH_SIZE not defined, using 1024" | ||||||
| #endif | #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef KNX_FLASH_CALLBACK | ||||||
|  | #ifndef KNX_FLASH_SIZE | ||||||
|  | #define KNX_FLASH_SIZE 0 | ||||||
|  | #endif | ||||||
|  | typedef uint32_t (*FlashCallbackSize)(); | ||||||
|  | typedef uint8_t* (*FlashCallbackRead)(); | ||||||
|  | typedef uint32_t (*FlashCallbackWrite)(uint32_t relativeAddress, uint8_t* buffer, size_t len); | ||||||
|  | typedef void (*FlashCallbackCommit)(); | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| enum NvMemoryType | enum NvMemoryType | ||||||
| { | { | ||||||
|     Eeprom, |     Eeprom, | ||||||
|     Flash |     Flash, | ||||||
|  |     Callback | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class Platform | class Platform | ||||||
| @ -75,13 +88,26 @@ class Platform | |||||||
|     NvMemoryType NonVolatileMemoryType(); |     NvMemoryType NonVolatileMemoryType(); | ||||||
|     void NonVolatileMemoryType(NvMemoryType type); |     void NonVolatileMemoryType(NvMemoryType type); | ||||||
| 
 | 
 | ||||||
|   // --- Overwrite these methods in the device-plattform to use flash memory handling by the knx stack ---
 |     // --- Overwrite these methods in the device-plattform to use flash memory handling by the knx stack ---
 | ||||||
|   // --- also set _memoryType = Flash in the device-plattform's contructor
 |     // --- also set _memoryType = Flash in the device-plattform's contructor
 | ||||||
|   // --- optional: overwrite writeBufferedEraseBlock() in the device-plattform to reduce overhead when flashing multiple pages
 |     // --- optional: overwrite writeBufferedEraseBlock() in the device-plattform to reduce overhead when flashing multiple pages
 | ||||||
| 
 | 
 | ||||||
|     // size of one flash page in bytes
 |     // size of one flash page in bytes
 | ||||||
|     virtual size_t flashPageSize(); |     virtual size_t flashPageSize(); | ||||||
|      |      | ||||||
|  | #ifdef KNX_FLASH_CALLBACK | ||||||
|  |     void registerFlashCallbacks( | ||||||
|  |         FlashCallbackSize callbackFlashSize, | ||||||
|  |         FlashCallbackRead callbackFlashRead, | ||||||
|  |         FlashCallbackWrite callbackFlashWrite, | ||||||
|  |         FlashCallbackCommit callbackFlashCommit); | ||||||
|  | 
 | ||||||
|  |     FlashCallbackSize callbackFlashSize(); | ||||||
|  |     FlashCallbackRead callbackFlashRead(); | ||||||
|  |     FlashCallbackWrite callbackFlashWrite(); | ||||||
|  |     FlashCallbackCommit callbackFlashCommit(); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|   protected: |   protected: | ||||||
|     // size of one EraseBlock in pages
 |     // size of one EraseBlock in pages
 | ||||||
|     virtual size_t flashEraseBlockSize(); |     virtual size_t flashEraseBlockSize(); | ||||||
| @ -95,8 +121,7 @@ class Platform | |||||||
|     virtual void flashWritePage(uint16_t pageNumber, uint8_t* data); |     virtual void flashWritePage(uint16_t pageNumber, uint8_t* data); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   // -------------------------------------------------------------------------------------------------------
 |     // -------------------------------------------------------------------------------------------------------
 | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
|     NvMemoryType _memoryType = Eeprom; |     NvMemoryType _memoryType = Eeprom; | ||||||
| 
 | 
 | ||||||
| @ -113,4 +138,11 @@ class Platform | |||||||
|     uint8_t* _eraseblockBuffer = nullptr; |     uint8_t* _eraseblockBuffer = nullptr; | ||||||
|     int32_t _bufferedEraseblockNumber = -1; |     int32_t _bufferedEraseblockNumber = -1; | ||||||
|     bool _bufferedEraseblockDirty = false; |     bool _bufferedEraseblockDirty = false; | ||||||
|  | 
 | ||||||
|  | #ifdef KNX_FLASH_CALLBACK | ||||||
|  |     FlashCallbackSize _callbackFlashSize = nullptr; | ||||||
|  |     FlashCallbackRead _callbackFlashRead = nullptr; | ||||||
|  |     FlashCallbackWrite _callbackFlashWrite = nullptr; | ||||||
|  |     FlashCallbackCommit _callbackFlashCommit = nullptr; | ||||||
|  | #endif | ||||||
| }; | }; | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user