|
|
@ -58,6 +58,45 @@ sub get_i2c_stub_bus_number |
|
|
|
} |
|
|
|
close(FH); |
|
|
|
|
|
|
|
return $nr; |
|
|
|
} |
|
|
|
|
|
|
|
# Load the required kernel drivers if needed |
|
|
|
sub load_kernel_drivers |
|
|
|
{ |
|
|
|
local $_; |
|
|
|
my $addr = oct shift; |
|
|
|
my $nr; |
|
|
|
|
|
|
|
# Maybe everything is already loaded |
|
|
|
$nr = get_i2c_stub_bus_number(); |
|
|
|
if (defined $nr) { |
|
|
|
if (kernel_version_at_least(2, 6, 19)) { |
|
|
|
# Check if the chip address we need is there |
|
|
|
open(CHIP_ADDR, "/sys/module/i2c_stub/parameters/chip_addr"); |
|
|
|
$_ = <CHIP_ADDR>; |
|
|
|
chomp; |
|
|
|
my @stub_addr = split ','; |
|
|
|
close(CHIP_ADDR); |
|
|
|
|
|
|
|
foreach (@stub_addr) { |
|
|
|
return $nr if $addr == $_; |
|
|
|
} |
|
|
|
printf STDERR "i2c-stub already loaded without support for address 0x%02x\n", $addr; |
|
|
|
exit 2; |
|
|
|
} |
|
|
|
return $nr; |
|
|
|
} |
|
|
|
|
|
|
|
system("/sbin/modprobe", "i2c-dev") == 0 || exit 1; |
|
|
|
if (kernel_version_at_least(2, 6, 19)) { |
|
|
|
system("/sbin/modprobe", "i2c-stub", "chip_addr=$addr") == 0 || exit 1; |
|
|
|
} else { |
|
|
|
system("/sbin/modprobe", "i2c-stub") == 0 || exit 1; |
|
|
|
} |
|
|
|
sleep(1); # udev may take some time to create the device node |
|
|
|
|
|
|
|
$nr = get_i2c_stub_bus_number(); |
|
|
|
if (!defined($nr)) { |
|
|
|
print STDERR "Please load i2c-stub first\n"; |
|
|
|
exit 2; |
|
|
@ -123,16 +162,7 @@ if ($addr !~ m/^0x[0-7][0-9a-f]$/i) { |
|
|
|
|
|
|
|
initialize_kernel_version(); |
|
|
|
|
|
|
|
# Load the required kernel drivers if needed |
|
|
|
system("/sbin/modprobe", "i2c-dev") == 0 || exit 1; |
|
|
|
if (kernel_version_at_least(2, 6, 19)) { |
|
|
|
system("/sbin/modprobe", "i2c-stub", "chip_addr=$addr") == 0 || exit 1; |
|
|
|
} else { |
|
|
|
system("/sbin/modprobe", "i2c-stub") == 0 || exit 1; |
|
|
|
} |
|
|
|
sleep(1); # udev may take some time to create the device node |
|
|
|
|
|
|
|
$bus_nr = get_i2c_stub_bus_number(); |
|
|
|
$bus_nr = load_kernel_drivers($addr); |
|
|
|
$bytes = $words = 0; |
|
|
|
|
|
|
|
# We don't want to see the output of 256 i2cset |
|
|
|