From 196cba51813549ca983ae153698f38013426817a Mon Sep 17 00:00:00 2001
From: "Wesley W. Terpstra" <w.terpstra@gsi.de>
Date: Wed, 4 Jul 2012 13:57:57 +0200
Subject: [PATCH] Fix power problems with the 1wire. Add more optional debug
 statements.

---
 dev/persistent_mac.c | 31 ++++++++++++++++++++-----------
 shell/cmd_mac.c      | 42 ++++++++++++++++++++++++++++++++++++++++++
 sockitowm/eep43.c    | 20 +++++++++++++++++---
 sockitowm/owlnk.c    |  6 ++----
 wrc_main.c           |  1 +
 5 files changed, 82 insertions(+), 18 deletions(-)
 create mode 100644 shell/cmd_mac.c

diff --git a/dev/persistent_mac.c b/dev/persistent_mac.c
index 4526056ac..fed7854dd 100644
--- a/dev/persistent_mac.c
+++ b/dev/persistent_mac.c
@@ -12,26 +12,33 @@ int get_persistent_mac(unsigned char* mac)
   unsigned char read_buffer[32];
   unsigned char portnum = ONEWIRE_PORT;
   int i, devices, out;
-
+  
   // Find the device(s)
   devices = 0;
   devices += FindDevices(portnum, &FamilySN[devices], 0x28, MAX_DEV1WIRE - devices); /* Temperature 28 sensor (SPEC) */
   devices += FindDevices(portnum, &FamilySN[devices], 0x42, MAX_DEV1WIRE - devices); /* Temperature 42 sensor (SCU) */
   devices += FindDevices(portnum, &FamilySN[devices], 0x43, MAX_DEV1WIRE - devices); /* EEPROM */
+#if DEBUG_PMAC
+  mprintf("Found %d onewire devices\n", devices);
+#endif
   
   out = -1;
   
   for (i = 0; i < devices; ++i) {
+#if DEBUG_PMAC
+    mprintf("Found device: %x:%x:%x:%x:%x:%x:%x:%x\n", 
+      FamilySN[i][7], FamilySN[i][6], FamilySN[i][5], FamilySN[i][4],
+      FamilySN[i][3], FamilySN[i][2], FamilySN[i][1], FamilySN[i][0]);
+#endif
+
     /* If there is a temperature sensor, use it for the low three MAC values */
     if (FamilySN[i][0] == 0x28 || FamilySN[i][0] == 0x42) {
       mac[3] = FamilySN[i][3];
       mac[4] = FamilySN[i][2];
       mac[5] = FamilySN[i][1];
       out = 0;
-#ifdef DEBUG_PMAC
-      mprintf("Using temperature sensor ID: %x:%x:%x:%x:%x:%x:%x:%x\n", 
-        FamilySN[i][7], FamilySN[i][6], FamilySN[i][5], FamilySN[i][4],
-        FamilySN[i][3], FamilySN[i][2], FamilySN[i][1], FamilySN[i][0]);
+#if DEBUG_PMAC
+      mprintf("Using temperature ID for MAC\n");
 #endif
     }
     
@@ -41,19 +48,17 @@ int get_persistent_mac(unsigned char* mac)
       if (ReadMem43(portnum, FamilySN[i], EEPROM_MAC_PAGE, &read_buffer) == TRUE) {
         if (read_buffer[0] == 0 && read_buffer[1] == 0 && read_buffer[2] == 0) {
           /* Skip the EEPROM since it has not been programmed! */
-#ifdef DEBUG_PMAC
-        mprintf("EEPROM %x:%x:%x:%x:%x:%x:%x:%x has not been programmed with a MAC\n", 
-          FamilySN[i][7], FamilySN[i][6], FamilySN[i][5], FamilySN[i][4],
-          FamilySN[i][3], FamilySN[i][2], FamilySN[i][1], FamilySN[i][0]);
+#if DEBUG_PMAC
+          mprintf("EEPROM has not been programmed with a MAC\n");
 #endif
         } else {
           memcpy(mac, read_buffer, 6);
           out = 0;
-#ifdef DEBUG_PMAC
+#if DEBUG_PMAC
           mprintf("Using EEPROM page: %x:%x:%x:%x:%x:%x\n", 
             mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
-        }
 #endif
+        }
       }
     }
   }
