amiro-os / include / amiro / memoryLayout.h @ e0c5d17a
History | View | Annotate | Download (8.902 KB)
1 | 58fe0e0b | Thomas Schöpping | #ifndef AMIRO_FILESYSTEMIO_H_
|
---|---|---|---|
2 | #define AMIRO_FILESYSTEMIO_H_
|
||
3 | |||
4 | /*! \brief memory layouts for the eeproms
|
||
5 | *
|
||
6 | * This header defines the memory layout.
|
||
7 | * Every memory layout starts with a preamble
|
||
8 | * of 3 byte. The first one is a magic byte
|
||
9 | * for checking purpose. The second one declares
|
||
10 | * the byte structure major version (BSMV) and the third
|
||
11 | * the byte structure minor version (bsmv) of the subsequently
|
||
12 | * bytes in the memory. With different major versions, the
|
||
13 | * layout of the memory may totaly change, so one should
|
||
14 | * not read from such a different layout if the version
|
||
15 | * differs from the expected one. With greater minor
|
||
16 | * versions the old memory layout may not change, but
|
||
17 | * new elements emerge.
|
||
18 | */
|
||
19 | |||
20 | #include <amiro/eeprom/at24.hpp> |
||
21 | #include <chprintf.h> |
||
22 | |||
23 | namespace amiro { |
||
24 | namespace fileSystemIo { |
||
25 | |||
26 | class FileSystemIoBase { |
||
27 | |||
28 | public:
|
||
29 | AT24 *at24c01; |
||
30 | const uint8_t BSMV;
|
||
31 | const uint8_t bsmv;
|
||
32 | const uint8_t HMV;
|
||
33 | const uint8_t hmv;
|
||
34 | const uint8_t magicByteValue = 0xAAu; |
||
35 | |||
36 | // TODO implement CRC check
|
||
37 | struct preamble {
|
||
38 | uint8_t magicByte; |
||
39 | uint8_t byteStructureMajorVersion; |
||
40 | uint8_t byteStructureMinorVersion; |
||
41 | uint8_t hardwareMajorVersion; |
||
42 | uint8_t hardwareMinorVersion; |
||
43 | uint8_t reserved_0x04_0x14[15];
|
||
44 | }; |
||
45 | |||
46 | enum{
|
||
47 | OK = 0x00u,
|
||
48 | NOT_IMPLEMENTED = 0x01u,
|
||
49 | WRONG_BSMV = 0x02u,
|
||
50 | WRONG_bsmv = 0x03u,
|
||
51 | IO_ERROR = 0x04u,
|
||
52 | WRONG_MAGICBYTE_VALUE = 0x05u,
|
||
53 | WRONG_INDEX = 0x06u,
|
||
54 | WRONG_HMV = 0x07u,
|
||
55 | WRONG_hmv = 0x08u,
|
||
56 | }; |
||
57 | |||
58 | public:
|
||
59 | |||
60 | FileSystemIoBase(AT24 *at24c01, uint8_t BSMV, uint8_t bsmv, uint8_t HMV, uint8_t hmv) |
||
61 | : at24c01(at24c01), |
||
62 | BSMV(BSMV), |
||
63 | bsmv(bsmv), |
||
64 | HMV(HMV), |
||
65 | hmv(hmv) { |
||
66 | } |
||
67 | |||
68 | msg_t getCheck(){ |
||
69 | |||
70 | // Get the preamble
|
||
71 | const uint8_t bufferSize = sizeof(FileSystemIoBase::preamble); |
||
72 | uint8_t buffer[bufferSize]; |
||
73 | chFileStreamSeek((BaseFileStream*)at24c01, offsetof(FileSystemIoBase::preamble, magicByte)); |
||
74 | msg_t bytesWritten = chSequentialStreamRead((BaseFileStream*)at24c01, (uint8_t*) buffer, sizeof(FileSystemIoBase::preamble));
|
||
75 | |||
76 | if (bytesWritten != bufferSize) {
|
||
77 | return IO_ERROR;
|
||
78 | } else if (buffer[offsetof(FileSystemIoBase::preamble, magicByte)] != magicByteValue) { |
||
79 | return WRONG_MAGICBYTE_VALUE;
|
||
80 | } else if (buffer[offsetof(FileSystemIoBase::preamble, byteStructureMajorVersion)] != BSMV) { |
||
81 | return WRONG_BSMV;
|
||
82 | } else if (buffer[offsetof(FileSystemIoBase::preamble, byteStructureMinorVersion)] < bsmv) { |
||
83 | return WRONG_bsmv;
|
||
84 | } else if (buffer[offsetof(FileSystemIoBase::preamble, hardwareMajorVersion)] != HMV) { |
||
85 | return WRONG_HMV;
|
||
86 | } else if (buffer[offsetof(FileSystemIoBase::preamble, hardwareMinorVersion)] < hmv) { |
||
87 | return WRONG_hmv;
|
||
88 | } else {
|
||
89 | return OK;
|
||
90 | } |
||
91 | } |
||
92 | |||
93 | msg_t initMemory(){ |
||
94 | |||
95 | // Get the preamble
|
||
96 | const uint8_t bufferSize = offsetof(FileSystemIoBase::preamble, hardwareMinorVersion) + 1; |
||
97 | uint8_t buffer[bufferSize]; |
||
98 | |||
99 | chFileStreamSeek((BaseFileStream*)at24c01, offsetof(FileSystemIoBase::preamble, magicByte)); |
||
100 | |||
101 | buffer[offsetof(FileSystemIoBase::preamble, magicByte)] = magicByteValue; |
||
102 | buffer[offsetof(FileSystemIoBase::preamble, byteStructureMajorVersion)] = BSMV; |
||
103 | buffer[offsetof(FileSystemIoBase::preamble, byteStructureMinorVersion)] = bsmv; |
||
104 | buffer[offsetof(FileSystemIoBase::preamble, hardwareMajorVersion)] = HMV; |
||
105 | buffer[offsetof(FileSystemIoBase::preamble, hardwareMinorVersion)] = hmv; |
||
106 | |||
107 | msg_t bytesWritten = chSequentialStreamWrite((BaseFileStream*)at24c01, (uint8_t*) buffer, bufferSize); |
||
108 | |||
109 | if (bytesWritten != bufferSize) {
|
||
110 | return IO_ERROR;
|
||
111 | } else {
|
||
112 | return OK;
|
||
113 | } |
||
114 | } |
||
115 | |||
116 | |||
117 | |||
118 | }; |
||
119 | |||
120 | |||
121 | class DiWheelDriveFSIO : public FileSystemIoBase { |
||
122 | private:
|
||
123 | |||
124 | /** \brief Layout for DiWheelDriveFSIO with BSMV 1 and bsmv 1*/
|
||
125 | struct DiWheelDrive_1_1 {
|
||
126 | uint8_t reserved_0x00_0x14[20];
|
||
127 | uint16_t vcnl4020offset[4]; // U [12, 13, 15, 16] |
||
128 | uint8_t generalPurpose[96]; // 1Cx_7Cx |
||
129 | uint8_t reserved_0x7D_0x80[4]; // TODO CRC |
||
130 | }; |
||
131 | |||
132 | public:
|
||
133 | DiWheelDriveFSIO(AT24 *at24c01, uint8_t BSMV, uint8_t bsmv, uint8_t HMV, uint8_t hmv) |
||
134 | : FileSystemIoBase(at24c01, BSMV, bsmv, HMV, hmv) { |
||
135 | |||
136 | } |
||
137 | |||
138 | msg_t getVcnl4020Offset (uint16_t *buffer, uint8_t idx) { |
||
139 | |||
140 | msg_t bytesWritten; |
||
141 | const uint8_t bufferSize = sizeof(uint16_t); |
||
142 | |||
143 | // Check if the vcnl index is in a valid range
|
||
144 | if (idx >= sizeof(DiWheelDrive_1_1::vcnl4020offset)) { |
||
145 | return WRONG_INDEX;
|
||
146 | } |
||
147 | |||
148 | // Get the data out of the memory
|
||
149 | switch (this->BSMV) {
|
||
150 | case 0x01u: |
||
151 | // Set the pointer to the address
|
||
152 | chFileStreamSeek((BaseFileStream*)at24c01, offsetof(DiWheelDriveFSIO::DiWheelDrive_1_1, vcnl4020offset[idx])); |
||
153 | switch (this->bsmv) {
|
||
154 | default:
|
||
155 | bytesWritten = chSequentialStreamRead((BaseFileStream*)at24c01, (uint8_t*) buffer, bufferSize); |
||
156 | break;
|
||
157 | } |
||
158 | break;
|
||
159 | } |
||
160 | |||
161 | if (bytesWritten != bufferSize) {
|
||
162 | return IO_ERROR;
|
||
163 | } else {
|
||
164 | return OK;
|
||
165 | } |
||
166 | } |
||
167 | |||
168 | msg_t setVcnl4020Offset (uint16_t *buffer, uint8_t idx) { |
||
169 | |||
170 | msg_t bytesWritten; |
||
171 | const uint8_t bufferSize = sizeof(uint16_t); |
||
172 | |||
173 | // Check if the vcnl index is in a valid range
|
||
174 | if (idx >= sizeof(DiWheelDrive_1_1::vcnl4020offset)) { |
||
175 | return WRONG_INDEX;
|
||
176 | } |
||
177 | |||
178 | // Get the data out of the memory
|
||
179 | switch (this->BSMV) {
|
||
180 | case 0x01u: |
||
181 | // Set the pointer to the address
|
||
182 | chFileStreamSeek((BaseFileStream*)at24c01, offsetof(DiWheelDriveFSIO::DiWheelDrive_1_1, vcnl4020offset[idx])); |
||
183 | switch (this->bsmv) {
|
||
184 | default:
|
||
185 | bytesWritten = chSequentialStreamWrite((BaseFileStream*)at24c01, (const uint8_t*) buffer, bufferSize);
|
||
186 | break;
|
||
187 | } |
||
188 | break;
|
||
189 | } |
||
190 | |||
191 | if (bytesWritten != bufferSize) {
|
||
192 | return IO_ERROR;
|
||
193 | } else {
|
||
194 | return OK;
|
||
195 | } |
||
196 | } |
||
197 | }; |
||
198 | |||
199 | class PowerBoardFSIO : public FileSystemIoBase { |
||
200 | private:
|
||
201 | |||
202 | /** \brief Layout for PowerBoardFSIO with BSMV 1 and bsmv 1*/
|
||
203 | struct PowerBoard_1_1 {
|
||
204 | uint8_t reserved_0x00_0x14[20];
|
||
205 | uint16_t vcnl4020offset[8]; // U1.Proximity [11, 21, 31, 41, 12, 22, 32, 42] |
||
206 | uint8_t generalPurpose[88]; // 24x_7Cx |
||
207 | uint8_t reserved_0x7D_0x80[4]; // TODO CRC |
||
208 | }; |
||
209 | |||
210 | public:
|
||
211 | PowerBoardFSIO(AT24 *at24c01, uint8_t BSMV, uint8_t bsmv, uint8_t HMV, uint8_t hmv) |
||
212 | : FileSystemIoBase(at24c01, BSMV, bsmv, HMV, hmv) { |
||
213 | |||
214 | } |
||
215 | |||
216 | msg_t getVcnl4020Offset (uint16_t *buffer, uint8_t idx) { |
||
217 | |||
218 | msg_t bytesWritten; |
||
219 | const uint8_t bufferSize = sizeof(uint16_t); |
||
220 | |||
221 | // Check if the vcnl index is in a valid range
|
||
222 | if (idx >= sizeof(PowerBoard_1_1::vcnl4020offset)) { |
||
223 | return WRONG_INDEX;
|
||
224 | } |
||
225 | |||
226 | // Get the data out of the memory
|
||
227 | switch (this->BSMV) {
|
||
228 | case 0x01u: |
||
229 | // Set the pointer to the address
|
||
230 | chFileStreamSeek((BaseFileStream*)at24c01, offsetof(PowerBoardFSIO::PowerBoard_1_1, vcnl4020offset[idx])); |
||
231 | switch (this->bsmv) {
|
||
232 | default:
|
||
233 | bytesWritten = chSequentialStreamRead((BaseFileStream*)at24c01, (uint8_t*) buffer, bufferSize); |
||
234 | break;
|
||
235 | } |
||
236 | break;
|
||
237 | } |
||
238 | |||
239 | if (bytesWritten != bufferSize) {
|
||
240 | return IO_ERROR;
|
||
241 | } else {
|
||
242 | return OK;
|
||
243 | } |
||
244 | } |
||
245 | |||
246 | msg_t setVcnl4020Offset (uint16_t *buffer, uint8_t idx) { |
||
247 | |||
248 | msg_t bytesWritten; |
||
249 | const uint8_t bufferSize = sizeof(uint16_t); |
||
250 | |||
251 | // Check if the vcnl index is in a valid range
|
||
252 | if (idx >= sizeof(PowerBoard_1_1::vcnl4020offset)) { |
||
253 | return WRONG_INDEX;
|
||
254 | } |
||
255 | |||
256 | // Get the data out of the memory
|
||
257 | switch (this->BSMV) {
|
||
258 | case 0x01u: |
||
259 | // Set the pointer to the address
|
||
260 | chFileStreamSeek((BaseFileStream*)at24c01, offsetof(PowerBoardFSIO::PowerBoard_1_1, vcnl4020offset[idx])); |
||
261 | switch (this->bsmv) {
|
||
262 | default:
|
||
263 | bytesWritten = chSequentialStreamWrite((BaseFileStream*)at24c01, (const uint8_t*) buffer, bufferSize);
|
||
264 | break;
|
||
265 | } |
||
266 | break;
|
||
267 | } |
||
268 | |||
269 | if (bytesWritten != bufferSize) {
|
||
270 | return IO_ERROR;
|
||
271 | } else {
|
||
272 | return OK;
|
||
273 | } |
||
274 | } |
||
275 | }; |
||
276 | |||
277 | class LightRingFSIO : public FileSystemIoBase { |
||
278 | private:
|
||
279 | |||
280 | /** \brief Layout for LightRingFSIO with BSMV 1 and bsmv 1*/
|
||
281 | struct LightRing_1_1 {
|
||
282 | uint8_t reserved_0x00_0x14[20];
|
||
283 | uint8_t generalPurpose[104]; // 15x_80x |
||
284 | uint8_t reserved_0x7D_0x80[4]; // TODO CRC |
||
285 | }; |
||
286 | |||
287 | public:
|
||
288 | LightRingFSIO(AT24 *at24c01, uint8_t BSMV, uint8_t bsmv, uint8_t HMV, uint8_t hmv) |
||
289 | : FileSystemIoBase(at24c01, BSMV, bsmv, HMV, hmv) { |
||
290 | |||
291 | } |
||
292 | }; |
||
293 | |||
294 | } |
||
295 | } |
||
296 | |||
297 | #endif /* AMIRO_FILESYSTEMIO_H_ */ |