mirror of
https://github.com/lm-sensors/lm-sensors.git
synced 2026-11-08 16:11:26 +00:00
Add preliminary sysfs support. Two entries added to struct sensors_chip_feature.
chips.c support added only for w83781d as an example.
Advance library version to 3.0.0.
git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2059 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
1 parent
9876834233
commit
27e9877012
5 files changed
+215
-89
No files matched your search
+2
-2
@@ -28,8 +28,8 @@ LIBMAN5DIR := $(MANDIR)/man5
|
||||
LIBMAN5FILES := $(MODULE_DIR)/sensors.conf.5
|
||||
|
||||
# The main and minor version of the library
|
||||
LIBMAINVER := 2
|
||||
LIBMINORVER := 0.2
|
||||
LIBMAINVER := 3
|
||||
LIBMINORVER := 0.0
|
||||
LIBVER := $(LIBMAINVER).$(LIBMINORVER)
|
||||
|
||||
# The static lib name, the shared lib name, and the internal ('so') name of
|
||||
|
||||
+29
-13
@@ -35,7 +35,7 @@ int sensors_match_chip(sensors_chip_name chip1, sensors_chip_name chip2)
|
||||
{
|
||||
if ((chip1.prefix != SENSORS_CHIP_NAME_PREFIX_ANY) &&
|
||||
(chip2.prefix != SENSORS_CHIP_NAME_PREFIX_ANY) &&
|
||||
strcmp(chip1.prefix,chip2.prefix))
|
||||
strcasecmp(chip1.prefix,chip2.prefix))
|
||||
return 0;
|
||||
if ((chip1.bus != SENSORS_CHIP_NAME_BUS_ANY) &&
|
||||
(chip2.bus != SENSORS_CHIP_NAME_BUS_ANY) &&
|
||||
@@ -87,7 +87,7 @@ const sensors_chip_feature *sensors_lookup_feature_nr(const char *prefix,
|
||||
int i,j;
|
||||
const sensors_chip_feature *features;
|
||||
for (i = 0; sensors_chip_features_list[i].prefix; i++)
|
||||
if (!strcmp(sensors_chip_features_list[i].prefix,prefix)) {
|
||||
if (!strcasecmp(sensors_chip_features_list[i].prefix,prefix)) {
|
||||
features = sensors_chip_features_list[i].feature;
|
||||
for (j=0; features[j].name; j++)
|
||||
if (features[j].number == feature)
|
||||
@@ -105,10 +105,10 @@ const sensors_chip_feature *sensors_lookup_feature_name(const char *prefix,
|
||||
int i,j;
|
||||
const sensors_chip_feature *features;
|
||||
for (i = 0; sensors_chip_features_list[i].prefix; i++)
|
||||
if (!strcmp(sensors_chip_features_list[i].prefix,prefix)) {
|
||||
if (!strcasecmp(sensors_chip_features_list[i].prefix,prefix)) {
|
||||
features = sensors_chip_features_list[i].feature;
|
||||
for (j=0; features[j].name; j++)
|
||||
if (!strcmp(features[j].name,feature))
|
||||
if (!strcasecmp(features[j].name,feature))
|
||||
return features + j;
|
||||
}
|
||||
return NULL;
|
||||
@@ -120,6 +120,14 @@ const sensors_chip_feature *sensors_lookup_feature_name(const char *prefix,
|
||||
if there are wildcards. */
|
||||
int sensors_chip_name_has_wildcards(sensors_chip_name chip)
|
||||
{
|
||||
extern int foundsysfs;
|
||||
|
||||
if(foundsysfs) {
|
||||
if (chip.prefix == SENSORS_CHIP_NAME_PREFIX_ANY)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
if ((chip.prefix == SENSORS_CHIP_NAME_PREFIX_ANY) ||
|
||||
(chip.bus == SENSORS_CHIP_NAME_BUS_ANY) ||
|
||||
(chip.bus == SENSORS_CHIP_NAME_BUS_ANY_I2C) ||
|
||||
@@ -154,14 +162,14 @@ int sensors_get_label(sensors_chip_name name, int feature, char **result)
|
||||
return -SENSORS_ERR_NO_ENTRY;
|
||||
for (chip = NULL; (chip = sensors_for_all_config_chips(name,chip));)
|
||||
for (i = 0; i < chip->labels_count; i++)
|
||||
if (!strcmp(featureptr->name, chip->labels[i].name)) {
|
||||
if (!strcasecmp(featureptr->name, chip->labels[i].name)) {
|
||||
if (*result)
|
||||
free(*result);
|
||||
if (! (*result = strdup(chip->labels[i].value)))
|
||||
sensors_fatal_error("sensors_get_label","Allocating label text");
|
||||
return 0; /* Exact match always overrules! */
|
||||
} else if (alt_featureptr &&
|
||||
!strcmp(alt_featureptr->name, chip->labels[i].name)) {
|
||||
!strcasecmp(alt_featureptr->name, chip->labels[i].name)) {
|
||||
if (*result)
|
||||
free(*result);
|
||||
if (! (*result = strdup(chip->labels[i].value)))
|
||||
@@ -192,10 +200,10 @@ int sensors_get_ignored(sensors_chip_name name, int feature)
|
||||
return -SENSORS_ERR_NO_ENTRY;
|
||||
for (chip = NULL; (chip = sensors_for_all_config_chips(name,chip));)
|
||||
for (i = 0; i < chip->ignores_count; i++)
|
||||
if (!strcmp(featureptr->name, chip->ignores[i].name))
|
||||
if (!strcasecmp(featureptr->name, chip->ignores[i].name))
|
||||
return 0; /* Exact match always overrules! */
|
||||
else if (alt_featureptr &&
|
||||
!strcmp(alt_featureptr->name, chip->ignores[i].name))
|
||||
!strcasecmp(alt_featureptr->name, chip->ignores[i].name))
|
||||
res = 0;
|
||||
return res;
|
||||
}
|
||||
@@ -227,11 +235,11 @@ int sensors_get_feature(sensors_chip_name name, int feature, double *result)
|
||||
return -SENSORS_ERR_ACCESS_R;
|
||||
for (chip = NULL; !expr && (chip = sensors_for_all_config_chips(name,chip));)
|
||||
for (i = 0; !final_expr && (i < chip->computes_count); i++) {
|
||||
if (!strcmp(main_feature->name,chip->computes[i].name)) {
|
||||
if (!strcasecmp(main_feature->name,chip->computes[i].name)) {
|
||||
expr = chip->computes[i].from_proc;
|
||||
final_expr = 1;
|
||||
} else if (alt_feature &&
|
||||
!strcmp(alt_feature->name,chip->computes[i].name))
|
||||
!strcasecmp(alt_feature->name,chip->computes[i].name))
|
||||
expr = chip->computes[i].from_proc;
|
||||
}
|
||||
if (sensors_read_proc(name,feature,&val))
|
||||
@@ -270,11 +278,11 @@ int sensors_set_feature(sensors_chip_name name, int feature, double value)
|
||||
return -SENSORS_ERR_ACCESS_W;
|
||||
for (chip = NULL; !expr && (chip = sensors_for_all_config_chips(name,chip));)
|
||||
for (i = 0; !final_expr && (i < chip->computes_count); i++)
|
||||
if (!strcmp(main_feature->name,chip->computes[i].name)) {
|
||||
if (!strcasecmp(main_feature->name,chip->computes[i].name)) {
|
||||
expr = chip->computes->to_proc;
|
||||
final_expr = 1;
|
||||
} else if (alt_feature &&
|
||||
!strcmp(alt_feature->name,chip->computes[i].name))
|
||||
!strcasecmp(alt_feature->name,chip->computes[i].name))
|
||||
expr = chip->computes[i].to_proc;
|
||||
|
||||
to_write = value;
|
||||
@@ -296,7 +304,11 @@ const sensors_chip_name *sensors_get_detected_chips (int *nr)
|
||||
|
||||
const char *sensors_get_adapter_name(int bus_nr)
|
||||
{
|
||||
extern int foundsysfs;
|
||||
int i;
|
||||
|
||||
if(foundsysfs)
|
||||
return "Unavailable from sysfs";
|
||||
if (bus_nr == SENSORS_CHIP_NAME_BUS_ISA)
|
||||
return "ISA adapter";
|
||||
if (bus_nr == SENSORS_CHIP_NAME_BUS_DUMMY)
|
||||
@@ -309,7 +321,11 @@ const char *sensors_get_adapter_name(int bus_nr)
|
||||
|
||||
const char *sensors_get_algorithm_name(int bus_nr)
|
||||
{
|
||||
extern int foundsysfs;
|
||||
int i;
|
||||
|
||||
if(foundsysfs)
|
||||
return "Unavailable from sysfs";
|
||||
if (bus_nr == SENSORS_CHIP_NAME_BUS_ISA)
|
||||
return "ISA algorithm";
|
||||
if (bus_nr == SENSORS_CHIP_NAME_BUS_DUMMY)
|
||||
@@ -328,7 +344,7 @@ const sensors_feature_data *sensors_get_all_features (sensors_chip_name name,
|
||||
int i;
|
||||
|
||||
for (i = 0; sensors_chip_features_list[i].prefix; i++)
|
||||
if (!strcmp(sensors_chip_features_list[i].prefix,name.prefix)) {
|
||||
if (!strcasecmp(sensors_chip_features_list[i].prefix,name.prefix)) {
|
||||
feature_list=sensors_chip_features_list[i].feature;
|
||||
if (!*nr1 && !*nr2) { /* Return the first entry */
|
||||
if (!feature_list[0].name) /* The list may be empty */
|
||||
|
||||
+40
-40
@@ -740,114 +740,114 @@ static sensors_chip_feature lm90_features[] =
|
||||
static sensors_chip_feature w83781d_features[] =
|
||||
{
|
||||
{ SENSORS_W83781D_IN0, "in0", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_IN0, VALUE(3), 2 },
|
||||
R, W83781D_SYSCTL_IN0, VALUE(3), 2, "in_input0", 3 },
|
||||
{ SENSORS_W83781D_IN1, "in1", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_IN1, VALUE(3), 2 },
|
||||
R, W83781D_SYSCTL_IN1, VALUE(3), 2, "in_input1", 3 },
|
||||
{ SENSORS_W83781D_IN2, "in2", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_IN2, VALUE(3), 2 },
|
||||
R, W83781D_SYSCTL_IN2, VALUE(3), 2, "in_input2", 3 },
|
||||
{ SENSORS_W83781D_IN3, "in3", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_IN3, VALUE(3), 2 },
|
||||
R, W83781D_SYSCTL_IN3, VALUE(3), 2, "in_input3", 3 },
|
||||
{ SENSORS_W83781D_IN4, "in4", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_IN4, VALUE(3), 2 },
|
||||
R, W83781D_SYSCTL_IN4, VALUE(3), 2, "in_input4", 3 },
|
||||
{ SENSORS_W83781D_IN5, "in5", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_IN5, VALUE(3), 2 },
|
||||
R, W83781D_SYSCTL_IN5, VALUE(3), 2, "in_input5", 3 },
|
||||
{ SENSORS_W83781D_IN6, "in6", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_IN6, VALUE(3), 2 },
|
||||
R, W83781D_SYSCTL_IN6, VALUE(3), 2, "in_input6", 3 },
|
||||
{ SENSORS_W83781D_IN0_MIN, "in0_min", SENSORS_W83781D_IN0,
|
||||
SENSORS_W83781D_IN0, RW,
|
||||
W83781D_SYSCTL_IN0, VALUE(1), 2 },
|
||||
W83781D_SYSCTL_IN0, VALUE(1), 2, "in_min0", 3 },
|
||||
{ SENSORS_W83781D_IN1_MIN, "in1_min", SENSORS_W83781D_IN1,
|
||||
SENSORS_W83781D_IN1, RW,
|
||||
W83781D_SYSCTL_IN1, VALUE(1), 2 },
|
||||
W83781D_SYSCTL_IN1, VALUE(1), 2, "in_min1", 3 },
|
||||
{ SENSORS_W83781D_IN2_MIN, "in2_min", SENSORS_W83781D_IN2,
|
||||
SENSORS_W83781D_IN2, RW,
|
||||
W83781D_SYSCTL_IN2, VALUE(1), 2 },
|
||||
W83781D_SYSCTL_IN2, VALUE(1), 2, "in_min2", 3 },
|
||||
{ SENSORS_W83781D_IN3_MIN, "in3_min", SENSORS_W83781D_IN3,
|
||||
SENSORS_W83781D_IN3, RW,
|
||||
W83781D_SYSCTL_IN3, VALUE(1), 2 },
|
||||
W83781D_SYSCTL_IN3, VALUE(1), 2, "in_min3", 3 },
|
||||
{ SENSORS_W83781D_IN4_MIN, "in4_min", SENSORS_W83781D_IN4,
|
||||
SENSORS_W83781D_IN4, RW,
|
||||
W83781D_SYSCTL_IN4, VALUE(1), 2 },
|
||||
W83781D_SYSCTL_IN4, VALUE(1), 2, "in_min4", 3 },
|
||||
/* swap 5 and 6 min/max because compute lines will be inverting */
|
||||
{ SENSORS_W83781D_IN5_MIN, "in5_min", SENSORS_W83781D_IN5,
|
||||
SENSORS_W83781D_IN5, RW,
|
||||
W83781D_SYSCTL_IN5, VALUE(2), 2 },
|
||||
W83781D_SYSCTL_IN5, VALUE(2), 2, "in_min5", 3 },
|
||||
{ SENSORS_W83781D_IN6_MIN, "in6_min", SENSORS_W83781D_IN6,
|
||||
SENSORS_W83781D_IN6, RW,
|
||||
W83781D_SYSCTL_IN6, VALUE(2), 2 },
|
||||
W83781D_SYSCTL_IN6, VALUE(2), 2, "in_min6", 3 },
|
||||
{ SENSORS_W83781D_IN0_MAX, "in0_max", SENSORS_W83781D_IN0,
|
||||
SENSORS_W83781D_IN0, RW,
|
||||
W83781D_SYSCTL_IN0, VALUE(2), 2 },
|
||||
W83781D_SYSCTL_IN0, VALUE(2), 2, "in_max0", 3 },
|
||||
{ SENSORS_W83781D_IN1_MAX, "in1_max", SENSORS_W83781D_IN1,
|
||||
SENSORS_W83781D_IN1, RW,
|
||||
W83781D_SYSCTL_IN1, VALUE(2), 2 },
|
||||
W83781D_SYSCTL_IN1, VALUE(2), 2, "in_max1", 3 },
|
||||
{ SENSORS_W83781D_IN2_MAX, "in2_max", SENSORS_W83781D_IN2,
|
||||
SENSORS_W83781D_IN2, RW,
|
||||
W83781D_SYSCTL_IN2, VALUE(2), 2 },
|
||||
W83781D_SYSCTL_IN2, VALUE(2), 2, "in_max2", 3 },
|
||||
{ SENSORS_W83781D_IN3_MAX, "in3_max", SENSORS_W83781D_IN3,
|
||||
SENSORS_W83781D_IN3, RW,
|
||||
W83781D_SYSCTL_IN3, VALUE(2), 2 },
|
||||
W83781D_SYSCTL_IN3, VALUE(2), 2, "in_max3", 3 },
|
||||
{ SENSORS_W83781D_IN4_MAX, "in4_max", SENSORS_W83781D_IN4,
|
||||
SENSORS_W83781D_IN4, RW,
|
||||
W83781D_SYSCTL_IN4, VALUE(2), 2 },
|
||||
W83781D_SYSCTL_IN4, VALUE(2), 2, "in_max4", 3 },
|
||||
{ SENSORS_W83781D_IN5_MAX, "in5_max", SENSORS_W83781D_IN5,
|
||||
SENSORS_W83781D_IN5, RW,
|
||||
W83781D_SYSCTL_IN5, VALUE(1), 2 },
|
||||
W83781D_SYSCTL_IN5, VALUE(1), 2, "in_max5", 3 },
|
||||
{ SENSORS_W83781D_IN6_MAX, "in6_max", SENSORS_W83781D_IN6,
|
||||
SENSORS_W83781D_IN6, RW,
|
||||
W83781D_SYSCTL_IN6, VALUE(1), 2 },
|
||||
W83781D_SYSCTL_IN6, VALUE(1), 2, "in_max6", 3 },
|
||||
{ SENSORS_W83781D_FAN1, "fan1", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_FAN1, VALUE(2), 0 },
|
||||
R, W83781D_SYSCTL_FAN1, VALUE(2), 0, "fan_input1" },
|
||||
{ SENSORS_W83781D_FAN2, "fan2", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_FAN2, VALUE(2), 0 },
|
||||
R, W83781D_SYSCTL_FAN2, VALUE(2), 0, "fan_input2" },
|
||||
{ SENSORS_W83781D_FAN3, "fan3", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_FAN3, VALUE(2), 0 },
|
||||
R, W83781D_SYSCTL_FAN3, VALUE(2), 0, "fan_input3" },
|
||||
{ SENSORS_W83781D_FAN1_MIN, "fan1_min", SENSORS_W83781D_FAN1,
|
||||
SENSORS_W83781D_FAN1, RW,
|
||||
W83781D_SYSCTL_FAN1, VALUE(1), 0 },
|
||||
W83781D_SYSCTL_FAN1, VALUE(1), 0, "fan_min1" },
|
||||
{ SENSORS_W83781D_FAN2_MIN, "fan2_min", SENSORS_W83781D_FAN2,
|
||||
SENSORS_W83781D_FAN2, RW,
|
||||
W83781D_SYSCTL_FAN2, VALUE(1), 0 },
|
||||
W83781D_SYSCTL_FAN2, VALUE(1), 0, "fan_min2" },
|
||||
{ SENSORS_W83781D_FAN3_MIN, "fan3_min", SENSORS_W83781D_FAN3,
|
||||
SENSORS_W83781D_FAN3, RW,
|
||||
W83781D_SYSCTL_FAN3, VALUE(1), 0 },
|
||||
W83781D_SYSCTL_FAN3, VALUE(1), 0, "fan_min3" },
|
||||
{ SENSORS_W83781D_TEMP1, "temp1", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_TEMP1, VALUE(3), 1 },
|
||||
R, W83781D_SYSCTL_TEMP1, VALUE(3), 1, "temp_input1", 2 },
|
||||
{ SENSORS_W83781D_TEMP1_HYST, "temp1_hyst", SENSORS_W83781D_TEMP1,
|
||||
SENSORS_W83781D_TEMP1, RW,
|
||||
W83781D_SYSCTL_TEMP1, VALUE(2), 1 },
|
||||
W83781D_SYSCTL_TEMP1, VALUE(2), 1, "temp_min1", 2 },
|
||||
{ SENSORS_W83781D_TEMP1_OVER, "temp1_over", SENSORS_W83781D_TEMP1,
|
||||
SENSORS_W83781D_TEMP1, RW,
|
||||
W83781D_SYSCTL_TEMP1, VALUE(1), 1 },
|
||||
W83781D_SYSCTL_TEMP1, VALUE(1), 1, "temp_max1", 2 },
|
||||
{ SENSORS_W83781D_TEMP2, "temp2", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_TEMP2, VALUE(3), 1 },
|
||||
R, W83781D_SYSCTL_TEMP2, VALUE(3), 1, "temp_input2", 2 },
|
||||
{ SENSORS_W83781D_TEMP2_HYST, "temp2_hyst", SENSORS_W83781D_TEMP2,
|
||||
SENSORS_W83781D_TEMP2, RW,
|
||||
W83781D_SYSCTL_TEMP2, VALUE(2), 1 },
|
||||
W83781D_SYSCTL_TEMP2, VALUE(2), 1, "temp_min2", 2 },
|
||||
{ SENSORS_W83781D_TEMP2_OVER, "temp2_over", SENSORS_W83781D_TEMP2,
|
||||
SENSORS_W83781D_TEMP2, RW,
|
||||
W83781D_SYSCTL_TEMP2, VALUE(1), 1 },
|
||||
W83781D_SYSCTL_TEMP2, VALUE(1), 1, "temp_max2", 2 },
|
||||
{ SENSORS_W83781D_TEMP3, "temp3", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_TEMP3, VALUE(3), 1 },
|
||||
R, W83781D_SYSCTL_TEMP3, VALUE(3), 1, "temp_input3", 2 },
|
||||
{ SENSORS_W83781D_TEMP3_HYST, "temp3_hyst", SENSORS_W83781D_TEMP3,
|
||||
SENSORS_W83781D_TEMP3, RW,
|
||||
W83781D_SYSCTL_TEMP3, VALUE(2), 1 },
|
||||
W83781D_SYSCTL_TEMP3, VALUE(2), 1, "temp_min3", 2 },
|
||||
{ SENSORS_W83781D_TEMP3_OVER, "temp3_over", SENSORS_W83781D_TEMP3,
|
||||
SENSORS_W83781D_TEMP3, RW,
|
||||
W83781D_SYSCTL_TEMP3, VALUE(1), 1 },
|
||||
W83781D_SYSCTL_TEMP3, VALUE(1), 1, "temp_max3", 2 },
|
||||
{ SENSORS_W83781D_VID, "vid", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_VID, VALUE(1), 3 },
|
||||
{ SENSORS_W83781D_VRM, "vrm", NOMAP, NOMAP,
|
||||
RW, W83781D_SYSCTL_VRM, VALUE(1), 1 },
|
||||
{ SENSORS_W83781D_FAN1_DIV, "fan1_div", SENSORS_W83781D_FAN1,
|
||||
NOMAP, RW,
|
||||
W83781D_SYSCTL_FAN_DIV, VALUE(1), 0 },
|
||||
W83781D_SYSCTL_FAN_DIV, VALUE(1), 0, "fan_div1" },
|
||||
{ SENSORS_W83781D_FAN2_DIV, "fan2_div", SENSORS_W83781D_FAN2,
|
||||
NOMAP, RW,
|
||||
W83781D_SYSCTL_FAN_DIV, VALUE(2), 0 },
|
||||
W83781D_SYSCTL_FAN_DIV, VALUE(2), 0, "fan_div2" },
|
||||
{ SENSORS_W83781D_FAN3_DIV, "fan3_div", SENSORS_W83781D_FAN3,
|
||||
NOMAP, RW,
|
||||
W83781D_SYSCTL_FAN_DIV, VALUE(3), 0 },
|
||||
W83781D_SYSCTL_FAN_DIV, VALUE(3), 0, "fan_div3" },
|
||||
{ SENSORS_W83781D_ALARMS, "alarms", NOMAP, NOMAP,
|
||||
R, W83781D_SYSCTL_ALARMS, VALUE(1), 0 },
|
||||
{ SENSORS_W83781D_BEEP_ENABLE, "beep_enable", SENSORS_W83781D_ALARMS,
|
||||
@@ -855,7 +855,7 @@ static sensors_chip_feature w83781d_features[] =
|
||||
W83781D_SYSCTL_BEEP, VALUE(1), 0 },
|
||||
{ SENSORS_W83781D_BEEPS, "beeps", SENSORS_W83781D_ALARMS,
|
||||
SENSORS_W83781D_ALARMS, RW,
|
||||
W83781D_SYSCTL_BEEP, VALUE(2), 0 },
|
||||
W83781D_SYSCTL_BEEP, VALUE(2), 0, "beep_mask" },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
|
||||
@@ -159,6 +159,8 @@ typedef struct sensors_chip_feature {
|
||||
int sysctl;
|
||||
int offset;
|
||||
int scaling;
|
||||
const char *sysname;
|
||||
int sysscaling;
|
||||
} sensors_chip_feature;
|
||||
|
||||
/* Internal data about all features of a type of chip */
|
||||
|
||||
+142
-34
@@ -38,35 +38,105 @@
|
||||
static char buf[BUF_LEN];
|
||||
|
||||
sensors_proc_chips_entry *sensors_proc_chips;
|
||||
int sensors_proc_chips_count;
|
||||
int sensors_proc_chips_max;
|
||||
int sensors_proc_chips_count, sensors_proc_chips_max;
|
||||
int sensors_sys_chips_count, sensors_sys_chips_max;
|
||||
|
||||
sensors_bus *sensors_sys_bus;
|
||||
int sensors_sys_bus_count, sensors_sys_bus_max;
|
||||
sensors_bus *sensors_proc_bus;
|
||||
int sensors_proc_bus_count;
|
||||
int sensors_proc_bus_max;
|
||||
int sensors_proc_bus_count, sensors_proc_bus_max;
|
||||
|
||||
static int sensors_get_chip_id(sensors_chip_name name);
|
||||
|
||||
int foundsysfs=0;
|
||||
|
||||
#define add_proc_chips(el) sensors_add_array_el(el,\
|
||||
(void **) &sensors_proc_chips,\
|
||||
&sensors_proc_chips_count,\
|
||||
&sensors_proc_chips_max,\
|
||||
sizeof(struct sensors_proc_chips_entry))
|
||||
|
||||
#define add_bus(el) sensors_add_array_el(el,\
|
||||
#define add_proc_bus(el) sensors_add_array_el(el,\
|
||||
(void **) &sensors_proc_bus,\
|
||||
&sensors_proc_bus_count,\
|
||||
&sensors_proc_bus_max,\
|
||||
sizeof(struct sensors_bus))
|
||||
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
/* This reads /proc/sys/dev/sensors/chips into memory */
|
||||
int sensors_read_proc_chips(void)
|
||||
{
|
||||
int name[3] = { CTL_DEV, DEV_SENSORS, SENSORS_CHIPS };
|
||||
int buflen = BUF_LEN;
|
||||
char *bufptr = buf;
|
||||
sensors_proc_chips_entry entry;
|
||||
int res,lineno;
|
||||
struct dirent *de;
|
||||
DIR *dir;
|
||||
FILE *f;
|
||||
char dev[NAME_MAX], fstype[NAME_MAX], sysfs[NAME_MAX], n[NAME_MAX];
|
||||
char dirname[NAME_MAX];
|
||||
int res;
|
||||
|
||||
int name[3] = { CTL_DEV, DEV_SENSORS, SENSORS_CHIPS };
|
||||
int buflen = BUF_LEN;
|
||||
char *bufptr = buf;
|
||||
sensors_proc_chips_entry entry;
|
||||
int lineno;
|
||||
|
||||
/* First figure out where sysfs was mounted */
|
||||
if ((f = fopen("/proc/mounts", "r")) == NULL)
|
||||
goto proc;
|
||||
while (fgets(n, NAME_MAX, f)) {
|
||||
sscanf(n, "%[^ ] %[^ ] %[^ ] %*s\n", dev, sysfs, fstype);
|
||||
if (strcasecmp(fstype, "sysfs") == 0) {
|
||||
foundsysfs++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
if (! foundsysfs)
|
||||
goto proc;
|
||||
strcat(sysfs, "/bus/i2c/devices");
|
||||
|
||||
/* Then read from it */
|
||||
dir = opendir(sysfs); /* Might just be "/sys/bus/i2c/devices" */
|
||||
if (! dir)
|
||||
goto proc;
|
||||
|
||||
while ((de = readdir(dir)) != NULL) {
|
||||
if (de->d_name[0] == '.' && de->d_name[1] == '\0')
|
||||
continue;
|
||||
if (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')
|
||||
continue;
|
||||
/*
|
||||
if (de->d_type != DT_DIR && de->d_type != DT_LNK)
|
||||
continue;
|
||||
*/
|
||||
|
||||
strcpy(n, sysfs);
|
||||
strcat(n, "/");
|
||||
strcat(n, de->d_name);
|
||||
strcpy(dirname, n);
|
||||
strcat(n, "/name");
|
||||
|
||||
if ((f = fopen(n, "r")) != NULL) {
|
||||
char x[120];
|
||||
fscanf(f, "%[a-zA-z0-9_]", &x);
|
||||
/* HACK */ strcat(x, "-*");
|
||||
if ((res = sensors_parse_chip_name(x, &entry.name))) {
|
||||
char em[NAME_MAX + 20];
|
||||
strcpy(em, "Parsing ");
|
||||
strcat(em, n);
|
||||
sensors_parse_error(em, 0);
|
||||
return res;
|
||||
}
|
||||
entry.name.busname = strdup(dirname);
|
||||
sscanf(de->d_name, "%x-%x", &entry.name.bus, &entry.name.addr);
|
||||
add_proc_chips(&entry);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
closedir(dir);
|
||||
return 0;
|
||||
|
||||
proc:
|
||||
|
||||
if (sysctl(name, 3, bufptr, &buflen, NULL, 0))
|
||||
return -SENSORS_ERR_PROC;
|
||||
@@ -90,11 +160,22 @@ int sensors_read_proc_chips(void)
|
||||
|
||||
int sensors_read_proc_bus(void)
|
||||
{
|
||||
FILE *f;
|
||||
char line[255];
|
||||
char *border;
|
||||
sensors_bus entry;
|
||||
int lineno;
|
||||
FILE *f;
|
||||
char line[255];
|
||||
char *border;
|
||||
sensors_bus entry;
|
||||
int lineno;
|
||||
|
||||
if(foundsysfs) {
|
||||
/* I don't have a clue what to read here. */
|
||||
entry.adapter = 0; /* ?? */
|
||||
entry.algorithm = 0; /* ?? */
|
||||
entry.number = SENSORS_CHIP_NAME_BUS_ISA;
|
||||
add_proc_bus(&entry);
|
||||
entry.number = SENSORS_CHIP_NAME_BUS_DUMMY;
|
||||
add_proc_bus(&entry);
|
||||
return 0;
|
||||
}
|
||||
|
||||
f = fopen("/proc/bus/i2c","r");
|
||||
if (!f)
|
||||
@@ -122,7 +203,7 @@ int sensors_read_proc_bus(void)
|
||||
goto ERROR;
|
||||
sensors_strip_of_spaces(entry.algorithm);
|
||||
sensors_strip_of_spaces(entry.adapter);
|
||||
add_bus(&entry);
|
||||
add_proc_bus(&entry);
|
||||
lineno++;
|
||||
}
|
||||
fclose(f);
|
||||
@@ -149,24 +230,51 @@ int sensors_get_chip_id(sensors_chip_name name)
|
||||
/* This reads a feature /proc file */
|
||||
int sensors_read_proc(sensors_chip_name name, int feature, double *value)
|
||||
{
|
||||
int sysctl_name[4] = { CTL_DEV, DEV_SENSORS };
|
||||
const sensors_chip_feature *the_feature;
|
||||
int buflen = BUF_LEN;
|
||||
int mag;
|
||||
|
||||
if ((sysctl_name[2] = sensors_get_chip_id(name)) < 0)
|
||||
return sysctl_name[2];
|
||||
if (! (the_feature = sensors_lookup_feature_nr(name.prefix,feature)))
|
||||
return -SENSORS_ERR_NO_ENTRY;
|
||||
sysctl_name[3] = the_feature->sysctl;
|
||||
if (sysctl(sysctl_name, 4, buf, &buflen, NULL, 0))
|
||||
return -SENSORS_ERR_PROC;
|
||||
*value = *((long *) (buf + the_feature->offset));
|
||||
for (mag = the_feature->scaling; mag > 0; mag --)
|
||||
*value /= 10.0;
|
||||
for (; mag < 0; mag ++)
|
||||
*value *= 10.0;
|
||||
return 0;
|
||||
int sysctl_name[4] = { CTL_DEV, DEV_SENSORS };
|
||||
const sensors_chip_feature *the_feature;
|
||||
int buflen = BUF_LEN;
|
||||
int mag;
|
||||
char n[NAME_MAX];
|
||||
FILE *f;
|
||||
|
||||
if(!foundsysfs)
|
||||
if ((sysctl_name[2] = sensors_get_chip_id(name)) < 0)
|
||||
return sysctl_name[2];
|
||||
if (! (the_feature = sensors_lookup_feature_nr(name.prefix,feature)))
|
||||
return -SENSORS_ERR_NO_ENTRY;
|
||||
if(foundsysfs) {
|
||||
strcpy(n, name.busname);
|
||||
strcat(n, "/");
|
||||
if(the_feature->sysname != NULL)
|
||||
strcat(n, the_feature->sysname);
|
||||
else
|
||||
strcat(n, the_feature->name);
|
||||
if ((f = fopen(n, "r")) != NULL) {
|
||||
fscanf(f, "%lf", value);
|
||||
fclose(f);
|
||||
if(the_feature->sysscaling)
|
||||
mag = the_feature->sysscaling;
|
||||
else
|
||||
mag = the_feature->scaling;
|
||||
for (; mag > 0; mag --)
|
||||
*value /= 10.0;
|
||||
// fprintf(stderr, "Feature %s value %lf scale %d offset %d\n",
|
||||
// the_feature->name, *value,
|
||||
// the_feature->scaling, the_feature->offset);
|
||||
return 0;
|
||||
} else
|
||||
return -SENSORS_ERR_PROC;
|
||||
} else {
|
||||
sysctl_name[3] = the_feature->sysctl;
|
||||
if (sysctl(sysctl_name, 4, buf, &buflen, NULL, 0))
|
||||
return -SENSORS_ERR_PROC;
|
||||
*value = *((long *) (buf + the_feature->offset));
|
||||
for (mag = the_feature->scaling; mag > 0; mag --)
|
||||
*value /= 10.0;
|
||||
for (; mag < 0; mag ++)
|
||||
*value *= 10.0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sensors_write_proc(sensors_chip_name name, int feature, double value)
|
||||
|
||||
Reference in new issue
Block a user