[U-Boot-Users] [PATCH] lwmon5 SYSMON POST: fix handling of negative temperatures

Wolfgang Denk wd at denx.de
Tue Mar 25 00:27:04 CET 2008


From: Yuri Tikhonov <yur at emcraft.com>

Fix errors in the LWMON5 Sysmon POST for negative temperatures.

Signed-off-by: Yuri Tikhonov <yur at emcraft.com>
---
 post/board/lwmon5/dspic.c  |   27 ++++++++++++++-------------
 post/board/lwmon5/sysmon.c |   33 ++++++++++++++++++++++-----------
 2 files changed, 36 insertions(+), 24 deletions(-)

diff --git a/post/board/lwmon5/dspic.c b/post/board/lwmon5/dspic.c
index dbaa074..fcbbc60 100644
--- a/post/board/lwmon5/dspic.c
+++ b/post/board/lwmon5/dspic.c
@@ -59,25 +59,27 @@ int dspic_init_post_test(int flags)
 
 #if CONFIG_POST & CFG_POST_BSPEC2
 /* Read a register from the dsPIC. */
-int dspic_read(ushort reg)
+int dspic_read(ushort reg, ushort *data)
 {
-	uchar buf[2];
+	uchar buf[sizeof(*data)];
+	int rval;
 
-	if (i2c_read(CFG_I2C_DSPIC_IO_ADDR, reg, 2, buf, 2))
-		return -1;
+	rval = i2c_read(CFG_I2C_DSPIC_IO_ADDR, reg, sizeof(reg),
+					       buf, sizeof(*data));
 
-	return (uint)((buf[0] << 8) | buf[1]);
+	*data = (buf[0] << 8) | buf[1];
+
+	return rval;
 }
 
 /* Verify error codes regs, display version */
 int dspic_post_test(int flags)
 {
-	int data;
+	ushort data;
 	int ret = 0;
 
 	post_log("\n");
-	data = dspic_read(DSPIC_VERSION_REG);
-	if (data == -1) {
+	if (dspic_read(DSPIC_VERSION_REG, &data)) {
 		post_log("dsPIC : failed read version\n");
 		ret = 1;
 	} else {
@@ -85,16 +87,15 @@ int dspic_post_test(int flags)
 			(data >> 8) & 0xFF, data & 0xFF);
 	}
 
-	data = dspic_read(DSPIC_POST_ERROR_REG);
-	if (data != 0) ret = 1;
-	if (data == -1) {
+	if (dspic_read(DSPIC_POST_ERROR_REG, &data)) {
 		post_log("dsPIC : failed read POST code\n");
 	} else {
 		post_log("dsPIC POST code 0x%04X\n", data);
 	}
+	if (data != 0)
+		ret = 1;
 
-	data = dspic_read(DSPIC_SYS_ERROR_REG);
-	if (data == -1) {
+	if (dspic_read(DSPIC_SYS_ERROR_REG, &data)) {
 		post_log("dsPIC : failed read system error\n");
 		ret = 1;
 	} else if (data != 0) {
diff --git a/post/board/lwmon5/sysmon.c b/post/board/lwmon5/sysmon.c
index f7e51a3..b1b81c6 100644
--- a/post/board/lwmon5/sysmon.c
+++ b/post/board/lwmon5/sysmon.c
@@ -58,7 +58,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 /* from dspic.c */
-extern int dspic_read(ushort reg);
+extern int dspic_read(ushort reg, ushort *data);
 
 #define	RELOC(x) if (x != NULL) x = (void *) ((ulong) (x) + gd->reloc_off)
 
@@ -67,6 +67,7 @@ typedef struct sysmon_table_s sysmon_table_t;
 
 static void sysmon_dspic_init (sysmon_t * this);
 static int sysmon_dspic_read (sysmon_t * this, uint addr);
+static int sysmon_dspic_read_sgn (sysmon_t * this, uint addr);
 static void sysmon_backlight_disable (sysmon_table_t * this);
 
 struct sysmon_s
@@ -79,9 +80,13 @@ struct sysmon_s
 static sysmon_t sysmon_dspic =
 	{CFG_I2C_DSPIC_IO_ADDR, sysmon_dspic_init, sysmon_dspic_read};
 
+static sysmon_t sysmon_dspic_sgn =
+	{CFG_I2C_DSPIC_IO_ADDR, sysmon_dspic_init, sysmon_dspic_read_sgn};
+
 static sysmon_t * sysmon_list[] =
 {
 	&sysmon_dspic,
+	&sysmon_dspic_sgn,
 	NULL
 };
 
@@ -109,17 +114,17 @@ struct sysmon_table_s
 
 static sysmon_table_t sysmon_table[] =
 {
-    {"Temperature", " C", &sysmon_dspic, NULL, sysmon_backlight_disable,
+    {"Temperature", " C", &sysmon_dspic_sgn, NULL, sysmon_backlight_disable,
      1, 1, -32768, 32767, 0xFFFF, 0x8000-40, 0x8000+85, 0,
                                   0x8000-30, 0x8000+80, 0, 0x12BC},
 
     {"+ 5 V", "V", &sysmon_dspic, NULL, NULL,
-     100, 1000, -0x8000, 0x7FFF, 0xFFFF, 0x8000+4750, 0x8000+5250, 0,
-                                         0x8000+4750, 0x8000+5250, 0, 0x12CA},
+     100, 1000, 0, 0xFFFF, 0xFFFF, 4750, 5250, 0,
+                                   4750, 5250, 0, 0x12CA},
 
     {"+ 5 V standby", "V", &sysmon_dspic, NULL, NULL,
-     100, 1000, -0x8000, 0x7FFF, 0xFFFF, 0x8000+4750, 0x8000+5250, 0,
-                                         0x8000+4750, 0x8000+5250, 0, 0x12C6},
+     100, 1000, 0, 0xFFFF, 0xFFFF, 4750, 5250, 0,
+                                   4750, 5250, 0, 0x12C6},
 };
 static int sysmon_table_size = sizeof(sysmon_table) / sizeof(sysmon_table[0]);
 
@@ -156,9 +161,7 @@ static char *sysmon_unit_value (sysmon_table_t *s, uint val)
 	static char buf[32];
 	char *p, sign;
 	int decimal, frac;
-	int unit_val;
-
-	unit_val =
+	int unit_val =
 	    s->unit_min + (s->unit_max - s->unit_min) * val / s->val_mask;
 
 	if (val == -1)
@@ -194,10 +197,18 @@ static void sysmon_dspic_init (sysmon_t * this)
 
 static int sysmon_dspic_read (sysmon_t * this, uint addr)
 {
-	int res = dspic_read(addr);
+	ushort data;
+
+	return (dspic_read(addr, &data)) ? -1 : data;
+}
+
+static int sysmon_dspic_read_sgn (sysmon_t * this, uint addr)
+{
+	ushort data;
 
 	/* To fit into the table range we should add 0x8000 */
-	return (res == -1) ? -1 : (res + 0x8000);
+	return (dspic_read(addr, &data)) ? -1 :
+	       (signed short)data + 0x8000;
 }
 
 static void sysmon_backlight_disable (sysmon_table_t * this)
-- 
1.5.4.2





More information about the U-Boot mailing list