-
Notifications
You must be signed in to change notification settings - Fork 164
Expand file tree
/
Copy pathmain.cpp
More file actions
96 lines (84 loc) · 3.33 KB
/
main.cpp
File metadata and controls
96 lines (84 loc) · 3.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
* Copyright (c) 2020, Niklas Hauser
*
* This file is part of the modm project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <modm/board.hpp>
#include <modm/processing.hpp>
using namespace std::chrono_literals;
// ----------------------------------------------------------------------------
int
main()
{
Board::initialize();
MODM_LOG_INFO << "\n\nReboot\n";
if (not Flash::unlock()) {
MODM_LOG_INFO << "Flash unlock failed!" << modm::endl;
}
for (uintptr_t offset{0}, sector{255}; offset < Flash::Size; offset += 1)
{
const uint8_t nsector = Flash::getSector(offset);
if (sector != nsector) {
MODM_LOG_INFO << "Sector " << nsector << " found at boundary " <<
(Flash::Origin + offset) << modm::endl;
sector = nsector;
}
}
{
uint32_t err{0};
const uint8_t sector_start = Flash::getSector(Flash::Size / 2);
const uint8_t sector_end = Flash::getSector(Flash::Size);
MODM_LOG_INFO << "Erasing sectors [" << sector_start << ", " << sector_end << ")" << modm::endl;
MODM_LOG_INFO.flush();
modm::delay(1s);
const modm::PreciseTimestamp start = modm::PreciseClock::now();
for (uint8_t sector{sector_start}; sector < sector_end; sector++){
err |= Flash::erase(sector);
}
const auto diff = (modm::PreciseClock::now() - start);
MODM_LOG_INFO << "Erasing done in " << diff << " with errors: " << err << modm::endl;
MODM_LOG_INFO << "Erasing with " << (Flash::Size/2 / (diff.count() >> 10) ) << "kiB/s" << modm::endl;
MODM_LOG_INFO.flush();
}
{
uint32_t err{0};
const modm::PreciseTimestamp start = modm::PreciseClock::now();
for (uint32_t dst_addr{Flash::OriginAddr + Flash::Size/2}, src_addr{Flash::OriginAddr};
src_addr < (Flash::OriginAddr + Flash::Size/2);
src_addr += sizeof(Flash::MaxWordType), dst_addr += sizeof(Flash::MaxWordType))
{
err |= Flash::program(dst_addr, *(Flash::MaxWordType*)src_addr);
}
const auto diff = (modm::PreciseClock::now() - start);
MODM_LOG_INFO << "Programming done in " << diff << " with errors: " << err << modm::endl;
MODM_LOG_INFO << "Programming with " << (Flash::Size/2 / (diff.count() >> 10) ) << "kiB/s" << modm::endl;
}
{
uint32_t err{0};
const modm::PreciseTimestamp start = modm::PreciseClock::now();
for (uint32_t dst_addr{Flash::OriginAddr + Flash::Size/2}, src_addr{Flash::OriginAddr};
src_addr < (Flash::OriginAddr + Flash::Size/2);
src_addr += sizeof(Flash::MaxWordType), dst_addr += sizeof(Flash::MaxWordType))
{
auto dst_addr_ptr = reinterpret_cast<uint8_t*>(static_cast<std::uintptr_t>(dst_addr));
auto src_addr_ptr = reinterpret_cast<uint8_t*>(static_cast<std::uintptr_t>(src_addr));
auto dst_val = (*dst_addr_ptr);
auto src_val = (*src_addr_ptr);
if(dst_val != src_val){
MODM_LOG_INFO << "Error during verification!";
MODM_LOG_INFO << "Dst: " << dst_addr << " value " << dst_val;
MODM_LOG_INFO << "Src: " << src_addr << " value " << src_val;
++err;
}
}
const auto diff = (modm::PreciseClock::now() - start);
MODM_LOG_INFO << "Verifying done in " << diff << " with errors: " << err << modm::endl;
MODM_LOG_INFO << "Verifying with " << (Flash::Size/2 / (diff.count() >> 10) ) << "kiB/s" << modm::endl;
}
while(1) ;
return 0;
}