SDHI_driver patch (mbedOS 5.11.5)

Committer:
tvendov
Date:
Fri Mar 29 19:47:34 2019 +0200
Revision:
2:7c75ab32d7c9
Fix: Folder structure changed. All SD Auto tests pass with OK!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tvendov 2:7c75ab32d7c9 1 /* mbed Microcontroller Library
tvendov 2:7c75ab32d7c9 2 * Copyright (c) 2016 ARM Limited
tvendov 2:7c75ab32d7c9 3 *
tvendov 2:7c75ab32d7c9 4 * Licensed under the Apache License, Version 2.0 (the "License");
tvendov 2:7c75ab32d7c9 5 * you may not use this file except in compliance with the License.
tvendov 2:7c75ab32d7c9 6 * You may obtain a copy of the License at
tvendov 2:7c75ab32d7c9 7 *
tvendov 2:7c75ab32d7c9 8 * http://www.apache.org/licenses/LICENSE-2.0
tvendov 2:7c75ab32d7c9 9 *
tvendov 2:7c75ab32d7c9 10 * Unless required by applicable law or agreed to in writing, software
tvendov 2:7c75ab32d7c9 11 * distributed under the License is distributed on an "AS IS" BASIS,
tvendov 2:7c75ab32d7c9 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
tvendov 2:7c75ab32d7c9 13 * See the License for the specific language governing permissions and
tvendov 2:7c75ab32d7c9 14 * limitations under the License.
tvendov 2:7c75ab32d7c9 15 */
tvendov 2:7c75ab32d7c9 16
tvendov 2:7c75ab32d7c9 17 #include "mbed.h"
tvendov 2:7c75ab32d7c9 18 #include "greentea-client/test_env.h"
tvendov 2:7c75ab32d7c9 19 #include "unity.h"
tvendov 2:7c75ab32d7c9 20 #include "utest.h"
tvendov 2:7c75ab32d7c9 21 #include <stdlib.h>
tvendov 2:7c75ab32d7c9 22 #include <errno.h>
tvendov 2:7c75ab32d7c9 23
tvendov 2:7c75ab32d7c9 24 using namespace utest::v1;
tvendov 2:7c75ab32d7c9 25
tvendov 2:7c75ab32d7c9 26 // test configuration
tvendov 2:7c75ab32d7c9 27 #ifndef MBED_TEST_FILESYSTEM
tvendov 2:7c75ab32d7c9 28 #define MBED_TEST_FILESYSTEM FATFileSystem
tvendov 2:7c75ab32d7c9 29 #endif
tvendov 2:7c75ab32d7c9 30
tvendov 2:7c75ab32d7c9 31 #ifndef MBED_TEST_FILESYSTEM_DECL
tvendov 2:7c75ab32d7c9 32 #define MBED_TEST_FILESYSTEM_DECL MBED_TEST_FILESYSTEM fs("fs")
tvendov 2:7c75ab32d7c9 33 #endif
tvendov 2:7c75ab32d7c9 34
tvendov 2:7c75ab32d7c9 35 #ifndef MBED_TEST_BLOCKDEVICE
tvendov 2:7c75ab32d7c9 36 #define MBED_TEST_BLOCKDEVICE RZ_SDHIBlockDevice
tvendov 2:7c75ab32d7c9 37 #define MBED_TEST_BLOCKDEVICE_DECL SDHIBlockDevice bd(MBED_CONF_RZ_SDHI_CH);
tvendov 2:7c75ab32d7c9 38 #endif
tvendov 2:7c75ab32d7c9 39
tvendov 2:7c75ab32d7c9 40 #ifndef MBED_TEST_BLOCKDEVICE_DECL
tvendov 2:7c75ab32d7c9 41 #define MBED_TEST_BLOCKDEVICE_DECL MBED_TEST_BLOCKDEVICE bd
tvendov 2:7c75ab32d7c9 42 #endif
tvendov 2:7c75ab32d7c9 43
tvendov 2:7c75ab32d7c9 44 #ifndef MBED_TEST_FILES
tvendov 2:7c75ab32d7c9 45 #define MBED_TEST_FILES 4
tvendov 2:7c75ab32d7c9 46 #endif
tvendov 2:7c75ab32d7c9 47
tvendov 2:7c75ab32d7c9 48 #ifndef MBED_TEST_DIRS
tvendov 2:7c75ab32d7c9 49 #define MBED_TEST_DIRS 4
tvendov 2:7c75ab32d7c9 50 #endif
tvendov 2:7c75ab32d7c9 51
tvendov 2:7c75ab32d7c9 52 #ifndef MBED_TEST_BUFFER
tvendov 2:7c75ab32d7c9 53 #define MBED_TEST_BUFFER 512
tvendov 2:7c75ab32d7c9 54 #endif
tvendov 2:7c75ab32d7c9 55
tvendov 2:7c75ab32d7c9 56 #ifndef MBED_TEST_TIMEOUT
tvendov 2:7c75ab32d7c9 57 #define MBED_TEST_TIMEOUT 120
tvendov 2:7c75ab32d7c9 58 #endif
tvendov 2:7c75ab32d7c9 59
tvendov 2:7c75ab32d7c9 60 #ifndef MBED_THREAD_COUNT
tvendov 2:7c75ab32d7c9 61 #define MBED_THREAD_COUNT MBED_TEST_FILES
tvendov 2:7c75ab32d7c9 62 #endif
tvendov 2:7c75ab32d7c9 63
tvendov 2:7c75ab32d7c9 64 // declarations
tvendov 2:7c75ab32d7c9 65 #define STRINGIZE(x) STRINGIZE2(x)
tvendov 2:7c75ab32d7c9 66 #define STRINGIZE2(x) #x
tvendov 2:7c75ab32d7c9 67 #define INCLUDE(x, ext) STRINGIZE(x.ext)
tvendov 2:7c75ab32d7c9 68
tvendov 2:7c75ab32d7c9 69 #include INCLUDE(MBED_TEST_FILESYSTEM, h)
tvendov 2:7c75ab32d7c9 70 #include INCLUDE(MBED_TEST_BLOCKDEVICE, hpp)
tvendov 2:7c75ab32d7c9 71
tvendov 2:7c75ab32d7c9 72 MBED_TEST_FILESYSTEM_DECL;
tvendov 2:7c75ab32d7c9 73 MBED_TEST_BLOCKDEVICE_DECL;
tvendov 2:7c75ab32d7c9 74
tvendov 2:7c75ab32d7c9 75 Dir dir[MBED_TEST_DIRS];
tvendov 2:7c75ab32d7c9 76 File file[MBED_TEST_FILES];
tvendov 2:7c75ab32d7c9 77 DIR *dd[MBED_TEST_DIRS];
tvendov 2:7c75ab32d7c9 78 FILE *fd[MBED_TEST_FILES];
tvendov 2:7c75ab32d7c9 79 struct dirent ent;
tvendov 2:7c75ab32d7c9 80 struct dirent *ed;
tvendov 2:7c75ab32d7c9 81
tvendov 2:7c75ab32d7c9 82 volatile bool count_done = 0;
tvendov 2:7c75ab32d7c9 83
tvendov 2:7c75ab32d7c9 84 // tests
tvendov 2:7c75ab32d7c9 85
tvendov 2:7c75ab32d7c9 86 void test_file_tests()
tvendov 2:7c75ab32d7c9 87 {
tvendov 2:7c75ab32d7c9 88 int res = bd.init();
tvendov 2:7c75ab32d7c9 89 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 90
tvendov 2:7c75ab32d7c9 91 {
tvendov 2:7c75ab32d7c9 92 res = MBED_TEST_FILESYSTEM::format(&bd);
tvendov 2:7c75ab32d7c9 93 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 94 }
tvendov 2:7c75ab32d7c9 95
tvendov 2:7c75ab32d7c9 96 res = bd.deinit();
tvendov 2:7c75ab32d7c9 97 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 98 }
tvendov 2:7c75ab32d7c9 99
tvendov 2:7c75ab32d7c9 100 void write_file_data(char count)
tvendov 2:7c75ab32d7c9 101 {
tvendov 2:7c75ab32d7c9 102
tvendov 2:7c75ab32d7c9 103 char filename[10];
tvendov 2:7c75ab32d7c9 104 uint8_t wbuffer[MBED_TEST_BUFFER];
tvendov 2:7c75ab32d7c9 105 int res;
tvendov 2:7c75ab32d7c9 106
tvendov 2:7c75ab32d7c9 107 sprintf(filename, "%s%d", "data", count);
tvendov 2:7c75ab32d7c9 108 res = file[count].open(&fs, filename, O_WRONLY | O_CREAT);
tvendov 2:7c75ab32d7c9 109 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 110
tvendov 2:7c75ab32d7c9 111 char letter = 'A' + count;
tvendov 2:7c75ab32d7c9 112 for (uint32_t i = 0; i < MBED_TEST_BUFFER; i++) {
tvendov 2:7c75ab32d7c9 113 wbuffer[i] = letter++;
tvendov 2:7c75ab32d7c9 114 if ('z' == letter) {
tvendov 2:7c75ab32d7c9 115 letter = 'A' + count;
tvendov 2:7c75ab32d7c9 116 }
tvendov 2:7c75ab32d7c9 117 }
tvendov 2:7c75ab32d7c9 118
tvendov 2:7c75ab32d7c9 119 for (uint32_t i = 0; i < 5; i++) {
tvendov 2:7c75ab32d7c9 120 res = file[count].write(wbuffer, MBED_TEST_BUFFER);
tvendov 2:7c75ab32d7c9 121 TEST_ASSERT_EQUAL(MBED_TEST_BUFFER, res);
tvendov 2:7c75ab32d7c9 122 }
tvendov 2:7c75ab32d7c9 123
tvendov 2:7c75ab32d7c9 124 res = file[count].close();
tvendov 2:7c75ab32d7c9 125 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 126 }
tvendov 2:7c75ab32d7c9 127
tvendov 2:7c75ab32d7c9 128 void read_file_data(char count)
tvendov 2:7c75ab32d7c9 129 {
tvendov 2:7c75ab32d7c9 130 char filename[10];
tvendov 2:7c75ab32d7c9 131 uint8_t rbuffer[MBED_TEST_BUFFER];
tvendov 2:7c75ab32d7c9 132 int res;
tvendov 2:7c75ab32d7c9 133
tvendov 2:7c75ab32d7c9 134 sprintf(filename, "%s%d", "data", count);
tvendov 2:7c75ab32d7c9 135 res = file[count].open(&fs, filename, O_RDONLY);
tvendov 2:7c75ab32d7c9 136 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 137
tvendov 2:7c75ab32d7c9 138 for (uint32_t i = 0; i < 5; i++) {
tvendov 2:7c75ab32d7c9 139 res = file[count].read(rbuffer, MBED_TEST_BUFFER);
tvendov 2:7c75ab32d7c9 140 TEST_ASSERT_EQUAL(MBED_TEST_BUFFER, res);
tvendov 2:7c75ab32d7c9 141 char letter = 'A' + count;
tvendov 2:7c75ab32d7c9 142 for (uint32_t i = 0; i < MBED_TEST_BUFFER; i++) {
tvendov 2:7c75ab32d7c9 143 res = rbuffer[i];
tvendov 2:7c75ab32d7c9 144 TEST_ASSERT_EQUAL(letter++, res);
tvendov 2:7c75ab32d7c9 145 if ('z' == letter) {
tvendov 2:7c75ab32d7c9 146 letter = 'A' + count;
tvendov 2:7c75ab32d7c9 147 }
tvendov 2:7c75ab32d7c9 148 }
tvendov 2:7c75ab32d7c9 149 }
tvendov 2:7c75ab32d7c9 150
tvendov 2:7c75ab32d7c9 151 res = file[count].close();
tvendov 2:7c75ab32d7c9 152 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 153 }
tvendov 2:7c75ab32d7c9 154
tvendov 2:7c75ab32d7c9 155 void test_thread_access_test()
tvendov 2:7c75ab32d7c9 156 {
tvendov 2:7c75ab32d7c9 157 char *dummy = new (std::nothrow) char[OS_STACK_SIZE * MBED_THREAD_COUNT];
tvendov 2:7c75ab32d7c9 158 delete[] dummy;
tvendov 2:7c75ab32d7c9 159 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
tvendov 2:7c75ab32d7c9 160
tvendov 2:7c75ab32d7c9 161 Thread *data[MBED_THREAD_COUNT];
tvendov 2:7c75ab32d7c9 162 int res = bd.init();
tvendov 2:7c75ab32d7c9 163 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 164 res = fs.mount(&bd);
tvendov 2:7c75ab32d7c9 165 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 166
tvendov 2:7c75ab32d7c9 167 // Write threads in parallel
tvendov 2:7c75ab32d7c9 168 for (char thread_count = 0; thread_count < MBED_THREAD_COUNT; thread_count++) {
tvendov 2:7c75ab32d7c9 169 data[thread_count] = new Thread(osPriorityNormal);
tvendov 2:7c75ab32d7c9 170 data[thread_count]->start(callback((void(*)(void *))write_file_data, (void *)thread_count));
tvendov 2:7c75ab32d7c9 171 }
tvendov 2:7c75ab32d7c9 172
tvendov 2:7c75ab32d7c9 173 // Wait for write thread to join before creating read thread
tvendov 2:7c75ab32d7c9 174 for (char thread_count = 0; thread_count < MBED_THREAD_COUNT; thread_count++) {
tvendov 2:7c75ab32d7c9 175 data[thread_count]->join();
tvendov 2:7c75ab32d7c9 176 delete data[thread_count];
tvendov 2:7c75ab32d7c9 177 data[thread_count] = new Thread(osPriorityNormal);
tvendov 2:7c75ab32d7c9 178 data[thread_count]->start(callback((void(*)(void *))read_file_data, (void *)thread_count));
tvendov 2:7c75ab32d7c9 179 }
tvendov 2:7c75ab32d7c9 180
tvendov 2:7c75ab32d7c9 181 // Wait for read threads to join
tvendov 2:7c75ab32d7c9 182 for (char thread_count = 0; thread_count < MBED_THREAD_COUNT; thread_count++) {
tvendov 2:7c75ab32d7c9 183 data[thread_count]->join();
tvendov 2:7c75ab32d7c9 184 delete data[thread_count];
tvendov 2:7c75ab32d7c9 185 }
tvendov 2:7c75ab32d7c9 186 res = fs.unmount();
tvendov 2:7c75ab32d7c9 187 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 188 res = bd.deinit();
tvendov 2:7c75ab32d7c9 189 TEST_ASSERT_EQUAL(0, res);
tvendov 2:7c75ab32d7c9 190 }
tvendov 2:7c75ab32d7c9 191
tvendov 2:7c75ab32d7c9 192 // test setup
tvendov 2:7c75ab32d7c9 193 utest::v1::status_t test_setup(const size_t number_of_cases)
tvendov 2:7c75ab32d7c9 194 {
tvendov 2:7c75ab32d7c9 195 GREENTEA_SETUP(MBED_TEST_TIMEOUT, "default_auto");
tvendov 2:7c75ab32d7c9 196 return verbose_test_setup_handler(number_of_cases);
tvendov 2:7c75ab32d7c9 197 }
tvendov 2:7c75ab32d7c9 198
tvendov 2:7c75ab32d7c9 199 Case cases[] = {
tvendov 2:7c75ab32d7c9 200 Case("File tests", test_file_tests),
tvendov 2:7c75ab32d7c9 201 Case("Filesystem access from multiple threads", test_thread_access_test),
tvendov 2:7c75ab32d7c9 202 };
tvendov 2:7c75ab32d7c9 203
tvendov 2:7c75ab32d7c9 204 Specification specification(test_setup, cases);
tvendov 2:7c75ab32d7c9 205
tvendov 2:7c75ab32d7c9 206 int main()
tvendov 2:7c75ab32d7c9 207 {
tvendov 2:7c75ab32d7c9 208 return !Harness::run(specification);
tvendov 2:7c75ab32d7c9 209 }