From 91db687bfe05651c23a7b7a08a6ec6f091d6a1b8 Mon Sep 17 00:00:00 2001
From: Iceman <iceman@iuse.se>
Date: Tue, 13 Aug 2019 15:58:37 +0200
Subject: [PATCH 01/19] Update cheatsheet.md

---
 doc/cheatsheet.md | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/doc/cheatsheet.md b/doc/cheatsheet.md
index 8770b7551..65f2d3d79 100644
--- a/doc/cheatsheet.md
+++ b/doc/cheatsheet.md
@@ -1,6 +1,17 @@
 # Cheatsheet
 
-## Generic
+[Generic](#generic-id)
+[iClass](#iclass-id)
+[Mifare](#mifare-id)
+[HID Prox](#prox-id)
+[Indala](#indala-id)
+[Hitag](#hitag-id)
+[T55XX](#t55xx-id)
+[Data](#data-id)
+[Lua Scripts](#lua-id)
+
+
+## Generic {#generic-id}
 
 Identify High Frequency cards
 ```
@@ -22,7 +33,7 @@ Check versioning
 pm3 --> hw version
 ```
 
-## iClass
+## iClass {#iclass-id}
 
 Reverse permute iClass master key
 ```
@@ -151,7 +162,7 @@ e            : elite
 pm3 --> hf iclass lookup u 010a0ffff7ff12e0 p feffffffffffffff m 66348979153c41b9 f default_iclass_keys.dic e
 ```
 
-## Mifare
+## Mifare {#mifare-id}
 
 Check for default keys
 ```
@@ -239,7 +250,7 @@ pm3 --> hf mf dump
 pm3 --> hf mf restore 1 u 4A6CE843 k hf-mf-A29558E4-key.bin f hf-mf-A29558E4-data.bin
 ```
 
-## HID Prox
+## HID Prox {#prox-id}
 
 Read HID Prox card
 ```
@@ -288,7 +299,7 @@ pm3 --> lf hid brute a 26 f 224
 pm3 --> lf hid brute v a 26 f 21 c 200 d 2000
 ```
 
-## Indala
+## Indala {#indala-id}
 
 Read Indala card
 ```
@@ -318,7 +329,7 @@ Options
 pm3 --> lf indala clone a0000000c2c436c1
 ```
 
-## Hitag
+## Hitag {#hitag-id}
 
 Read Hitag information
 ```
@@ -376,7 +387,7 @@ pm3 --> lf hitag reader 21 56713368
 pm3 --> lf hitag sim c378181c_a8f7.ht2 
 ```
 
-## T55XX
+## T55XX {#t55xx-id}
 
 Detect T55XX card
 ```
@@ -408,7 +419,7 @@ Wipe a T55xx tag and set defaults
 lf t55xx wipe
 ```
 
-## Data
+## Data {#data-id}
 
 Get raw samples [512-40000]
 ```
@@ -425,7 +436,7 @@ Load samples from file
 data load <filename>
 ```
 
-## Lua Scripts
+## Lua Scripts {#lua-id}
 
 List Lua Scripts
 

From c3cb746a7e4296983296156670f2df3ceb62e952 Mon Sep 17 00:00:00 2001
From: Iceman <iceman@iuse.se>
Date: Tue, 13 Aug 2019 16:02:22 +0200
Subject: [PATCH 02/19] Update cheatsheet.md

---
 doc/cheatsheet.md | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/doc/cheatsheet.md b/doc/cheatsheet.md
index 65f2d3d79..5221def92 100644
--- a/doc/cheatsheet.md
+++ b/doc/cheatsheet.md
@@ -1,17 +1,17 @@
 # Cheatsheet
 
-[Generic](#generic-id)
-[iClass](#iclass-id)
-[Mifare](#mifare-id)
+[Generic](#Generic)
+[iClass](#iClass)
+[Mifare](#Mifare)
 [HID Prox](#prox-id)
 [Indala](#indala-id)
 [Hitag](#hitag-id)
-[T55XX](#t55xx-id)
-[Data](#data-id)
-[Lua Scripts](#lua-id)
+[T55XX](#T55XX)
+[Data](#Data)
+[Lua Scripts](#Lua Scripts)
 
 
-## Generic {#generic-id}
+## Generic
 
 Identify High Frequency cards
 ```
@@ -33,7 +33,7 @@ Check versioning
 pm3 --> hw version
 ```
 
-## iClass {#iclass-id}
+## iClass
 
 Reverse permute iClass master key
 ```
@@ -162,7 +162,7 @@ e            : elite
 pm3 --> hf iclass lookup u 010a0ffff7ff12e0 p feffffffffffffff m 66348979153c41b9 f default_iclass_keys.dic e
 ```
 
-## Mifare {#mifare-id}
+## Mifare
 
 Check for default keys
 ```
@@ -387,7 +387,7 @@ pm3 --> lf hitag reader 21 56713368
 pm3 --> lf hitag sim c378181c_a8f7.ht2 
 ```
 
-## T55XX {#t55xx-id}
+## T55XX
 
 Detect T55XX card
 ```
@@ -419,7 +419,7 @@ Wipe a T55xx tag and set defaults
 lf t55xx wipe
 ```
 
-## Data {#data-id}
+## Data
 
 Get raw samples [512-40000]
 ```
@@ -436,7 +436,7 @@ Load samples from file
 data load <filename>
 ```
 
-## Lua Scripts {#lua-id}
+## Lua Scripts
 
 List Lua Scripts
 

From 084ea32d11bc6e66ef49b1b35969119bb1402ab8 Mon Sep 17 00:00:00 2001
From: Iceman <iceman@iuse.se>
Date: Tue, 13 Aug 2019 16:03:54 +0200
Subject: [PATCH 03/19] Update cheatsheet.md

---
 doc/cheatsheet.md | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/doc/cheatsheet.md b/doc/cheatsheet.md
index 5221def92..6a0ce2581 100644
--- a/doc/cheatsheet.md
+++ b/doc/cheatsheet.md
@@ -1,14 +1,14 @@
 # Cheatsheet
 
-[Generic](#Generic)
-[iClass](#iClass)
-[Mifare](#Mifare)
-[HID Prox](#prox-id)
-[Indala](#indala-id)
-[Hitag](#hitag-id)
-[T55XX](#T55XX)
-[Data](#Data)
-[Lua Scripts](#Lua Scripts)
+- [Generic](#Generic)
+- [iClass](#iClass)
+- [Mifare](#Mifare)
+- [HID Prox](#HID-Prox)
+- [Indala](#Indala)
+- [Hitag](#Hitag)
+- [T55XX](#T55XX)
+- [Data](#Data)
+- [Lua Scripts](#Lua-Scripts)
 
 
 ## Generic

From 1da98c7aa6f72c1424069256534bc87a8512b1d2 Mon Sep 17 00:00:00 2001
From: Iceman <iceman@iuse.se>
Date: Tue, 13 Aug 2019 16:04:47 +0200
Subject: [PATCH 04/19] Update cheatsheet.md

---
 doc/cheatsheet.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/doc/cheatsheet.md b/doc/cheatsheet.md
index 6a0ce2581..3fcaf9876 100644
--- a/doc/cheatsheet.md
+++ b/doc/cheatsheet.md
@@ -250,7 +250,7 @@ pm3 --> hf mf dump
 pm3 --> hf mf restore 1 u 4A6CE843 k hf-mf-A29558E4-key.bin f hf-mf-A29558E4-data.bin
 ```
 
-## HID Prox {#prox-id}
+## HID Prox
 
 Read HID Prox card
 ```
@@ -299,7 +299,7 @@ pm3 --> lf hid brute a 26 f 224
 pm3 --> lf hid brute v a 26 f 21 c 200 d 2000
 ```
 
-## Indala {#indala-id}
+## Indala
 
 Read Indala card
 ```
@@ -329,7 +329,7 @@ Options
 pm3 --> lf indala clone a0000000c2c436c1
 ```
 
-## Hitag {#hitag-id}
+## Hitag
 
 Read Hitag information
 ```

From 961f98c125e6cce26fd593987b209c21669df245 Mon Sep 17 00:00:00 2001
From: cjbrigato <colin@brigato.fr>
Date: Tue, 13 Aug 2019 15:58:08 +0200
Subject: [PATCH 05/19] SPIFFS : FIXES FS corruption against high numbero f
 current losses, high number of files manipulation. FIXES LOG_BLOCK erasing
 handlers. FIXES Garbage Collector. Overall, SPIFFS should now be WAY MORE
 resilient to any form of misbehavior. In case of corrupted filesystem (should
 still be readable !), spamming 'mem spiffs check' from the client will ensure
 at least 2 new free 4k blocks each tile (if number of LOG_PAGE available is
 enough) and in the same pass will move/reorganize the LOG_PAGES of contextual
 blocks. Yiha

---
 armsrc/Standalone/hf_colin.c | 41 +++++++++------------
 armsrc/appmain.c             |  9 +++++
 armsrc/spiffs.c              | 71 ++++++++++++++++++------------------
 armsrc/spiffs.h              | 10 +++--
 armsrc/spiffs_cache.c        |  8 ++--
 armsrc/spiffs_config.h       | 21 +++++++++--
 client/cmdflashmemspiffs.c   |  8 ++++
 include/pm3_cmd.h            |  1 +
 8 files changed, 100 insertions(+), 69 deletions(-)

diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c
index a45dd71c3..4fe898a18 100644
--- a/armsrc/Standalone/hf_colin.c
+++ b/armsrc/Standalone/hf_colin.c
@@ -8,27 +8,8 @@
 //-----------------------------------------------------------------------------
 // main code for HF Mifare aka ColinRun by Colin Brigato
 //-----------------------------------------------------------------------------
-#include "standalone.h" // standalone definitions
-#include <stdbool.h>    // for bool
-#include <stdio.h>
-#include <inttypes.h>
 #include "hf_colin.h"
-#include "appmain.h"
-#include "fpgaloader.h"
-#include "dbprint.h"
-#include "ticks.h"
-#include "commonutil.h"
-#include "crc16.h"
-#include "BigBuf.h"
 #include "frozen.h"
-#include "proxmark3_arm.h"
-#include "mifaresim.h"  // mifare1ksim
-#include "mifareutil.h"
-#include "iso14443a.h"
-#include "util.h"
-#include "vtsend.h"
-#include "spiffs.h"
-#include "string.h"
 
 #define MF1KSZ 1024
 #define MF1KSZSIZE 64
@@ -720,8 +701,10 @@ readysim:
     SpinOff(100);
     LED_C_ON();
 
-    uint16_t flags;
-    switch (p_card.uidlen) {
+    DBGLEVEL = DBG_NONE;
+
+    //uint16_t flags=0;
+    /*switch (p_card.uidlen) {
         case 10:
             flags = FLAG_10B_UID_IN_DATA;
             break;
@@ -734,13 +717,23 @@ readysim:
         default:
             flags = FLAG_UID_IN_EMUL;
             break;
-    }
+    }*/
 
     // Use UID, SAK, ATQA from EMUL, if uid not defined
     // if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) {
-    flags |= FLAG_UID_IN_EMUL;
+    //flags |= FLAG_UID_IN_EMUL;
     //}
-    Mifare1ksim(flags | FLAG_MF_1K, 0, cjuid, 0, 0);
+    //flags |= FLAG_MF_1K;
+    //if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) {
+    //    flags |= FLAG_UID_IN_EMUL;
+    //}
+    //flags = 0x10;
+    uint16_t flags = 0;
+    flags = 16;
+    DbprintfEx(FLAG_NEWLINE,"\n\n\n\n\n\n\n\nn\n\nn\n\n\nflags: %d (0x%02x)",flags,flags);
+    cjSetCursLeft();
+    SpinOff(1000);
+    Mifare1ksim(flags , 0, cjuid);
     LED_C_OFF();
     SpinOff(50);
     vtsend_cursor_position_restore(NULL);
diff --git a/armsrc/appmain.c b/armsrc/appmain.c
index f163e579b..c54ff7255 100644
--- a/armsrc/appmain.c
+++ b/armsrc/appmain.c
@@ -1518,6 +1518,10 @@ static void PacketReceived(PacketCommandNG *packet) {
             test_spiffs();
             break;
         }
+        case CMD_SPIFFS_CHECK: {
+            rdv40_spiffs_check();
+            break;
+        }
         case CMD_SPIFFS_MOUNT: {
             rdv40_spiffs_lazy_mount();
             break;
@@ -1901,6 +1905,11 @@ void  __attribute__((noreturn)) AppMain(void) {
 #ifdef WITH_FLASH
     // If flash is not present, BUSY_TIMEOUT kicks in, let's do it after USB
     loadT55xxConfig();
+
+    // 
+    // Enforce a spiffs check/garbage collection at boot so we are likely to never
+    // fall under the 2 contigous free blocks availables
+    rdv40_spiffs_check();
 #endif
 
     for (;;) {
diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c
index df827b4e3..18f20187c 100644
--- a/armsrc/spiffs.c
+++ b/armsrc/spiffs.c
@@ -22,9 +22,11 @@
 // case, will ensure a flush by rollbacking to previous Unmounted state
 #define RDV40_SPIFFS_CACHE_SZ ((LOG_PAGE_SIZE + 32) * 4)
 #define SPIFFS_FD_SIZE (32)
-#define RDV40_SPIFFS_MAX_FD (2)
+#define RDV40_SPIFFS_MAX_FD (3)
 #define RDV40_SPIFFS_FDBUF_SZ (SPIFFS_FD_SIZE * RDV40_SPIFFS_MAX_FD)
 
+#define RDV40_LLERASE_BLOCKSIZE (64*1024)
+
 #define RDV40_SPIFFS_LAZY_HEADER                                                                                       \
     int changed = 0;                                                                                                   \
     if ((level == RDV40_SPIFFS_SAFETY_LAZY) || (level == RDV40_SPIFFS_SAFETY_SAFE)) {                                  \
@@ -43,12 +45,6 @@
     RDV40_SPIFFS_SAFE_FOOTER
 
 #include "spiffs.h"
-#include "flashmem.h"
-#include "dbprint.h"
-#include "printf.h"
-#include "common.h"
-#include "string.h"
-#include "BigBuf.h"
 
 ///// FLASH LEVEL R/W/E operations  for feeding SPIFFS Driver/////////////////
 static s32_t rdv40_spiffs_llread(u32_t addr, u32_t size, u8_t *dst) {
@@ -70,28 +66,29 @@ static s32_t rdv40_spiffs_llwrite(u32_t addr, u32_t size, u8_t *src) {
 
 static s32_t rdv40_spiffs_llerase(u32_t addr, u32_t size) {
 
+
+    uint8_t erased = 0;
+
     if (!FlashInit()) {
         return 130;
     }
-
-    uint32_t bytes_erased = 0, bytes_remaining = size;
-    while (bytes_remaining > 0) {
-
-        addr += bytes_erased;
+	if (DBGLEVEL > 2) Dbprintf("LLERASEDBG : Orig addr : %d\n", addr);
+        uint8_t block, sector = 0;
+        block = addr / RDV40_LLERASE_BLOCKSIZE;
+        if (block){
+            addr = addr - (block*RDV40_LLERASE_BLOCKSIZE);
+	}
+        if (DBGLEVEL > 2) Dbprintf("LLERASEDBG : Result addr : %d\n", addr);
+	sector = addr / SPIFFS_CFG_LOG_BLOCK_SZ;
         Flash_CheckBusy(BUSY_TIMEOUT);
         Flash_WriteEnable();
-        FlashSendByte(SECTORERASE);
-        Flash_TransferAdresse(addr);
-        FlashSendLastByte(0);
-
-        bytes_remaining -= 4096;
-        bytes_erased += 4096;
-    }
+        if (DBGLEVEL > 2) Dbprintf("LLERASEDBG : block : %d, sector : %d \n", block, sector);
+        erased = Flash_Erase4k(block, sector);
 
     Flash_CheckBusy(BUSY_TIMEOUT);
     FlashStop();
 
-    return SPIFFS_OK;
+    return SPIFFS_OK == erased ;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -162,6 +159,15 @@ int rdv40_spiffs_unmount() {
     }
     return ret;
 }
+
+int rdv40_spiffs_check() {
+   rdv40_spiffs_lazy_mount();
+   SPIFFS_check(&fs);
+   SPIFFS_gc_quick(&fs,0);
+   rdv40_spiffs_lazy_unmount();
+   rdv40_spiffs_lazy_mount();
+   return SPIFFS_gc(&fs,8192) == SPIFFS_OK;
+}
 ////////////////////////////////////////////////////////////////////////////////
 
 ///// Base RDV40_SPIFFS_SAFETY_NORMAL operations////////////////////////////////
@@ -533,21 +539,16 @@ void rdv40_spiffs_safe_print_fsinfo() {
     rdv40_spiffs_fsinfo fsinfo;
     rdv40_spiffs_getfsinfo(&fsinfo, RDV40_SPIFFS_SAFETY_SAFE);
     DbpString(_BLUE_("Flash Memory FileSystem Info (SPIFFS)"));
-//    Dbprintf("-------------------------------------");
-    Dbprintf("  Logical Block Size........." _YELLOW_("%d")"bytes", fsinfo.blockSize);
-    Dbprintf("  Logical Page Size.........." _YELLOW_("%d")"bytes", fsinfo.pageSize);
-    Dbprintf("");
-    Dbprintf("  Max Open Files............." _YELLOW_("%d")"file descriptors", fsinfo.maxOpenFiles);
-    Dbprintf("  Max Path Length............" _YELLOW_("%d")"chars", fsinfo.maxPathLength);
-//    DbpString(_BLUE_("Details"));
-    DbpString("");
-    Dbprintf("  Filesystem\tSize\tUsed\tAvailable\tUse%\tMounted on");
-    Dbprintf("  spiffs    \t%d B\t%d B\t%d B\t\t"_YELLOW_("%d%")"\t/"
-             , fsinfo.totalBytes
-             , fsinfo.usedBytes
-             , fsinfo.freeBytes
-             , fsinfo.usedPercent
-            );
+    Dbprintf("-------------------------------------");
+    Dbprintf("* Filesystem Logical Block Size.........%d bytes", fsinfo.blockSize);
+    Dbprintf("* Filesystem Logical Page Size..........%d bytes", fsinfo.pageSize);
+    Dbprintf("--");
+    Dbprintf("* Filesystem Max Open Files.............%d file descriptors", fsinfo.maxOpenFiles);
+    Dbprintf("* Filesystem Max Path Length............%d chars", fsinfo.maxPathLength);
+    Dbprintf("--");
+    Dbprintf("Filesystem\tSize\tUsed\tAvailable\tUse%\tMounted on");
+    Dbprintf("spiffs\t%dB\t%dB\t%dB\t\t%d%\t/", fsinfo.totalBytes, fsinfo.usedBytes, fsinfo.freeBytes,
+             fsinfo.usedPercent);
 }
 
 // this function is safe and WILL rollback since it is only a PRINTING function,
diff --git a/armsrc/spiffs.h b/armsrc/spiffs.h
index 29e8215b0..d75335e40 100644
--- a/armsrc/spiffs.h
+++ b/armsrc/spiffs.h
@@ -7,8 +7,9 @@
 
 #ifndef SPIFFS_H_
 #define SPIFFS_H_
-
-#include "common.h"
+#if defined(__cplusplus)
+extern "C" {
+#endif
 
 #include "spiffs_config.h"
 
@@ -32,7 +33,7 @@ typedef struct rdv40_spiffs_fsinfo {
 
 int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level);
 
-
+int rdv40_spiffs_check();
 int rdv40_spiffs_lazy_unmount();
 int rdv40_spiffs_lazy_mount();
 int rdv40_spiffs_lazy_mount_rollback(int changed);
@@ -853,5 +854,8 @@ u32_t SPIFFS_buffer_bytes_for_cache(spiffs *fs, u32_t num_pages);
 
 #if SPIFFS_CACHE
 #endif
+#if defined(__cplusplus)
+}
+#endif
 
 #endif /* SPIFFS_H_ */
diff --git a/armsrc/spiffs_cache.c b/armsrc/spiffs_cache.c
index f86133be4..98acc4c2f 100644
--- a/armsrc/spiffs_cache.c
+++ b/armsrc/spiffs_cache.c
@@ -39,17 +39,17 @@ static s32_t spiffs_cache_page_free(spiffs *fs, int ix, u8_t write_back) {
                 (cp->flags & SPIFFS_CACHE_FLAG_TYPE_WR) == 0 &&
                 (cp->flags & SPIFFS_CACHE_FLAG_DIRTY)) {
             u8_t *mem =  spiffs_get_cache_page(fs, cache, ix);
-            SPIFFS_CACHE_DBG("CACHE_FREE: write cache page "_SPIPRIi" pix "_SPIPRIpg"\n", ix, cp->pix);
+            SPIFFS_CACHE_DBG("CACHE_FREE: write cache page "_SPIPRIi" pix "_SPIPRIpg"\n", ix, cp->ucache.spix.pix);
             res = SPIFFS_HAL_WRITE(fs, SPIFFS_PAGE_TO_PADDR(fs, cp->ucache.spix.pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), mem);
         }
 
 #if SPIFFS_CACHE_WR
         if (cp->flags & SPIFFS_CACHE_FLAG_TYPE_WR) {
-            SPIFFS_CACHE_DBG("CACHE_FREE: free cache page "_SPIPRIi" objid "_SPIPRIid"\n", ix, cp->obj_id);
+            SPIFFS_CACHE_DBG("CACHE_FREE: free cache page "_SPIPRIi" objid "_SPIPRIid"\n", ix, cp->ucache.swrc.obj_id);
         } else
 #endif
         {
-            SPIFFS_CACHE_DBG("CACHE_FREE: free cache page "_SPIPRIi" pix "_SPIPRIpg"\n", ix, cp->pix);
+            SPIFFS_CACHE_DBG("CACHE_FREE: free cache page "_SPIPRIi" pix "_SPIPRIpg"\n", ix, cp->ucache.spix.pix);
         }
         cache->cpage_use_map &= ~(1 << ix);
         cp->flags = 0;
@@ -156,7 +156,7 @@ s32_t spiffs_phys_rd(
         if (cp) {
             cp->flags = SPIFFS_CACHE_FLAG_WRTHRU;
             cp->ucache.spix.pix = SPIFFS_PADDR_TO_PAGE(fs, addr);
-            SPIFFS_CACHE_DBG("CACHE_ALLO: allocated cache page "_SPIPRIi" for pix "_SPIPRIpg "\n", cp->ix, cp->pix);
+            SPIFFS_CACHE_DBG("CACHE_ALLO: allocated cache page "_SPIPRIi" for pix "_SPIPRIpg "\n", cp->ix, cp->ucache.spix.pix);
 
             s32_t res2 = SPIFFS_HAL_READ(fs,
                                          addr - SPIFFS_PADDR_TO_PAGE_OFFSET(fs, addr),
diff --git a/armsrc/spiffs_config.h b/armsrc/spiffs_config.h
index 6fe1f48c6..7710a65a8 100644
--- a/armsrc/spiffs_config.h
+++ b/armsrc/spiffs_config.h
@@ -8,7 +8,22 @@
 #ifndef SPIFFS_CONFIG_H_
 #define SPIFFS_CONFIG_H_
 
-#include "common.h"
+// ----------- 8< ------------
+// Following includes are for the linux test build of spiffs
+// These may/should/must be removed/altered/replaced in your target
+//#include <stdio.h>
+//#include <stdlib.h>
+//
+#include "printf.h"
+#include "string.h"
+#include "flashmem.h"
+
+void Dbprintf(const char *fmt, ...);
+
+//#include <stddef.h>
+//#include <unistd.h>
+// ----------- >8 ------------
+
 
 typedef int s32_t;
 typedef uint32_t u32_t;
@@ -26,7 +41,7 @@ typedef uint8_t u8_t;
 #endif
 // Set spiffs debug output call for garbage collecting.
 #ifndef SPIFFS_GC_DBG
-#define SPIFFS_GC_DBG(_f, ...)
+#define SPIFFS_GC_DBG(_f, ...) //Dbprintf(_f, ## __VA_ARGS__)
 #define SPIFFS_GC_DBGF(str) SPIFFS_GC_DBG(str,NULL)
 #endif
 // Set spiffs debug output call for caching.
@@ -36,7 +51,7 @@ typedef uint8_t u8_t;
 #endif
 // Set spiffs debug output call for system consistency checks.
 #ifndef SPIFFS_CHECK_DBG
-#define SPIFFS_CHECK_DBG(_f, ...) //SPIFFS_CHECK_DBG(_f, ## __VA_ARGS__)
+#define SPIFFS_CHECK_DBG(_f, ...) //Dbprintf(_f, ## __VA_ARGS__)
 #define SPIFFS_CHECK_DBGF(str) SPIFFS_CHECK_DBG(str,NULL)
 #endif
 // Set spiffs debug output call for all api invocations.
diff --git a/client/cmdflashmemspiffs.c b/client/cmdflashmemspiffs.c
index a3f9b950a..f53e17915 100644
--- a/client/cmdflashmemspiffs.c
+++ b/client/cmdflashmemspiffs.c
@@ -39,6 +39,13 @@ static int CmdFlashMemSpiFFSTest(const char *Cmd) {
     return PM3_SUCCESS;
 }
 
+static int CmdFlashMemSpiFFSCheck(const char *Cmd) {
+    (void)Cmd; // Cmd is not used so far
+    clearCommandBuffer();
+    SendCommandNG(CMD_SPIFFS_CHECK, NULL, 0);
+    return PM3_SUCCESS;
+}
+
 static int CmdFlashMemSpiFFSTree(const char *Cmd) {
     (void)Cmd; // Cmd is not used so far
     clearCommandBuffer();
@@ -439,6 +446,7 @@ static command_t CommandTable[] = {
         "copy", CmdFlashMemSpiFFSCopy, IfPm3Flash,
         "Copy a file to another (destructively) in SPIFFS FileSystem in FlashMEM (spiffs)"
     },
+    {"check", CmdFlashMemSpiFFSCheck, IfPm3Flash, "Check/try to defrag faulty/fragmented Filesystem"},
     {"dump", CmdFlashMemSpiFFSDump, IfPm3Flash, "Dump a file from SPIFFS FileSystem in FlashMEM (spiffs)"},
     {"info", CmdFlashMemSpiFFSInfo, IfPm3Flash, "Print filesystem info and usage statistics (spiffs)"},
     {"load", CmdFlashMemSpiFFSLoad, IfPm3Flash, "Upload file into SPIFFS Filesystem (spiffs)"},
diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h
index 3d7b156bd..742f45f6e 100644
--- a/include/pm3_cmd.h
+++ b/include/pm3_cmd.h
@@ -299,6 +299,7 @@ typedef struct {
 #define CMD_SPIFFS_PRINT_FSINFO                                           0x2133
 #define CMD_SPIFFS_DOWNLOAD                                               0x2134
 #define CMD_SPIFFS_DOWNLOADED                                             0x2135
+#define CMD_SPIFFS_CHECK						  0x3000
 // more ?
 
 

From 0ace6bffb821c13b07cabd95ec74f69308cace17 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Tue, 13 Aug 2019 17:16:43 +0200
Subject: [PATCH 06/19] missing includes for spiffs

---
 armsrc/appmain.h | 1 -
 armsrc/spiffs.c  | 2 ++
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/armsrc/appmain.h b/armsrc/appmain.h
index fa35714e3..141c943f9 100644
--- a/armsrc/appmain.h
+++ b/armsrc/appmain.h
@@ -34,7 +34,6 @@ void __attribute__((noreturn)) AppMain(void);
 
 uint16_t AvgAdc(int ch);
 
-void print_result(char *name, uint8_t *buf, size_t len);
 //void PrintToSendBuffer(void);
 void ToSendStuffBit(int b);
 void ToSendReset(void);
diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c
index 18f20187c..e642a0e29 100644
--- a/armsrc/spiffs.c
+++ b/armsrc/spiffs.c
@@ -45,6 +45,8 @@
     RDV40_SPIFFS_SAFE_FOOTER
 
 #include "spiffs.h"
+#include "BigBuf.h"
+#include "dbprint.h"
 
 ///// FLASH LEVEL R/W/E operations  for feeding SPIFFS Driver/////////////////
 static s32_t rdv40_spiffs_llread(u32_t addr, u32_t size, u8_t *dst) {

From 763c94334b7f61dc06e962f9386f3d72650736e2 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Tue, 13 Aug 2019 17:27:52 +0200
Subject: [PATCH 07/19] add missing includes and fix mf1ksim usage in hf_colin
 standalone mode

---
 armsrc/Standalone/hf_colin.c | 18 +++++++++++++++++-
 armsrc/Standalone/hf_colin.h |  4 ++++
 armsrc/iso14443a.h           |  1 +
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c
index 4fe898a18..21df29b9d 100644
--- a/armsrc/Standalone/hf_colin.c
+++ b/armsrc/Standalone/hf_colin.c
@@ -8,7 +8,23 @@
 //-----------------------------------------------------------------------------
 // main code for HF Mifare aka ColinRun by Colin Brigato
 //-----------------------------------------------------------------------------
+
+#include "standalone.h" // standalone definitions
+
 #include "hf_colin.h"
+#include "proxmark3_arm.h"
+#include "appmain.h"
+#include "fpgaloader.h"
+#include "dbprint.h"
+#include "ticks.h"
+#include "util.h"
+#include "commonutil.h"
+#include "BigBuf.h"
+#include "iso14443a.h"
+#include "mifareutil.h"
+#include "mifaresim.h"
+#include "vtsend.h"
+#include "spiffs.h"
 #include "frozen.h"
 
 #define MF1KSZ 1024
@@ -733,7 +749,7 @@ readysim:
     DbprintfEx(FLAG_NEWLINE,"\n\n\n\n\n\n\n\nn\n\nn\n\n\nflags: %d (0x%02x)",flags,flags);
     cjSetCursLeft();
     SpinOff(1000);
-    Mifare1ksim(flags , 0, cjuid);
+    Mifare1ksim(flags , 0, cjuid, 0, 0);
     LED_C_OFF();
     SpinOff(50);
     vtsend_cursor_position_restore(NULL);
diff --git a/armsrc/Standalone/hf_colin.h b/armsrc/Standalone/hf_colin.h
index ca65a6df4..a4b870abc 100644
--- a/armsrc/Standalone/hf_colin.h
+++ b/armsrc/Standalone/hf_colin.h
@@ -9,6 +9,10 @@
 // StandAlone Mod
 //-----------------------------------------------------------------------------
 
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stddef.h>
+
 #ifndef FALSE
 #define FALSE 0
 #endif
diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h
index e4ea7f0df..1bea3a1b9 100644
--- a/armsrc/iso14443a.h
+++ b/armsrc/iso14443a.h
@@ -16,6 +16,7 @@
 #include "common.h"
 #include "mifare.h" // struct
 #include "pm3_cmd.h"
+#include "crc16.h"  // compute_crc
 
 // When the PM acts as tag and is receiving it takes
 // 2 ticks delay in the RF part (for the first falling edge),

From 3771c150f0345b85e1109197306bf2269db9c1b6 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Tue, 13 Aug 2019 17:42:03 +0200
Subject: [PATCH 08/19] make style

---
 armsrc/Standalone/hf_colin.c |  4 ++--
 armsrc/appmain.c             |  2 +-
 armsrc/spiffs.c              | 36 ++++++++++++++++++------------------
 3 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c
index 21df29b9d..265b7e3c9 100644
--- a/armsrc/Standalone/hf_colin.c
+++ b/armsrc/Standalone/hf_colin.c
@@ -746,10 +746,10 @@ readysim:
     //flags = 0x10;
     uint16_t flags = 0;
     flags = 16;
-    DbprintfEx(FLAG_NEWLINE,"\n\n\n\n\n\n\n\nn\n\nn\n\n\nflags: %d (0x%02x)",flags,flags);
+    DbprintfEx(FLAG_NEWLINE, "\n\n\n\n\n\n\n\nn\n\nn\n\n\nflags: %d (0x%02x)", flags, flags);
     cjSetCursLeft();
     SpinOff(1000);
-    Mifare1ksim(flags , 0, cjuid, 0, 0);
+    Mifare1ksim(flags, 0, cjuid, 0, 0);
     LED_C_OFF();
     SpinOff(50);
     vtsend_cursor_position_restore(NULL);
diff --git a/armsrc/appmain.c b/armsrc/appmain.c
index c54ff7255..b593c826b 100644
--- a/armsrc/appmain.c
+++ b/armsrc/appmain.c
@@ -1906,7 +1906,7 @@ void  __attribute__((noreturn)) AppMain(void) {
     // If flash is not present, BUSY_TIMEOUT kicks in, let's do it after USB
     loadT55xxConfig();
 
-    // 
+    //
     // Enforce a spiffs check/garbage collection at boot so we are likely to never
     // fall under the 2 contigous free blocks availables
     rdv40_spiffs_check();
diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c
index e642a0e29..cb4412264 100644
--- a/armsrc/spiffs.c
+++ b/armsrc/spiffs.c
@@ -74,18 +74,18 @@ static s32_t rdv40_spiffs_llerase(u32_t addr, u32_t size) {
     if (!FlashInit()) {
         return 130;
     }
-	if (DBGLEVEL > 2) Dbprintf("LLERASEDBG : Orig addr : %d\n", addr);
-        uint8_t block, sector = 0;
-        block = addr / RDV40_LLERASE_BLOCKSIZE;
-        if (block){
-            addr = addr - (block*RDV40_LLERASE_BLOCKSIZE);
-	}
-        if (DBGLEVEL > 2) Dbprintf("LLERASEDBG : Result addr : %d\n", addr);
-	sector = addr / SPIFFS_CFG_LOG_BLOCK_SZ;
-        Flash_CheckBusy(BUSY_TIMEOUT);
-        Flash_WriteEnable();
-        if (DBGLEVEL > 2) Dbprintf("LLERASEDBG : block : %d, sector : %d \n", block, sector);
-        erased = Flash_Erase4k(block, sector);
+    if (DBGLEVEL > 2) Dbprintf("LLERASEDBG : Orig addr : %d\n", addr);
+    uint8_t block, sector = 0;
+    block = addr / RDV40_LLERASE_BLOCKSIZE;
+    if (block) {
+        addr = addr - (block * RDV40_LLERASE_BLOCKSIZE);
+    }
+    if (DBGLEVEL > 2) Dbprintf("LLERASEDBG : Result addr : %d\n", addr);
+    sector = addr / SPIFFS_CFG_LOG_BLOCK_SZ;
+    Flash_CheckBusy(BUSY_TIMEOUT);
+    Flash_WriteEnable();
+    if (DBGLEVEL > 2) Dbprintf("LLERASEDBG : block : %d, sector : %d \n", block, sector);
+    erased = Flash_Erase4k(block, sector);
 
     Flash_CheckBusy(BUSY_TIMEOUT);
     FlashStop();
@@ -163,12 +163,12 @@ int rdv40_spiffs_unmount() {
 }
 
 int rdv40_spiffs_check() {
-   rdv40_spiffs_lazy_mount();
-   SPIFFS_check(&fs);
-   SPIFFS_gc_quick(&fs,0);
-   rdv40_spiffs_lazy_unmount();
-   rdv40_spiffs_lazy_mount();
-   return SPIFFS_gc(&fs,8192) == SPIFFS_OK;
+    rdv40_spiffs_lazy_mount();
+    SPIFFS_check(&fs);
+    SPIFFS_gc_quick(&fs, 0);
+    rdv40_spiffs_lazy_unmount();
+    rdv40_spiffs_lazy_mount();
+    return SPIFFS_gc(&fs, 8192) == SPIFFS_OK;
 }
 ////////////////////////////////////////////////////////////////////////////////
 

From 847b6bcc3370e89894ca6236caeec434752a76de Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Tue, 13 Aug 2019 17:51:11 +0200
Subject: [PATCH 09/19] remove tabs

---
 Makefile          | 11 ++++++++---
 doc/cheatsheet.md |  2 +-
 fpga/fpga_lf.v    | 14 +++++++-------
 fpga/lo_adc.v     | 20 ++++++++++----------
 include/pm3_cmd.h |  2 +-
 5 files changed, 27 insertions(+), 22 deletions(-)

diff --git a/Makefile b/Makefile
index 58c61281f..9be67311b 100644
--- a/Makefile
+++ b/Makefile
@@ -164,11 +164,16 @@ style:
 
 # Detecting weird codepages and tabs.
 checks:
-	find . \( -name "*.[ch]" -or -name "*.cpp" -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "Makefile" -or -name "*.v" \) \
+	@echo "Files with suspicious chars:"
+	@find . \( -name "*.[ch]" -or -name "*.cpp" -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "Makefile" -or -name "*.v" \) \
 	      -exec sh -c "cat {} |recode utf8.. >/dev/null || echo {}" \;
-	find . \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "*.md" -or -name "*.txt" -or -name "*.awk" -or -name "*.v" \) \
-	      -exec grep -lP '\t' {} \;
+	@echo "Files with tabs:"
 # to remove tabs within lines, one can try with: vi $file -c ':set tabstop=4' -c ':set et|retab' -c ':wq'
+	@find . \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "*.md" -or -name "*.txt" -or -name "*.awk" -or -name "*.v" \) \
+	      -exec grep -lP '\t' {} \;
+#	@echo "Files with printf \\\\t:"
+#	@find . \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "*.md" -or -name "*.txt" -or -name "*.awk" -or -name "*.v" \) \
+#	      -exec grep -lP '\\t' {} \;
 
 # Dummy target to test for GNU make availability
 _test:
diff --git a/doc/cheatsheet.md b/doc/cheatsheet.md
index 3fcaf9876..ecef56d9d 100644
--- a/doc/cheatsheet.md
+++ b/doc/cheatsheet.md
@@ -448,7 +448,7 @@ Convert .bin to .eml
 ```
 Options
 ---
-i <file>	: Specifies the dump-file (input). If omitted, 'dumpdata.bin' is used
+i <file>    : Specifies the dump-file (input). If omitted, 'dumpdata.bin' is used
 
 script run dumptoemul -i xxxxxxxxxxxxxx.bin
 ```
diff --git a/fpga/fpga_lf.v b/fpga/fpga_lf.v
index 20d2ca440..88b22b7ca 100644
--- a/fpga/fpga_lf.v
+++ b/fpga/fpga_lf.v
@@ -102,13 +102,13 @@ lo_edge_detect le(
 );
 
 lo_adc la(
-	pck0,
-	la_pwr_lo, la_pwr_hi, la_pwr_oe1, la_pwr_oe2, la_pwr_oe3, la_pwr_oe4,
-	adc_d, la_adc_clk,
-	la_ssp_frame, la_ssp_din, ssp_dout, la_ssp_clk,
-	cross_hi, cross_lo,
-	la_dbg, divisor,
-	lo_is_125khz, lf_field
+    pck0,
+    la_pwr_lo, la_pwr_hi, la_pwr_oe1, la_pwr_oe2, la_pwr_oe3, la_pwr_oe4,
+    adc_d, la_adc_clk,
+    la_ssp_frame, la_ssp_din, ssp_dout, la_ssp_clk,
+    cross_hi, cross_lo,
+    la_dbg, divisor,
+    lo_is_125khz, lf_field
 );
 
 // Major modes:
diff --git a/fpga/lo_adc.v b/fpga/lo_adc.v
index dff9fda3f..57e9eebc8 100644
--- a/fpga/lo_adc.v
+++ b/fpga/lo_adc.v
@@ -55,28 +55,28 @@ assign ssp_frame = (pck_divider[7:3] == 5'd1) && !clk_state;
 
 always @(posedge pck0)
 begin
-	if(pck_divider == divisor[7:0])
+    if(pck_divider == divisor[7:0])
   begin
-		pck_divider <= 8'd0;
-		clk_state = !clk_state;
+        pck_divider <= 8'd0;
+        clk_state = !clk_state;
   end
-	else
-	begin
-		pck_divider <= pck_divider + 1;
-	end
+    else
+    begin
+        pck_divider <= pck_divider + 1;
+    end
 end
 
 always @(posedge pck0)
 begin
-	if((pck_divider == 8'd7) && !clk_state)
+    if((pck_divider == 8'd7) && !clk_state)
   begin
       to_arm_shiftreg <= adc_d;
   end
   else
-	begin
+    begin
     to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0];
     to_arm_shiftreg[0] <= 1'b0;
-	end
+    end
 end
 
 endmodule
diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h
index 742f45f6e..035e85405 100644
--- a/include/pm3_cmd.h
+++ b/include/pm3_cmd.h
@@ -299,7 +299,7 @@ typedef struct {
 #define CMD_SPIFFS_PRINT_FSINFO                                           0x2133
 #define CMD_SPIFFS_DOWNLOAD                                               0x2134
 #define CMD_SPIFFS_DOWNLOADED                                             0x2135
-#define CMD_SPIFFS_CHECK						  0x3000
+#define CMD_SPIFFS_CHECK                                                  0x3000
 // more ?
 
 

From 252929bed4d318fb50a882dc93344035cc4c0ac2 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Tue, 13 Aug 2019 20:30:19 +0200
Subject: [PATCH 10/19] fix lf read command parsing bug

---
 client/cmdlf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/client/cmdlf.c b/client/cmdlf.c
index cf8e60f82..366f2ed0e 100644
--- a/client/cmdlf.c
+++ b/client/cmdlf.c
@@ -453,7 +453,7 @@ int CmdLFRead(const char *Cmd) {
                 cmdp++;
                 break;
             case 'd':
-                samples = param_get32ex(Cmd, cmdp, 0, 10);
+                samples = param_get32ex(Cmd, cmdp + 1, 0, 10);
                 cmdp += 2;
                 break;
             default:

From db0ac1639b5d811a6f22c8bddc5a7219f3f2dce3 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Tue, 13 Aug 2019 22:57:54 +0200
Subject: [PATCH 11/19] em4x watch & read: collect enough samples to cover EM
 XL tags

---
 client/cmdlfem4x.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/client/cmdlfem4x.c b/client/cmdlfem4x.c
index a87fd46eb..c04e64c00 100644
--- a/client/cmdlfem4x.c
+++ b/client/cmdlfem4x.c
@@ -442,7 +442,7 @@ static int CmdEM410xDemod(const char *Cmd) {
 
 // this read is the "normal" read,  which download lf signal and tries to demod here.
 static int CmdEM410xRead(const char *Cmd) {
-    lf_read(true, 8192);
+    lf_read(true, 12288);
     return CmdEM410xDemod(Cmd);
 }
 
@@ -599,7 +599,7 @@ static int CmdEM410xWatch(const char *Cmd) {
             PrintAndLogEx(WARNING, "\naborted via keyboard!\n");
             break;
         }
-        lf_read(true, 8201);
+        lf_read(true, 12288);
 
     } while (CmdEM410xRead("") != PM3_SUCCESS);
     return PM3_SUCCESS;

From ea601f4052d044915782b5adf0a321018a9c6f70 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Wed, 14 Aug 2019 21:52:20 +0200
Subject: [PATCH 12/19] fix reveng for all platforms else than WIN32

---
 CHANGELOG.md           |  1 +
 client/Makefile        | 33 +++++++++++++++++++++------------
 client/reveng/bmpbit.c |  2 +-
 client/reveng/config.h | 34 ++++++++++++++++++++++------------
 4 files changed, 45 insertions(+), 25 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a6aab7919..b5f7d8d76 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
 This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
 
 ## [unreleased][unreleased]
+ - Fix reveng integration for all platforms else than WIN32 (@doegox)
  - Add cheat sheet for easy operations of the Proxmark3 (scund00r)
  - Chg commands are now in green in the helptext list (@iceman1001)
  - Fix 'script run ndefdump' - better exit messages when failing (@iceman1001)
diff --git a/client/Makefile b/client/Makefile
index adf83cb18..89f8cfb44 100644
--- a/client/Makefile
+++ b/client/Makefile
@@ -22,6 +22,8 @@ TAR = tar
 TARFLAGS = -C .. --ignore-failed-read -rvf
 RM = rm -f
 MV = mv
+TOUCH = touch
+FALSE = false
 
 ENV_LDFLAGS := $(LDFLAGS)
 ENV_CFLAGS := $(CFLAGS)
@@ -52,11 +54,11 @@ MBEDTLSLIBPATH = ../common/mbedtls
 MBEDTLSLIB = $(MBEDTLSLIBPATH)/libmbedtls.a
 CBORLIBPATH = ./tinycbor
 CBORLIB = $(CBORLIBPATH)/tinycbor.a
+REVENGFLAGS = -DPRESETS
 LIBS = -I../common/zlib -Iuart -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH)
 INCLUDES_CLIENT = -I. -I../include -I../common -I/opt/local/include $(LIBS)
 LDFLAGS = $(ENV_LDFLAGS)
-
-CFLAGS = $(ENV_CFLAGS) -std=c99 -D_ISOC99_SOURCE -DPRESETS $(INCLUDES_CLIENT) -Wall -Werror -g -O3
+CFLAGS = $(ENV_CFLAGS) -std=c99 -D_ISOC99_SOURCE $(REVENGFLAGS) $(INCLUDES_CLIENT) -Wall -Werror -g -O3
 ifneq (,$(findstring MINGW,$(platform)))
     CFLAGS += -mno-ms-bitfields
 endif
@@ -239,12 +241,6 @@ CMDSRCS =   crapto1/crapto1.c \
             cmdscript.c \
             pm3_bitlib.c \
             cmdcrc.c \
-            reveng/preset.c \
-            reveng/reveng.c \
-            reveng/cli.c \
-            reveng/bmpbit.c \
-            reveng/model.c \
-            reveng/poly.c \
             bucketsort.c
 
 cpu_arch = $(shell uname -m)
@@ -262,12 +258,20 @@ ZLIBSRCS = deflate.c adler32.c trees.c zutil.c inflate.c inffast.c inftrees.c
 ZLIBFLAGS = -DZ_SOLO -DZ_PREFIX -DNO_GZIP -DZLIB_PM3_TUNED
 #-DDEBUG -Dverbose=1
 
+REVENGSRCS = reveng/preset.c \
+            reveng/reveng.c \
+            reveng/cli.c \
+            reveng/bmpbit.c \
+            reveng/model.c \
+            reveng/poly.c
+
 QTGUISRCS = proxgui.cpp proxguiqt.cpp proxguiqt.moc.cpp guidummy.cpp
 
 COREOBJS = $(CORESRCS:%.c=$(OBJDIR)/%.o)
 CMDOBJS = $(CMDSRCS:%.c=$(OBJDIR)/%.o)
 OBJCOBJS = $(OBJCSRCS:%.m=$(OBJDIR)/%.o)
 ZLIBOBJS = $(ZLIBSRCS:%.c=$(OBJDIR)/%.o)
+REVENGOBJS = $(REVENGSRCS:%.c=$(OBJDIR)/%.o)
 MULTIARCHOBJS = $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_NOSIMD.o) \
             $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_MMX.o) \
             $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_SSE2.o) \
@@ -292,7 +296,7 @@ ifeq "$(SUPPORTS_AVX512)" "True"
 endif
 
 BINS = proxmark3 flasher
-CLEAN = $(BINS) $(DEPENDENCY_FILES) $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(ZLIBOBJS) $(QTGUIOBJS) $(MULTIARCHOBJS) $(OBJDIR)/*.o *.moc.cpp ui/ui_overlays.h lualibs/pm3_cmd.lua lualibs/mf_default_keys.lua
+CLEAN = $(BINS) $(DEPENDENCY_FILES) $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(ZLIBOBJS) $(REVENGOBJS) $(QTGUIOBJS) $(MULTIARCHOBJS) $(OBJDIR)/*.o *.moc.cpp ui/ui_overlays.h lualibs/pm3_cmd.lua lualibs/mf_default_keys.lua reveng/bmptst
 
 # need to assign dependancies to build these first...
 all: lua_build jansson_build mbedtls_build cbor_build $(BINS)
@@ -301,9 +305,9 @@ all-static: LDLIBS:=-static $(LDLIBS)
 all-static: $(BINS)
 
 proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(QTLDLIBS)
-proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(MULTIARCHOBJS) $(ZLIBOBJS) lualibs/pm3_cmd.lua lualibs/mf_default_keys.lua
+proxmark3: reveng/bmptst $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(MULTIARCHOBJS) $(ZLIBOBJS) $(REVENGOBJS) lualibs/pm3_cmd.lua lualibs/mf_default_keys.lua
 	$(info [=] LD $@)
-	$(Q)$(LD) $(LDFLAGS) $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(MULTIARCHOBJS) $(ZLIBOBJS) $(LDLIBS)  -o $@
+	$(Q)$(LD) $(LDFLAGS) $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(MULTIARCHOBJS) $(ZLIBOBJS) $(REVENGOBJS) $(LDLIBS)  -o $@
 
 flasher: $(OBJDIR)/flash.o $(OBJDIR)/flasher.o $(COREOBJS) $(OBJCOBJS)
 	$(info [=] LD $@)
@@ -354,6 +358,11 @@ cbor_build:
 	$(info [*] MAKE tinycbor)
 	$(Q)$(MAKE) --no-print-directory -C $(CBORLIBPATH) all
 
+
+reveng/bmptst: reveng/bmpbit.c reveng/config.h reveng/reveng.h
+	$(CC) $(CFLAGS) $(REVENGFLAGS) -DBMPTST -o $@ $<
+	( ./$@ && $(TOUCH) $@ ) || ( $(RM) $@ && $(FALSE) )
+
 .PHONY: all clean
 
 # easy printing of MAKE VARIABLES
@@ -419,7 +428,7 @@ $(OBJDIR)/%.o : %.m $(OBJDIR)/%.d
 #	$(CXX) $(DEPFLAGS) $(CXXFLAGS) -c -o $@ $<
 #	$(POSTCOMPILE)
 
-DEPENDENCY_FILES = $(patsubst %.c, $(OBJDIR)/%.d, $(CORESRCS) $(CMDSRCS) $(ZLIBSRCS)) \
+DEPENDENCY_FILES = $(patsubst %.c, $(OBJDIR)/%.d, $(CORESRCS) $(CMDSRCS) $(ZLIBSRCS) $(REVENGSRCS)) \
 	$(patsubst %.o, %.d, $(MULTIARCHOBJS)) \
 	$(patsubst %.cpp, $(OBJDIR)/%.d, $(QTGUISRCS)) \
 	$(patsubst %.m, $(OBJDIR)/%.d, $(OBJCSRCS)) \
diff --git a/client/reveng/bmpbit.c b/client/reveng/bmpbit.c
index d529b0e96..e44ddb250 100644
--- a/client/reveng/bmpbit.c
+++ b/client/reveng/bmpbit.c
@@ -67,7 +67,7 @@ main(int argc, char *argv[]) {
     setbmp();
     if (BMP_BIT != bmpbit || BMP_SUB != bmpsub) {
         fprintf(stderr, "reveng: configuration fault.  Update "
-                "config.h with these definitions and "
+                "reveng/config.h with these definitions and "
                 "recompile:\n"
                 "\t#define BMP_BIT   %d\n"
                 "\t#define BMP_SUB   %d\n",
diff --git a/client/reveng/config.h b/client/reveng/config.h
index a4d46e9f2..55038b55a 100644
--- a/client/reveng/config.h
+++ b/client/reveng/config.h
@@ -57,33 +57,43 @@
 
 /* #define ALWPCK   1 */
 
-/* Define PRESETS to compile CRC RevEng with the preset models from the
+/* #define PRESETS  1
+ * Define PRESETS to compile CRC RevEng with the preset models from the
  * CRC Catalogue.  This implies BMPMACRO and so makes the code platform-
  * specific.
  */
 
-#ifdef _WIN32
-#define PRESETS  1 //
-#endif
-
-
-/* Macros defining the size of a bmp_t.
+/* #define BMP_BIT   32
+ * Macros defining the size of a bmp_t.
  * Their values only matter if PRESETS and/or BMPMACRO are defined, in
  * which case edit the macros below to suit your architecture.
  * Otherwise, BMP_BIT and BMP_SUB will be redefined as aliases of bmpbit
  * and bmpsub, global objects initialised at run time.
  */
 
-/* Size in bits of a bmp_t.  Not necessarily a power of two. */
-
-#define BMP_BIT   32
-
-/* The highest power of two that is strictly less than BMP_BIT.
+/* #define BMP_SUB   16
+ * The highest power of two that is strictly less than BMP_BIT.
  * Initialises the index of a binary search for set bits in a bmp_t.
  */
 
+
+#if UINTMAX_MAX == UINT64_MAX
+// 64-bit
+#define PRESETS  1
+#define BMP_BIT   64
+#define BMP_SUB   32
+
+//#elif INTPTR_MAX == INT32_MAX
+#elif UINTMAX_MAX == UINT32_MAX
+// 32-bit
+#define PRESETS  1
+#define BMP_BIT   32
 #define BMP_SUB   16
 
+#else
+#error Cannot determine automatically REVENG PRESETS Macros for your platform, you need to set them manually
+#endif
+
 /*****************************************
  *                                       *
  *   End of user configuration options   *

From 2f029d0d9db70caedef0e972c8a5841d9a5c3358 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Wed, 14 Aug 2019 21:54:43 +0200
Subject: [PATCH 13/19] remove comment

---
 client/reveng/config.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/client/reveng/config.h b/client/reveng/config.h
index 55038b55a..b5498c5db 100644
--- a/client/reveng/config.h
+++ b/client/reveng/config.h
@@ -83,7 +83,6 @@
 #define BMP_BIT   64
 #define BMP_SUB   32
 
-//#elif INTPTR_MAX == INT32_MAX
 #elif UINTMAX_MAX == UINT32_MAX
 // 32-bit
 #define PRESETS  1

From a187968967a353fe70b751c812fa3018e9a9cca1 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Wed, 14 Aug 2019 22:19:52 +0200
Subject: [PATCH 14/19] Hmm, let's try to fix reveng on 32b

---
 client/reveng/config.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/client/reveng/config.h b/client/reveng/config.h
index b5498c5db..ab7eb9aaa 100644
--- a/client/reveng/config.h
+++ b/client/reveng/config.h
@@ -77,13 +77,13 @@
  */
 
 
-#if UINTMAX_MAX == UINT64_MAX
+#if UINTPTR_MAX == UINT64_MAX
 // 64-bit
 #define PRESETS  1
 #define BMP_BIT   64
 #define BMP_SUB   32
 
-#elif UINTMAX_MAX == UINT32_MAX
+#elif UINTPTR_MAX == UINT32_MAX
 // 32-bit
 #define PRESETS  1
 #define BMP_BIT   32

From f008b965d5b77e173c3f9718ee10481b221ec793 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Wed, 14 Aug 2019 23:06:14 +0200
Subject: [PATCH 15/19] missing include

---
 client/reveng/config.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/client/reveng/config.h b/client/reveng/config.h
index ab7eb9aaa..ecf17773f 100644
--- a/client/reveng/config.h
+++ b/client/reveng/config.h
@@ -77,6 +77,7 @@
  */
 
 
+#include <stdint.h>
 #if UINTPTR_MAX == UINT64_MAX
 // 64-bit
 #define PRESETS  1

From 4d16f3e7d2404ad28642b2bc947d541b5eb1235d Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Thu, 15 Aug 2019 19:24:50 +0200
Subject: [PATCH 16/19] fix reveng: unsigned long on Mingw64 is only 32b,
 hopefully limits.h can help

---
 client/reveng/config.h | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/client/reveng/config.h b/client/reveng/config.h
index ecf17773f..94d3c4da5 100644
--- a/client/reveng/config.h
+++ b/client/reveng/config.h
@@ -78,14 +78,15 @@
 
 
 #include <stdint.h>
-#if UINTPTR_MAX == UINT64_MAX
-// 64-bit
+#include <limits.h>
+#if ULONG_MAX == UINT64_MAX
+// most 64-bit platforms
 #define PRESETS  1
 #define BMP_BIT   64
 #define BMP_SUB   32
 
-#elif UINTPTR_MAX == UINT32_MAX
-// 32-bit
+#elif ULONG_MAX == UINT32_MAX
+// 32-bit platforms and Mingw64
 #define PRESETS  1
 #define BMP_BIT   32
 #define BMP_SUB   16

From 271011911349af981a1a1c4b04ac2d44ce0ab9c7 Mon Sep 17 00:00:00 2001
From: Iceman <iceman@iuse.se>
Date: Thu, 15 Aug 2019 21:28:45 +0200
Subject: [PATCH 17/19] Update README.md

---
 README.md | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 1af5d2157..6829fdff1 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,9 @@
-# Proxmark3 RDV4.0 Dedicated Github
+# RRG / Iceman repo, dedicated to Proxmark3 RDV4.0 
 
 This repo is based on iceman fork for Proxmark3. It is dedicated to bringing the most out of the new features for Proxmark3 RDV4.0 new hardware and design.
-Note that it also supports other Proxmark3 platforms as well!
+
+_Note that it also supports other Proxmark3 platforms as well!_
+
 
 | Releases     | Linux & OSX CI       | Windows CI |
 | ------------------- |:-------------------:| -------------------:|

From ca5fbc843882dfa1dbb19c49fcbb021b4ea358dc Mon Sep 17 00:00:00 2001
From: Iceman <iceman@iuse.se>
Date: Thu, 15 Aug 2019 21:32:00 +0200
Subject: [PATCH 18/19] Update README.md

---
 README.md | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index 6829fdff1..23d412ff2 100644
--- a/README.md
+++ b/README.md
@@ -49,11 +49,14 @@ This fork now compiles just fine on
 If you intend to contribute to the code, please read the [coding style notes](HACKING.md) first.
 
 - Internal notes on [Coverity Scan Config & Run](/doc/md/Development/Coverity-Scan-Config-%26-Run.md).
-- Internal notes on UART
-- Internal notes on Frame format
-- Internal notes on standalone mode
-
+- Internal notes on [UART](/doc/uart_notes.md)
+- Internal notes on [Frame format](/doc/new_frame_format.md)
+- Internal notes on [external flash](/doc/ext_flash_notes.md)
+- Internal notes on [standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode)
+- Internal notes on [Termux / Android](/doc/termux_notes.md)
 
+## Cheat sheet
+Thanks to Alex Dibs, you can enjoy a [command cheat sheet](/doc/cheatsheet.md)
 
 ## Why didn't you base it on official Proxmark3 Master?
 

From d12b3c35f18e76c84b34fe9954d5e791b63b94da Mon Sep 17 00:00:00 2001
From: Iceman <iceman@iuse.se>
Date: Thu, 15 Aug 2019 21:32:54 +0200
Subject: [PATCH 19/19] Update README.md

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 23d412ff2..81c676b8d 100644
--- a/README.md
+++ b/README.md
@@ -42,8 +42,8 @@ This fork now compiles just fine on
    - Windows/mingw environment with Qt5.6.1 & GCC 4.8
    - Ubuntu 1404, 1510, 1604, 1804, 1904
    - Mac OS X / Homebrew
-   - ParrotOS
-   - WSL (Windows subsystem linux) on Windows 10
+   - ParrotOS, Gentoo, Pentoo
+   - WSL, WSL2  (Windows subsystem linux) on Windows 10
    - Docker container
 
 If you intend to contribute to the code, please read the [coding style notes](HACKING.md) first.