Changeset 5540 for i2c-tools/trunk

Show
Ignore:
Timestamp:
12/08/08 18:29:23 (3 years ago)
Author:
khali
Message:

Read all EEPROM bytes at once, this is easier and even more efficient in
the general case.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • i2c-tools/trunk/eeprom/decode-dimms

    r5539 r5540  
    12221222} 
    12231223 
    1224 sub readspd64($$) # reads 64 bytes from SPD-EEPROM 
    1225 { 
    1226         my ($offset, $dimm_i) = @_; 
     1224sub readspd($$) # reads bytes from SPD-EEPROM 
     1225{ 
     1226        my ($size, $dimm_i) = @_; 
    12271227        my @bytes; 
    12281228        if ($use_hexdump) { 
    12291229                @bytes = read_hexdump($dimm_i); 
    1230                 return @bytes[$offset..($offset+63)]; 
     1230                return @bytes[0..($size-1)]; 
    12311231        } elsif ($use_sysfs) { 
    12321232                # Kernel 2.6 with sysfs 
     
    12341234                        or die "Cannot open /sys/bus/i2c/drivers/eeprom/$dimm_i/eeprom"; 
    12351235                binmode HANDLE; 
    1236                 sysseek(HANDLE, $offset, SEEK_SET); 
    1237                 sysread(HANDLE, my $eeprom, 64); 
     1236                sysseek(HANDLE, 0, SEEK_SET); 
     1237                sysread(HANDLE, my $eeprom, $size); 
    12381238                close HANDLE; 
    1239                 @bytes = unpack("C64", $eeprom); 
     1239                @bytes = unpack("C*", $eeprom); 
    12401240        } else { 
    12411241                # Kernel 2.4 with procfs 
    1242                 for my $i (0 .. 3) { 
    1243                         my $hexoff = sprintf('%02x', $offset + $i * 16); 
     1242                for my $i (0 .. ($size-1)/16) { 
     1243                        my $hexoff = sprintf('%02x', $i * 16); 
    12441244                        push @bytes, split(" ", `cat /proc/sys/dev/sensors/$dimm_i/$hexoff`); 
    12451245                } 
     
    13331333         || (!$use_sysfs && /^eeprom-/) 
    13341334         || $use_hexdump) { 
    1335                 my @bytes = readspd64(0, $dimm_list[$i]); 
     1335                my @bytes = readspd(128, $dimm_list[$i]); 
    13361336                my $dimm_checksum = 0; 
    13371337                $dimm_checksum += $bytes[$_] foreach (0 .. 62); 
     
    14081408 
    14091409# Decode next 35 bytes (64-98, common to all memory types) 
    1410                 @bytes = readspd64(64, $dimm_list[$i]); 
     1410                splice(@bytes, 0, 64); 
    14111411                decode_manufacturing_information(\@bytes); 
    14121412