smartbatt

jklaas jklaas at comcast.net
Thu Aug 21 20:26:02 CEST 2003


I recently upgraded my ProGear to use Knoppix.  In the process I wanted to 
be able to get information about the battery.  So, in looking at the 
i2c/lm_sensors drivers for that particular set of Debian packages, it 
seemed to be stuck at 2.6.(something).  I decided to see if I could write 
a chip driver for it and proceeded to hack at the adm1021 driver (since 
that is also on the ProGear and I could more easily see what I was doing).  

Fortunately, I didn't get very far before I decided to see if someone else 
had already done this and lo and behold, in 2.7 and above it exists.  I 
ended up getting the latest CVS of i2c and lm_sensors2.  I couldn't get 
the smartbatt stuff to load without forcing it.  I also updated some of 
the code to read stuff like manufacturer information (but left it inside
#if 0/#endif bracketing).  

I figured out, in this process, that I also needed to update lib/chip.c 
and lib/chip.h to recognize the smartbatt fields in order to display them 
using sensors.  I also started on getting the display properly formatted in 
sensors.conf, but I didn't get very far yet (I just got it working, yay!!!). 
I'll send a smartbatt-* section for sensors.conf in a bit.  It also looks 
like I'll need to add a print_smartbatt section too.

Has anyone started work on the Battery Charger stuff.  I have one more 
address on the ProGear that I don't know what it does (0x09) and looking 
at the list of addresses (from 
http://www2.lm-sensors.nu/~lm78/i2ctools.html), that seems likely.  

Should I ask for write access to CVS?

-- 
			James Klaas

Procrastinate NOW!!!! -- Don't put it off.
-------------- next part --------------
Only in lm_sensors2/kernel/busses: dmi_scan.d
Only in lm_sensors2/kernel/busses: dmi_scan.o
Only in lm_sensors2/kernel/busses: i2c-ali1535.d
Only in lm_sensors2/kernel/busses: i2c-ali1535.o
Only in lm_sensors2/kernel/busses: i2c-ali15x3.d
Only in lm_sensors2/kernel/busses: i2c-ali15x3.o
Only in lm_sensors2/kernel/busses: i2c-amd756.d
Only in lm_sensors2/kernel/busses: i2c-amd756.o
Only in lm_sensors2/kernel/busses: i2c-amd8111.d
Only in lm_sensors2/kernel/busses: i2c-amd8111.o
Only in lm_sensors2/kernel/busses: i2c-hydra.d
Only in lm_sensors2/kernel/busses: i2c-hydra.o
Only in lm_sensors2/kernel/busses: i2c-i801.d
Only in lm_sensors2/kernel/busses: i2c-i801.o
Only in lm_sensors2/kernel/busses: i2c-i810.d
Only in lm_sensors2/kernel/busses: i2c-i810.o
Only in lm_sensors2/kernel/busses: i2c-isa.d
Only in lm_sensors2/kernel/busses: i2c-isa.o
Only in lm_sensors2/kernel/busses: i2c-nforce2.d
Only in lm_sensors2/kernel/busses: i2c-nforce2.o
Only in lm_sensors2/kernel/busses: i2c-piix4.d
Only in lm_sensors2/kernel/busses: i2c-piix4.o
Only in lm_sensors2/kernel/busses: i2c-savage4.d
Only in lm_sensors2/kernel/busses: i2c-savage4.o
Only in lm_sensors2/kernel/busses: i2c-sis5595.d
Only in lm_sensors2/kernel/busses: i2c-sis5595.o
Only in lm_sensors2/kernel/busses: i2c-sis630.d
Only in lm_sensors2/kernel/busses: i2c-sis630.o
Only in lm_sensors2/kernel/busses: i2c-sis645.d
Only in lm_sensors2/kernel/busses: i2c-sis645.o
Only in lm_sensors2/kernel/busses: i2c-via.d
Only in lm_sensors2/kernel/busses: i2c-via.o
Only in lm_sensors2/kernel/busses: i2c-viapro.d
Only in lm_sensors2/kernel/busses: i2c-viapro.o
Only in lm_sensors2/kernel/busses: i2c-voodoo3.d
Only in lm_sensors2/kernel/busses: i2c-voodoo3.o
Only in lm_sensors2/kernel/chips: adm1021.d
Only in lm_sensors2/kernel/chips: adm1021.o
Only in lm_sensors2/kernel/chips: adm1024.d
Only in lm_sensors2/kernel/chips: adm1024.o
Only in lm_sensors2/kernel/chips: adm1025.d
Only in lm_sensors2/kernel/chips: adm1025.o
Only in lm_sensors2/kernel/chips: adm1026.d
Only in lm_sensors2/kernel/chips: adm1026.o
Only in lm_sensors2/kernel/chips: adm9240.d
Only in lm_sensors2/kernel/chips: adm9240.o
Only in lm_sensors2/kernel/chips: bt869.d
Only in lm_sensors2/kernel/chips: bt869.o
Only in lm_sensors2/kernel/chips: ddcmon.d
Only in lm_sensors2/kernel/chips: ddcmon.o
Only in lm_sensors2/kernel/chips: ds1307.d
Only in lm_sensors2/kernel/chips: ds1307.o
Only in lm_sensors2/kernel/chips: ds1621.d
Only in lm_sensors2/kernel/chips: ds1621.o
Only in lm_sensors2/kernel/chips: eeprom.d
Only in lm_sensors2/kernel/chips: eeprom.o
Only in lm_sensors2/kernel/chips: fscpos.d
Only in lm_sensors2/kernel/chips: fscpos.o
Only in lm_sensors2/kernel/chips: fscscy.d
Only in lm_sensors2/kernel/chips: fscscy.o
Only in lm_sensors2/kernel/chips: gl518sm.d
Only in lm_sensors2/kernel/chips: gl518sm.o
Only in lm_sensors2/kernel/chips: gl520sm.d
Only in lm_sensors2/kernel/chips: gl520sm.o
Only in lm_sensors2/kernel/chips: it87.d
Only in lm_sensors2/kernel/chips: it87.o
Only in lm_sensors2/kernel/chips: lm75.d
Only in lm_sensors2/kernel/chips: lm75.o
Only in lm_sensors2/kernel/chips: lm78.d
Only in lm_sensors2/kernel/chips: lm78.o
Only in lm_sensors2/kernel/chips: lm80.d
Only in lm_sensors2/kernel/chips: lm80.o
Only in lm_sensors2/kernel/chips: lm83.d
Only in lm_sensors2/kernel/chips: lm83.o
Only in lm_sensors2/kernel/chips: lm85.d
Only in lm_sensors2/kernel/chips: lm85.o
Only in lm_sensors2/kernel/chips: lm87.d
Only in lm_sensors2/kernel/chips: lm87.o
Only in lm_sensors2/kernel/chips: lm90.d
Only in lm_sensors2/kernel/chips: lm90.o
Only in lm_sensors2/kernel/chips: lm92.d
Only in lm_sensors2/kernel/chips: lm92.o
Only in lm_sensors2/kernel/chips: ltc1710.d
Only in lm_sensors2/kernel/chips: ltc1710.o
Only in lm_sensors2/kernel/chips: matorb.d
Only in lm_sensors2/kernel/chips: matorb.o
Only in lm_sensors2/kernel/chips: maxilife.d
Only in lm_sensors2/kernel/chips: maxilife.o
Only in lm_sensors2/kernel/chips: mtp008.d
Only in lm_sensors2/kernel/chips: mtp008.o
Only in lm_sensors2/kernel/chips: pcf8574.d
Only in lm_sensors2/kernel/chips: pcf8574.o
Only in lm_sensors2/kernel/chips: pcf8591.d
Only in lm_sensors2/kernel/chips: pcf8591.o
Only in lm_sensors2/kernel/chips: saa1064.d
Only in lm_sensors2/kernel/chips: saa1064.o
Only in lm_sensors2/kernel/chips: sis5595.d
Only in lm_sensors2/kernel/chips: sis5595.o
diff -u2 -r lm_sensors2.orig/kernel/chips/smartbatt.c lm_sensors2/kernel/chips/smartbatt.c
--- lm_sensors2.orig/kernel/chips/smartbatt.c	2003-06-22 19:55:05.000000000 +0200
+++ lm_sensors2/kernel/chips/smartbatt.c	2003-08-21 10:52:11.000000000 +0200
@@ -34,6 +34,6 @@
 
 /* Addresses to scan */
-static unsigned short normal_i2c[] = { 0x0b, SENSORS_I2C_END };
-static unsigned short normal_i2c_range[] = { SENSORS_I2C_END };
+static unsigned short normal_i2c[] = { SENSORS_I2C_END };
+static unsigned short normal_i2c_range[] = { 0x0b, SENSORS_I2C_END };
 static unsigned int normal_isa[] = { SENSORS_ISA_END };
 static unsigned int normal_isa_range[] = { SENSORS_ISA_END };
@@ -57,4 +57,5 @@
 #define SMARTBATT_REG_AVGTIME_F 0x13
 #define SMARTBATT_REG_STATUS 0x16
+#define SMARTBATT_REG_CYCLECT 0x17
 #define SMARTBATT_REG_DESV 0x19
 #define SMARTBATT_REG_DATE 0x1b
@@ -64,6 +65,5 @@
 #define SMARTBATT_REG_CHEM 0x22
 
-#define COMM_TIMEOUT 16
-#define BATTERY_STRING_MAX	33
+#define BATTERY_STRING_MAX	64
 
 /* Each client has this additional data */
@@ -87,5 +87,5 @@
 	u16 temp, v, desv, i, avgi;	/* Register values */
 	u16 rte, ate, atf, alarms;	/* Register values */
-	u16 relchg, abschg;		/* Register values */
+	u16 cyclect, relchg, abschg;	/* Register values */
 };
 
@@ -97,5 +97,5 @@
 
 static u16 swap_bytes(u16 val);
-static int sb_read(struct i2c_client *client, u8 reg);
+static int smartbatt_read(struct i2c_client *client, u8 reg);
 #if 0
 static int smartbatt_write_value(struct i2c_client *client, u8 reg, u16 value);
@@ -274,5 +274,5 @@
 }
 
