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