00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #include "cfs-coffee-arch.h"
00043
00044 #define DEBUG 1
00045 #if DEBUG
00046 #include <stdio.h>
00047 #define PRINTF(...) printf(__VA_ARGS__)
00048 #else
00049 #define PRINTF(...)
00050 #endif
00051
00052 #define TESTCOFFEE 1
00053 #define DEBUG_CFS 1
00054 #if TESTCOFFEE
00055 #if DEBUG_CFS
00056 #include <stdio.h>
00057 #define PRINTF_CFS(...) printf(__VA_ARGS__)
00058 #else
00059 #define PRINTF_CFS(...)
00060 #endif
00061
00062 #include "cfs/cfs.h"
00063 #include "cfs/cfs-coffee.h"
00064 #include "lib/crc16.h"
00065 #include "lib/random.h"
00066 #include <stdio.h>
00067
00068 #define FAIL(x) PRINTF("FAILED\n");error = (x); goto end;
00069
00070 #define FILE_SIZE 512
00071
00072 int
00073 coffee_file_test(void)
00074 {
00075 int error;
00076 int wfd, rfd, afd;
00077 unsigned char buf[256], buf2[11];
00078 int r, i, j, total_read;
00079 unsigned offset;
00080
00081 cfs_remove("T1");
00082 cfs_remove("T2");
00083 cfs_remove("T3");
00084 cfs_remove("T4");
00085 cfs_remove("T5");
00086
00087 wfd = rfd = afd = -1;
00088
00089 for(r = 0; r < sizeof(buf); r++) {
00090 buf[r] = r;
00091 }
00092
00093 PRINTF("TEST 1\n");
00094
00095
00096 wfd = cfs_open("T1", CFS_WRITE);
00097 if(wfd < 0) {
00098 FAIL(-1);
00099 }
00100
00101 PRINTF("PASSED\n");
00102 PRINTF("TEST ");
00103 PRINTF("2\n");
00104
00105
00106 r = cfs_write(wfd, buf, sizeof(buf));
00107 if(r < 0) {
00108 FAIL(-2);
00109 } else if(r < sizeof(buf)) {
00110 FAIL(-3);
00111 }
00112
00113 PRINTF("PASSED\n");
00114 PRINTF("TEST ");
00115 PRINTF("3\n");
00116
00117
00118 r = cfs_read(wfd, buf, sizeof(buf));
00119 if(r >= 0) {
00120 FAIL(-4);
00121 }
00122
00123 PRINTF("PASSED\n");
00124 PRINTF("TEST ");
00125 PRINTF("4\n");
00126
00127
00128 rfd = cfs_open("T1", CFS_READ);
00129 if(rfd < 0) {
00130 FAIL(-5);
00131 }
00132
00133 PRINTF("PASSED\n");
00134 PRINTF("TEST ");
00135 PRINTF("5\n");
00136
00137
00138 r = cfs_write(rfd, buf, sizeof(buf));
00139 if(r >= 0) {
00140 FAIL(-6);
00141 }
00142
00143 PRINTF("PASSED\n");
00144 PRINTF("TEST ");
00145 PRINTF("7\n");
00146
00147
00148 memset(buf, 0, sizeof(buf));
00149 r = cfs_read(rfd, buf, sizeof(buf));
00150 if(r < 0) {
00151 FAIL(-8);
00152 } else if(r < sizeof(buf)) {
00153 PRINTF_CFS("r=%d\n", r);
00154 FAIL(-9);
00155 }
00156
00157 PRINTF("PASSED\n");
00158 PRINTF("TEST ");
00159 PRINTF("8\n");
00160
00161
00162 for(r = 0; r < sizeof(buf); r++) {
00163 if(buf[r] != r) {
00164 PRINTF_CFS("r=%d. buf[r]=%d\n", r, buf[r]);
00165 FAIL(-10);
00166 }
00167 }
00168
00169 PRINTF("PASSED\n");
00170 PRINTF("TEST ");
00171 PRINTF("9\n");
00172
00173
00174 if(cfs_seek(wfd, 0, CFS_SEEK_SET) != 0) {
00175 FAIL(-11);
00176 }
00177
00178 PRINTF("PASSED\n");
00179 PRINTF("TEST ");
00180 PRINTF("10\n");
00181
00182
00183 r = cfs_write(wfd, buf, sizeof(buf));
00184 if(r < 0) {
00185 FAIL(-12);
00186 } else if(r < sizeof(buf)) {
00187 FAIL(-13);
00188 }
00189
00190 PRINTF("PASSED\n");
00191 PRINTF("TEST ");
00192 PRINTF("11\n");
00193
00194
00195 cfs_seek(rfd, 0, CFS_SEEK_SET);
00196 memset(buf, 0, sizeof(buf));
00197 r = cfs_read(rfd, buf, sizeof(buf));
00198 if(r < 0) {
00199 FAIL(-14);
00200 } else if(r < sizeof(buf)) {
00201 FAIL(-15);
00202 }
00203
00204 PRINTF("PASSED\n");
00205 PRINTF("TEST ");
00206 PRINTF("12\n");
00207
00208
00209 for(r = 0; r < sizeof(buf); r++) {
00210 if(buf[r] != r) {
00211 FAIL(-16);
00212 }
00213 }
00214
00215 PRINTF("PASSED\n");
00216 PRINTF("TEST ");
00217 PRINTF("13\n");
00218
00219
00220 for(r = 0; r < sizeof(buf); r++) {
00221 buf[r] = sizeof(buf) - r - 1;
00222 }
00223 if(cfs_seek(wfd, 0, CFS_SEEK_SET) != 0) {
00224 FAIL(-17);
00225 }
00226 r = cfs_write(wfd, buf, sizeof(buf));
00227 if(r < 0) {
00228 FAIL(-18);
00229 } else if(r < sizeof(buf)) {
00230 FAIL(-19);
00231 }
00232 if(cfs_seek(rfd, 0, CFS_SEEK_SET) != 0) {
00233 FAIL(-20);
00234 }
00235
00236 PRINTF("PASSED\n");
00237 PRINTF("TEST ");
00238 PRINTF("14\n");
00239
00240
00241 cfs_seek(rfd, 0, CFS_SEEK_SET);
00242 memset(buf, 0, sizeof(buf));
00243 r = cfs_read(rfd, buf, sizeof(buf));
00244 if(r < 0) {
00245 FAIL(-21);
00246 } else if(r < sizeof(buf)) {
00247 PRINTF_CFS("r = %d\n", r);
00248 FAIL(-22);
00249 }
00250
00251 PRINTF("PASSED\n");
00252 PRINTF("TEST ");
00253 PRINTF("15\n");
00254
00255
00256 for(r = 0; r < sizeof(buf); r++) {
00257 if(buf[r] != sizeof(buf) - r - 1) {
00258 FAIL(-23);
00259 }
00260 }
00261
00262 cfs_close(rfd);
00263 cfs_close(wfd);
00264
00265 if(cfs_coffee_reserve("T2", FILE_SIZE) < 0) {
00266 FAIL(-24);
00267 }
00268
00269 PRINTF("PASSED\n");
00270 PRINTF("TEST ");
00271 PRINTF("16\n");
00272
00273
00274 for(r = 0; r < 100; r++) {
00275 wfd = cfs_open("T2", CFS_WRITE | CFS_READ);
00276 if(wfd < 0) {
00277 FAIL(-25);
00278 }
00279
00280 offset = random_rand() % FILE_SIZE;
00281
00282 for(r = 0; r < sizeof(buf); r++) {
00283 buf[r] = r;
00284 }
00285
00286 if(cfs_seek(wfd, offset, CFS_SEEK_SET) != offset) {
00287 FAIL(-26);
00288 }
00289
00290 if(cfs_write(wfd, buf, sizeof(buf)) != sizeof(buf)) {
00291 FAIL(-27);
00292 }
00293
00294 if(cfs_seek(wfd, offset, CFS_SEEK_SET) != offset) {
00295 FAIL(-28);
00296 }
00297
00298 memset(buf, 0, sizeof(buf));
00299 if(cfs_read(wfd, buf, sizeof(buf)) != sizeof(buf)) {
00300 FAIL(-29);
00301 }
00302
00303 for(i = 0; i < sizeof(buf); i++) {
00304 if(buf[i] != i) {
00305 PRINTF_CFS("buf[%d] != %d\n", i, buf[i]);
00306 FAIL(-30);
00307 }
00308 }
00309 }
00310 PRINTF("PASSED\n");
00311 PRINTF("TEST ");
00312 PRINTF("17\n");
00313
00314 #define APPEND_BYTES 3000
00315 #define BULK_SIZE 10
00316 for (i = 0; i < APPEND_BYTES; i += BULK_SIZE) {
00317 afd = cfs_open("T3", CFS_WRITE | CFS_APPEND);
00318 if (afd < 0) {
00319 FAIL(-31);
00320 }
00321 for (j = 0; j < BULK_SIZE; j++) {
00322 buf[j] = 1 + ((i + j) & 0x7f);
00323 }
00324 if ((r = cfs_write(afd, buf, BULK_SIZE)) != BULK_SIZE) {
00325 PRINTF_CFS("Count:%d, r=%d\n", i, r);
00326 FAIL(-32);
00327 }
00328 cfs_close(afd);
00329 }
00330
00331 PRINTF("PASSED\n");
00332 PRINTF("TEST ");
00333 PRINTF("18\n");
00334
00335
00336
00337 afd = cfs_open("T3", CFS_READ);
00338 if(afd < 0) {
00339 FAIL(-33);
00340 }
00341 total_read = 0;
00342 while((r = cfs_read(afd, buf2, sizeof(buf2))) > 0) {
00343 for(j = 0; j < r; j++) {
00344 if(buf2[j] != 1 + ((total_read + j) & 0x7f)) {
00345 FAIL(-34);
00346 }
00347 }
00348 total_read += r;
00349 }
00350 if(r < 0) {
00351 PRINTF_CFS("FAIL:-35 r=%d\n",r);
00352 FAIL(-35);
00353 }
00354 if(total_read != APPEND_BYTES) {
00355 PRINTF_CFS("FAIL:-35 total_read=%d\n",total_read);
00356 FAIL(-35);
00357 }
00358 cfs_close(afd);
00359
00360 PRINTF("PASSED\n");
00361 PRINTF("TEST ");
00362 PRINTF("19\n");
00363
00364
00365
00366
00367
00368 #define APPEND_BYTES_1 2000
00369 #define BULK_SIZE_1 10
00370 for (i = 0; i < APPEND_BYTES_1; i += BULK_SIZE_1) {
00371 afd = cfs_open("T4", CFS_WRITE | CFS_APPEND);
00372 if (afd < 0) {
00373 FAIL(-36);
00374 }
00375 for (j = 0; j < BULK_SIZE_1; j++) {
00376 buf[j] = 1 + ((i + j) & 0x7f);
00377 }
00378
00379 if ((r = cfs_write(afd, buf, BULK_SIZE_1)) != BULK_SIZE_1) {
00380 PRINTF_CFS("Count:%d, r=%d\n", i, r);
00381 FAIL(-37);
00382 }
00383 cfs_close(afd);
00384 }
00385
00386 afd = cfs_open("T4", CFS_READ);
00387 if(afd < 0) {
00388 FAIL(-38);
00389 }
00390 total_read = 0;
00391 while((r = cfs_read(afd, buf2, sizeof(buf2))) > 0) {
00392 for(j = 0; j < r; j++) {
00393 if(buf2[j] != 1 + ((total_read + j) & 0x7f)) {
00394 PRINTF_CFS("FAIL:-39, total_read=%d r=%d\n",total_read,r);
00395 FAIL(-39);
00396 }
00397 }
00398 total_read += r;
00399 }
00400 if(r < 0) {
00401 PRINTF_CFS("FAIL:-40 r=%d\n",r);
00402 FAIL(-40);
00403 }
00404 if(total_read != APPEND_BYTES_1) {
00405 PRINTF_CFS("FAIL:-41 total_read=%d\n",total_read);
00406 FAIL(-41);
00407 }
00408 cfs_close(afd);
00409
00410 PRINTF("PASSED\n");
00411 PRINTF("TEST ");
00412 PRINTF("20\n");
00413 #define APPEND_BYTES_2 1000
00414 #define BULK_SIZE_2 10
00415 for (i = 0; i < APPEND_BYTES_2; i += BULK_SIZE_2) {
00416 afd = cfs_open("T5", CFS_WRITE | CFS_APPEND);
00417 if (afd < 0) {
00418 FAIL(-42);
00419 }
00420 for (j = 0; j < BULK_SIZE_2; j++) {
00421 buf[j] = 1 + ((i + j) & 0x7f);
00422 }
00423
00424 if ((r = cfs_write(afd, buf, BULK_SIZE_2)) != BULK_SIZE_2) {
00425 PRINTF_CFS("Count:%d, r=%d\n", i, r);
00426 FAIL(-43);
00427 }
00428
00429 cfs_close(afd);
00430 }
00431
00432 afd = cfs_open("T5", CFS_READ);
00433 if(afd < 0) {
00434 FAIL(-44);
00435 }
00436 total_read = 0;
00437 while((r = cfs_read(afd, buf2, sizeof(buf2))) > 0) {
00438 for(j = 0; j < r; j++) {
00439 if(buf2[j] != 1 + ((total_read + j) & 0x7f)) {
00440 PRINTF_CFS("FAIL:-45, total_read=%d r=%d\n",total_read,r);
00441 FAIL(-45);
00442 }
00443 }
00444 total_read += r;
00445 }
00446 if(r < 0) {
00447 PRINTF_CFS("FAIL:-46 r=%d\n",r);
00448 FAIL(-46);
00449 }
00450 if(total_read != APPEND_BYTES_2) {
00451 PRINTF_CFS("FAIL:-47 total_read=%d\n",total_read);
00452 FAIL(-47);
00453 }
00454 cfs_close(afd);
00455
00456 PRINTF("PASSED\n");
00457
00458 error = 0;
00459 end:
00460 cfs_close(wfd); cfs_close(rfd); cfs_close(afd);
00461 return error;
00462 }
00463 #endif
00464
00465 void stm32w_flash_read(int32u address, void * data, int32u length)
00466 {
00467 int8u * pdata = (int8u *)address;
00468 ENERGEST_ON(ENERGEST_TYPE_FLASH_READ);
00469 memcpy(data, pdata, length);
00470 ENERGEST_OFF(ENERGEST_TYPE_FLASH_READ);
00471 }
00472
00473 void stm32w_flash_erase(int8u sector)
00474 {
00475
00476
00477 int16u data = 0;
00478 int32u addr = COFFEE_START + (sector) * COFFEE_SECTOR_SIZE;
00479 int32u end = addr + COFFEE_SECTOR_SIZE;
00480
00481
00482 if (!(addr >= MFB_BOTTOM && end <= MFB_TOP + 1)) {
00483 return;
00484 }
00485
00486 for(; addr < end; addr += 2){
00487 halInternalFlashWrite(addr, &data, 1);
00488 }
00489 }
00490
00491
00492 #ifndef STATIC_FLASH_BUFFER
00493 #define STATIC_FLASH_BUFFER 1
00494 #endif
00495
00496 void stm32w_flash_write(int32u address, const void * data, int32u length)
00497 {
00498 const int32u end = address + length;
00499 int32u i;
00500 int32u next_page, curr_page;
00501 int16u offset;
00502
00503 #if STATIC_FLASH_BUFFER
00504 static int8u buf[FLASH_PAGE_SIZE];
00505 #else
00506 int8u buf[FLASH_PAGE_SIZE];
00507 #endif
00508
00509 for(i = address; i < end;) {
00510 next_page = (i | (FLASH_PAGE_SIZE-1)) + 1;
00511 curr_page = i & ~(FLASH_PAGE_SIZE-1);
00512 offset = i-curr_page;
00513 if(next_page > end) {
00514 next_page = end;
00515 }
00516
00517
00518 stm32w_flash_read(curr_page, buf, FLASH_PAGE_SIZE);
00519
00520 memcpy(buf + offset, data, next_page - i);
00521
00522 ENERGEST_ON(ENERGEST_TYPE_FLASH_WRITE);
00523 halInternalFlashErase(MFB_PAGE_ERASE, i);
00524
00525 halInternalFlashWrite(curr_page, (int16u *)buf, FLASH_PAGE_SIZE/2);
00526 ENERGEST_OFF(ENERGEST_TYPE_FLASH_WRITE);
00527
00528 data = (u8_t *)data + next_page - i;
00529 i = next_page;
00530 }
00531
00532 }
00533