Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
TivaFlash.cxx
1
34#include "TivaFlash.hxx"
35
36#include "driverlib/rom.h"
37#include "driverlib/rom_map.h"
38#include "driverlib/flash.h"
39
40ssize_t TivaFlash::read(File *f, void *buf, size_t size)
41{
42 if ((uint32_t)f->offset >= len_)
43 {
44 size = 0;
45 }
46 else
47 {
48 size = std::min(size, len_ - (size_t)f->offset);
49 }
50 memcpy(buf, base_ + f->offset, size);
51 f->offset += size;
52 return size;
53}
54
55static uint32_t write_buf[32];
56
57ssize_t TivaFlash::write(File *f, const void *buf, size_t size)
58{
59 // Do not write beyond the end of the file.
60 if ((uint32_t)f->offset >= len_)
61 {
62 return 0;
63 }
64 else
65 {
66 size = std::min(size, len_ - (size_t)f->offset);
67 }
68 uint32_t write_address = reinterpret_cast<uint32_t>(base_) + f->offset;
69 const uint8_t *read_buf = static_cast<const uint8_t *>(buf);
70 uint32_t end_address = write_address + size;
71 ssize_t ret = 0;
72 while (write_address < end_address)
73 {
74 HASSERT((write_address & 3) == 0);
75 // If we are at the start of a page, let's erase the page.
76 if (!(write_address & subpage_mask()))
77 {
78 MAP_FlashErase(reinterpret_cast<uint32_t>(write_address));
79 }
80 uint32_t current_end_address = end_address;
81 // Checks if we are trying to write more than one page.
82 if ((current_end_address & write_page_mask()) !=
83 (write_address & write_page_mask()))
84 {
85 // Stops writing at the end of the current page.
86 current_end_address =
87 (write_address + write_page_size() - 1) & write_page_mask();
88 }
89 uint32_t current_len = current_end_address - write_address;
90 HASSERT(current_len <= sizeof(write_buf));
91 memcpy(write_buf, read_buf, current_len);
92 if (MAP_FlashProgram(write_buf, write_address, (current_len + 3) & ~3) < 0)
93 {
94 return -EIO;
95 }
96 write_address += current_len;
97 read_buf += current_len;
98 f->offset += current_len;
99 ret += current_len;
100 }
101 return ret;
102}
uint32_t write_page_mask()
Returns a bitmask with one bits to get the page address.
Definition TivaFlash.hxx:92
size_t len_
Number of bytes in the file.
uint32_t write_page_size()
Returns a bitmask with one bits to get the page address.
Definition TivaFlash.hxx:97
uint32_t subpage_mask()
Returns a bitmask with one bits to get the within-page address.
Definition TivaFlash.hxx:82
const uint8_t * base_
Base pointer.
ssize_t read(File *, void *, size_t) OVERRIDE
Read method.
Definition TivaFlash.cxx:40
ssize_t write(File *, const void *, size_t) OVERRIDE
Write method.
Definition TivaFlash.cxx:57
#define HASSERT(x)
Checks that the value of expression x is true, else terminates the current process.
Definition macros.h:138
File information.
Definition Devtab.hxx:52
off_t offset
current offset within file
Definition Devtab.hxx:62