Improved MFS to use explicitly non-cacheable buffers for potentially DMA-accessible I/O areas.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15557 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
0fc6cb688f
commit
9b4bf3c9f0
|
@ -212,9 +212,9 @@ static mfs_error_t mfs_flash_write(MFSDriver *mfsp,
|
||||||
while (n > 0U) {
|
while (n > 0U) {
|
||||||
size_t chunk = n <= MFS_CFG_BUFFER_SIZE ? n : MFS_CFG_BUFFER_SIZE;
|
size_t chunk = n <= MFS_CFG_BUFFER_SIZE ? n : MFS_CFG_BUFFER_SIZE;
|
||||||
|
|
||||||
RET_ON_ERROR(mfs_flash_read(mfsp, offset, chunk, mfsp->buffer.data8));
|
RET_ON_ERROR(mfs_flash_read(mfsp, offset, chunk, mfsp->ncbuf->data8));
|
||||||
|
|
||||||
if (memcmp((void *)mfsp->buffer.data8, (void *)wp, chunk)) {
|
if (memcmp((void *)mfsp->ncbuf->data8, (void *)wp, chunk)) {
|
||||||
mfsp->state = MFS_ERROR;
|
mfsp->state = MFS_ERROR;
|
||||||
return MFS_ERR_FLASH_FAILURE;
|
return MFS_ERR_FLASH_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -255,8 +255,8 @@ static mfs_error_t mfs_flash_copy(MFSDriver *mfsp,
|
||||||
chunk = n;
|
chunk = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
RET_ON_ERROR(mfs_flash_read(mfsp, soffset, chunk, mfsp->buffer.data8));
|
RET_ON_ERROR(mfs_flash_read(mfsp, soffset, chunk, mfsp->ncbuf->data8));
|
||||||
RET_ON_ERROR(mfs_flash_write(mfsp, doffset, chunk, mfsp->buffer.data8));
|
RET_ON_ERROR(mfs_flash_write(mfsp, doffset, chunk, mfsp->ncbuf->data8));
|
||||||
|
|
||||||
/* Next page.*/
|
/* Next page.*/
|
||||||
soffset += chunk;
|
soffset += chunk;
|
||||||
|
@ -366,7 +366,6 @@ static mfs_error_t mfs_bank_write_header(MFSDriver *mfsp,
|
||||||
mfs_bank_t bank,
|
mfs_bank_t bank,
|
||||||
uint32_t cnt) {
|
uint32_t cnt) {
|
||||||
flash_sector_t sector;
|
flash_sector_t sector;
|
||||||
mfs_bank_header_t bhdr;
|
|
||||||
|
|
||||||
if (bank == MFS_BANK_0) {
|
if (bank == MFS_BANK_0) {
|
||||||
sector = mfsp->config->bank0_start;
|
sector = mfsp->config->bank0_start;
|
||||||
|
@ -375,17 +374,18 @@ static mfs_error_t mfs_bank_write_header(MFSDriver *mfsp,
|
||||||
sector = mfsp->config->bank1_start;
|
sector = mfsp->config->bank1_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
bhdr.fields.magic1 = MFS_BANK_MAGIC_1;
|
mfsp->ncbuf->bhdr.fields.magic1 = MFS_BANK_MAGIC_1;
|
||||||
bhdr.fields.magic2 = MFS_BANK_MAGIC_2;
|
mfsp->ncbuf->bhdr.fields.magic2 = MFS_BANK_MAGIC_2;
|
||||||
bhdr.fields.counter = cnt;
|
mfsp->ncbuf->bhdr.fields.counter = cnt;
|
||||||
bhdr.fields.reserved1 = (uint16_t)mfsp->config->erased;
|
mfsp->ncbuf->bhdr.fields.reserved1 = (uint16_t)mfsp->config->erased;
|
||||||
bhdr.fields.crc = crc16(0xFFFFU, bhdr.hdr8,
|
mfsp->ncbuf->bhdr.fields.crc = crc16(0xFFFFU,
|
||||||
sizeof (mfs_bank_header_t) - sizeof (uint16_t));
|
mfsp->ncbuf->bhdr.hdr8,
|
||||||
|
sizeof (mfs_bank_header_t) - sizeof (uint16_t));
|
||||||
|
|
||||||
return mfs_flash_write(mfsp,
|
return mfs_flash_write(mfsp,
|
||||||
flashGetSectorOffset(mfsp->config->flashp, sector),
|
flashGetSectorOffset(mfsp->config->flashp, sector),
|
||||||
sizeof (mfs_bank_header_t),
|
sizeof (mfs_bank_header_t),
|
||||||
bhdr.hdr8);
|
mfsp->ncbuf->bhdr.hdr8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -399,25 +399,25 @@ static mfs_error_t mfs_bank_write_header(MFSDriver *mfsp,
|
||||||
static mfs_bank_state_t mfs_bank_check_header(MFSDriver *mfsp) {
|
static mfs_bank_state_t mfs_bank_check_header(MFSDriver *mfsp) {
|
||||||
uint16_t crc;
|
uint16_t crc;
|
||||||
|
|
||||||
if ((mfsp->buffer.bhdr.hdr32[0] == mfsp->config->erased) &&
|
if ((mfsp->ncbuf->bhdr.hdr32[0] == mfsp->config->erased) &&
|
||||||
(mfsp->buffer.bhdr.hdr32[1] == mfsp->config->erased) &&
|
(mfsp->ncbuf->bhdr.hdr32[1] == mfsp->config->erased) &&
|
||||||
(mfsp->buffer.bhdr.hdr32[2] == mfsp->config->erased) &&
|
(mfsp->ncbuf->bhdr.hdr32[2] == mfsp->config->erased) &&
|
||||||
(mfsp->buffer.bhdr.hdr32[3] == mfsp->config->erased)) {
|
(mfsp->ncbuf->bhdr.hdr32[3] == mfsp->config->erased)) {
|
||||||
return MFS_BANK_ERASED;
|
return MFS_BANK_ERASED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checking header fields integrity.*/
|
/* Checking header fields integrity.*/
|
||||||
if ((mfsp->buffer.bhdr.fields.magic1 != MFS_BANK_MAGIC_1) ||
|
if ((mfsp->ncbuf->bhdr.fields.magic1 != MFS_BANK_MAGIC_1) ||
|
||||||
(mfsp->buffer.bhdr.fields.magic2 != MFS_BANK_MAGIC_2) ||
|
(mfsp->ncbuf->bhdr.fields.magic2 != MFS_BANK_MAGIC_2) ||
|
||||||
(mfsp->buffer.bhdr.fields.counter == mfsp->config->erased) ||
|
(mfsp->ncbuf->bhdr.fields.counter == mfsp->config->erased) ||
|
||||||
(mfsp->buffer.bhdr.fields.reserved1 != (uint16_t)mfsp->config->erased)) {
|
(mfsp->ncbuf->bhdr.fields.reserved1 != (uint16_t)mfsp->config->erased)) {
|
||||||
return MFS_BANK_GARBAGE;
|
return MFS_BANK_GARBAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verifying header CRC.*/
|
/* Verifying header CRC.*/
|
||||||
crc = crc16(0xFFFFU, mfsp->buffer.bhdr.hdr8,
|
crc = crc16(0xFFFFU, mfsp->ncbuf->bhdr.hdr8,
|
||||||
sizeof (mfs_bank_header_t) - sizeof (uint16_t));
|
sizeof (mfs_bank_header_t) - sizeof (uint16_t));
|
||||||
if (crc != mfsp->buffer.bhdr.fields.crc) {
|
if (crc != mfsp->ncbuf->bhdr.fields.crc) {
|
||||||
return MFS_BANK_GARBAGE;
|
return MFS_BANK_GARBAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -492,10 +492,10 @@ static mfs_error_t mfs_bank_scan_records(MFSDriver *mfsp,
|
||||||
total;
|
total;
|
||||||
|
|
||||||
/* Reading the data chunk.*/
|
/* Reading the data chunk.*/
|
||||||
RET_ON_ERROR(mfs_flash_read(mfsp, data, chunk, mfsp->buffer.data8));
|
RET_ON_ERROR(mfs_flash_read(mfsp, data, chunk, mfsp->ncbuf->data8));
|
||||||
|
|
||||||
/* CRC on the read data chunk.*/
|
/* CRC on the read data chunk.*/
|
||||||
crc = crc16(crc, &mfsp->buffer.data8[0], chunk);
|
crc = crc16(crc, &mfsp->ncbuf->data8[0], chunk);
|
||||||
|
|
||||||
/* Next chunk.*/
|
/* Next chunk.*/
|
||||||
data += chunk;
|
data += chunk;
|
||||||
|
@ -554,11 +554,11 @@ static mfs_error_t mfs_bank_get_state(MFSDriver *mfsp,
|
||||||
/* Reading the current bank header.*/
|
/* Reading the current bank header.*/
|
||||||
RET_ON_ERROR(mfs_flash_read(mfsp, mfs_flash_get_bank_offset(mfsp, bank),
|
RET_ON_ERROR(mfs_flash_read(mfsp, mfs_flash_get_bank_offset(mfsp, bank),
|
||||||
sizeof (mfs_bank_header_t),
|
sizeof (mfs_bank_header_t),
|
||||||
mfsp->buffer.data8));
|
mfsp->ncbuf->data8));
|
||||||
|
|
||||||
/* Getting the counter regardless of the bank state, it is only valid if
|
/* Getting the counter regardless of the bank state, it is only valid if
|
||||||
the state is MFS_BANK_OK.*/
|
the state is MFS_BANK_OK.*/
|
||||||
*cntp = mfsp->buffer.bhdr.fields.counter;
|
*cntp = mfsp->ncbuf->bhdr.fields.counter;
|
||||||
|
|
||||||
/* Checking just the header.*/
|
/* Checking just the header.*/
|
||||||
*statep = mfs_bank_check_header(mfsp);
|
*statep = mfs_bank_check_header(mfsp);
|
||||||
|
@ -734,7 +734,7 @@ static mfs_error_t mfs_try_mount(MFSDriver *mfsp) {
|
||||||
/* Reading the bank header again.*/
|
/* Reading the bank header again.*/
|
||||||
RET_ON_ERROR(mfs_flash_read(mfsp, mfs_flash_get_bank_offset(mfsp, bank),
|
RET_ON_ERROR(mfs_flash_read(mfsp, mfs_flash_get_bank_offset(mfsp, bank),
|
||||||
sizeof (mfs_bank_header_t),
|
sizeof (mfs_bank_header_t),
|
||||||
mfsp->buffer.data8));
|
mfsp->ncbuf->data8));
|
||||||
|
|
||||||
/* Checked again for extra safety.*/
|
/* Checked again for extra safety.*/
|
||||||
if (mfs_bank_check_header(mfsp) != MFS_BANK_OK) {
|
if (mfs_bank_check_header(mfsp) != MFS_BANK_OK) {
|
||||||
|
@ -743,7 +743,7 @@ static mfs_error_t mfs_try_mount(MFSDriver *mfsp) {
|
||||||
|
|
||||||
/* Storing the bank data.*/
|
/* Storing the bank data.*/
|
||||||
mfsp->current_bank = bank;
|
mfsp->current_bank = bank;
|
||||||
mfsp->current_counter = mfsp->buffer.bhdr.fields.counter;
|
mfsp->current_counter = mfsp->ncbuf->bhdr.fields.counter;
|
||||||
|
|
||||||
/* Scanning for the most recent instance of all records.*/
|
/* Scanning for the most recent instance of all records.*/
|
||||||
RET_ON_ERROR(mfs_bank_scan_records(mfsp, bank, &w2));
|
RET_ON_ERROR(mfs_bank_scan_records(mfsp, bank, &w2));
|
||||||
|
@ -818,15 +818,17 @@ mfs_error_t mfs_mount(MFSDriver *mfsp) {
|
||||||
* @brief Initializes an instance.
|
* @brief Initializes an instance.
|
||||||
*
|
*
|
||||||
* @param[out] mfsp pointer to the @p MFSDriver object
|
* @param[out] mfsp pointer to the @p MFSDriver object
|
||||||
|
* @param[in] ncbuf pointer to an @p mfs_nocache_buffer_t buffer structure
|
||||||
*
|
*
|
||||||
* @init
|
* @init
|
||||||
*/
|
*/
|
||||||
void mfsObjectInit(MFSDriver *mfsp) {
|
void mfsObjectInit(MFSDriver *mfsp, mfs_nocache_buffer_t *ncbuf) {
|
||||||
|
|
||||||
osalDbgCheck(mfsp != NULL);
|
osalDbgCheck(mfsp != NULL);
|
||||||
|
|
||||||
mfsp->state = MFS_STOP;
|
mfsp->state = MFS_STOP;
|
||||||
mfsp->config = NULL;
|
mfsp->config = NULL;
|
||||||
|
mfsp->ncbuf = ncbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -955,7 +957,7 @@ mfs_error_t mfsReadRecord(MFSDriver *mfsp, mfs_id_t id,
|
||||||
RET_ON_ERROR(mfs_flash_read(mfsp,
|
RET_ON_ERROR(mfs_flash_read(mfsp,
|
||||||
mfsp->descriptors[id - 1U].offset,
|
mfsp->descriptors[id - 1U].offset,
|
||||||
sizeof (mfs_data_header_t),
|
sizeof (mfs_data_header_t),
|
||||||
mfsp->buffer.data8));
|
mfsp->ncbuf->data8));
|
||||||
|
|
||||||
/* Data read from flash.*/
|
/* Data read from flash.*/
|
||||||
*np = mfsp->descriptors[id - 1U].size;
|
*np = mfsp->descriptors[id - 1U].size;
|
||||||
|
@ -966,7 +968,7 @@ mfs_error_t mfsReadRecord(MFSDriver *mfsp, mfs_id_t id,
|
||||||
|
|
||||||
/* Checking CRC.*/
|
/* Checking CRC.*/
|
||||||
crc = crc16(0xFFFFU, buffer, *np);
|
crc = crc16(0xFFFFU, buffer, *np);
|
||||||
if (crc != mfsp->buffer.dhdr.fields.crc) {
|
if (crc != mfsp->ncbuf->dhdr.fields.crc) {
|
||||||
mfsp->state = MFS_ERROR;
|
mfsp->state = MFS_ERROR;
|
||||||
return MFS_ERR_FLASH_FAILURE;
|
return MFS_ERR_FLASH_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -1037,13 +1039,13 @@ mfs_error_t mfsWriteRecord(MFSDriver *mfsp, mfs_id_t id,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Writing the data header without the magic, it will be written last.*/
|
/* Writing the data header without the magic, it will be written last.*/
|
||||||
mfsp->buffer.dhdr.fields.id = (uint16_t)id;
|
mfsp->ncbuf->dhdr.fields.id = (uint16_t)id;
|
||||||
mfsp->buffer.dhdr.fields.size = (uint32_t)n;
|
mfsp->ncbuf->dhdr.fields.size = (uint32_t)n;
|
||||||
mfsp->buffer.dhdr.fields.crc = crc16(0xFFFFU, buffer, n);
|
mfsp->ncbuf->dhdr.fields.crc = crc16(0xFFFFU, buffer, n);
|
||||||
RET_ON_ERROR(mfs_flash_write(mfsp,
|
RET_ON_ERROR(mfs_flash_write(mfsp,
|
||||||
mfsp->next_offset + (sizeof (uint32_t) * 2U),
|
mfsp->next_offset + (sizeof (uint32_t) * 2U),
|
||||||
sizeof (mfs_data_header_t) - (sizeof (uint32_t) * 2U),
|
sizeof (mfs_data_header_t) - (sizeof (uint32_t) * 2U),
|
||||||
mfsp->buffer.data8 + (sizeof (uint32_t) * 2U)));
|
mfsp->ncbuf->data8 + (sizeof (uint32_t) * 2U)));
|
||||||
|
|
||||||
/* Writing the data part.*/
|
/* Writing the data part.*/
|
||||||
RET_ON_ERROR(mfs_flash_write(mfsp,
|
RET_ON_ERROR(mfs_flash_write(mfsp,
|
||||||
|
@ -1052,12 +1054,12 @@ mfs_error_t mfsWriteRecord(MFSDriver *mfsp, mfs_id_t id,
|
||||||
buffer));
|
buffer));
|
||||||
|
|
||||||
/* Finally writing the magic number, it seals the operation.*/
|
/* Finally writing the magic number, it seals the operation.*/
|
||||||
mfsp->buffer.dhdr.fields.magic1 = (uint32_t)MFS_HEADER_MAGIC_1;
|
mfsp->ncbuf->dhdr.fields.magic1 = (uint32_t)MFS_HEADER_MAGIC_1;
|
||||||
mfsp->buffer.dhdr.fields.magic2 = (uint32_t)MFS_HEADER_MAGIC_2;
|
mfsp->ncbuf->dhdr.fields.magic2 = (uint32_t)MFS_HEADER_MAGIC_2;
|
||||||
RET_ON_ERROR(mfs_flash_write(mfsp,
|
RET_ON_ERROR(mfs_flash_write(mfsp,
|
||||||
mfsp->next_offset,
|
mfsp->next_offset,
|
||||||
sizeof (uint32_t) * 2U,
|
sizeof (uint32_t) * 2U,
|
||||||
mfsp->buffer.data8));
|
mfsp->ncbuf->data8));
|
||||||
|
|
||||||
/* The size of the old record instance, if present, must be subtracted
|
/* The size of the old record instance, if present, must be subtracted
|
||||||
to the total used size.*/
|
to the total used size.*/
|
||||||
|
@ -1093,13 +1095,13 @@ mfs_error_t mfsWriteRecord(MFSDriver *mfsp, mfs_id_t id,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Writing the data header without the magic, it will be written last.*/
|
/* Writing the data header without the magic, it will be written last.*/
|
||||||
mfsp->buffer.dhdr.fields.id = (uint16_t)id;
|
mfsp->ncbuf->dhdr.fields.id = (uint16_t)id;
|
||||||
mfsp->buffer.dhdr.fields.size = (uint32_t)n;
|
mfsp->ncbuf->dhdr.fields.size = (uint32_t)n;
|
||||||
mfsp->buffer.dhdr.fields.crc = crc16(0xFFFFU, buffer, n);
|
mfsp->ncbuf->dhdr.fields.crc = crc16(0xFFFFU, buffer, n);
|
||||||
RET_ON_ERROR(mfs_flash_write(mfsp,
|
RET_ON_ERROR(mfs_flash_write(mfsp,
|
||||||
mfsp->tr_next_offset + (sizeof (uint32_t) * 2U),
|
mfsp->tr_next_offset + (sizeof (uint32_t) * 2U),
|
||||||
sizeof (mfs_data_header_t) - (sizeof (uint32_t) * 2U),
|
sizeof (mfs_data_header_t) - (sizeof (uint32_t) * 2U),
|
||||||
mfsp->buffer.data8 + (sizeof (uint32_t) * 2U)));
|
mfsp->ncbuf->data8 + (sizeof (uint32_t) * 2U)));
|
||||||
|
|
||||||
/* Writing the data part.*/
|
/* Writing the data part.*/
|
||||||
RET_ON_ERROR(mfs_flash_write(mfsp,
|
RET_ON_ERROR(mfs_flash_write(mfsp,
|
||||||
|
@ -1188,15 +1190,15 @@ mfs_error_t mfsEraseRecord(MFSDriver *mfsp, mfs_id_t id) {
|
||||||
|
|
||||||
/* Writing the data header with size set to zero, it means that the
|
/* Writing the data header with size set to zero, it means that the
|
||||||
record is logically erased.*/
|
record is logically erased.*/
|
||||||
mfsp->buffer.dhdr.fields.magic1 = (uint32_t)MFS_HEADER_MAGIC_1;
|
mfsp->ncbuf->dhdr.fields.magic1 = (uint32_t)MFS_HEADER_MAGIC_1;
|
||||||
mfsp->buffer.dhdr.fields.magic2 = (uint32_t)MFS_HEADER_MAGIC_2;
|
mfsp->ncbuf->dhdr.fields.magic2 = (uint32_t)MFS_HEADER_MAGIC_2;
|
||||||
mfsp->buffer.dhdr.fields.id = (uint16_t)id;
|
mfsp->ncbuf->dhdr.fields.id = (uint16_t)id;
|
||||||
mfsp->buffer.dhdr.fields.size = (uint32_t)0;
|
mfsp->ncbuf->dhdr.fields.size = (uint32_t)0;
|
||||||
mfsp->buffer.dhdr.fields.crc = (uint16_t)0xFFFF;
|
mfsp->ncbuf->dhdr.fields.crc = (uint16_t)0xFFFF;
|
||||||
RET_ON_ERROR(mfs_flash_write(mfsp,
|
RET_ON_ERROR(mfs_flash_write(mfsp,
|
||||||
mfsp->next_offset,
|
mfsp->next_offset,
|
||||||
sizeof (mfs_data_header_t),
|
sizeof (mfs_data_header_t),
|
||||||
mfsp->buffer.data8));
|
mfsp->ncbuf->data8));
|
||||||
|
|
||||||
/* Adjusting bank-related metadata.*/
|
/* Adjusting bank-related metadata.*/
|
||||||
mfsp->used_space -= ALIGNED_REC_SIZE(mfsp->descriptors[id - 1U].size);
|
mfsp->used_space -= ALIGNED_REC_SIZE(mfsp->descriptors[id - 1U].size);
|
||||||
|
@ -1232,13 +1234,13 @@ mfs_error_t mfsEraseRecord(MFSDriver *mfsp, mfs_id_t id) {
|
||||||
|
|
||||||
/* Writing the data header with size set to zero, it means that the
|
/* Writing the data header with size set to zero, it means that the
|
||||||
record is logically erased. Note, the magic number is not set.*/
|
record is logically erased. Note, the magic number is not set.*/
|
||||||
mfsp->buffer.dhdr.fields.id = (uint16_t)id;
|
mfsp->ncbuf->dhdr.fields.id = (uint16_t)id;
|
||||||
mfsp->buffer.dhdr.fields.size = (uint32_t)0;
|
mfsp->ncbuf->dhdr.fields.size = (uint32_t)0;
|
||||||
mfsp->buffer.dhdr.fields.crc = (uint16_t)0xFFFF;
|
mfsp->ncbuf->dhdr.fields.crc = (uint16_t)0xFFFF;
|
||||||
RET_ON_ERROR(mfs_flash_write(mfsp,
|
RET_ON_ERROR(mfs_flash_write(mfsp,
|
||||||
mfsp->tr_next_offset + (sizeof (uint32_t) * 2U),
|
mfsp->tr_next_offset + (sizeof (uint32_t) * 2U),
|
||||||
sizeof (mfs_data_header_t) - (sizeof (uint32_t) * 2U),
|
sizeof (mfs_data_header_t) - (sizeof (uint32_t) * 2U),
|
||||||
mfsp->buffer.data8 + (sizeof (uint32_t) * 2U)));
|
mfsp->ncbuf->data8 + (sizeof (uint32_t) * 2U)));
|
||||||
|
|
||||||
/* Adding a transaction operation record.*/
|
/* Adding a transaction operation record.*/
|
||||||
top = &mfsp->tr_ops[mfsp->tr_nops];
|
top = &mfsp->tr_ops[mfsp->tr_nops];
|
||||||
|
@ -1384,8 +1386,8 @@ mfs_error_t mfsCommitTransaction(MFSDriver *mfsp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scanning all buffered operations in reverse order.*/
|
/* Scanning all buffered operations in reverse order.*/
|
||||||
mfsp->buffer.dhdr.fields.magic1 = (uint32_t)MFS_HEADER_MAGIC_1;
|
mfsp->ncbuf->dhdr.fields.magic1 = (uint32_t)MFS_HEADER_MAGIC_1;
|
||||||
mfsp->buffer.dhdr.fields.magic2 = (uint32_t)MFS_HEADER_MAGIC_2;
|
mfsp->ncbuf->dhdr.fields.magic2 = (uint32_t)MFS_HEADER_MAGIC_2;
|
||||||
top = &mfsp->tr_ops[mfsp->tr_nops];
|
top = &mfsp->tr_ops[mfsp->tr_nops];
|
||||||
while (top > &mfsp->tr_ops[0]) {
|
while (top > &mfsp->tr_ops[0]) {
|
||||||
/* On the previous element.*/
|
/* On the previous element.*/
|
||||||
|
@ -1395,7 +1397,7 @@ mfs_error_t mfsCommitTransaction(MFSDriver *mfsp) {
|
||||||
RET_ON_ERROR(mfs_flash_write(mfsp,
|
RET_ON_ERROR(mfs_flash_write(mfsp,
|
||||||
top->offset,
|
top->offset,
|
||||||
sizeof (uint32_t) * 2U,
|
sizeof (uint32_t) * 2U,
|
||||||
mfsp->buffer.data8));
|
mfsp->ncbuf->data8));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Transaction fully committed by writing the last (first in transaction)
|
/* Transaction fully committed by writing the last (first in transaction)
|
||||||
|
|
|
@ -333,6 +333,17 @@ typedef struct {
|
||||||
mfs_id_t id;
|
mfs_id_t id;
|
||||||
} mfs_transaction_op_t;
|
} mfs_transaction_op_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type of an non-cacheable MFS buffer.
|
||||||
|
*/
|
||||||
|
typedef union mfs_nocache_buffer {
|
||||||
|
mfs_data_header_t dhdr;
|
||||||
|
mfs_bank_header_t bhdr;
|
||||||
|
uint8_t data8[MFS_CFG_BUFFER_SIZE];
|
||||||
|
uint16_t data16[MFS_CFG_BUFFER_SIZE / sizeof (uint16_t)];
|
||||||
|
uint32_t data32[MFS_CFG_BUFFER_SIZE / sizeof (uint32_t)];
|
||||||
|
} mfs_nocache_buffer_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Type of an MFS instance.
|
* @brief Type of an MFS instance.
|
||||||
*/
|
*/
|
||||||
|
@ -385,15 +396,9 @@ typedef struct {
|
||||||
mfs_transaction_op_t tr_ops[MFS_CFG_TRANSACTION_MAX];
|
mfs_transaction_op_t tr_ops[MFS_CFG_TRANSACTION_MAX];
|
||||||
#endif
|
#endif
|
||||||
/**
|
/**
|
||||||
* @brief Transient buffer.
|
* @brief Associated non-cacheable buffer.
|
||||||
*/
|
*/
|
||||||
union {
|
mfs_nocache_buffer_t *ncbuf;
|
||||||
mfs_data_header_t dhdr;
|
|
||||||
mfs_bank_header_t bhdr;
|
|
||||||
uint8_t data8[MFS_CFG_BUFFER_SIZE];
|
|
||||||
uint16_t data16[MFS_CFG_BUFFER_SIZE / sizeof (uint16_t)];
|
|
||||||
uint32_t data32[MFS_CFG_BUFFER_SIZE / sizeof (uint32_t)];
|
|
||||||
} buffer;
|
|
||||||
} MFSDriver;
|
} MFSDriver;
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -426,7 +431,7 @@ typedef struct {
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
void mfsObjectInit(MFSDriver *devp);
|
void mfsObjectInit(MFSDriver *devp, mfs_nocache_buffer_t *ncbuf);
|
||||||
mfs_error_t mfsStart(MFSDriver *devp, const MFSConfig *config);
|
mfs_error_t mfsStart(MFSDriver *devp, const MFSConfig *config);
|
||||||
void mfsStop(MFSDriver *devp);
|
void mfsStop(MFSDriver *devp);
|
||||||
mfs_error_t mfsErase(MFSDriver *mfsp);
|
mfs_error_t mfsErase(MFSDriver *mfsp);
|
||||||
|
|
|
@ -74,6 +74,8 @@
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
|
|
||||||
*** Next ***
|
*** Next ***
|
||||||
|
- NEW: Improved MFS to use explicitly non-cacheable buffers for potentially
|
||||||
|
DMA-accessible I/O areas.
|
||||||
- NEW: FatFS now functional on STM32H7xx, added a target to the VFS demo.
|
- NEW: FatFS now functional on STM32H7xx, added a target to the VFS demo.
|
||||||
- NEW: Improved cache settings in STM32H7xx mcuconf.h.
|
- NEW: Improved cache settings in STM32H7xx mcuconf.h.
|
||||||
- NEW: Modified SDMMCv2 to allow for uncached buffers, tested on STM32H7xx.
|
- NEW: Modified SDMMCv2 to allow for uncached buffers, tested on STM32H7xx.
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
|
|
||||||
#define TEST_REPORT_HOOK_HEADER test_print_mfs_info();
|
#define TEST_REPORT_HOOK_HEADER test_print_mfs_info();
|
||||||
|
|
||||||
|
extern mfs_nocache_buffer_t __nocache_mfsbuf1;
|
||||||
extern const MFSConfig mfscfg1;
|
extern const MFSConfig mfscfg1;
|
||||||
extern MFSDriver mfs1;
|
extern MFSDriver mfs1;
|
||||||
extern uint8_t mfs_buffer[512];
|
extern uint8_t mfs_buffer[512];
|
||||||
|
@ -54,6 +55,7 @@ void test_print_mfs_info(void);]]></value>
|
||||||
<global_code>
|
<global_code>
|
||||||
<value><![CDATA[#include "hal_mfs.h"
|
<value><![CDATA[#include "hal_mfs.h"
|
||||||
|
|
||||||
|
mfs_nocache_buffer_t __nocache_mfsbuf1;
|
||||||
MFSDriver mfs1;
|
MFSDriver mfs1;
|
||||||
uint8_t mfs_buffer[512];
|
uint8_t mfs_buffer[512];
|
||||||
|
|
||||||
|
@ -193,7 +195,7 @@ flash_error_t bank_verify_erased(mfs_bank_t bank) {
|
||||||
</condition>
|
</condition>
|
||||||
<various_code>
|
<various_code>
|
||||||
<setup_code>
|
<setup_code>
|
||||||
<value><![CDATA[mfsObjectInit(&mfs1);]]></value>
|
<value><![CDATA[mfsObjectInit(&mfs1, &__nocache_mfsbuf1);]]></value>
|
||||||
</setup_code>
|
</setup_code>
|
||||||
<teardown_code>
|
<teardown_code>
|
||||||
<value><![CDATA[mfsStop(&mfs1);]]></value>
|
<value><![CDATA[mfsStop(&mfs1);]]></value>
|
||||||
|
|
|
@ -65,6 +65,7 @@ const testsuite_t mfs_test_suite = {
|
||||||
|
|
||||||
#include "hal_mfs.h"
|
#include "hal_mfs.h"
|
||||||
|
|
||||||
|
mfs_nocache_buffer_t __nocache_mfsbuf1;
|
||||||
MFSDriver mfs1;
|
MFSDriver mfs1;
|
||||||
uint8_t mfs_buffer[512];
|
uint8_t mfs_buffer[512];
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ extern "C" {
|
||||||
|
|
||||||
#define TEST_REPORT_HOOK_HEADER test_print_mfs_info();
|
#define TEST_REPORT_HOOK_HEADER test_print_mfs_info();
|
||||||
|
|
||||||
|
extern mfs_nocache_buffer_t __nocache_mfsbuf1;
|
||||||
extern const MFSConfig mfscfg1;
|
extern const MFSConfig mfscfg1;
|
||||||
extern MFSDriver mfs1;
|
extern MFSDriver mfs1;
|
||||||
extern uint8_t mfs_buffer[512];
|
extern uint8_t mfs_buffer[512];
|
||||||
|
|
|
@ -69,7 +69,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void mfs_test_001_001_setup(void) {
|
static void mfs_test_001_001_setup(void) {
|
||||||
mfsObjectInit(&mfs1);
|
mfsObjectInit(&mfs1, &__nocache_mfsbuf1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mfs_test_001_001_teardown(void) {
|
static void mfs_test_001_001_teardown(void) {
|
||||||
|
|
Loading…
Reference in New Issue