void eeprom_testsuit_run(void){ EepromOpen(&EfsTest); /* run from zero address */ TestAreaStart = 0; TestAreaFinish = TestAreaStart + TEST_AREA_SIZE; eeprom_testsuit(); /* run somwhere in middle */ TestAreaStart = (EEPROM_SIZE / 2) - (TEST_AREA_SIZE / 2) - EEPROM_PAGE_SIZE; TestAreaFinish = TestAreaStart + TEST_AREA_SIZE; eeprom_testsuit(); /* run at the end */ TestAreaStart = EEPROM_SIZE - TEST_AREA_SIZE; TestAreaFinish = TestAreaStart + TEST_AREA_SIZE; eeprom_testsuit(); chFileStreamClose(&EfsTest); /* switch off led */ palSetPad(GPIOB, GPIOB_LED_B); }
msg_t EepromTestThread(void *sdp){ chRegSetThreadName("EepromTst"); cli_println("basic tests"); cli_println("--------------------------------------------------------------"); cli_print("mount aligned file sized to whole test area"); ocfg.barrier_low = TEST_AREA_START; ocfg.barrier_hi = TEST_AREA_END; EepromFileOpen(&ofile, &ocfg); OK(); printfileinfo(sdp, &ofile); cli_print("test fill with 0xFF"); pattern_fill(&ofile, 0xFF); if (chThdShouldTerminate()){goto END;} OK(); cli_print("test fill with 0xAA"); pattern_fill(&ofile, 0xAA); if (chThdShouldTerminate()){goto END;} OK(); cli_print("test fill with 0x55"); pattern_fill(&ofile, 0x55); if (chThdShouldTerminate()){goto END;} OK(); cli_print("test fill with 0x00"); pattern_fill(&ofile, 0x00); if (chThdShouldTerminate()){goto END;} OK(); cli_print("Closing file"); chFileStreamClose(&ofile); OK(); uint32_t b1, b2, b3, b4, istart, ilen; uint8_t pattern = 0x55; b1 = TEST_AREA_START; b2 = TEST_AREA_START + EEPROM_PAGE_SIZE; b3 = TEST_AREA_END - EEPROM_PAGE_SIZE; b4 = TEST_AREA_END; istart = 0; ilen = b3-b2; cli_println(" Linear barriers testing."); chThdSleepMilliseconds(20); overflow_check( b1, b2, b3, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2, b3, b4, istart + 1, ilen - 1, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2, b3, b4, istart + 1, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2, b3, b4, istart + 1, ilen + 23, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 1, b3 + 1, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 2, b3 + 2, b4, istart + 2, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 1, b3 + 1, b4, istart + 1, ilen + 23, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 2, b3 + 2, b4, istart + 1, ilen + 23, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 + 2, b3 - 3, b4, istart + 2, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2, b2 + 1, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2, b2 + 2, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2, b2 + 3, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 + 1, b2 + 2, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 + 1, b2 + 3, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 + 1, b2 + 4, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 1, b2, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 1, b2 + 1, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 1, b2 + 2, b4, istart, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 1, b2 + 1, b4, istart + 1, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 1, b2 + 2, b4, istart + 1, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; overflow_check( b1, b2 - 1, b2 + 3, b4, istart + 1, ilen, pattern, FALSE, sdp); if (chThdShouldTerminate()){goto END;} pattern++; cli_println(" Basic API testing."); chThdSleepMilliseconds(20); ocfg.barrier_low = TEST_AREA_START; ocfg.barrier_hi = TEST_AREA_END; EepromFileOpen(&ofile, &ocfg); chFileStreamSeek(&ofile, 0); EepromWriteByte(&ofile, 0x11); EepromWriteHalfword(&ofile, 0x2222); EepromWriteWord(&ofile, 0x33333333); chFileStreamSeek(&ofile, 0); if(EepromReadByte(&ofile) != 0x11) chDbgPanic(""); if(EepromReadHalfword(&ofile) != 0x2222) chDbgPanic(""); if(EepromReadWord(&ofile) != 0x33333333) chDbgPanic(""); chFileStreamClose(&ofile); OK(); cli_println("All tests passed successfully."); END: chThdExit(0); return 0; }
static void ImageBaseFileStreamClose(struct gdispImageIO *pio) { if (pio->fd == (void *)-1) return; chFileStreamClose(((BaseFileStream *)pio->fd)); pio->fd = (void *)-1; pio->pos = 0; }
/** * Create overlapped files like this: * * |<--------- outer file ------------>| * | | * ======b1==b2========================b3===b4====== * | | | | * | |<------ inner file ------>| | * |<----------------- EEPROM -------------------->| */ static void overflow_check(uint32_t b1, uint32_t b2, uint32_t b3, uint32_t b4, uint32_t istart, uint32_t ilen, uint8_t pattern, bool_t pat_autoinc, BaseSequentialStream *sdp){ uint32_t status, i, n; chDbgCheck(ilen < (b4-b1),"sequences more than length of outer file can not be verified"); chprintf(sdp, "b1=%u, b2=%u, b3=%u, b4=%u, istart=%u, ilen=%u, ", b1, b2, b3, b4, istart, ilen); cli_print("autoinc="); if (pat_autoinc) cli_print("TRUE"); else cli_print("FALSE"); chThdSleepMilliseconds(50); /* open outer file and clear it */ ocfg.barrier_low = b1; ocfg.barrier_hi = b4; EepromFileOpen(&ofile, &ocfg); pattern_fill(&ofile, 0x00); /* open inner file */ icfg.barrier_low = b2; icfg.barrier_hi = b3; EepromFileOpen(&ifile, &icfg); /* reference buffer */ memset(referencebuf, 0x00, b4-b1); n = b2 - b1 + istart; if ((ilen + istart) > (b3-b2)) i = b3 - b2 - istart; else i = ilen; while (i > 0){ referencebuf[n] = pattern; n++; i--; if (pat_autoinc) pattern++; } /* check buffer */ n = 0; while (n < ilen){ checkbuf[n] = pattern; n++; if (pat_autoinc) pattern++; } /* now write check buffer content into inner file */ chThdSleepMilliseconds(20); chFileStreamSeek(&ifile, istart); status = chFileStreamWrite(&ifile, checkbuf, ilen); if ((istart + ilen) > (b3 - b2)){ /* data must be clamped */ if (status != (b3 - b2 - istart)) chDbgPanic("not all data written or overflow ocrred"); } else{/* data fitted in file */ if (status != ilen) chDbgPanic("not all data written or overflow ocrred"); } /* read outer file and compare content with reference buffer */ memset(checkbuf, 0x00, b4-b1); chFileStreamSeek(&ofile, 0); status = chFileStreamRead(&ofile, checkbuf, b4-b1); if (status != (b4-b1)) chDbgPanic("reading back failed"); if (memcmp(referencebuf, checkbuf, b4-b1) != 0) chDbgPanic("veryfication failed"); chFileStreamClose(&ofile); chFileStreamClose(&ifile); OK(); }