X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/ba8a80b30c4da36ef10854b53b06d9ff9acaca44..393c3ef933553e628635590ca2b8237d07e9e0e3:/armsrc/util.c

diff --git a/armsrc/util.c b/armsrc/util.c
index a102bbb5..e6332a7b 100644
--- a/armsrc/util.c
+++ b/armsrc/util.c
@@ -64,6 +64,24 @@ char* strncat(char *dest, const char *src, unsigned int n)
 	return dest;
 }
 
+void num_to_bytes(uint64_t n, size_t len, byte_t* dest)
+{
+	while (len--) {
+		dest[len] = (byte_t) n;
+		n >>= 8;
+	}
+}
+
+uint64_t bytes_to_num(byte_t* src, size_t len)
+{
+	uint64_t num = 0;
+	while (len--)
+	{
+		num = (num << 8) | (*src);
+		src++;
+	}
+	return num;
+}
 
 void LEDsoff()
 {
@@ -115,18 +133,18 @@ int BUTTON_CLICKED(int ms)
 		return BUTTON_NO_CLICK;
 
 	// Borrow a PWM unit for my real-time clock
-	PWM_ENABLE = PWM_CHANNEL(0);
+	AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);
 	// 48 MHz / 1024 gives 46.875 kHz
-	PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);
-	PWM_CH_DUTY_CYCLE(0) = 0;
-	PWM_CH_PERIOD(0) = 0xffff;
+	AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);
+	AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;
+	AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;
 
-	WORD start = (WORD)PWM_CH_COUNTER(0);
+	WORD start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
 
 	int letoff = 0;
 	for(;;)
 	{
-		WORD now = (WORD)PWM_CH_COUNTER(0);
+		WORD now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
 
 		// We haven't let off the button yet
 		if (!letoff)
@@ -137,7 +155,7 @@ int BUTTON_CLICKED(int ms)
 				letoff = 1;
 
 				// reset our timer for 500ms
-				start = (WORD)PWM_CH_COUNTER(0);
+				start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
 				ticks = (48000 * (500)) >> 10;
 			}
 
@@ -178,17 +196,17 @@ int BUTTON_HELD(int ms)
 		return BUTTON_NO_CLICK;
 
 	// Borrow a PWM unit for my real-time clock
-	PWM_ENABLE = PWM_CHANNEL(0);
+	AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);
 	// 48 MHz / 1024 gives 46.875 kHz
-	PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);
-	PWM_CH_DUTY_CYCLE(0) = 0;
-	PWM_CH_PERIOD(0) = 0xffff;
+	AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);
+	AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;
+	AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;
 
-	WORD start = (WORD)PWM_CH_COUNTER(0);
+	WORD start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
 
 	for(;;)
 	{
-		WORD now = (WORD)PWM_CH_COUNTER(0);
+		WORD now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
 
 		// As soon as our button let go, we didn't hold long enough
 		if (!BUTTON_PRESS())
@@ -213,16 +231,16 @@ void SpinDelayUs(int us)
 	int ticks = (48*us) >> 10;
 
 	// Borrow a PWM unit for my real-time clock
-	PWM_ENABLE = PWM_CHANNEL(0);
+	AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);
 	// 48 MHz / 1024 gives 46.875 kHz
-	PWM_CH_MODE(0) = PWM_CH_MODE_PRESCALER(10);
-	PWM_CH_DUTY_CYCLE(0) = 0;
-	PWM_CH_PERIOD(0) = 0xffff;
+	AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);
+	AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;
+	AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;
 
-	WORD start = (WORD)PWM_CH_COUNTER(0);
+	WORD start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
 
 	for(;;) {
-		WORD now = (WORD)PWM_CH_COUNTER(0);
+		WORD now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
 		if (now == (WORD)(start + ticks))
 			return;
 
@@ -235,3 +253,37 @@ void SpinDelay(int ms)
   // convert to uS and call microsecond delay function
 	SpinDelayUs(ms*1000);
 }
+
+/* Similar to FpgaGatherVersion this formats stored version information
+ * into a string representation. It takes a pointer to the struct version_information,
+ * verifies the magic properties, then stores a formatted string, prefixed by
+ * prefix in dst.
+ */
+void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_information)
+{
+	struct version_information *v = (struct version_information*)version_information;
+	dst[0] = 0;
+	strncat(dst, prefix, len);
+	if(v->magic != VERSION_INFORMATION_MAGIC) {
+		strncat(dst, "Missing/Invalid version information", len);
+		return;
+	}
+	if(v->versionversion != 1) {
+		strncat(dst, "Version information not understood", len);
+		return;
+	}
+	if(!v->present) {
+		strncat(dst, "Version information not available", len);
+		return;
+	}
+	
+	strncat(dst, v->svnversion, len);
+	if(v->clean == 0) {
+		strncat(dst, "-unclean", len);
+	} else if(v->clean == 2) {
+		strncat(dst, "-suspect", len);
+	}
+	
+	strncat(dst, " ", len);
+	strncat(dst, v->buildtime, len);
+}