]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/util.c
Implement version information storage and retrieval for the bootrom and the osimage.
[proxmark3-svn] / armsrc / util.c
index 5af09f8868315538e4734e7de35d6f9e218a020d..650ba22bacb31914c142ffeee9a0a882c940fb3b 100644 (file)
@@ -52,6 +52,19 @@ int strlen(char *str)
        return l;\r
 }\r
 \r
+char* strncat(char *dest, const char *src, unsigned int n)\r
+{\r
+       unsigned int dest_len = strlen(dest);\r
+       unsigned int i;\r
+       \r
+       for (i = 0 ; i < n && src[i] != '\0' ; i++)\r
+               dest[dest_len + i] = src[i];\r
+       dest[dest_len + i] = '\0';\r
+       \r
+       return dest;\r
+}\r
+\r
+\r
 void LEDsoff()\r
 {\r
        LED_A_OFF();\r
@@ -86,7 +99,7 @@ void LED(int led, int ms)
        if (led & LED_RED2)\r
                LED_D_OFF();\r
 }\r
-       \r
+\r
 \r
 // Determine if a button is double clicked, single clicked,\r
 // not clicked, or held down (for ms || 1sec)\r
@@ -107,14 +120,14 @@ int BUTTON_CLICKED(int ms)
        PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);\r
        PWM_CH_DUTY_CYCLE(0) = 0;\r
        PWM_CH_PERIOD(0) = 0xffff;\r
-       \r
+\r
        WORD start = (WORD)PWM_CH_COUNTER(0);\r
-       \r
+\r
        int letoff = 0;\r
        for(;;)\r
        {\r
                WORD now = (WORD)PWM_CH_COUNTER(0);\r
-               \r
+\r
                // We haven't let off the button yet\r
                if (!letoff)\r
                {\r
@@ -163,20 +176,20 @@ int BUTTON_HELD(int ms)
        // If we're not even pressed, forget about it!\r
        if (!BUTTON_PRESS())\r
                return BUTTON_NO_CLICK;\r
-       \r
+\r
        // Borrow a PWM unit for my real-time clock\r
        PWM_ENABLE = PWM_CHANNEL(0);\r
        // 48 MHz / 1024 gives 46.875 kHz\r
        PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);\r
        PWM_CH_DUTY_CYCLE(0) = 0;\r
        PWM_CH_PERIOD(0) = 0xffff;\r
-       \r
+\r
        WORD start = (WORD)PWM_CH_COUNTER(0);\r
-       \r
+\r
        for(;;)\r
        {\r
                WORD now = (WORD)PWM_CH_COUNTER(0);\r
-               \r
+\r
                // As soon as our button let go, we didn't hold long enough\r
                if (!BUTTON_PRESS())\r
                        return BUTTON_SINGLE_CLICK;\r
@@ -185,7 +198,7 @@ int BUTTON_HELD(int ms)
                else\r
                        if (now == (WORD)(start + ticks))\r
                                return BUTTON_HOLD;\r
-               \r
+\r
                WDT_HIT();\r
        }\r
 \r
@@ -193,47 +206,66 @@ int BUTTON_HELD(int ms)
        return BUTTON_ERROR;\r
 }\r
 \r
+// attempt at high resolution microsecond timer\r
+// beware: timer counts in 21.3uS increments (1024/48Mhz)\r
 void SpinDelayUs(int us)\r
 {\r
        int ticks = (48*us) >> 10;\r
-       \r
+\r
        // Borrow a PWM unit for my real-time clock\r
        PWM_ENABLE = PWM_CHANNEL(0);\r
        // 48 MHz / 1024 gives 46.875 kHz\r
        PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);\r
        PWM_CH_DUTY_CYCLE(0) = 0;\r
        PWM_CH_PERIOD(0) = 0xffff;\r
-       \r
+\r
        WORD start = (WORD)PWM_CH_COUNTER(0);\r
-       \r
+\r
        for(;;) {\r
                WORD now = (WORD)PWM_CH_COUNTER(0);\r
-               if(now == (WORD)(start + ticks)) {\r
+               if (now == (WORD)(start + ticks))\r
                        return;\r
-               }\r
+\r
                WDT_HIT();\r
        }\r
 }\r
 \r
 void SpinDelay(int ms)\r
 {\r
-       int ticks = (48000*ms) >> 10;\r
-\r
-       // Borrow a PWM unit for my real-time clock\r
-       PWM_ENABLE = PWM_CHANNEL(0);\r
-       // 48 MHz / 1024 gives 46.875 kHz\r
-       PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);\r
-       PWM_CH_DUTY_CYCLE(0) = 0;\r
-       PWM_CH_PERIOD(0) = 0xffff;\r
-\r
-       WORD start = (WORD)PWM_CH_COUNTER(0);\r
-\r
-       for(;;)\r
-       {\r
-               WORD now = (WORD)PWM_CH_COUNTER(0);\r
-               if (now == (WORD)(start + ticks))\r
-                       return;\r
+  // convert to uS and call microsecond delay function\r
+       SpinDelayUs(ms*1000);\r
+}\r
 \r
-               WDT_HIT();\r
+/* Similar to FpgaGatherVersion this formats stored version information\r
+ * into a string representation. It takes a pointer to the struct version_information,\r
+ * verifies the magic properties, then stores a formatted string, prefixed by\r
+ * prefix in dst.
+ */\r
+void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_information)\r
+{\r
+       struct version_information *v = (struct version_information*)version_information;\r
+       dst[0] = 0;\r
+       strncat(dst, prefix, len);\r
+       if(v->magic != VERSION_INFORMATION_MAGIC) {\r
+               strncat(dst, "Missing/Invalid version information", len);\r
+               return;\r
        }\r
+       if(v->versionversion != 1) {\r
+               strncat(dst, "Version information not understood", len);\r
+               return;\r
+       }\r
+       if(!v->present) {\r
+               strncat(dst, "Version information not available", len);\r
+               return;\r
+       }\r
+       \r
+       strncat(dst, v->svnversion, len);\r
+       if(v->clean == 0) {\r
+               strncat(dst, "-unclean", len);\r
+       } else if(v->clean == 2) {\r
+               strncat(dst, "-suspect", len);\r
+       }\r
+       \r
+       strncat(dst, " ", len);\r
+       strncat(dst, v->buildtime, len);\r
 }\r
Impressum, Datenschutz