@@ -77,6 +82,10 @@ int set_persistent_mac(unsigned char* mac)
   memset(write_buffer, 0, sizeof(write_buffer));
   memcpy(write_buffer, mac, 6);
   
+#if DEBUG_PMAC
+  mprintf("Writing to EEPROM\n");
+#endif
+  
   /* Write the last EEPROM with the MAC */
   owLevel(portnum, MODE_NORMAL);
   if (Write43(portnum, FamilySN[devices-1], EEPROM_MAC_PAGE, &write_buffer) == TRUE)
diff --git a/shell/cmd_mac.c b/shell/cmd_mac.c
new file mode 100644
index 000000000..eea3d4e3b
--- /dev/null
+++ b/shell/cmd_mac.c
@@ -0,0 +1,42 @@
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "softpll_ng.h"
+#include "shell.h"
+#include "../lib/ipv4.h"
+
+static decode_mac(const char *str, unsigned char* mac) {
+  int i, x;
+  
+  /* Don't try to detect bad input; need small code */
+  for (i = 0; i < 6; ++i) {
+    str = fromhex(str, &x);
+    mac[i] = x;
+    if (*str == ':') ++str;
+  }
+}
+
+int cmd_ip(const char *args[])
+{
+  unsigned char mac[6];
+  
+  if (!args[0] || !strcasecmp(args[0], "get")) {
+    /* get current MAC */
+    get_mac_addr(mac);
+  } else if (!strcasecmp(args[0], "getp")) {
+    /* get persistent MAC */
+    get_persistent_mac(mac);
+  } else if (!strcasecmp(args[0], "set") && args[1]) {
+    decode_mac(args[1], mac);
+    set_mac_addr(mac);
+  } else if (!strcasecmp(args[0], "setp") && args[1]) {
+    decode_mac(args[1], mac);
+    set_persistent_mac(mac);
+  } else {
+    return -EINVAL;
+  }
+  
+  mprintf("MAC-address: %x:%x:%x:%x:%x:%x\n", 
+    mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+}
diff --git a/sockitowm/eep43.c b/sockitowm/eep43.c
index ee0c549ec..080c9b200 100644
--- a/sockitowm/eep43.c
+++ b/sockitowm/eep43.c
@@ -6,6 +6,8 @@
 #define READ_MEM_CMD 0xf0
 #define E_READ_MEM_CMD 0xa5
 
+//#define DEBUG_EEP43 1
+
 int Write43(int portnum, uchar *SerialNum, int page, uchar *page_buffer)
 {
 	uchar rt=FALSE;
@@ -16,7 +18,9 @@ int Write43(int portnum, uchar *SerialNum, int page, uchar *page_buffer)
 
 	if(owAccess(portnum))
 	{
+#if DEBUG_EEP43
 		mprintf(" Writing Scratchpad...\n");
+#endif
 		if (!owWriteBytePower(portnum, WRITE_SCRATCH_CMD)) 
 			return FALSE;
 		setcrc16(portnum, 0);
@@ -33,8 +37,8 @@ int Write43(int portnum, uchar *SerialNum, int page, uchar *page_buffer)
 		for(i = 0; i < 32; i++)			//write 32 data bytes to scratchpad 
 		{	
 			owLevel(portnum,MODE_NORMAL);
-			owWriteBytePower(portnum, i);
-			lastcrc16 = docrc16(portnum,i);
+			owWriteBytePower(portnum, page_buffer[i]);
+			lastcrc16 = docrc16(portnum, page_buffer[i]);
 //			mprintf(" CRC16: %x\n", lastcrc16);
 
 		}
@@ -43,7 +47,9 @@ int Write43(int portnum, uchar *SerialNum, int page, uchar *page_buffer)
 			owLevel(portnum,MODE_NORMAL);
 			lastcrc16 = docrc16(portnum,(ushort)owReadBytePower(portnum));
 		}
+#if DEBUG_EEP43
 		mprintf(" CRC16: %x\n", lastcrc16);
+#endif
 		if(lastcrc16 == 0xb001)
 		{
 			//copy to mem
@@ -54,6 +60,7 @@ int Write43(int portnum, uchar *SerialNum, int page, uchar *page_buffer)
 		}
 	}
 
+	owLevel(portnum, MODE_NORMAL);
 	return rt;
 }
 
