1919#include "mtd.h"
2020#include "mtd_flashpage.h"
2121
22+ #define TEST_ADDRESS1 (uint32_t)flashpage_addr(FLASHPAGE_NUMOF - 1)
23+ #define TEST_ADDRESS2 (uint32_t)flashpage_addr(FLASHPAGE_NUMOF - 2)
24+
2225static mtd_dev_t _dev = MTD_FLASHPAGE_INIT_VAL (8 );
2326static mtd_dev_t * dev = & _dev ;
2427
25- static void setup_teardown (void )
28+ static void setup (void )
29+ {
30+ int ret = mtd_init (dev );
31+ TEST_ASSERT_EQUAL_INT (0 , ret );
32+ mtd_erase (dev , TEST_ADDRESS1 , dev -> pages_per_sector * dev -> page_size );
33+ mtd_erase (dev , TEST_ADDRESS2 , dev -> pages_per_sector * dev -> page_size );
34+ }
35+
36+ static void teardown (void )
2637{
27- mtd_erase (dev , (FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , dev -> pages_per_sector * dev -> page_size );
38+ mtd_erase (dev , TEST_ADDRESS1 , dev -> pages_per_sector * dev -> page_size );
39+ mtd_erase (dev , TEST_ADDRESS2 , dev -> pages_per_sector * dev -> page_size );
2840}
2941
3042static void test_mtd_init (void )
@@ -36,75 +48,92 @@ static void test_mtd_init(void)
3648static void test_mtd_erase (void )
3749{
3850 /* Erase last sector */
39- int ret = mtd_erase (dev , ( FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , FLASHPAGE_SIZE );
51+ int ret = mtd_erase (dev , TEST_ADDRESS1 , FLASHPAGE_SIZE );
4052 TEST_ASSERT_EQUAL_INT (0 , ret );
4153
4254 /* Erase with wrong size (less than sector size) */
43- ret = mtd_erase (dev , ( FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , dev -> page_size );
55+ ret = mtd_erase (dev , TEST_ADDRESS1 , dev -> page_size );
4456 TEST_ASSERT_EQUAL_INT (- EOVERFLOW , ret );
4557
4658 /* Unaligned erase */
47- ret = mtd_erase (dev , ( FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE + dev -> page_size , dev -> page_size );
59+ ret = mtd_erase (dev , TEST_ADDRESS1 + dev -> page_size , dev -> page_size );
4860 TEST_ASSERT_EQUAL_INT (- EOVERFLOW , ret );
4961
5062 /* Erase 2 last sectors */
51- ret = mtd_erase (dev , ( FLASHPAGE_NUMOF - 2 ) * FLASHPAGE_SIZE ,
63+ ret = mtd_erase (dev , TEST_ADDRESS2 ,
5264 FLASHPAGE_SIZE * 2 );
5365 TEST_ASSERT_EQUAL_INT (0 , ret );
5466
5567 /* Erase out of memory area */
56- ret = mtd_erase (dev , ( FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE ,
68+ ret = mtd_erase (dev , TEST_ADDRESS1 ,
5769 FLASHPAGE_SIZE * 2 );
5870 TEST_ASSERT_EQUAL_INT (- EOVERFLOW , ret );
5971}
6072
6173static void test_mtd_write_erase (void )
6274{
63- const char buf [] = "ABCDEFGHIJK" ;
75+ const char buf [] = "ABCDEFGHIJKLMNO" ;
76+
77+ /* stm32l0x and stm32l1x erase its flash with 0's */
78+ #if defined(CPU_FAM_STM32L0 ) || defined(CPU_FAM_STM32L1 )
79+ uint8_t buf_empty [] = {0 , 0 , 0 };
80+ #else
6481 uint8_t buf_empty [] = {0xff , 0xff , 0xff };
82+ #endif
6583 char buf_read [sizeof (buf ) + sizeof (buf_empty )];
6684 memset (buf_read , 0 , sizeof (buf_read ));
6785
68- int ret = mtd_write (dev , buf , ( FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , sizeof (buf ));
86+ int ret = mtd_write (dev , buf , TEST_ADDRESS1 , sizeof (buf ));
6987 TEST_ASSERT_EQUAL_INT (sizeof (buf ), ret );
7088
71- ret = mtd_erase (dev , ( FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , dev -> pages_per_sector * dev -> page_size );
89+ ret = mtd_erase (dev , TEST_ADDRESS1 , dev -> pages_per_sector * dev -> page_size );
7290 TEST_ASSERT_EQUAL_INT (0 , ret );
7391
7492 uint8_t expected [sizeof (buf_read )];
93+ #if defined(CPU_FAM_STM32L0 ) || defined(CPU_FAM_STM32L1 )
7594 memset (expected , 0 , sizeof (expected ));
76- ret = mtd_read (dev , buf_read , (FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , sizeof (buf_read ));
95+ #else
96+ memset (expected , 0xff , sizeof (expected ));
97+ #endif
98+ ret = mtd_read (dev , buf_read , TEST_ADDRESS1 , sizeof (buf_read ));
7799 TEST_ASSERT_EQUAL_INT (sizeof (buf_read ), ret );
78100 TEST_ASSERT_EQUAL_INT (0 , memcmp (expected , buf_read , sizeof (buf_read )));
79101}
80102
81103static void test_mtd_write_read (void )
82104{
83- const char buf [] = "ABCDEFG" ;
84- uint8_t buf_empty [] = {0 , 0 , 0 , 0 };
105+ const char buf [] __attribute__ ((aligned (FLASHPAGE_RAW_ALIGNMENT ))) = "ABCDEFGHIJKLMNO" ;
106+
107+ /* stm32l0x and stm32l1x erase its flash with 0's */
108+ #if defined(CPU_FAM_STM32L0 ) || defined(CPU_FAM_STM32L1 )
109+ uint8_t buf_empty [] = {0 , 0 , 0 };
110+ #else
111+ uint8_t buf_empty [] = {0xff , 0xff , 0xff };
112+ #endif
85113 char buf_read [sizeof (buf ) + sizeof (buf_empty )];
86114 memset (buf_read , 0 , sizeof (buf_read ));
87115
88116 /* Basic write / read */
89- int ret = mtd_write (dev , buf , ( FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , sizeof (buf ));
117+ int ret = mtd_write (dev , buf , TEST_ADDRESS1 , sizeof (buf ));
90118 TEST_ASSERT_EQUAL_INT (sizeof (buf ), ret );
91119
92- ret = mtd_read (dev , buf_read , ( FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , sizeof (buf_read ));
120+ ret = mtd_read (dev , buf_read , TEST_ADDRESS1 , sizeof (buf_read ));
93121 TEST_ASSERT_EQUAL_INT (sizeof (buf_read ), ret );
94122 TEST_ASSERT_EQUAL_INT (0 , memcmp (buf , buf_read , sizeof (buf )));
95123 TEST_ASSERT_EQUAL_INT (0 , memcmp (buf_empty , buf_read + sizeof (buf ), sizeof (buf_empty )));
96124
97- ret = mtd_erase (dev , ( FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , dev -> pages_per_sector * dev -> page_size );
125+ ret = mtd_erase (dev , TEST_ADDRESS1 , dev -> pages_per_sector * dev -> page_size );
98126 TEST_ASSERT_EQUAL_INT (0 , ret );
99127
100128 /* Unaligned write / read */
101- ret = mtd_write (dev , buf , (FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE + sizeof (buf_empty ), sizeof (buf ));
102- TEST_ASSERT_EQUAL_INT (sizeof (buf ), ret );
103-
104- ret = mtd_read (dev , buf_read , (FLASHPAGE_NUMOF - 1 ) * FLASHPAGE_SIZE , sizeof (buf_read ));
105- TEST_ASSERT_EQUAL_INT (sizeof (buf_read ), ret );
106- TEST_ASSERT_EQUAL_INT (0 , memcmp (buf_empty , buf_read , sizeof (buf_empty )));
107- TEST_ASSERT_EQUAL_INT (0 , memcmp (buf , buf_read + sizeof (buf_empty ), sizeof (buf )));
129+ ret = mtd_write (dev , buf , TEST_ADDRESS1 + sizeof (buf_empty ), sizeof (buf ));
130+ TEST_ASSERT_EQUAL_INT (- EINVAL , ret );
131+
132+ /* Only Cortex-M0 doesn't allow unaligned reads */
133+ #if defined(CPU_ARCH_CORTEX_M0 )
134+ ret = mtd_read (dev , buf_read , TEST_ADDRESS1 + sizeof (buf_empty ), sizeof (buf_read ));
135+ TEST_ASSERT_EQUAL_INT (- EINVAL , ret );
136+ #endif
108137}
109138
110139Test * tests_mtd_flashpage_tests (void )
@@ -116,7 +145,7 @@ Test *tests_mtd_flashpage_tests(void)
116145 new_TestFixture (test_mtd_write_read ),
117146 };
118147
119- EMB_UNIT_TESTCALLER (mtd_flashpage_tests , setup_teardown , setup_teardown , fixtures );
148+ EMB_UNIT_TESTCALLER (mtd_flashpage_tests , setup , teardown , fixtures );
120149
121150 return (Test * )& mtd_flashpage_tests ;
122151}
0 commit comments