stbenn opened a new pull request, #16178:
URL: https://github.com/apache/nuttx/pull/16178
## Summary
H5 implementation of functions defined in `include/nuttx/progmem.h`. The
driver supports a subset of the flash peripheral functions.
- Assumes non-secure memory accesses. Does not check for memory protection
mechanisms.
References implementation in `arch/arm/src/stm32h7/stm32h743xx_flash.c`,
with slight difference in how bank1/2 is handled because banks share registers
on the H5 but are separate in the H7.
## Impact
This adds a few new options to the H5 Kconfig, which will include the new
flash file when progmem is enabled.
## Testing
OS: Docker container of Ubuntu 24.04 running on Ubuntu 24.04 host.
CPU: STM32H563ZIT6U
Compiler: Arm GNU Toolchain 13.3.Rel1 (Build arm-13.24)
Target: Nucleo-H563ZI
Testing was done using a custom application, called from NSH, to write and
erase flash blocks. Breakpoints were placed between each erase/write step, and
the flash memory was inspected using the debugger.
Testing application:
```c
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <nuttx/config.h>
#include <nuttx/mtd/mtd.h>
#include <nuttx/progmem.h>
#include <sys/types.h>
#if !defined(CONFIG_ARCH_HAVE_PROGMEM) || !defined(CONFIG_MTD_PROGMEM)
# error "progmemtest requires CONFIG_MTD_PROGMEM"
#endif
#define BLOCK_SIZE (8 * 1024)
#define BANK2_STARTADDR 0x08100000
static struct mtd_dev_s *progmem_mtd;
static uint8_t *buff;
static int mount_progmem(void) {
int result = 0;
if (progmem_mtd)
{
return 0;
}
progmem_mtd = progmem_initialize();
if (progmem_mtd)
{
printf("Progmem device initialized.\n");
}
return result;
}
uint8_t* create_and_fill_buffer(void) {
uint32_t pattern = 0xDEADBEEF;
uint8_t *buffer = (uint8_t *)malloc(BLOCK_SIZE);
if (!buffer)
{
printf("Failed to allocate buffer: %s\n", strerror(errno));
return NULL;
}
for (size_t i = 0; i < BLOCK_SIZE; i += sizeof(pattern))
{
if (i + sizeof(pattern) <= BLOCK_SIZE)
{
memcpy(buffer + i, &pattern, sizeof(pattern));
}
}
return buffer;
}
int main(int argc, char *argv[])
{
ssize_t ret;
uint32_t addr;
buff = create_and_fill_buffer();
if (buff)
{
/* Erase all blocks of memory in bank 2 */
for (int i = 128; i <= 255; i++)
{
ret = up_progmem_eraseblock(i);
if (ret < 0)
{
printf("Progmem erase block %d failed: %d\n", i, ret);
goto exit_with_free;
}
}
for (int i = 0; i <= 127; i++)
{
addr = BANK2_STARTADDR + (i * BLOCK_SIZE);
ret = up_progmem_write(addr, (const void *)buff, BLOCK_SIZE);
if (ret < 0)
{
printf("Progmem write failed: %d\n", ret);
goto exit_with_free;
}
}
for (int i = 128; i <= 255; i++)
{
ret = up_progmem_eraseblock(i);
if (ret < 0)
{
printf("Progmem erase block %d failed: %d\n", i, ret);
goto exit_with_free;
}
}
exit_with_free:
free(buff);
}
return 0;
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]