-static int sb_read(struct i2c_client *client, u8 reg)
+static int smartbatt_read(struct i2c_client *client, u8 reg)
 {
 	return swap_bytes(i2c_smbus_read_word_data(client, reg));
@@ -287,44 +287,44 @@
 
 #if 0
-/* this is code from battery.c. No strings support yet in i2c-proc.c so
-   all we could do is print this out at startup if we wanted.
-*/
-int
-static battery_info(int fd, struct battery_info *info)
+#define COMM_TIMEOUT 16
+static void get_battery_info(struct i2c_client *client)
 {
-  int n;
+  struct smartbatt_data *data = client->data;
   int val;
 
+	down(&data->update_lock);
+	
   /* ManufactureDate */
-  val = sb_read(SMARTBATT_REG_DATE);
-  info->manufacture_date.day=val & 0x1F;
-  info->manufacture_date.month=(val >> 5) & 0x0F;
-  info->manufacture_date.year=(val >> 9) & 0x7F;
+  val = smartbatt_read(client, SMARTBATT_REG_DATE);
+  data->manufacture_date.day=val & 0x1F;
+  data->manufacture_date.month=(val >> 5) & 0x0F;
+  data->manufacture_date.year=(val >> 9) & 0x7F;
 
   /* SerialNumber */
-  info->serial = sb_read(SMARTBATT_REG_SERIAL
+  data->serial = smartbatt_read(client, SMARTBATT_REG_SERIAL);
 
   /* ManufacturerName */
-  n = COMM_TIMEOUT;
+  n=COMM_TIMEOUT;
   do {
-    val = i2c_smbus_read_block_data(fd, 0x20, info->manufacturer);
+    val = i2c_smbus_read_block_data(client, 0x20, data->manufacturer);
   } while ((val == -1) && (n-- > 0));
-  info->manufacturer[val]=0;	
+  data->manufacturer[val]=0;	
 
   /* DeviceName */
-  n = COMM_TIMEOUT;
+  n=COMM_TIMEOUT;
   do {
-    val = i2c_smbus_read_block_data(fd, 0x21, info->device);
+    val = i2c_smbus_read_block_data(client, 0x21, data->device);
   } while ((val == -1) && (n-- > 0));
-  info->device[val]=0;	
+  data->device[val]=0;	
 
   /* DeviceChemistry */
-  n = COMM_TIMEOUT;
+  n=COMM_TIMEOUT;
   do {
-    val = i2c_smbus_read_block_data(fd, 0x22, info->chemistry);
+    val = i2c_smbus_read_block_data(client, 0x22, data->chemistry);
   } while ((val == -1) && (n-- > 0));
-  info->chemistry[val]=0;	
+  data->chemistry[val]=0;	
+
+	up(&data->update_lock);
 
-  return 0;
 }
 #endif
@@ -332,5 +332,7 @@
 static void smartbatt_init_client(struct i2c_client *client)
 {
-
+#if 0
+	get_battery_info( client );
+#endif
 }
 
@@ -343,15 +345,16 @@
 	if ((jiffies - data->last_updated > HZ + HZ / 2) ||
 	    (jiffies < data->last_updated) || !data->valid) {
-		data->temp = sb_read(client, SMARTBATT_REG_TEMP);
-		data->i = sb_read(client, SMARTBATT_REG_I);
-		data->avgi = sb_read(client, SMARTBATT_REG_AVGI);
-		data->v = sb_read(client, SMARTBATT_REG_V);
-		data->desv = sb_read(client, SMARTBATT_REG_DESV);
-		data->ate = sb_read(client, SMARTBATT_REG_AVGTIME_E);
-		data->atf = sb_read(client, SMARTBATT_REG_AVGTIME_F);
-		data->rte = sb_read(client, SMARTBATT_REG_RUNTIME_E);
-		data->alarms = sb_read(client, SMARTBATT_REG_STATUS);
-		data->relchg = sb_read(client, SMARTBATT_REG_RELCHG);
-		data->abschg = sb_read(client, SMARTBATT_REG_ABSCHG);
+		data->temp = smartbatt_read(client, SMARTBATT_REG_TEMP);
+		data->i = smartbatt_read(client, SMARTBATT_REG_I);
+		data->avgi = smartbatt_read(client, SMARTBATT_REG_AVGI);
+		data->v = smartbatt_read(client, SMARTBATT_REG_V);
+		data->desv = smartbatt_read(client, SMARTBATT_REG_DESV);
+		data->ate = smartbatt_read(client, SMARTBATT_REG_AVGTIME_E);
+		data->atf = smartbatt_read(client, SMARTBATT_REG_AVGTIME_F);
+		data->rte = smartbatt_read(client, SMARTBATT_REG_RUNTIME_E);
+		data->alarms = smartbatt_read(client, SMARTBATT_REG_STATUS);
+		data->cyclect = smartbatt_read(client, SMARTBATT_REG_CYCLECT);
+		data->relchg = smartbatt_read(client, SMARTBATT_REG_RELCHG);
+		data->abschg = smartbatt_read(client, SMARTBATT_REG_ABSCHG);
 		data->last_updated = jiffies;
 		data->valid = 1;
Only in lm_sensors2/kernel/chips: smartbatt.d
Only in lm_sensors2/kernel/chips: smartbatt.o
Only in lm_sensors2/kernel/chips: smbus-arp.d
Only in lm_sensors2/kernel/chips: smbus-arp.o
Only in lm_sensors2/kernel/chips: smsc47m1.d
Only in lm_sensors2/kernel/chips: smsc47m1.o
Only in lm_sensors2/kernel/chips: thmc50.d
Only in lm_sensors2/kernel/chips: thmc50.o
Only in lm_sensors2/kernel/chips: via686a.d
Only in lm_sensors2/kernel/chips: via686a.o
Only in lm_sensors2/kernel/chips: vt1211.d
Only in lm_sensors2/kernel/chips: vt1211.o
Only in lm_sensors2/kernel/chips: vt8231.d
Only in lm_sensors2/kernel/chips: vt8231.o
Only in lm_sensors2/kernel/chips: w83627hf.d
Only in lm_sensors2/kernel/chips: w83627hf.o
Only in lm_sensors2/kernel/chips: w83781d.d
Only in lm_sensors2/kernel/chips: w83781d.o
Only in lm_sensors2/kernel/include: sensors.h
Only in lm_sensors2/kernel/include: sensors.hd
Only in lm_sensors2/lib: access.ad
Only in lm_sensors2/lib: access.ao
Only in lm_sensors2/lib: access.ld
Only in lm_sensors2/lib: access.lo
Only in lm_sensors2/lib: chips.ad
Only in lm_sensors2/lib: chips.ao
diff -u2 -r lm_sensors2.orig/lib/chips.c lm_sensors2/lib/chips.c
--- lm_sensors2.orig/lib/chips.c	2003-08-15 00:10:32.000000000 +0200
+++ lm_sensors2/lib/chips.c	2003-08-21 10:21:39.000000000 +0200
@@ -4421,4 +4421,42 @@
   };
 
+static sensors_chip_feature smartbatt_features[] =
+  {
+    { SENSORS_SMARTBATT_I, "i", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING,
+                              SENSORS_MODE_R, SMARTBATT_SYSCTL_I, VALUE(2), 
+                              0 },
+    { SENSORS_SMARTBATT_I_AVG, "i_avg", SENSORS_SMARTBATT_I, SENSORS_SMARTBATT_I,
+                              SENSORS_MODE_RW, SMARTBATT_SYSCTL_I, VALUE(1), 
+                              0 },
+    { SENSORS_SMARTBATT_V, "v", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING,
+                              SENSORS_MODE_R, SMARTBATT_SYSCTL_V, VALUE(2), 
+                              0 },
+    { SENSORS_SMARTBATT_DES_V, "des_v", SENSORS_SMARTBATT_V, SENSORS_SMARTBATT_V,
+                              SENSORS_MODE_RW, SMARTBATT_SYSCTL_V, VALUE(1), 
+                              0 },
+    { SENSORS_SMARTBATT_TEMP, "temp", SENSORS_NO_MAPPING, 
+                              SENSORS_NO_MAPPING, SENSORS_MODE_R, 
+                              SMARTBATT_SYSCTL_TEMP, VALUE(1), 0 },
+    { SENSORS_SMARTBATT_TIME, "run_time_e", SENSORS_NO_MAPPING, 
+                              SENSORS_NO_MAPPING, SENSORS_MODE_R, 
+                              SMARTBATT_SYSCTL_TIME, VALUE(3), 0 },
+    { SENSORS_SMARTBATT_AVG_TIME_F, "avg_time_f", SENSORS_SMARTBATT_TIME, 
+	                      SENSORS_SMARTBATT_TIME, SENSORS_MODE_RW, 
+			      SMARTBATT_SYSCTL_TIME, VALUE(2), 0 },
+    { SENSORS_SMARTBATT_AVG_TIME_E, "avg_time_e", SENSORS_SMARTBATT_TIME, 
+	                      SENSORS_SMARTBATT_TIME, SENSORS_MODE_RW, 
+			      SMARTBATT_SYSCTL_TIME, VALUE(1), 0 },
+    { SENSORS_SMARTBATT_ALARMS, "alarms", SENSORS_NO_MAPPING,
+                              SENSORS_NO_MAPPING, SENSORS_MODE_R,
+                              SMARTBATT_SYSCTL_ALARMS, VALUE(1), 0 },
+    { SENSORS_SMARTBATT_CHARGE, "abs_charge", SENSORS_NO_MAPPING, 
+	                      SENSORS_NO_MAPPING, SENSORS_MODE_R, 
+			      SMARTBATT_SYSCTL_CHARGE, VALUE(2), 0 },
+    { SENSORS_SMARTBATT_REL_CHARGE, "rel_charge", SENSORS_SMARTBATT_CHARGE, 
+	                      SENSORS_SMARTBATT_V, SENSORS_MODE_RW, 
+			      SMARTBATT_SYSCTL_V, VALUE(1), 0 },
+    { 0 }
+  };
+
 sensors_chip_features sensors_chip_features_list[] =
 {
@@ -4488,4 +4526,5 @@
  { SENSORS_LM83_PREFIX, lm83_features },
  { SENSORS_LM90_PREFIX, lm90_features },
+ { SENSORS_SMARTBATT_PREFIX, smartbatt_features },
  { 0 }
 };
diff -u2 -r lm_sensors2.orig/lib/chips.h lm_sensors2/lib/chips.h
--- lm_sensors2.orig/lib/chips.h	2003-08-15 00:10:32.000000000 +0200
+++ lm_sensors2/lib/chips.h	2003-08-21 10:22:37.000000000 +0200
@@ -1646,3 +1646,19 @@
 #define SENSORS_BMC_CURR1_MAX 3201 /* RW */
 
+/* SMARTBATT chips. */
+
+#define SENSORS_SMARTBATT_PREFIX "smartbatt"
+
+#define SENSORS_SMARTBATT_I 1 /* R */
+#define SENSORS_SMARTBATT_I_AVG 2 /* RW */
+#define SENSORS_SMARTBATT_V 3 /* R */
+#define SENSORS_SMARTBATT_DES_V 4 /* RW */
+#define SENSORS_SMARTBATT_TEMP 5 /* R */
+#define SENSORS_SMARTBATT_TIME 6 /* R */
+#define SENSORS_SMARTBATT_AVG_TIME_F 7 /* RW */
+#define SENSORS_SMARTBATT_AVG_TIME_E 8 /* RW */
+#define SENSORS_SMARTBATT_ALARMS 9 /* R */
+#define SENSORS_SMARTBATT_CHARGE 10 /* R */
+#define SENSORS_SMARTBATT_REL_CHARGE 11 /* RW */
+
 #endif /* def LIB_SENSORS_CHIPS_H */
Only in lm_sensors2/lib: chips.ld
Only in lm_sensors2/lib: chips.lo
Only in lm_sensors2/lib: conf-lex.ao
Only in lm_sensors2/lib: conf-lex.c
Only in lm_sensors2/lib: conf-lex.lo
Only in lm_sensors2/lib: conf-parse.ao
Only in lm_sensors2/lib: conf-parse.c
Only in lm_sensors2/lib: conf-parse.h
Only in lm_sensors2/lib: conf-parse.lo
Only in lm_sensors2/lib: data.ad
Only in lm_sensors2/lib: data.ao
Only in lm_sensors2/lib: data.ld
Only in lm_sensors2/lib: data.lo
Only in lm_sensors2/lib: error.ad
Only in lm_sensors2/lib: error.ao
Only in lm_sensors2/lib: error.ld
Only in lm_sensors2/lib: error.lo
Only in lm_sensors2/lib: general.ad
Only in lm_sensors2/lib: general.ao
Only in lm_sensors2/lib: general.ld
Only in lm_sensors2/lib: general.lo
Only in lm_sensors2/lib: init.ad
Only in lm_sensors2/lib: init.ao
Only in lm_sensors2/lib: init.ld
Only in lm_sensors2/lib: init.lo
Only in lm_sensors2/lib: libsensors.a
Only in lm_sensors2/lib: libsensors.so
Only in lm_sensors2/lib: libsensors.so.2
Only in lm_sensors2/lib: libsensors.so.2.0.1
Only in lm_sensors2/lib: proc.ad
Only in lm_sensors2/lib: proc.ao
Only in lm_sensors2/lib: proc.ld
Only in lm_sensors2/lib: proc.lo
Only in lm_sensors2/prog/detect: dmidecode
Only in lm_sensors2/prog/detect: dmidecode.rd
Only in lm_sensors2/prog/detect: dmidecode.ro
Only in lm_sensors2/prog/detect: i2cdetect
Only in lm_sensors2/prog/detect: i2cdetect.rd
Only in lm_sensors2/prog/detect: i2cdetect.ro
Only in lm_sensors2/prog/dump: i2cdump
Only in lm_sensors2/prog/dump: i2cdump.rd
Only in lm_sensors2/prog/dump: i2cdump.ro
Only in lm_sensors2/prog/dump: i2cset
Only in lm_sensors2/prog/dump: i2cset.rd
Only in lm_sensors2/prog/dump: i2cset.ro
Only in lm_sensors2/prog/dump: isadump
Only in lm_sensors2/prog/dump: isadump.rd
Only in lm_sensors2/prog/dump: isadump.ro
Only in lm_sensors2/prog/sensord: args.rd
Only in lm_sensors2/prog/sensord: chips.rd
Only in lm_sensors2/prog/sensord: lib.rd
Only in lm_sensors2/prog/sensord: rrd.rd
Only in lm_sensors2/prog/sensord: sense.rd
Only in lm_sensors2/prog/sensord: sensord.rd
Only in lm_sensors2/prog/sensors: chips.rd
Only in lm_sensors2/prog/sensors: chips.ro
Only in lm_sensors2/prog/sensors: main.rd
Only in lm_sensors2/prog/sensors: main.ro
Only in lm_sensors2/prog/sensors: sensors


More information about the lm-sensors mailing list