@@ -77,7 +84,7 @@ int Copy2Mem43(int portnum, uchar *SerialNum)
 		owLevel(portnum, MODE_NORMAL);
 		owWriteBytePower(portnum, 0x1f);	//write E/S
 
-		msDelay(500);
+		usleep(500000);
 				
 		
 		owLevel(portnum,MODE_NORMAL);		
@@ -87,6 +94,7 @@ int Copy2Mem43(int portnum, uchar *SerialNum)
 			rt=TRUE;
 	}
 
+	owLevel(portnum, MODE_NORMAL);
 	return rt;
 }
 
@@ -107,7 +115,9 @@ int ReadScratch43(int portnum, uchar *SerialNum, uchar *page_buffer)
 
 	if(owAccess(portnum))
 	{	
+#if DEBUG_EEP43
 		mprintf(" Reading Scratchpad...\n");
+#endif
 		if (!owWriteBytePower(portnum, READ_SCRATCH_CMD)) 
 			return FALSE;
 
@@ -130,7 +140,9 @@ int ReadScratch43(int portnum, uchar *SerialNum, uchar *page_buffer)
 		read_data = owReadBytePower(portnum);
 		lastcrc16 = docrc16(portnum, read_data);
 
+#if DEBUG_EEP43
 		mprintf("E/S: 0x%x\n", read_data);
+#endif
 		for(i = 0; i < 32; i++) 
 		{	
 			owLevel(portnum,MODE_NORMAL);
@@ -151,6 +163,7 @@ int ReadScratch43(int portnum, uchar *SerialNum, uchar *page_buffer)
 			rt=TRUE;
 	}
 
+	owLevel(portnum, MODE_NORMAL);
 	return rt;
 }
 
@@ -202,5 +215,6 @@ int ReadMem43(int portnum, uchar *SerialNum, int page, uchar *page_buffer)
 			rt=TRUE;
 	}
 
+	owLevel(portnum, MODE_NORMAL);
 	return rt;
 }
diff --git a/sockitowm/owlnk.c b/sockitowm/owlnk.c
index 599080251..b06d352da 100644
--- a/sockitowm/owlnk.c
+++ b/sockitowm/owlnk.c
@@ -45,10 +45,8 @@
 //#define S_PWR 0 
 #define S_IEN 0
 #define S_OVD_E 1
-//#define CLK_DIV_NOR CPU_CLOCK/357     //clock divider for normal mode
-//#define CLK_DIV_OVD CPU_CLOCK/1008    //clock divider for overdrive mode
-#define CLK_DIV_NOR 624
-#define CLK_DIV_OVD 124
+#define CLK_DIV_NOR (CPU_CLOCK/200000-1)  //clock divider for normal mode
+#define CLK_DIV_OVD (CPU_CLOCK/1000000-1) //clock divider for overdrive mode
 
 // exportable link-level functions
 SMALLINT owTouchReset(int);
diff --git a/wrc_main.c b/wrc_main.c
index 44b0ccbae..3662bcacb 100644
--- a/wrc_main.c
+++ b/wrc_main.c
@@ -37,6 +37,7 @@ void wrc_initialize()
   uart_init();
   mprintf("WR Core: starting up...\n");
   timer_init(1);
+  owInit();
   
   mac_addr[0] = 0x08;   //
   mac_addr[1] = 0x00;   // CERN OUI
-- 
GitLab