kopia lustrzana https://github.com/OpenRTX/OpenRTX
Refactored 'W25Qx_writeData' and disabled '-ffunction-sections', which causes printf not printing decimal dots when used with %f
rodzic
eb0a5ee9f0
commit
dc131c3333
|
|
@ -19,7 +19,6 @@ c_args = [
|
|||
'-mthumb', # ARM Thumb2 ISA
|
||||
'-mfloat-abi=hard', # Hard floating point support
|
||||
'-mfpu=fpv4-sp-d16',
|
||||
'-ffunction-sections',
|
||||
'-Os'
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -632,7 +632,7 @@ int minmea_gettime(struct timespec *ts, const struct minmea_date *date, const st
|
|||
tm.tm_min = time_->minutes;
|
||||
tm.tm_sec = time_->seconds;
|
||||
|
||||
time_t timestamp = timegm(&tm); /* See README.md if your system lacks timegm(). */
|
||||
time_t timestamp = mktime(&tm); /* See README.md if your system lacks timegm(). */
|
||||
if (timestamp != (time_t)-1) {
|
||||
ts->tv_sec = timestamp;
|
||||
ts->tv_nsec = time_->microseconds * 1000;
|
||||
|
|
|
|||
|
|
@ -214,54 +214,51 @@ ssize_t W25Qx_writePage(uint32_t addr, void* buf, size_t len)
|
|||
|
||||
bool W25Qx_writeData(uint32_t addr, void* buf, size_t len)
|
||||
{
|
||||
// Fail if we are trying to write more than 4K bytes
|
||||
if(len > 4096)
|
||||
return false;
|
||||
// Fail if we are trying to write across 4K blocks,
|
||||
// this would erase two 4K blocks for one write, which is not good for flash life
|
||||
// We calculate block address using integer division of start and end address
|
||||
/* Fail if we are trying to write more than 4K bytes */
|
||||
if(len > 4096) return false;
|
||||
|
||||
/* Fail if we are trying to write across 4K blocks: this would erase two 4K
|
||||
* blocks for one write, which is not good for flash life.
|
||||
* We calculate block address using integer division of start and end address
|
||||
*/
|
||||
uint32_t startBlockAddr = addr / 4096 * 4096;
|
||||
uint32_t endBlockAddr = (addr + len - 1) / 4096 * 4096;
|
||||
if(endBlockAddr != startBlockAddr)
|
||||
return false;
|
||||
|
||||
// Read data from memory to check if it's already correct
|
||||
// Allocate buffer for storing data read from memory
|
||||
uint8_t *flashData;
|
||||
flashData = (uint8_t *) malloc(len);
|
||||
/* Before writing, check if we're not trying to write the same content */
|
||||
uint8_t *flashData = ((uint8_t *) malloc(len));
|
||||
W25Qx_readData(addr, flashData, len);
|
||||
// If data in flash corresponds to the passed data, do not perform the write
|
||||
if(memcmp(buf, flashData, len) == 0)
|
||||
{
|
||||
// Free the buffer
|
||||
free(flashData);
|
||||
return true;
|
||||
}
|
||||
// Free the flash data buffer
|
||||
|
||||
free(flashData);
|
||||
|
||||
// Perform the actual read-erase-write of flash data
|
||||
// Allocate 4096 bytes block for storing flash block to be erased
|
||||
uint8_t *flashBlock;
|
||||
flashBlock = (uint8_t *) malloc(4096);
|
||||
// Read the 4K block from flash
|
||||
/* Perform the actual read-erase-write of flash data. */
|
||||
uint8_t *flashBlock = ((uint8_t *) malloc(4096));
|
||||
W25Qx_readData(startBlockAddr, flashBlock, 4096);
|
||||
|
||||
/* Overwrite changed portion */
|
||||
uint32_t blockOffset = addr % 4096;
|
||||
// Overwrite changed portion
|
||||
memcpy(&flashBlock[blockOffset], buf, len);
|
||||
// Erase the 4K block
|
||||
|
||||
/* Erase the 4K block */
|
||||
if(!W25Qx_eraseSector(startBlockAddr))
|
||||
{
|
||||
// The erase operation failed, return failure
|
||||
/* Erase operation failed, return failure */
|
||||
free(flashBlock);
|
||||
return false;
|
||||
}
|
||||
// Write back the modified 4K block in 256 bytes chunks
|
||||
|
||||
/* Write back the modified 4K block in chunks of 256 bytes */
|
||||
for(uint32_t offset = 0; offset < 4096; offset += 256)
|
||||
{
|
||||
W25Qx_writePage(startBlockAddr + offset, &flashBlock[offset], 256);
|
||||
}
|
||||
// Free the 4K buffer
|
||||
|
||||
free(flashBlock);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue