From: Bernd Moessner <berndmoessne...@gmail.com> Updates #4981 --- cpukit/dev/flash/flashdev.c | 8 ++- cpukit/include/dev/flash/flashdev.h | 18 ++++++- cpukit/libmisc/shell/main_flashdev.c | 18 ++++--- testsuites/libtests/flashdev01/init.c | 18 ++++++- .../libtests/flashdev01/test_flashdev.c | 49 ++++++++++++++----- .../libtests/flashdev01/test_flashdev.h | 1 + 6 files changed, 90 insertions(+), 22 deletions(-)
diff --git a/cpukit/dev/flash/flashdev.c b/cpukit/dev/flash/flashdev.c index 50915312a0..e10daace99 100644 --- a/cpukit/dev/flash/flashdev.c +++ b/cpukit/dev/flash/flashdev.c @@ -819,7 +819,9 @@ static int rtems_flashdev_ioctl_get_pageinfo_by_offset( return ( *flash->get_page_info_by_offset )( flash, page_info->location, &page_info->page_info.offset, - &page_info->page_info.size ); + &page_info->page_info.size, + &page_info->erase_info.offset, + &page_info->erase_info.size ); } } @@ -838,7 +840,9 @@ static int rtems_flashdev_ioctl_get_pageinfo_by_index( rtems_flashdev *flash, return ( *flash->get_page_info_by_index )( flash, page_info->location, &page_info->page_info.offset, - &page_info->page_info.size ); + &page_info->page_info.size, + &page_info->erase_info.offset, + &page_info->erase_info.size ); } } diff --git a/cpukit/include/dev/flash/flashdev.h b/cpukit/include/dev/flash/flashdev.h index 6ce00c4ead..ac21f883e8 100644 --- a/cpukit/include/dev/flash/flashdev.h +++ b/cpukit/include/dev/flash/flashdev.h @@ -214,6 +214,12 @@ typedef struct rtems_flashdev_ioctl_page_info { * base offset and size of page. */ rtems_flashdev_region page_info; + + /** + * @brief Erase information returned about the page. Including the + * base offset and size of the erase block. + */ + rtems_flashdev_region erase_info; } rtems_flashdev_ioctl_page_info; /** @@ -306,6 +312,8 @@ struct rtems_flashdev { * returned. * @param[out] page_offset The offset of the start of the page * @param[out] page_size The size of the page + * @param[out] erase_offset The offset of the start of the erase block + * @param[out] erase_size The erase block size * * @retval 0 Success. * @retval non-zero Failed. @@ -314,7 +322,9 @@ struct rtems_flashdev { rtems_flashdev *flash, off_t search_offset, off_t *page_offset, - size_t *page_size + size_t *page_size, + off_t *erase_offset, + size_t *erase_size ); /** @@ -325,6 +335,8 @@ struct rtems_flashdev { * @param[in] search_index The index of the page which info is to be returned. * @param[out] page_offset The offset of the start of the page * @param[out] page_size The size of the page + * @param[out] erase_offset The offset of the start of the erase block + * @param[out] erase_size The erase block size * * @retval 0 Success. * @retval non-zero Failed. @@ -333,7 +345,9 @@ struct rtems_flashdev { rtems_flashdev *flashdev, off_t search_index, off_t *page_offset, - size_t *page_size + size_t *page_size, + off_t *erase_offset, + size_t *erase_size ); /** diff --git a/cpukit/libmisc/shell/main_flashdev.c b/cpukit/libmisc/shell/main_flashdev.c index 8443d8f71d..54cdf78103 100644 --- a/cpukit/libmisc/shell/main_flashdev.c +++ b/cpukit/libmisc/shell/main_flashdev.c @@ -37,11 +37,11 @@ static int flashdev_shell_write(char *dev_path, int argc, char *argv[]); static int flashdev_shell_erase(char *dev_path, int argc, char *argv[]); static int flashdev_shell_get_type(char *dev_path); static int flashdev_shell_get_jedec_id(char *dev_path); -static int flashdev_shell_get_page_by_off( +static int flashdev_shell_get_page_info_by_offset( char *dev_path, int argc, char *argv[] ); -static int flashdev_shell_get_page_by_idx( +static int flashdev_shell_get_page_info_by_index( char *dev_path, int argc, char *argv[] @@ -112,10 +112,10 @@ static int rtems_flashdev_shell_main( int argc, char *argv[] ) { return flashdev_shell_get_jedec_id(dev_path); case ('o'): /* Get page info by offset */ - return flashdev_shell_get_page_by_off(dev_path, argc, &argv[i]); + return flashdev_shell_get_page_info_by_offset(dev_path, argc, &argv[i]); case ('i'): /* Get page info by index */ - return flashdev_shell_get_page_by_idx(dev_path, argc, &argv[i]); + return flashdev_shell_get_page_info_by_index(dev_path, argc, &argv[i]); case ('p'): /* Get page count */ return flashdev_shell_get_page_count(dev_path); @@ -437,7 +437,7 @@ int flashdev_shell_get_jedec_id( char *dev_path ) { return 0; } -static int flashdev_shell_get_page_by_off( +static int flashdev_shell_get_page_info_by_offset( char *dev_path, int argc, char *argv[] @@ -451,7 +451,7 @@ static int flashdev_shell_get_page_by_off( ); } -static int flashdev_shell_get_page_by_idx( +static int flashdev_shell_get_page_info_by_index( char *dev_path, int argc, char *argv[] @@ -578,6 +578,12 @@ static int flashdev_shell_page( pg_info.page_info.size ); + printf( + "Erase block offset: 0x%jx\nErase block length: 0x%zx\n", + pg_info.erase_info.offset, + pg_info.erase_info.size + ); + /* Clean up */ close(fd); return 0; diff --git a/testsuites/libtests/flashdev01/init.c b/testsuites/libtests/flashdev01/init.c index 8fe1d083f3..84e2c7859d 100644 --- a/testsuites/libtests/flashdev01/init.c +++ b/testsuites/libtests/flashdev01/init.c @@ -39,7 +39,7 @@ #define TEST_DATA_SIZE (PAGE_SIZE * PAGE_COUNT) #define PAGE_COUNT 16 #define PAGE_SIZE 128 -#define MIN_WRTIE_BLOCK_SIZE 1 +#define ERASE_BLOCK_SIZE 256 const char rtems_test_name[] = "FLASHDEV 1"; const char test_string[] = "My test string!"; @@ -70,6 +70,7 @@ static void run_test(void) { /* Initalize the flash device driver and flashdev */ flash = test_flashdev_init( PAGE_COUNT, PAGE_SIZE, + ERASE_BLOCK_SIZE, min_write_write_block_size_in[loop]); rtems_test_assert(flash != NULL); @@ -131,6 +132,16 @@ static void run_test(void) { rtems_test_assert(!status); rtems_test_assert(type == RTEMS_FLASHDEV_NOR); + /* Test getting page info */ + pg_info.location = 0; + + status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_PAGEINFO_BY_OFFSET, &pg_info); + rtems_test_assert(!status); + rtems_test_assert(pg_info.page_info.offset == 0); + rtems_test_assert(pg_info.page_info.size == PAGE_SIZE); + rtems_test_assert(pg_info.erase_info.offset == 0); + rtems_test_assert(pg_info.erase_info.size == ERASE_BLOCK_SIZE); + /* Test getting page info from offset */ pg_info.location = PAGE_SIZE + PAGE_SIZE/2; @@ -138,6 +149,8 @@ static void run_test(void) { rtems_test_assert(!status); rtems_test_assert(pg_info.page_info.offset == PAGE_SIZE); rtems_test_assert(pg_info.page_info.size == PAGE_SIZE); + rtems_test_assert(pg_info.erase_info.offset == 0); + rtems_test_assert(pg_info.erase_info.size == ERASE_BLOCK_SIZE); /* Test getting page info from index */ pg_info.location = 2; @@ -145,6 +158,8 @@ static void run_test(void) { 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); + rtems_test_assert(pg_info.erase_info.offset == ERASE_BLOCK_SIZE); + rtems_test_assert(pg_info.erase_info.size == ERASE_BLOCK_SIZE); /* Test getting page count */ status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_GET_PAGE_COUNT, &page_count); @@ -173,6 +188,7 @@ static void run_test(void) { /* Initalize the flash device driver and flashdev */ flash = test_flashdev_init( PAGE_COUNT, PAGE_SIZE, + ERASE_BLOCK_SIZE, min_write_write_block_size_in[1]); rtems_test_assert(flash != NULL); diff --git a/testsuites/libtests/flashdev01/test_flashdev.c b/testsuites/libtests/flashdev01/test_flashdev.c index d7f8a2fe67..fe72923c6c 100644 --- a/testsuites/libtests/flashdev01/test_flashdev.c +++ b/testsuites/libtests/flashdev01/test_flashdev.c @@ -37,6 +37,7 @@ size_t g_min_write_block_size = 0; size_t g_page_count = 0; size_t g_page_size = 0; +size_t g_erase_block_size = 0; size_t g_test_data_size = 0; /** @@ -50,18 +51,22 @@ typedef struct test_flashdev { rtems_flashdev_region regions[MAX_NUM_REGIONS]; } test_flashdev; -int test_flashdev_get_page_by_offset( +int test_flashdev_get_page_info_by_offset( rtems_flashdev *flash, off_t search_offset, off_t *page_offset, - size_t *page_size + size_t *page_size, + off_t *erase_offset, + size_t *erase_size ); -int test_flashdev_get_page_by_index( +int test_flashdev_get_page_info_by_index( rtems_flashdev *flash, off_t search_index, off_t *page_offset, - size_t *page_size + size_t *page_size, + off_t *erase_offset, + size_t *erase_size ); int test_flashdev_get_page_count( @@ -104,28 +109,36 @@ int test_flashdev_erase( ); /* Get page info by offset handler */ -int test_flashdev_get_page_by_offset( +int test_flashdev_get_page_info_by_offset( rtems_flashdev *flash, off_t search_offset, off_t *page_offset, - size_t *page_size + size_t *page_size, + off_t *erase_offset, + size_t *erase_size ) { *page_offset = search_offset - (search_offset%g_page_size); *page_size = g_page_size; + *erase_size = g_erase_block_size; + *erase_offset = *page_offset - (*page_offset % *erase_size); return 0; } /* Get page by index handler */ -int test_flashdev_get_page_by_index( +int test_flashdev_get_page_info_by_index( rtems_flashdev *flash, off_t search_index, off_t *page_offset, - size_t *page_size + size_t *page_size, + off_t *erase_offset, + size_t *erase_size ) { *page_offset = search_index * g_page_size; *page_size = g_page_size; + *erase_size = g_erase_block_size; + *erase_offset = *page_offset - (*page_offset % *erase_size); return 0; } @@ -234,6 +247,7 @@ int test_flashdev_erase( rtems_flashdev* test_flashdev_init( size_t page_count, size_t page_size, + size_t erase_block_size, size_t min_write_block_size ) { @@ -243,15 +257,28 @@ rtems_flashdev* test_flashdev_init( if (0 == page_size) { return NULL; } + if (0 == erase_block_size) { + return NULL; + } if (0 == min_write_block_size) { return NULL; } - g_page_count = page_count; g_page_size = page_size; + g_erase_block_size = erase_block_size; g_min_write_block_size = min_write_block_size; g_test_data_size = g_page_size * g_page_count; + if (g_test_data_size % g_erase_block_size) { + return NULL; + } + if (g_erase_block_size % g_page_size) { + return NULL; + } + if (g_page_size % min_write_block_size) { + return NULL; + } + rtems_flashdev *flash = rtems_flashdev_alloc_and_init(sizeof(rtems_flashdev)); if (flash == NULL) { @@ -285,8 +312,8 @@ rtems_flashdev* test_flashdev_init( flash->erase = &test_flashdev_erase; flash->get_jedec_id = &test_flashdev_get_jedec_id; flash->get_flash_type = &test_flashdev_get_type; - flash->get_page_info_by_offset = &test_flashdev_get_page_by_offset; - flash->get_page_info_by_index = &test_flashdev_get_page_by_index; + flash->get_page_info_by_offset = &test_flashdev_get_page_info_by_offset; + flash->get_page_info_by_index = &test_flashdev_get_page_info_by_index; flash->get_page_count = &test_flashdev_get_page_count; flash->get_min_write_block_size = &test_flashdev_get_min_write_block_size; flash->region_table = ftable; diff --git a/testsuites/libtests/flashdev01/test_flashdev.h b/testsuites/libtests/flashdev01/test_flashdev.h index ca2838ecd2..7205e28472 100644 --- a/testsuites/libtests/flashdev01/test_flashdev.h +++ b/testsuites/libtests/flashdev01/test_flashdev.h @@ -33,6 +33,7 @@ rtems_flashdev* test_flashdev_init( size_t page_count, size_t page_size, + size_t erase_block_size, size_t min_write_block_size ); -- 2.34.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel