37 #define FLASH_BLOCK_SIZE 0x01000
39 #define FLASH_BLOCK_11 0x18000
40 #define FLASH_BLOCK_21 0x1A000
43 #define FLASH_CONF_B1 FLASH_BLOCK_SIZE
47 #define FLASH_CONF_B2 FLASH_BLOCK_SIZE
55 #define PRINTF(...) printf(__VA_ARGS__)
60 uint16_t stackPointer;
64 flash_addr_t getAddr(flash_addr_t address);
71 PRINTF(
"Initializing flash ... ");
73 nvm_erase(gNvmInternalInterface_c, gNvmType_SST_c, 0x0F000000);
75 nvm_write(gNvmInternalInterface_c, gNvmType_SST_c,
"\001", FLASH_BLOCK_11, 1);
76 nvm_write(gNvmInternalInterface_c, gNvmType_SST_c,
"\001", FLASH_BLOCK_21, 1);
79 for(i = 1; i < 0x2000; i++) {
85 nvm_write(gNvmInternalInterface_c, gNvmType_SST_c,
"\0", FLASH_BLOCK_11 + i, 1);
86 nvm_write(gNvmInternalInterface_c, gNvmType_SST_c,
"\0", FLASH_BLOCK_21 + i, 1);
94 address = getAddr(address);
96 if(address >= 0x18000 && address <= 0x1EFFF) {
97 PRINTF(
"Read from Adress: %p\n", address);
98 nvmErr_t err = nvm_read(gNvmInternalInterface_c, gNvmType_SST_c, dest, address, numBytes);
100 PRINTF(
"Read error, nmv_error: %u\n", err);
103 return gNvmErrNoError_c;
106 PRINTF(
"Read error - Invalid pointer.\n");
107 return gNvmErrInvalidPointer_c;
113 printf(
"SetVar - START . ");
114 uint32_t time = *MACA_CLK;
117 if(address >= 8192) {
118 PRINTF(
"Write error - Invalid pointer.\n");
119 return gNvmErrInvalidPointer_c;
121 uint32_t block_len = (address < 4096 ? FLASH_CONF_B1 : FLASH_CONF_B2);
123 address = getAddr(address);
125 flash_addr_t src_block = address & 0xFF000;
126 flash_addr_t dst_block = src_block ^ 0x01000;
127 address = address & 0x00FFF;
129 if(address < 1 || address >= block_len) {
130 PRINTF(
"Write error - Invalid pointer.\n");
131 return gNvmErrInvalidPointer_c;
133 if(address + numBytes > block_len) {
134 PRINTF(
"Write error - Var is to long.\n");
135 return gNvmErrAddressSpaceOverflow_c;
138 nvm_erase(gNvmInternalInterface_c, gNvmType_SST_c, 1 << (dst_block / FLASH_BLOCK_SIZE));
142 for(i = 0; i < address; i++) {
143 nvm_read(gNvmInternalInterface_c, gNvmType_SST_c, &buf, src_block + i, 1);
144 nvm_write(gNvmInternalInterface_c, gNvmType_SST_c, &buf, dst_block + i, 1);
146 PRINTF(
"Write to adress: %p\n", dst_block + i);
147 nvm_write(gNvmInternalInterface_c, gNvmType_SST_c, src, dst_block + i, numBytes);
148 for(i += numBytes; i < block_len; i++) {
149 nvm_read(gNvmInternalInterface_c, gNvmType_SST_c, &buf, src_block + i, 1);
150 nvm_write(gNvmInternalInterface_c, gNvmType_SST_c, &buf, dst_block + i, 1);
153 nvm_erase(gNvmInternalInterface_c, gNvmType_SST_c, 1 << (src_block / FLASH_BLOCK_SIZE));
156 time = *MACA_CLK - time;
157 printf(
"FINISHED AFTER %u MS\n", time / 250);
160 return gNvmErrNoError_c;
163 flash_cmp(
void *src, flash_addr_t address, uint32_t numBytes)
165 address = getAddr(address);
167 if(address >= 0x18000 && address <= 0x1EFFF) {
168 return nvm_verify(gNvmInternalInterface_c, gNvmType_SST_c, src, address, numBytes);
170 PRINTF(
"Read error - Invalid pointer.\n");
171 return gNvmErrInvalidPointer_c;
177 nvm_erase(gNvmInternalInterface_c, gNvmType_SST_c, 1 << (FLASH_STACK / FLASH_BLOCK_SIZE));
182 if(stackPointer + numBytes > FLASH_BLOCK_SIZE) {
183 return gNvmErrAddressSpaceOverflow_c;
186 nvm_write(gNvmInternalInterface_c, gNvmType_SST_c, src, FLASH_STACK + stackPointer, numBytes);
187 stackPointer += numBytes;
188 return gNvmErrNoError_c;
198 getAddr(flash_addr_t address)
200 if(address >= 0x02000) {
204 flash_addr_t block = (address & 0x01000 ? FLASH_BLOCK_21 : FLASH_BLOCK_11);
205 uint8_t blockcheck = (
flash_cmp(
"\001", block, 1) == 0 ? 0 : 1);
206 return block + (blockcheck << 12) + (address & 0x00FFF);
uint32_t flash_stack_size()
Stacksize.
nvmErr_t flash_cmp(void *src, flash_addr_t address, uint32_t numBytes)
Compares data from RAM with flash memory.
void flash_stack_init()
Stack initialisation.
nvmErr_t flash_stack_push(uint8_t *src, uint32_t numBytes)
Push data to stack.
void flash_init()
Initialize or clear random access blocks.
nvmErr_t flash_setVar(void *src, flash_addr_t address, uint32_t numBytes)
Write data to flash memory.
nvmErr_t flash_getVar(void *dest, flash_addr_t address, uint32_t numBytes)
Read data from flash memory.
App for easy usage of additional flash memory