@@ -71,7 +71,8 @@ static s32_t api_spiffs_erase(u32_t addr, u32_t size)
71
71
return SPIFFS_OK;
72
72
}
73
73
74
-
74
+ static int checkArgs ();
75
+ static size_t getFileSize (FILE* fp);
75
76
76
77
77
78
// implementation
@@ -147,9 +148,7 @@ int addFile(char* name, const char* path)
147
148
spiffs_file dst = SPIFFS_open (&s_fs, name, SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0 );
148
149
149
150
// read file size
150
- fseek (src, 0 , SEEK_END);
151
- size_t size = ftell (src);
152
- fseek (src, 0 , SEEK_SET);
151
+ size_t size = getFileSize (src);
153
152
154
153
if (s_debugLevel > 0 ) {
155
154
std::cout << " file size: " << size << std::endl;
@@ -468,6 +467,14 @@ int actionPack()
468
467
469
468
if (s_imageSize == 0 ) {
470
469
s_imageSize = 0x10000 ;
470
+ if (s_debugLevel > 0 ) {
471
+ std::cout << " image size not specifed, using default: " << s_imageSize << std::endl;
472
+ }
473
+ }
474
+
475
+ int err = checkArgs ();
476
+ if (err != 0 ) {
477
+ return err;
471
478
}
472
479
473
480
s_flashmem.resize (s_imageSize, 0xff );
@@ -488,7 +495,7 @@ int actionPack()
488
495
return result;
489
496
}
490
497
491
- size_t getFileSize (FILE* fp)
498
+ static size_t getFileSize (FILE* fp)
492
499
{
493
500
fseek (fp, 0L , SEEK_END);
494
501
size_t size = (size_t ) ftell (fp);
@@ -517,6 +524,11 @@ int actionUnpack(void)
517
524
s_imageSize = getFileSize (fdsrc);
518
525
}
519
526
527
+ int err = checkArgs ();
528
+ if (err != 0 ) {
529
+ return err;
530
+ }
531
+
520
532
s_flashmem.resize (s_imageSize, 0xff );
521
533
522
534
// read content into s_flashmem
@@ -555,6 +567,11 @@ int actionList()
555
567
s_imageSize = getFileSize (fdsrc);
556
568
}
557
569
570
+ int err = checkArgs ();
571
+ if (err != 0 ) {
572
+ return err;
573
+ }
574
+
558
575
s_flashmem.resize (s_imageSize, 0xff );
559
576
560
577
fread (&s_flashmem[0 ], 4 , s_flashmem.size () / 4 , fdsrc);
@@ -582,6 +599,11 @@ int actionVisualize()
582
599
s_imageSize = getFileSize (fdsrc);
583
600
}
584
601
602
+ int err = checkArgs ();
603
+ if (err != 0 ) {
604
+ return err;
605
+ }
606
+
585
607
s_flashmem.resize (s_imageSize, 0xff );
586
608
587
609
@@ -660,7 +682,7 @@ void processArgs(int argc, const char** argv)
660
682
cmd.parse ( argc, argv );
661
683
662
684
if (debugArg.getValue () > 0 ) {
663
- std::cout << " Debug output enabled" << std::endl;
685
+ std::cerr << " Debug output enabled" << std::endl;
664
686
s_debugLevel = debugArg.getValue ();
665
687
}
666
688
@@ -683,13 +705,45 @@ void processArgs(int argc, const char** argv)
683
705
s_addAllFiles = addAllFilesArg.isSet ();
684
706
}
685
707
708
+ static int checkArgs ()
709
+ {
710
+ // Argument checks don't use TCLAP's Constraint interface because
711
+ // a) we need to check one argument against another, while Constraints only check
712
+ // each argument individually, and b) image size might only be known when image
713
+ // file is opened.
714
+
715
+ if (s_imageSize < 0 || s_pageSize < 0 || s_blockSize < 0 ) {
716
+ std::cerr << " error: Image, block, page sizes should not be negative" << std::endl;
717
+ return 1 ;
718
+ }
719
+
720
+ if (s_imageSize % s_blockSize != 0 ) {
721
+ std::cerr << " error: Image size should be a multiple of block size" << std::endl;
722
+ return 1 ;
723
+ }
724
+
725
+ if (s_blockSize % s_pageSize != 0 ) {
726
+ std::cerr << " error: Block size should be a multiple of page size" << std::endl;
727
+ return 1 ;
728
+ }
729
+
730
+ const int physicalFlashEraseBlockSize = 4096 ;
731
+ if (s_blockSize % physicalFlashEraseBlockSize != 0 ) {
732
+ std::cerr << " error: Block size should be multiple of flash erase block size (" <<
733
+ physicalFlashEraseBlockSize << " )" << std::endl;
734
+ return 1 ;
735
+ }
736
+
737
+ return 0 ;
738
+ }
739
+
686
740
int main (int argc, const char * argv[])
687
741
{
688
742
689
743
try {
690
744
processArgs (argc, argv);
691
745
} catch (...) {
692
- std::cerr << " Invalid arguments" << std::endl;
746
+ std::cerr << " error: Invalid arguments" << std::endl;
693
747
return 1 ;
694
748
}
695
749
0 commit comments