]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/util.c
Refactor things around to make it easier to add a reader mode with code reuse
[proxmark3-svn] / armsrc / util.c
index 8a3da63a898f5dae60299ef4f8502c50dd0c56b7..3cad25f438928d4ffc464b8b7e29c09777eda665 100644 (file)
@@ -52,6 +52,19 @@ int strlen(char *str)
        return l;\r
 }\r
 \r
        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
 void LEDsoff()\r
 {\r
        LED_A_OFF();\r
@@ -102,18 +115,18 @@ int BUTTON_CLICKED(int ms)
                return BUTTON_NO_CLICK;\r
 \r
        // Borrow a PWM unit for my real-time clock\r
                return BUTTON_NO_CLICK;\r
 \r
        // Borrow a PWM unit for my real-time clock\r
-       PWM_ENABLE = PWM_CHANNEL(0);\r
+       AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);\r
        // 48 MHz / 1024 gives 46.875 kHz\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
+       AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);\r
+       AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;\r
+       AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;\r
 \r
 \r
-       WORD start = (WORD)PWM_CH_COUNTER(0);\r
+       WORD start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;\r
 \r
        int letoff = 0;\r
        for(;;)\r
        {\r
 \r
        int letoff = 0;\r
        for(;;)\r
        {\r
-               WORD now = (WORD)PWM_CH_COUNTER(0);\r
+               WORD now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;\r
 \r
                // We haven't let off the button yet\r
                if (!letoff)\r
 \r
                // We haven't let off the button yet\r
                if (!letoff)\r
@@ -124,7 +137,7 @@ int BUTTON_CLICKED(int ms)
                                letoff = 1;\r
 \r
                                // reset our timer for 500ms\r
                                letoff = 1;\r
 \r
                                // reset our timer for 500ms\r
-                               start = (WORD)PWM_CH_COUNTER(0);\r
+                               start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;\r
                                ticks = (48000 * (500)) >> 10;\r
                        }\r
 \r
                                ticks = (48000 * (500)) >> 10;\r
                        }\r
 \r
@@ -165,17 +178,17 @@ int BUTTON_HELD(int ms)
                return BUTTON_NO_CLICK;\r
 \r
        // Borrow a PWM unit for my real-time clock\r
                return BUTTON_NO_CLICK;\r
 \r
        // Borrow a PWM unit for my real-time clock\r
-       PWM_ENABLE = PWM_CHANNEL(0);\r
+       AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);\r
        // 48 MHz / 1024 gives 46.875 kHz\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
+       AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);\r
+       AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;\r
+       AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;\r
 \r
 \r
-       WORD start = (WORD)PWM_CH_COUNTER(0);\r
+       WORD start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;\r
 \r
        for(;;)\r
        {\r
 \r
        for(;;)\r
        {\r
-               WORD now = (WORD)PWM_CH_COUNTER(0);\r
+               WORD now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;\r
 \r
                // As soon as our button let go, we didn't hold long enough\r
                if (!BUTTON_PRESS())\r
 \r
                // As soon as our button let go, we didn't hold long enough\r
                if (!BUTTON_PRESS())\r
@@ -200,16 +213,16 @@ void SpinDelayUs(int us)
        int ticks = (48*us) >> 10;\r
 \r
        // Borrow a PWM unit for my real-time clock\r
        int ticks = (48*us) >> 10;\r
 \r
        // Borrow a PWM unit for my real-time clock\r
-       PWM_ENABLE = PWM_CHANNEL(0);\r
+       AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);\r
        // 48 MHz / 1024 gives 46.875 kHz\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
+       AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);\r
+       AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;\r
+       AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;\r
 \r
 \r
-       WORD start = (WORD)PWM_CH_COUNTER(0);\r
+       WORD start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;\r
 \r
        for(;;) {\r
 \r
        for(;;) {\r
-               WORD now = (WORD)PWM_CH_COUNTER(0);\r
+               WORD now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;\r
                if (now == (WORD)(start + ticks))\r
                        return;\r
 \r
                if (now == (WORD)(start + ticks))\r
                        return;\r
 \r
@@ -222,3 +235,37 @@ void SpinDelay(int ms)
   // convert to uS and call microsecond delay function\r
        SpinDelayUs(ms*1000);\r
 }\r
   // convert to uS and call microsecond delay function\r
        SpinDelayUs(ms*1000);\r
 }\r
+\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
+ */\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