2
0
mirror of https://github.com/lm-sensors/lm-sensors synced 2025-09-01 23:05:25 +00:00

sensors-detect new feature

The detection program can now be told that it should probe for more
addresses than the kernel driver module; it automatically generates
the necessary insmod parameters for the module if chips are found on
these non-standard addresses. Very useful for the LM78, for instance;
the driver still only check 0x20-0x2f, but the probe program checks
all addresses.


git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@336 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Frodo Looijaard
1999-03-23 21:48:41 +00:00
parent 3ccf39c7d0
commit bdb8f575b7

View File

@@ -92,11 +92,15 @@ use subs qw(lm78_detect lm78_isa_detect lm78_alias_detect lm75_detect
# written yet.
# i2c_addrs (optional): For I2C chips, the range of valid I2C addresses to
# probe.
# i2c_driver_addrs (optional): For I2C chips, the range of valid I2C
# addresses probed by the kernel driver. Strictly optional.
# i2c_detect (optional): For I2C chips, the function to call to detect
# this chip. The function should take two parameters: an open file
# descriptor to access the bus, and the I2C address to probe.
# isa_addrs (optional): For ISA chips, the range of valid port addresses to
# probe.
# isa_driver_addrs (optional): For ISA chips, the range of valid ISA
# addresses probed by the kernel driver. Strictly optional.
# isa_detect (optional): For ISA chips, the function to call to detect
# this chip. The function should take one parameter: the ISA address
# to probe.
@@ -109,6 +113,7 @@ use subs qw(lm78_detect lm78_isa_detect lm78_alias_detect lm75_detect
name => "National Semiconductors LM78",
driver => "lm78",
i2c_addrs => [0x00..0x7f],
i2c_driver_addrs => [0x20..0x2f],
i2c_detect => sub { lm78_detect 0, @_},
isa_addrs => [0x290],
isa_detect => sub { lm78_isa_detect 0, @_ },
@@ -118,6 +123,7 @@ use subs qw(lm78_detect lm78_isa_detect lm78_alias_detect lm75_detect
name => "National Semiconductors LM78-J",
driver => "lm78",
i2c_addrs => [0x00..0x7f],
i2c_driver_addrs => [0x20..0x2f],
i2c_detect => sub { lm78_detect 1, @_ },
isa_addrs => [0x290],
isa_detect => sub { lm78_isa_detect 1, @_ },
@@ -127,6 +133,7 @@ use subs qw(lm78_detect lm78_isa_detect lm78_alias_detect lm75_detect
name => "National Semiconductors LM79",
driver => "lm78",
i2c_addrs => [0x00..0x7f],
i2c_driver_addrs => [0x20..0x2f],
i2c_detect => sub { lm78_detect 2, @_ },
isa_addrs => [0x290],
isa_detect => sub { lm78_isa_detect 2, @_ },
@@ -711,8 +718,12 @@ use vars qw(@chips_detected);
# (if this is an I2C detection)
# with field 'i2c_sub_addrs', containing a reference to a list of
# other I2C addresses (if this is an I2C detection)
# with field 'i2c_extra' if this is an I2C detection and the address
# is not normally probed by the kernel driver
# with field 'isa_addr' containing the ISA address this chip is on
# (if this is an ISA detection)
# with field 'isa_extra' if this is an ISA detection and the address
# is not normally probed by the kernel driver
# with field 'conf', containing the confidence level of this detection
# with field 'chipname', containing the chip name
@@ -841,6 +852,8 @@ sub add_isa_to_chips_detected
if (&$alias_detect ($datahash->{isa_addr},\*FILE,
$new_misdetected_ref->[$i]->{i2c_addr})) {
$new_misdetected_ref->[$i]->{isa_addr} = $datahash->{isa_addr};
$new_misdetected_ref->[$i]->{isa_extra} = $datahash->{isa_extra}
if exists $datahash->{isa_extra};
close FILE;
return;
}
@@ -865,6 +878,8 @@ sub add_isa_to_chips_detected
if (&$alias_detect ($datahash->{isa_addr},\*FILE,
$new_detected_ref->[$i]->{i2c_addr})) {
$new_detected_ref->[$i]->{isa_addr} = $datahash->{isa_addr};
$new_detected_ref->[$i]->{isa_extra} = $datahash->{isa_extra}
if exists $datahash->{isa_extra};
($datahash) = splice (@$new_detected_ref, $i, 1);
close FILE;
last;
@@ -955,6 +970,9 @@ sub scan_adapter
my @chips_copy = @chips;
$new_hash->{i2c_sub_addrs} = \@chips_copy;
}
$new_hash->{i2c_extra} = 0
if exists $chip->{i2c_driver_addrs} and
not contains( $addr , @{$chip->{i2c_driver_addrs}});
add_i2c_to_chips_detected $$chip{driver}, $new_hash;
} else {
print "Failed!\n";
@@ -980,11 +998,14 @@ sub scan_isa_bus
print("Failed!\n"), next if not defined $conf;
print "Success!\n";
printf " (confidence %d, driver `%s')\n", $conf, $$chip{driver};
add_isa_to_chips_detected $$chip{alias_detect},$$chip{driver},
{ conf => $conf,
isa_addr => $addr,
chipname => $$chip{name},
};
my $new_hash = { conf => $conf,
isa_addr => $addr,
chipname => $$chip{name}
};
$new_hash->{isa_extra} = 0
if exists $chip->{isa_driver_addrs} and
not contains ($addr, @{$chip->{isa_driver_addrs}});
add_isa_to_chips_detected $$chip{alias_detect},$$chip{driver},$new_hash;
}
}
}
@@ -1401,7 +1422,7 @@ sub generate_modprobes
{
my ($prefer_isa) = @_;
my ($chip,$detection,%adapters,$nr,$i,@optionlist);
my ($chip,$detection,%adapters,$nr,$i,@optionlist,@probelist);
my $modprobes = "";
my $configfile = "";
@@ -1437,10 +1458,24 @@ sub generate_modprobes
$modprobes .= "# I2C chip drivers\n";
foreach $chip (@chips_detected) {
next if not @{$chip->{detected}};
# Handle misdetects
$modprobes .= "modprobe $chip->{driver}\n";
@optionlist = ();
@probelist = ();
# Handle detects out-of-range
foreach $detection (@{$chip->{detected}}) {
push @probelist, %adapters->{$detection->{i2c_driver}},
$detection->{i2c_addr}
if exists $detection->{i2c_driver} and
exists %adapters->{$detection->{i2c_driver}} and
exists $detection->{i2c_extra};
push @probelist, -1, $detection->{isa_addr}
if exists $detection->{isa_addr} and
exists %adapters->{"i2c-isa"} and
exists $detection->{isa_extra};
}
# Handle misdetects
foreach $detection (@{$chip->{misdetected}}) {
push @optionlist, %adapters->{$detection->{i2c_driver}},
$detection->{i2c_addr}
@@ -1466,12 +1501,18 @@ sub generate_modprobes
}
}
next if not @optionlist;
next if not (@probelist or @optionlist);
$configfile .= "options $chip->{driver}";
$configfile .= sprintf " ignore=0x%02x",shift @optionlist
if @optionlist;
$configfile .= sprintf ",0x%02x",shift @optionlist
while @optionlist;
$configfile .= sprintf " ignore=%d,0x%02x",shift @optionlist,
shift @optionlist
if @optionlist;
$configfile .= sprintf ",%d,0x%02x",shift @optionlist, shift @optionlist
while @optionlist;
$configfile .= sprintf " probe=%d,0x%02x",shift @probelist,
shift @probelist
if @probelist;
$configfile .= sprintf ",%d,0x%02x",shift @probelist, shift @probelist
while @probelist;
$configfile .= "\n";
}