[PATCH rtems6 - v1 07/16] Flashdev: Refactor write_block_size and add function to dergister flashdev
berndmoessner80 at gmail.com
berndmoessner80 at gmail.com
Thu Jan 4 18:34:31 UTC 2024
From: Bernd Moessner <berndmoessner80 at gmail.com>
---
cpukit/dev/flash/flashdev.c | 71 ++++--
cpukit/include/dev/flash/flashdev.h | 22 +-
cpukit/libmisc/shell/main_flashdev.c | 26 +--
testsuites/libtests/flashdev01/init.c | 204 ++++++++++++------
.../libtests/flashdev01/test_flashdev.c | 54 +++--
.../libtests/flashdev01/test_flashdev.h | 4 +-
6 files changed, 264 insertions(+), 117 deletions(-)
diff --git a/cpukit/dev/flash/flashdev.c b/cpukit/dev/flash/flashdev.c
index 0020e8d2c1..f50d2235a1 100644
--- a/cpukit/dev/flash/flashdev.c
+++ b/cpukit/dev/flash/flashdev.c
@@ -124,7 +124,7 @@ static int rtems_flashdev_ioctl_get_page_count(
void *arg
);
-static int rtems_flashdev_ioctl_get_write_block_size(
+static int rtems_flashdev_ioctl_get_min_write_size(
rtems_flashdev *flash,
void *arg
);
@@ -146,8 +146,7 @@ static int rtems_flashdev_get_abs_addr(
static int rtems_flashdev_update_and_return(
rtems_libio_t *iop,
int status,
- size_t count,
- off_t new_offset
+ size_t count
);
static uint32_t rtems_flashdev_find_unallocated_region(
@@ -225,13 +224,20 @@ static const rtems_filesystem_file_handlers_r rtems_flashdev_handler = {
.poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev };
-
+/*
static const IMFS_node_control
rtems_flashdev_node_control = IMFS_GENERIC_INITIALIZER(
&rtems_flashdev_handler,
IMFS_node_initialize_generic,
rtems_flashdev_node_destroy
);
+*/
+static const IMFS_node_control rtems_flashdev_node_control = {
+ .handlers = &rtems_flashdev_handler,
+ .node_initialize = IMFS_node_initialize_generic,
+ .node_remove = IMFS_node_remove_default,
+ .node_destroy = rtems_flashdev_node_destroy
+};
static void rtems_flashdev_node_destroy(
IMFS_jnode_t *node
@@ -321,7 +327,7 @@ static int rtems_flashdev_read_write(
int status;
if ( read_buff == NULL && write_buff == NULL ) {
- return 0;
+ return EINVAL;
}
/* Get flash address */
@@ -335,12 +341,35 @@ static int rtems_flashdev_read_write(
if ( read_buff != NULL ) {
status = ( *flash->read )( flash, addr, count, read_buff );
} else if ( write_buff != NULL ) {
+ size_t min_write_size = 0;
+ status = (flash)->get_min_write_size(flash, &min_write_size);
+
+ if ( status < 0 ) {
+ return status;
+ }
+
+ if (0 == min_write_size )
+ {
+ rtems_set_errno_and_return_minus_one( EIO );
+ }
+ else
+ {
+ if (count % min_write_size)
+ {
+ rtems_set_errno_and_return_minus_one( EINVAL );
+ }
+ if (addr % min_write_size)
+ {
+ rtems_set_errno_and_return_minus_one( EFAULT );
+ }
+ }
+
status = ( *flash->write )( flash, addr, count, write_buff );
}
rtems_flashdev_release( flash );
/* Update offset and return */
- return rtems_flashdev_update_and_return( iop, status, count, addr + count );
+ return rtems_flashdev_update_and_return( iop, status, count );
}
static int rtems_flashdev_ioctl(
@@ -388,8 +417,8 @@ static int rtems_flashdev_ioctl(
case RTEMS_FLASHDEV_IOCTL_GET_PAGE_COUNT:
err = rtems_flashdev_ioctl_get_page_count( flash, arg );
break;
- case RTEMS_FLASHDEV_IOCTL_GET_WRITE_BLOCK_SIZE:
- err = rtems_flashdev_ioctl_get_write_block_size( flash, arg );
+ case RTEMS_FLASHDEV_IOCTL_GET_MIN_WRITE_SIZE:
+ err = rtems_flashdev_ioctl_get_min_write_size( flash, arg );
break;
default:
err = EINVAL;
@@ -486,6 +515,18 @@ int rtems_flashdev_register(
return rv;
}
+int rtems_flashdev_deregister(
+ const char *flash_path
+)
+{
+ rtems_filesystem_eval_path_context_t ctx;
+ int eval_flags = RTEMS_FS_FOLLOW_LINK;
+ const rtems_filesystem_location_info_t *currentloc =
+ rtems_filesystem_eval_path_start( &ctx , flash_path, eval_flags );
+
+ return IMFS_rmnod(NULL, currentloc);
+}
+
static int rtems_flashdev_do_init(
rtems_flashdev *flash,
void ( *destroy )( rtems_flashdev *flash )
@@ -503,7 +544,7 @@ static int rtems_flashdev_do_init(
flash->get_page_info_by_offset = NULL;
flash->get_page_info_by_index = NULL;
flash->get_page_count = NULL;
- flash->get_write_block_size = NULL;
+ flash->get_min_write_size = NULL;
flash->region_table = NULL;
return 0;
}
@@ -520,7 +561,6 @@ void rtems_flashdev_destroy_and_free( rtems_flashdev *flash )
}
rtems_recursive_mutex_destroy( &( flash->mutex ) );
free( flash );
- flash = NULL;
return;
}
@@ -602,13 +642,12 @@ static int rtems_flashdev_get_abs_addr(
static int rtems_flashdev_update_and_return(
rtems_libio_t *iop,
int status,
- size_t count,
- off_t new_offset
+ size_t count
)
{
/* Update offset and return */
if ( status == 0 ) {
- iop->offset = new_offset;
+ iop->offset += count;
return count;
} else {
rtems_set_errno_and_return_minus_one( status );
@@ -847,7 +886,7 @@ static int rtems_flashdev_ioctl_get_page_count( rtems_flashdev *flash, void *arg
}
}
-static int rtems_flashdev_ioctl_get_write_block_size(
+static int rtems_flashdev_ioctl_get_min_write_size(
rtems_flashdev *flash,
void *arg
)
@@ -855,10 +894,10 @@ static int rtems_flashdev_ioctl_get_write_block_size(
if ( arg == NULL ) {
rtems_set_errno_and_return_minus_one( EINVAL );
}
- if ( flash->get_write_block_size == NULL ) {
+ if ( flash->get_min_write_size == NULL ) {
return 0;
} else {
- return ( *flash->get_write_block_size )( flash, ( (size_t *) arg ) );
+ return ( *flash->get_min_write_size )( flash, ( (size_t *) arg ) );
}
}
diff --git a/cpukit/include/dev/flash/flashdev.h b/cpukit/include/dev/flash/flashdev.h
index 6244d38e3a..f6973df2a3 100644
--- a/cpukit/include/dev/flash/flashdev.h
+++ b/cpukit/include/dev/flash/flashdev.h
@@ -142,7 +142,7 @@ typedef struct rtems_flashdev rtems_flashdev;
*
* @param[out] count Integer containing the minimum write size.
*/
-#define RTEMS_FLASHDEV_IOCTL_GET_WRITE_BLOCK_SIZE 10
+#define RTEMS_FLASHDEV_IOCTL_GET_MIN_WRITE_SIZE 10
/**
* @brief The maximum number of region limited file descriptors
@@ -354,14 +354,14 @@ struct rtems_flashdev {
* @brief Call to device driver to return the minimum write size of the
* flash device.
*
- * @param[out] write_block_size The minimum write size of the flash device.
+ * @param[out] min_write_size The minimum write size of the flash device.
*
* @retval 0 Success.
* @retval non-zero Failed.
*/
- int ( *get_write_block_size )(
+ int ( *get_min_write_size )(
rtems_flashdev *flashdev,
- size_t *write_block_size
+ size_t *min_write_size
);
/**
@@ -441,6 +441,20 @@ int rtems_flashdev_register(
const char *flash_path
);
+/**
+ * @brief Deregister the flash device.
+ *
+ * This function removes the node allocated for the flash device.
+ *
+ * @param[in] flash_path The path to the flash device file.
+ *
+ * @retval 0 Successful operation.
+ * @retval non-zero Failed operation.
+ */
+int rtems_flashdev_deregister(
+ const char *flash_path
+);
+
/**
* @brief Destroys the flash device.
*
diff --git a/cpukit/libmisc/shell/main_flashdev.c b/cpukit/libmisc/shell/main_flashdev.c
index 516c77ae27..5851adfeef 100644
--- a/cpukit/libmisc/shell/main_flashdev.c
+++ b/cpukit/libmisc/shell/main_flashdev.c
@@ -40,7 +40,7 @@ static int flashdev_shell_get_jedec_id(char *dev_path);
static int flashdev_shell_get_page_by_off(char *dev_path, int argc, char *argv[]);
static int flashdev_shell_get_page_by_idx(char *dev_path, int argc, char *argv[]);
static int flashdev_shell_get_pg_count(char *dev_path);
-static int flashdev_shell_get_wb_size(char *dev_path);
+static int flashdev_shell_get_min_write_size(char *dev_path);
static int flashdev_shell_ioctl_value(
char *dev_path,
@@ -67,7 +67,7 @@ static const char rtems_flashdev_shell_usage [] =
" -o <address> Print the page information of page at address\n"
" -i <index> Print the page information of page at index\n"
" -p Print the number of pages\n"
- " -b Print the write block size\n"
+ " -b Print the min. write size\n"
" -h Print this help\n";
@@ -98,23 +98,23 @@ static int rtems_flashdev_shell_main( int argc, char *argv[] ) {
/* Erase */
return flashdev_shell_erase(dev_path, argc, &argv[i]);
case ('t'):
- /* Flash Type */
+ /* Get flash Type */
return flashdev_shell_get_type(dev_path);
case ('d'):
- /* JEDEC Id */
+ /* Get JEDEC Id */
return flashdev_shell_get_jedec_id(dev_path);
case ('o'):
- /* Page info by offset */
+ /* Get page info by offset */
return flashdev_shell_get_page_by_off(dev_path, argc, &argv[i]);
case ('i'):
- /* Page info by index */
+ /* Get page info by index */
return flashdev_shell_get_page_by_idx(dev_path, argc, &argv[i]);
case ('p'):
- /* Page count */
+ /* Get page count */
return flashdev_shell_get_pg_count(dev_path);
case ('b'):
- /* Write block size */
- return flashdev_shell_get_wb_size(dev_path);
+ /* Get min write size */
+ return flashdev_shell_get_min_write_size(dev_path);
case ('h'):
default:
/* Help */
@@ -480,7 +480,7 @@ static int flashdev_shell_get_pg_count( char *dev_path )
return 0;
}
-static int flashdev_shell_get_wb_size( char *dev_path )
+static int flashdev_shell_get_min_write_size( char *dev_path )
{
size_t ret;
int status;
@@ -488,16 +488,16 @@ static int flashdev_shell_get_wb_size( char *dev_path )
/* Get Write Block Size */
status = flashdev_shell_ioctl_value(
dev_path,
- RTEMS_FLASHDEV_IOCTL_GET_WRITE_BLOCK_SIZE,
+ RTEMS_FLASHDEV_IOCTL_GET_MIN_WRITE_SIZE,
&ret
);
/* Print Write Block Size */
if (status) {
- printf("Failed to get write block size\n");
+ printf("Failed to get min write size\n");
return status;
} else {
- printf("Write block size: 0x%zx\n", ret);
+ printf("Min. Write size: 0x%zx\n", ret);
}
return 0;
}
diff --git a/testsuites/libtests/flashdev01/init.c b/testsuites/libtests/flashdev01/init.c
index 30af3f33c1..dc174daa62 100644
--- a/testsuites/libtests/flashdev01/init.c
+++ b/testsuites/libtests/flashdev01/init.c
@@ -34,14 +34,15 @@
#include <fcntl.h>
#include <sys/ioctl.h>
-#define TEST_NAME_LENGTH 10
+
#define TEST_DATA_SIZE (PAGE_SIZE * PAGE_COUNT)
#define PAGE_COUNT 16
#define PAGE_SIZE 128
-#define WB_SIZE 1
+#define MIN_WRITE_SIZE 1
const char rtems_test_name[] = "FLASHDEV 1";
+const char test_string[] = "My test string!";
static void run_test(void);
@@ -53,89 +54,134 @@ static void run_test(void) {
rtems_flashdev* flash;
int status;
char* read_data;
+ size_t bytes_read;
rtems_flashdev_region e_args;
rtems_flashdev_ioctl_page_info pg_info;
rtems_flashdev_region region;
uint32_t jedec;
int page_count;
int type;
- size_t wb_size;
+ size_t min_write_size_in[] = {1,8,16};
+ size_t min_write_size_out;
+ const char flash_path[] = "/dev/flashdev0";
+
+ for ( int loop = 0; loop <= 2; loop++)
+ {
+ /* Initalize the flash device driver and flashdev */
+ flash = test_flashdev_init(min_write_size_in[loop]);
+ rtems_test_assert(flash != NULL);
+
+ /* Register the flashdev as a device */
+ status = rtems_flashdev_register(flash, flash_path);
+ rtems_test_assert(!status);
+
+ /* Open the flashdev */
+ file = fopen(flash_path, "r+");
+ rtems_test_assert(file != NULL);
+
+ /* Adjust the file buffering */
+ status = setvbuf(file, NULL, _IOFBF, min_write_size_in[loop]);
+ rtems_test_assert(!status);
+
+ fd = fileno(file);
+
+ /* Read data from flash */
+ read_data = fgets(buff, TEST_DATA_SIZE, file);
+ rtems_test_assert(read_data != NULL);
+
+ /* Fseek to start of flash and read again */
+ status = fseek(file, 0x0, SEEK_SET);
+ rtems_test_assert(!status);
+ bytes_read = fread(buff, 1, TEST_DATA_SIZE, file);
+ rtems_test_assert(bytes_read == TEST_DATA_SIZE);
+
+ /* Fseek to start of flash */
+ status = fseek(file, 0x0, SEEK_SET);
+ rtems_test_assert(!status);
+
+ /* Write the test name to the flash */
+ status = fwrite(test_string, 1, sizeof(test_string), file);
+ rtems_test_assert(status == sizeof(test_string));
+
+ /* Fseek to start of flash and read again */
+ status = fseek(file, 0x0, SEEK_SET);
+ rtems_test_assert(!status);
+ fgets(buff, TEST_DATA_SIZE, file);
+ rtems_test_assert(!strncmp(buff, test_string, sizeof(test_string)));
+
+ /* Test Erasing */
+ e_args.offset = 0x0;
+ e_args.size = PAGE_SIZE;
+ status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_ERASE, &e_args);
+ rtems_test_assert(!status);
+
+ fseek(file, 0x0, SEEK_SET);
+ fgets(buff, TEST_DATA_SIZE, file);
+ rtems_test_assert(buff[0] == 0);
+
+ /* Test getting JEDEC ID */
+ status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_JEDEC_ID, &jedec);
+ rtems_test_assert(!status);
+ rtems_test_assert(jedec == 0x00ABCDEF);
+
+ /* Test getting flash type */
+ status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_TYPE, &type);
+ rtems_test_assert(!status);
+ rtems_test_assert(type == RTEMS_FLASHDEV_NOR);
+
+ /* Test getting page info from offset */
+ pg_info.location = PAGE_SIZE + PAGE_SIZE/2;
+
+ status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_PAGEINFO_BY_OFFSET, &pg_info);
+ rtems_test_assert(!status);
+ rtems_test_assert(pg_info.page_info.offset == PAGE_SIZE);
+ rtems_test_assert(pg_info.page_info.size == PAGE_SIZE);
+
+ /* Test getting page info from index */
+ pg_info.location = 2;
+ status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_PAGEINFO_BY_INDEX, &pg_info);
+ rtems_test_assert(!status);
+ rtems_test_assert(pg_info.page_info.offset == 2*PAGE_SIZE);
+ rtems_test_assert(pg_info.page_info.size == PAGE_SIZE);
+
+ /* Test getting page count */
+ status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_PAGE_COUNT, &page_count);
+ rtems_test_assert(!status);
+ rtems_test_assert(page_count == PAGE_COUNT);
+
+ /* Test getting min write size */
+ status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_MIN_WRITE_SIZE, &min_write_size_out);
+ rtems_test_assert(!status);
+ rtems_test_assert(0 == memcmp(&min_write_size_out, &min_write_size_in[loop] , sizeof(size_t)));
+
+ /* Close the file handle */
+ status = fclose(file);
+ rtems_test_assert(!status);
+
+ /* Deregister path */
+ status = rtems_flashdev_deregister(flash_path);
+ rtems_test_assert(!status);
+
+ test_flashdev_deinit(flash);
+ }
/* Initalize the flash device driver and flashdev */
- flash = test_flashdev_init();
+ flash = test_flashdev_init(min_write_size_in[1]);
rtems_test_assert(flash != NULL);
/* Register the flashdev as a device */
- status = rtems_flashdev_register(flash, "dev/flashdev0");
+ status = rtems_flashdev_register(flash, flash_path);
rtems_test_assert(!status);
/* Open the flashdev */
- file = fopen("dev/flashdev0", "r+");
+ file = fopen(flash_path, "r+");
rtems_test_assert(file != NULL);
- fd = fileno(file);
-
- /* Read data from flash */
- read_data = fgets(buff, TEST_DATA_SIZE, file);
- rtems_test_assert(read_data != NULL);
-
- /* Fseek to start of flash */
- status = fseek(file, 0x0, SEEK_SET);
- rtems_test_assert(!status);
-
- /* Write the test name to the flash */
- status = fwrite(rtems_test_name, TEST_NAME_LENGTH, 1, file);
- rtems_test_assert(status == 1);
-
- /* Fseek to start of flash and read again */
- status = fseek(file, 0x0, SEEK_SET);
- rtems_test_assert(!status);
- fgets(buff, TEST_DATA_SIZE, file);
- rtems_test_assert(!strncmp(buff, rtems_test_name, TEST_NAME_LENGTH));
- /* Test Erasing */
- e_args.offset = 0x0;
- e_args.size = PAGE_SIZE;
- status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_ERASE, &e_args);
+ /* Adjust the file buffering */
+ status = setvbuf(file, NULL, _IOFBF, min_write_size_in[1]);
rtems_test_assert(!status);
- fseek(file, 0x0, SEEK_SET);
- fgets(buff, TEST_DATA_SIZE, file);
- rtems_test_assert(buff[0] == 0);
-
- /* Test getting JEDEC ID */
- status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_JEDEC_ID, &jedec);
- rtems_test_assert(!status);
- rtems_test_assert(jedec == 0x00ABCDEF);
-
- /* Test getting flash type */
- status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_TYPE, &type);
- rtems_test_assert(!status);
- rtems_test_assert(type == RTEMS_FLASHDEV_NOR);
-
- /* Test getting page info from offset */
- pg_info.location = PAGE_SIZE + PAGE_SIZE/2;
-
- status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_PAGEINFO_BY_OFFSET, &pg_info);
- rtems_test_assert(!status);
- rtems_test_assert(pg_info.page_info.offset == PAGE_SIZE);
- rtems_test_assert(pg_info.page_info.size == PAGE_SIZE);
-
- /* Test getting page info from index */
- pg_info.location = 2;
- status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_PAGEINFO_BY_INDEX, &pg_info);
- rtems_test_assert(!status);
- rtems_test_assert(pg_info.page_info.offset == 2*PAGE_SIZE);
- rtems_test_assert(pg_info.page_info.size == PAGE_SIZE);
-
- /* Test getting page count */
- status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_PAGE_COUNT, &page_count);
- rtems_test_assert(!status);
- rtems_test_assert(page_count == PAGE_COUNT);
-
- /* Test getting write block size */
- status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_WRITE_BLOCK_SIZE, &wb_size);
- rtems_test_assert(!status);
- rtems_test_assert(wb_size == WB_SIZE);
+ fd = fileno(file);
/* Test Regions */
region.offset = 0x400;
@@ -143,10 +189,16 @@ static void run_test(void) {
status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_SET_REGION, ®ion);
rtems_test_assert(!status);
+ /* Test read within then region */
+ status = fseek(file, 0x0, SEEK_SET);
+ rtems_test_assert(!status);
+ bytes_read = fread(buff, 1, 0x200, file);
+ rtems_test_assert(bytes_read == 0x200);
+
/* Test read to larger then region */
fseek(file, 0x0, SEEK_SET);
read_data = fgets(buff, 2048, file);
- rtems_test_assert(read_data == NULL);
+ rtems_test_assert(buff[0] == 0);
/* Test fseek outside of region */
status = fseek(file, 0x201, SEEK_SET);
@@ -154,11 +206,21 @@ static void run_test(void) {
/* Write to base unset region and check the writes location */
fseek(file, 0x0, SEEK_SET);
- fwrite("HELLO WORLD", 11, 1, file);
+ fwrite("HELLO WORLD!!!!!", 1, 16, file);
ioctl(fd, RTEMS_FLASHDEV_IOCTL_UNSET_REGION, NULL);
fseek(file, 0x400, SEEK_SET);
- fgets(buff, 11, file);
- rtems_test_assert(strncmp(buff, "HELLO WORLD", 11));
+ fgets(buff, 16, file);
+ rtems_test_assert(strncmp(buff, "HELLO WORLD!!!!!", 16));
+
+ /* Close the file handle */
+ status = fclose(file);
+ rtems_test_assert(!status);
+
+ /* Deregister path */
+ status = rtems_flashdev_deregister(flash_path);
+ rtems_test_assert(!status);
+
+ test_flashdev_deinit(flash);
}
static void Init(rtems_task_argument arg)
diff --git a/testsuites/libtests/flashdev01/test_flashdev.c b/testsuites/libtests/flashdev01/test_flashdev.c
index d97f5d8145..0022210668 100644
--- a/testsuites/libtests/flashdev01/test_flashdev.c
+++ b/testsuites/libtests/flashdev01/test_flashdev.c
@@ -33,11 +33,12 @@
#define TEST_DATA_SIZE (PAGE_SIZE * PAGE_COUNT)
#define PAGE_COUNT 16
#define PAGE_SIZE 128
-#define WB_SIZE 1
#define MAX_NUM_REGIONS 48
#define BITALLOC_SIZE 32
#define NUM_BITALLOC ((MAX_NUM_REGIONS + BITALLOC_SIZE - 1) / BITALLOC_SIZE)
+static size_t g_min_write_size = 0;
+
/**
* This flash device driver is for testing flashdev
* API calls.
@@ -68,9 +69,9 @@ int test_flashdev_get_page_count(
int *page_count
);
-int test_flashdev_get_wb_size(
+int test_flashdev_get_min_write_size(
rtems_flashdev *flash,
- size_t *write_block_size
+ size_t *min_write_size
);
uint32_t test_flashdev_get_jedec_id(
@@ -102,7 +103,7 @@ int test_flashdev_erase(
size_t count
);
-/* Find page info by offset handler */
+/* Get page info by offset handler */
int test_flashdev_get_page_by_off(
rtems_flashdev *flash,
off_t search_offset,
@@ -115,7 +116,7 @@ int test_flashdev_get_page_by_off(
return 0;
}
-/* Find page by index handler */
+/* Get page info by index handler */
int test_flashdev_get_page_by_index(
rtems_flashdev *flash,
off_t search_index,
@@ -128,7 +129,7 @@ int test_flashdev_get_page_by_index(
return 0;
}
-/* Page count handler */
+/* Get page count handler */
int test_flashdev_get_page_count(
rtems_flashdev *flash,
int *page_count
@@ -138,13 +139,13 @@ int test_flashdev_get_page_count(
return 0;
}
-/* Write block size handler */
-int test_flashdev_get_wb_size(
+/* Get min. write size handler */
+int test_flashdev_get_min_write_size(
rtems_flashdev *flash,
- size_t *write_block_size
+ size_t *min_write_size
)
{
- *write_block_size = WB_SIZE;
+ *min_write_size = g_min_write_size;
return 0;
}
@@ -230,8 +231,13 @@ int test_flashdev_erase(
}
/* Initialize Flashdev and underlying driver. */
-rtems_flashdev* test_flashdev_init(void)
+rtems_flashdev* test_flashdev_init(size_t min_write_size)
{
+ if (0 == min_write_size) {
+ return NULL;
+ }
+
+ g_min_write_size = min_write_size;
rtems_flashdev *flash = rtems_flashdev_alloc_and_init(sizeof(rtems_flashdev));
if (flash == NULL) {
@@ -268,8 +274,32 @@ rtems_flashdev* test_flashdev_init(void)
flash->get_page_info_by_offset = &test_flashdev_get_page_by_off;
flash->get_page_info_by_index = &test_flashdev_get_page_by_index;
flash->get_page_count = &test_flashdev_get_page_count;
- flash->get_write_block_size = &test_flashdev_get_wb_size;
+ flash->get_min_write_size = &test_flashdev_get_min_write_size;
flash->region_table = ftable;
return flash;
}
+
+/* Free Flashdev and underlying driver. */
+void test_flashdev_deinit(
+ rtems_flashdev* flash
+)
+{
+ if (NULL != flash)
+ {
+ if (NULL != flash->driver)
+ {
+ free(flash->region_table);
+ }
+ if (NULL != flash->driver)
+ {
+ test_flashdev* flash_driver = (test_flashdev*) flash->driver;
+ if (NULL != flash_driver->data)
+ {
+ free( flash_driver->data);
+ }
+ free(flash->driver);
+ }
+ rtems_flashdev_destroy_and_free(flash);
+ }
+}
diff --git a/testsuites/libtests/flashdev01/test_flashdev.h b/testsuites/libtests/flashdev01/test_flashdev.h
index 8b03959c42..ad995854ea 100644
--- a/testsuites/libtests/flashdev01/test_flashdev.h
+++ b/testsuites/libtests/flashdev01/test_flashdev.h
@@ -30,6 +30,8 @@
#include <dev/flash/flashdev.h>
-rtems_flashdev* test_flashdev_init(void);
+rtems_flashdev* test_flashdev_init(size_t min_write_size);
+
+void test_flashdev_deinit(rtems_flashdev* flash);
#endif /* __TEST_FLASHDEV_H */
--
2.34.1
More information about the devel
mailing list