Fork of Final351CW_FINAL by Liam Grazier

Committer:
liam_grazier
Date:
Tue Jan 09 11:59:10 2018 +0000
Revision:
11:ce2a977dcab0
NEW NON LIB;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
liam_grazier 11:ce2a977dcab0 1 /*
liam_grazier 11:ce2a977dcab0 2 * mbed Microcontroller Library
liam_grazier 11:ce2a977dcab0 3 * Copyright (c) 2006-2016 ARM Limited
liam_grazier 11:ce2a977dcab0 4 *
liam_grazier 11:ce2a977dcab0 5 * Licensed under the Apache License, Version 2.0 (the "License");
liam_grazier 11:ce2a977dcab0 6 * you may not use this file except in compliance with the License.
liam_grazier 11:ce2a977dcab0 7 * You may obtain a copy of the License at
liam_grazier 11:ce2a977dcab0 8 *
liam_grazier 11:ce2a977dcab0 9 * http://www.apache.org/licenses/LICENSE-2.0
liam_grazier 11:ce2a977dcab0 10 *
liam_grazier 11:ce2a977dcab0 11 * Unless required by applicable law or agreed to in writing, software
liam_grazier 11:ce2a977dcab0 12 * distributed under the License is distributed on an "AS IS" BASIS,
liam_grazier 11:ce2a977dcab0 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
liam_grazier 11:ce2a977dcab0 14 * See the License for the specific language governing permissions and
liam_grazier 11:ce2a977dcab0 15 * limitations under the License.
liam_grazier 11:ce2a977dcab0 16 *
liam_grazier 11:ce2a977dcab0 17 */
liam_grazier 11:ce2a977dcab0 18
liam_grazier 11:ce2a977dcab0 19 /* The following copyright notice is reproduced from the glibc project
liam_grazier 11:ce2a977dcab0 20 * REF_LICENCE_GLIBC
liam_grazier 11:ce2a977dcab0 21 *
liam_grazier 11:ce2a977dcab0 22 * Copyright (C) 1991, 1992 Free Software Foundation, Inc.
liam_grazier 11:ce2a977dcab0 23 * This file is part of the GNU C Library.
liam_grazier 11:ce2a977dcab0 24 *
liam_grazier 11:ce2a977dcab0 25 * The GNU C Library is free software; you can redistribute it and/or
liam_grazier 11:ce2a977dcab0 26 * modify it under the terms of the GNU Library General Public License as
liam_grazier 11:ce2a977dcab0 27 * published by the Free Software Foundation; either version 2 of the
liam_grazier 11:ce2a977dcab0 28 * License, or (at your option) any later version.
liam_grazier 11:ce2a977dcab0 29 *
liam_grazier 11:ce2a977dcab0 30 * The GNU C Library is distributed in the hope that it will be useful,
liam_grazier 11:ce2a977dcab0 31 * but WITHOUT ANY WARRANTY; without even the implied warranty of
liam_grazier 11:ce2a977dcab0 32 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
liam_grazier 11:ce2a977dcab0 33 * Library General Public License for more details.
liam_grazier 11:ce2a977dcab0 34 *
liam_grazier 11:ce2a977dcab0 35 * You should have received a copy of the GNU Library General Public
liam_grazier 11:ce2a977dcab0 36 * License along with the GNU C Library; see the file COPYING.LIB. If
liam_grazier 11:ce2a977dcab0 37 * not, write to the Free Software Foundation, Inc., 675 Mass Ave,
liam_grazier 11:ce2a977dcab0 38 * Cambridge, MA 02139, USA.
liam_grazier 11:ce2a977dcab0 39 */
liam_grazier 11:ce2a977dcab0 40
liam_grazier 11:ce2a977dcab0 41
liam_grazier 11:ce2a977dcab0 42 /** @file main.cpp Basic SD Driver Test
liam_grazier 11:ce2a977dcab0 43 */
liam_grazier 11:ce2a977dcab0 44 #include "mbed.h"
liam_grazier 11:ce2a977dcab0 45 #include "greentea-client/test_env.h"
liam_grazier 11:ce2a977dcab0 46 #include "unity.h"
liam_grazier 11:ce2a977dcab0 47 #include "utest.h"
liam_grazier 11:ce2a977dcab0 48
liam_grazier 11:ce2a977dcab0 49 #include "SDBlockDevice.h"
liam_grazier 11:ce2a977dcab0 50 #include <stdlib.h>
liam_grazier 11:ce2a977dcab0 51
liam_grazier 11:ce2a977dcab0 52 using namespace utest::v1;
liam_grazier 11:ce2a977dcab0 53
liam_grazier 11:ce2a977dcab0 54 #define TEST_BLOCK_COUNT 10
liam_grazier 11:ce2a977dcab0 55 #define TEST_ERROR_MASK 16
liam_grazier 11:ce2a977dcab0 56 #define TEST_BLOCK_SIZE 2048
liam_grazier 11:ce2a977dcab0 57
liam_grazier 11:ce2a977dcab0 58 const struct {
liam_grazier 11:ce2a977dcab0 59 const char *name;
liam_grazier 11:ce2a977dcab0 60 bd_size_t (BlockDevice::*method)() const;
liam_grazier 11:ce2a977dcab0 61 } ATTRS[] = {
liam_grazier 11:ce2a977dcab0 62 {"read size", &BlockDevice::get_read_size},
liam_grazier 11:ce2a977dcab0 63 {"program size", &BlockDevice::get_program_size},
liam_grazier 11:ce2a977dcab0 64 {"erase size", &BlockDevice::get_erase_size},
liam_grazier 11:ce2a977dcab0 65 {"total size", &BlockDevice::size},
liam_grazier 11:ce2a977dcab0 66 };
liam_grazier 11:ce2a977dcab0 67
liam_grazier 11:ce2a977dcab0 68 void test_read_write() {
liam_grazier 11:ce2a977dcab0 69 SDBlockDevice sd(MBED_CONF_SD_SPI_MOSI, MBED_CONF_SD_SPI_MISO, MBED_CONF_SD_SPI_CLK, MBED_CONF_SD_SPI_CS);
liam_grazier 11:ce2a977dcab0 70
liam_grazier 11:ce2a977dcab0 71 int err = sd.init();
liam_grazier 11:ce2a977dcab0 72 TEST_ASSERT_EQUAL(0, err);
liam_grazier 11:ce2a977dcab0 73
liam_grazier 11:ce2a977dcab0 74 err = sd.frequency(25000000);
liam_grazier 11:ce2a977dcab0 75 TEST_ASSERT_EQUAL(0, err);
liam_grazier 11:ce2a977dcab0 76
liam_grazier 11:ce2a977dcab0 77 for (unsigned a = 0; a < sizeof(ATTRS)/sizeof(ATTRS[0]); a++) {
liam_grazier 11:ce2a977dcab0 78 static const char *prefixes[] = {"", "k", "M", "G"};
liam_grazier 11:ce2a977dcab0 79 for (int i = 3; i >= 0; i--) {
liam_grazier 11:ce2a977dcab0 80 bd_size_t size = (sd.*ATTRS[a].method)();
liam_grazier 11:ce2a977dcab0 81 if (size >= (1ULL << 10*i)) {
liam_grazier 11:ce2a977dcab0 82 printf("%s: %llu%sbytes (%llubytes)\n",
liam_grazier 11:ce2a977dcab0 83 ATTRS[a].name, size >> 10*i, prefixes[i], size);
liam_grazier 11:ce2a977dcab0 84 break;
liam_grazier 11:ce2a977dcab0 85 }
liam_grazier 11:ce2a977dcab0 86 }
liam_grazier 11:ce2a977dcab0 87 }
liam_grazier 11:ce2a977dcab0 88
liam_grazier 11:ce2a977dcab0 89 bd_size_t erase_size = sd.get_erase_size();
liam_grazier 11:ce2a977dcab0 90 bd_size_t block_size = erase_size > TEST_BLOCK_SIZE ? erase_size : TEST_BLOCK_SIZE;
liam_grazier 11:ce2a977dcab0 91
liam_grazier 11:ce2a977dcab0 92 uint8_t *write_block = new uint8_t[block_size];
liam_grazier 11:ce2a977dcab0 93 uint8_t *read_block = new uint8_t[block_size];
liam_grazier 11:ce2a977dcab0 94 uint8_t *error_mask = new uint8_t[TEST_ERROR_MASK];
liam_grazier 11:ce2a977dcab0 95 unsigned addrwidth = ceil(log(float(sd.size()-1)) / log(float(16)))+1;
liam_grazier 11:ce2a977dcab0 96
liam_grazier 11:ce2a977dcab0 97 for (int b = 0; b < TEST_BLOCK_COUNT; b++) {
liam_grazier 11:ce2a977dcab0 98 // Find a random block
liam_grazier 11:ce2a977dcab0 99 bd_addr_t block = (rand()*block_size) % sd.size();
liam_grazier 11:ce2a977dcab0 100
liam_grazier 11:ce2a977dcab0 101 // Use next random number as temporary seed to keep
liam_grazier 11:ce2a977dcab0 102 // the address progressing in the pseudorandom sequence
liam_grazier 11:ce2a977dcab0 103 unsigned seed = rand();
liam_grazier 11:ce2a977dcab0 104
liam_grazier 11:ce2a977dcab0 105 // Fill with random sequence
liam_grazier 11:ce2a977dcab0 106 srand(seed);
liam_grazier 11:ce2a977dcab0 107 for (bd_size_t i = 0; i < block_size; i++) {
liam_grazier 11:ce2a977dcab0 108 write_block[i] = 0xff & rand();
liam_grazier 11:ce2a977dcab0 109 }
liam_grazier 11:ce2a977dcab0 110
liam_grazier 11:ce2a977dcab0 111 // Write, sync, and read the block
liam_grazier 11:ce2a977dcab0 112 printf("test %0*llx:%llu...\n", addrwidth, block, block_size);
liam_grazier 11:ce2a977dcab0 113
liam_grazier 11:ce2a977dcab0 114 err = sd.erase(block, block_size);
liam_grazier 11:ce2a977dcab0 115 TEST_ASSERT_EQUAL(0, err);
liam_grazier 11:ce2a977dcab0 116
liam_grazier 11:ce2a977dcab0 117 err = sd.program(write_block, block, block_size);
liam_grazier 11:ce2a977dcab0 118 TEST_ASSERT_EQUAL(0, err);
liam_grazier 11:ce2a977dcab0 119
liam_grazier 11:ce2a977dcab0 120 printf("write %0*llx:%llu ", addrwidth, block, block_size);
liam_grazier 11:ce2a977dcab0 121 for (int i = 0; i < 16; i++) {
liam_grazier 11:ce2a977dcab0 122 printf("%02x", write_block[i]);
liam_grazier 11:ce2a977dcab0 123 }
liam_grazier 11:ce2a977dcab0 124 printf("...\n");
liam_grazier 11:ce2a977dcab0 125
liam_grazier 11:ce2a977dcab0 126 err = sd.read(read_block, block, block_size);
liam_grazier 11:ce2a977dcab0 127 TEST_ASSERT_EQUAL(0, err);
liam_grazier 11:ce2a977dcab0 128
liam_grazier 11:ce2a977dcab0 129 printf("read %0*llx:%llu ", addrwidth, block, block_size);
liam_grazier 11:ce2a977dcab0 130 for (int i = 0; i < 16; i++) {
liam_grazier 11:ce2a977dcab0 131 printf("%02x", read_block[i]);
liam_grazier 11:ce2a977dcab0 132 }
liam_grazier 11:ce2a977dcab0 133 printf("...\n");
liam_grazier 11:ce2a977dcab0 134
liam_grazier 11:ce2a977dcab0 135 // Find error mask for debugging
liam_grazier 11:ce2a977dcab0 136 memset(error_mask, 0, TEST_ERROR_MASK);
liam_grazier 11:ce2a977dcab0 137 bd_size_t error_scale = block_size / (TEST_ERROR_MASK*8);
liam_grazier 11:ce2a977dcab0 138
liam_grazier 11:ce2a977dcab0 139 srand(seed);
liam_grazier 11:ce2a977dcab0 140 for (bd_size_t i = 0; i < TEST_ERROR_MASK*8; i++) {
liam_grazier 11:ce2a977dcab0 141 for (bd_size_t j = 0; j < error_scale; j++) {
liam_grazier 11:ce2a977dcab0 142 if ((0xff & rand()) != read_block[i*error_scale + j]) {
liam_grazier 11:ce2a977dcab0 143 error_mask[i/8] |= 1 << (i%8);
liam_grazier 11:ce2a977dcab0 144 }
liam_grazier 11:ce2a977dcab0 145 }
liam_grazier 11:ce2a977dcab0 146 }
liam_grazier 11:ce2a977dcab0 147
liam_grazier 11:ce2a977dcab0 148 printf("error %0*llx:%llu ", addrwidth, block, block_size);
liam_grazier 11:ce2a977dcab0 149 for (int i = 0; i < 16; i++) {
liam_grazier 11:ce2a977dcab0 150 printf("%02x", error_mask[i]);
liam_grazier 11:ce2a977dcab0 151 }
liam_grazier 11:ce2a977dcab0 152 printf("\n");
liam_grazier 11:ce2a977dcab0 153
liam_grazier 11:ce2a977dcab0 154 // Check that the data was unmodified
liam_grazier 11:ce2a977dcab0 155 srand(seed);
liam_grazier 11:ce2a977dcab0 156 for (bd_size_t i = 0; i < block_size; i++) {
liam_grazier 11:ce2a977dcab0 157 TEST_ASSERT_EQUAL(0xff & rand(), read_block[i]);
liam_grazier 11:ce2a977dcab0 158 }
liam_grazier 11:ce2a977dcab0 159 }
liam_grazier 11:ce2a977dcab0 160
liam_grazier 11:ce2a977dcab0 161 err = sd.deinit();
liam_grazier 11:ce2a977dcab0 162 TEST_ASSERT_EQUAL(0, err);
liam_grazier 11:ce2a977dcab0 163 }
liam_grazier 11:ce2a977dcab0 164
liam_grazier 11:ce2a977dcab0 165 // Test setup
liam_grazier 11:ce2a977dcab0 166 utest::v1::status_t test_setup(const size_t number_of_cases) {
liam_grazier 11:ce2a977dcab0 167 GREENTEA_SETUP(120, "default_auto");
liam_grazier 11:ce2a977dcab0 168 return verbose_test_setup_handler(number_of_cases);
liam_grazier 11:ce2a977dcab0 169 }
liam_grazier 11:ce2a977dcab0 170
liam_grazier 11:ce2a977dcab0 171 Case cases[] = {
liam_grazier 11:ce2a977dcab0 172 Case("Testing read write random blocks", test_read_write),
liam_grazier 11:ce2a977dcab0 173 };
liam_grazier 11:ce2a977dcab0 174
liam_grazier 11:ce2a977dcab0 175 Specification specification(test_setup, cases);
liam_grazier 11:ce2a977dcab0 176
liam_grazier 11:ce2a977dcab0 177 int main() {
liam_grazier 11:ce2a977dcab0 178 return !Harness::run(specification);
liam_grazier 11:ce2a977dcab0 179 }