Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mbed-os/TESTS/mbed_drivers/flashiap/main.cpp@0:6bf0743ece18, 2020-03-28 (annotated)
- Committer:
- demayer
- Date:
- Sat Mar 28 15:28:19 2020 +0000
- Revision:
- 0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
demayer | 0:6bf0743ece18 | 1 | |
demayer | 0:6bf0743ece18 | 2 | /* mbed Microcontroller Library |
demayer | 0:6bf0743ece18 | 3 | * Copyright (c) 2017 ARM Limited |
demayer | 0:6bf0743ece18 | 4 | * |
demayer | 0:6bf0743ece18 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
demayer | 0:6bf0743ece18 | 6 | * you may not use this file except in compliance with the License. |
demayer | 0:6bf0743ece18 | 7 | * You may obtain a copy of the License at |
demayer | 0:6bf0743ece18 | 8 | * |
demayer | 0:6bf0743ece18 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
demayer | 0:6bf0743ece18 | 10 | * |
demayer | 0:6bf0743ece18 | 11 | * Unless required by applicable law or agreed to in writing, software |
demayer | 0:6bf0743ece18 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
demayer | 0:6bf0743ece18 | 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
demayer | 0:6bf0743ece18 | 14 | * See the License for the specific language governing permissions and |
demayer | 0:6bf0743ece18 | 15 | * limitations under the License. |
demayer | 0:6bf0743ece18 | 16 | */ |
demayer | 0:6bf0743ece18 | 17 | |
demayer | 0:6bf0743ece18 | 18 | #if !DEVICE_FLASH |
demayer | 0:6bf0743ece18 | 19 | #error [NOT_SUPPORTED] Flash API not supported for this target |
demayer | 0:6bf0743ece18 | 20 | #endif |
demayer | 0:6bf0743ece18 | 21 | |
demayer | 0:6bf0743ece18 | 22 | #include "utest/utest.h" |
demayer | 0:6bf0743ece18 | 23 | #include "unity/unity.h" |
demayer | 0:6bf0743ece18 | 24 | #include "greentea-client/test_env.h" |
demayer | 0:6bf0743ece18 | 25 | |
demayer | 0:6bf0743ece18 | 26 | #include "mbed.h" |
demayer | 0:6bf0743ece18 | 27 | |
demayer | 0:6bf0743ece18 | 28 | using namespace utest::v1; |
demayer | 0:6bf0743ece18 | 29 | |
demayer | 0:6bf0743ece18 | 30 | void flashiap_init_test() |
demayer | 0:6bf0743ece18 | 31 | { |
demayer | 0:6bf0743ece18 | 32 | FlashIAP flash_device; |
demayer | 0:6bf0743ece18 | 33 | uint32_t ret = flash_device.init(); |
demayer | 0:6bf0743ece18 | 34 | TEST_ASSERT_EQUAL_INT32(0, ret); |
demayer | 0:6bf0743ece18 | 35 | ret = flash_device.deinit(); |
demayer | 0:6bf0743ece18 | 36 | TEST_ASSERT_EQUAL_INT32(0, ret); |
demayer | 0:6bf0743ece18 | 37 | } |
demayer | 0:6bf0743ece18 | 38 | |
demayer | 0:6bf0743ece18 | 39 | void flashiap_program_test() |
demayer | 0:6bf0743ece18 | 40 | { |
demayer | 0:6bf0743ece18 | 41 | FlashIAP flash_device; |
demayer | 0:6bf0743ece18 | 42 | uint32_t ret = flash_device.init(); |
demayer | 0:6bf0743ece18 | 43 | TEST_ASSERT_EQUAL_INT32(0, ret); |
demayer | 0:6bf0743ece18 | 44 | |
demayer | 0:6bf0743ece18 | 45 | // get the last sector size (flash size - 1) |
demayer | 0:6bf0743ece18 | 46 | uint32_t sector_size = flash_device.get_sector_size(flash_device.get_flash_start() + flash_device.get_flash_size() - 1UL); |
demayer | 0:6bf0743ece18 | 47 | uint32_t page_size = flash_device.get_page_size(); |
demayer | 0:6bf0743ece18 | 48 | TEST_ASSERT_NOT_EQUAL(0, sector_size); |
demayer | 0:6bf0743ece18 | 49 | TEST_ASSERT_NOT_EQUAL(0, page_size); |
demayer | 0:6bf0743ece18 | 50 | TEST_ASSERT_TRUE(sector_size % page_size == 0); |
demayer | 0:6bf0743ece18 | 51 | const uint8_t test_value = 0xCE; |
demayer | 0:6bf0743ece18 | 52 | uint8_t *data = new uint8_t[page_size]; |
demayer | 0:6bf0743ece18 | 53 | for (uint32_t i = 0; i < page_size; i++) { |
demayer | 0:6bf0743ece18 | 54 | data[i] = test_value; |
demayer | 0:6bf0743ece18 | 55 | } |
demayer | 0:6bf0743ece18 | 56 | |
demayer | 0:6bf0743ece18 | 57 | // the one before the last sector in the system |
demayer | 0:6bf0743ece18 | 58 | uint32_t address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size); |
demayer | 0:6bf0743ece18 | 59 | TEST_ASSERT_TRUE(address != 0UL); |
demayer | 0:6bf0743ece18 | 60 | ret = flash_device.erase(address, sector_size); |
demayer | 0:6bf0743ece18 | 61 | TEST_ASSERT_EQUAL_INT32(0, ret); |
demayer | 0:6bf0743ece18 | 62 | |
demayer | 0:6bf0743ece18 | 63 | |
demayer | 0:6bf0743ece18 | 64 | for (uint32_t i = 0; i < sector_size / page_size; i++) { |
demayer | 0:6bf0743ece18 | 65 | uint32_t page_addr = address + i * page_size; |
demayer | 0:6bf0743ece18 | 66 | ret = flash_device.program(data, page_addr, page_size); |
demayer | 0:6bf0743ece18 | 67 | TEST_ASSERT_EQUAL_INT32(0, ret); |
demayer | 0:6bf0743ece18 | 68 | } |
demayer | 0:6bf0743ece18 | 69 | |
demayer | 0:6bf0743ece18 | 70 | uint8_t *data_flashed = new uint8_t[page_size]; |
demayer | 0:6bf0743ece18 | 71 | for (uint32_t i = 0; i < sector_size / page_size; i++) { |
demayer | 0:6bf0743ece18 | 72 | uint32_t page_addr = address + i * page_size; |
demayer | 0:6bf0743ece18 | 73 | ret = flash_device.read(data_flashed, page_addr, page_size); |
demayer | 0:6bf0743ece18 | 74 | TEST_ASSERT_EQUAL_INT32(0, ret); |
demayer | 0:6bf0743ece18 | 75 | TEST_ASSERT_EQUAL_UINT8_ARRAY(data, data_flashed, page_size); |
demayer | 0:6bf0743ece18 | 76 | } |
demayer | 0:6bf0743ece18 | 77 | delete[] data; |
demayer | 0:6bf0743ece18 | 78 | delete[] data_flashed; |
demayer | 0:6bf0743ece18 | 79 | |
demayer | 0:6bf0743ece18 | 80 | ret = flash_device.deinit(); |
demayer | 0:6bf0743ece18 | 81 | TEST_ASSERT_EQUAL_INT32(0, ret); |
demayer | 0:6bf0743ece18 | 82 | } |
demayer | 0:6bf0743ece18 | 83 | |
demayer | 0:6bf0743ece18 | 84 | void flashiap_program_error_test() |
demayer | 0:6bf0743ece18 | 85 | { |
demayer | 0:6bf0743ece18 | 86 | FlashIAP flash_device; |
demayer | 0:6bf0743ece18 | 87 | uint32_t ret = flash_device.init(); |
demayer | 0:6bf0743ece18 | 88 | TEST_ASSERT_EQUAL_INT32(0, ret); |
demayer | 0:6bf0743ece18 | 89 | |
demayer | 0:6bf0743ece18 | 90 | // get the last sector size (flash size - 1) |
demayer | 0:6bf0743ece18 | 91 | uint32_t sector_size = flash_device.get_sector_size(flash_device.get_flash_start() + flash_device.get_flash_size() - 1UL); |
demayer | 0:6bf0743ece18 | 92 | uint32_t page_size = flash_device.get_page_size(); |
demayer | 0:6bf0743ece18 | 93 | TEST_ASSERT_NOT_EQUAL(0, sector_size); |
demayer | 0:6bf0743ece18 | 94 | TEST_ASSERT_NOT_EQUAL(0, page_size); |
demayer | 0:6bf0743ece18 | 95 | TEST_ASSERT_TRUE(sector_size % page_size == 0); |
demayer | 0:6bf0743ece18 | 96 | const uint8_t test_value = 0xCE; |
demayer | 0:6bf0743ece18 | 97 | uint8_t *data = new uint8_t[page_size]; |
demayer | 0:6bf0743ece18 | 98 | for (uint32_t i = 0; i < page_size; i++) { |
demayer | 0:6bf0743ece18 | 99 | data[i] = test_value; |
demayer | 0:6bf0743ece18 | 100 | } |
demayer | 0:6bf0743ece18 | 101 | |
demayer | 0:6bf0743ece18 | 102 | // the one before the last page in the system |
demayer | 0:6bf0743ece18 | 103 | uint32_t address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size); |
demayer | 0:6bf0743ece18 | 104 | TEST_ASSERT_TRUE(address != 0UL); |
demayer | 0:6bf0743ece18 | 105 | |
demayer | 0:6bf0743ece18 | 106 | // unaligned address |
demayer | 0:6bf0743ece18 | 107 | ret = flash_device.erase(address + 1, sector_size); |
demayer | 0:6bf0743ece18 | 108 | TEST_ASSERT_EQUAL_INT32(-1, ret); |
demayer | 0:6bf0743ece18 | 109 | if (flash_device.get_page_size() > 1) { |
demayer | 0:6bf0743ece18 | 110 | ret = flash_device.program(data, address + 1, page_size); |
demayer | 0:6bf0743ece18 | 111 | TEST_ASSERT_EQUAL_INT32(-1, ret); |
demayer | 0:6bf0743ece18 | 112 | } |
demayer | 0:6bf0743ece18 | 113 | |
demayer | 0:6bf0743ece18 | 114 | if (flash_device.get_page_size() > 1) { |
demayer | 0:6bf0743ece18 | 115 | // unaligned page size |
demayer | 0:6bf0743ece18 | 116 | ret = flash_device.program(data, address, page_size + 1); |
demayer | 0:6bf0743ece18 | 117 | TEST_ASSERT_EQUAL_INT32(-1, ret); |
demayer | 0:6bf0743ece18 | 118 | } |
demayer | 0:6bf0743ece18 | 119 | |
demayer | 0:6bf0743ece18 | 120 | delete[] data; |
demayer | 0:6bf0743ece18 | 121 | |
demayer | 0:6bf0743ece18 | 122 | ret = flash_device.deinit(); |
demayer | 0:6bf0743ece18 | 123 | TEST_ASSERT_EQUAL_INT32(0, ret); |
demayer | 0:6bf0743ece18 | 124 | } |
demayer | 0:6bf0743ece18 | 125 | |
demayer | 0:6bf0743ece18 | 126 | Case cases[] = { |
demayer | 0:6bf0743ece18 | 127 | Case("FlashIAP - init", flashiap_init_test), |
demayer | 0:6bf0743ece18 | 128 | Case("FlashIAP - program", flashiap_program_test), |
demayer | 0:6bf0743ece18 | 129 | Case("FlashIAP - program errors", flashiap_program_error_test), |
demayer | 0:6bf0743ece18 | 130 | }; |
demayer | 0:6bf0743ece18 | 131 | |
demayer | 0:6bf0743ece18 | 132 | utest::v1::status_t greentea_test_setup(const size_t number_of_cases) { |
demayer | 0:6bf0743ece18 | 133 | GREENTEA_SETUP(20, "default_auto"); |
demayer | 0:6bf0743ece18 | 134 | return greentea_test_setup_handler(number_of_cases); |
demayer | 0:6bf0743ece18 | 135 | } |
demayer | 0:6bf0743ece18 | 136 | |
demayer | 0:6bf0743ece18 | 137 | Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler); |
demayer | 0:6bf0743ece18 | 138 | |
demayer | 0:6bf0743ece18 | 139 | int main() { |
demayer | 0:6bf0743ece18 | 140 | Harness::run(specification); |
demayer | 0:6bf0743ece18 | 141 | } |