Changeset 2224

Show
Ignore:
Timestamp:
01/17/04 19:07:45 (9 years ago)
Author:
khali
Message:

Add Linux 2.5/2.6 (sysfs) support.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/prog/eeprom/decode-vaio.pl

    r2105 r2224  
    3535#  Gave the label "Timestamp" to the field at 0xE0. 
    3636#  Renamed "Model Number" to "Model Name". 
    37 #  Added some Documentation. 
     37#  Added some documentation. 
     38# Version 1.1  2004-01-17  Jean Delvare <khali@linux-fr.org> 
     39#  Added support for Linux 2.5/2.6 (i.e. sysfs). 
    3840# 
    3941# EEPROM data decoding for Sony Vaio laptops.  
     
    4446# Please note that this is a guess-only work.  Sony support refused to help 
    4547# me, so if someone can provide information, please contact me. 
     48# My knowledge is summarized on this page: 
     49# http://www.ensicaen.ismra.fr/~delvare/vaio/eeprom.html 
    4650# 
    4751# It seems that if present, the EEPROM is always at 0x57. 
     
    6771 
    6872use strict; 
     73use Fcntl qw(:DEFAULT :seek); 
     74use vars qw($sysfs); 
    6975 
    7076sub print_item 
     
    7581} 
    7682 
     83# Abstract reads so that other functions don't have to care wether 
     84# we need to use procfs or sysfs 
     85sub read_eeprom_bytes 
     86{ 
     87        my ($bus, $addr, $offset, $length) = @_; 
     88        my $filename; 
     89         
     90        if ($sysfs) 
     91        { 
     92                $filename = "/sys/bus/i2c/devices/$bus-00$addr/eeprom"; 
     93                sysopen(FH, $filename, O_RDONLY) 
     94                        or die "Can't open $filename"; 
     95                sysseek(FH, $offset, SEEK_SET) 
     96                        or die "Can't seek in $filename"; 
     97 
     98                my ($r, $bytes); 
     99                $bytes = ''; 
     100                $offset = 0; 
     101                while($length) 
     102                { 
     103                        $r = sysread(FH, $bytes, $length, $offset); 
     104                        die "Can't read $filename" 
     105                                unless defined($r); 
     106                        die "Unexpected EOF in $filename" 
     107                                unless $r; 
     108                        $offset += $r; 
     109                        $length -= $r; 
     110                } 
     111                close(FH); 
     112                 
     113                return $bytes; 
     114        } 
     115        else 
     116        { 
     117                my $base = $offset & 0xf0; 
     118                $offset -= $base; 
     119                my $values = ''; 
     120                my $remains = $length + $offset; 
     121                 
     122                # Get all lines in a single string 
     123                while ($remains > 0) 
     124                { 
     125                        $filename = "/proc/sys/dev/sensors/eeprom-i2c-$bus-$addr/" 
     126                                  . sprintf('%02x', $base); 
     127                        open(FH, $filename) 
     128                                or die "Can't open $filename"; 
     129                        $values .= <FH>; 
     130                        close(FH); 
     131                        $remains -= 16; 
     132                        $base += 16; 
     133                } 
     134                 
     135                # Store the useful part in an array 
     136                my @bytes = split(/[ \n]/, $values); 
     137                @bytes = @bytes[$offset..$offset+$length-1]; 
     138 
     139                # Back to a binary string 
     140                return pack('C*', @bytes); 
     141        } 
     142} 
     143 
    77144sub decode_string 
    78145{ 
    79         my ($bus,$addr,$base,$offset,$length) = @_; 
    80  
    81         my $line=''; 
    82         my $remains=$length+$offset; 
    83         while($remains>0) 
    84         { 
    85                 my $filename="/proc/sys/dev/sensors/eeprom-i2c-$bus-$addr/".sprintf('%02x',$base); 
    86                 open(FH,$filename) || die "Can't open $filename"; 
    87                 $line.=<FH>; 
    88                 close(FH); 
    89                 $remains-=16; 
    90                 $base+=16; 
    91         } 
    92  
    93         my @bytes=split(/[ \n]/,$line); 
    94         @bytes=@bytes[$offset..$offset+$length-1]; 
     146        my ($bus, $addr, $offset, $length) = @_; 
     147 
     148        my $string = read_eeprom_bytes($bus, $addr, $offset, $length); 
     149        $string =~ s/\x00.*$//; 
     150         
     151        return($string); 
     152} 
     153 
     154sub decode_uuid 
     155{ 
     156        my ($bus,$addr,$base) = @_; 
     157 
     158        my @bytes = unpack('C16', read_eeprom_bytes($bus, $addr, $base, 16)); 
    95159        my $string=''; 
    96         my $item; 
    97         while(defined($item=shift(@bytes)) && ($item!=0)) 
    98         { 
    99                 $string.=chr($item); 
    100         } 
    101          
    102         return($string); 
    103 } 
    104  
    105 sub decode_uuid 
    106 { 
    107         my ($bus,$addr,$base) = @_; 
    108  
    109         my $filename="/proc/sys/dev/sensors/eeprom-i2c-$bus-$addr/".sprintf('%02x',$base); 
    110         open(FH,$filename) || die "Can't open $filename"; 
    111         my $line=<FH>; 
    112         close(FH); 
    113  
    114         my @bytes=split(/[ \n]/,$line); 
    115         my $string=''; 
    116         my $item; 
    117160 
    118161        for(my $i=0;$i<16;$i++) 
     
    132175        my ($bus,$addr) = @_; 
    133176         
    134         print_item('Machine Name',decode_string($bus,$addr,128,0,32)); 
    135         print_item('Serial Number',decode_string($bus,$addr,192,0,32)); 
    136         print_item('UUID',decode_uuid($bus,$addr,16)); 
    137         print_item('Revision',decode_string($bus,$addr,160,0,10)); 
    138         print_item('Model Name','PCG-'.decode_string($bus,$addr,160,10,4)); 
    139         print_item('OEM Data',decode_string($bus,$addr,32,0,16)); 
    140         print_item('Timestamp',decode_string($bus,$addr,224,0,32)); 
     177        print_item('Machine Name', decode_string($bus, $addr, 128, 32)); 
     178        print_item('Serial Number', decode_string($bus, $addr, 192, 32)); 
     179        print_item('UUID', decode_uuid($bus, $addr, 16)); 
     180        print_item('Revision', decode_string($bus, $addr, 160, 10)); 
     181        print_item('Model Name', 'PCG-'.decode_string($bus, $addr, 170, 4)); 
     182        print_item('OEM Data', decode_string($bus, $addr, 32, 16)); 
     183        print_item('Timestamp', decode_string($bus, $addr, 224, 32)); 
    141184} 
    142185 
     
    144187{ 
    145188        print("Sony Vaio EEPROM Decoder\n"); 
    146         print("Written by Jean Delvare.  Copyright 2002,2003.\n"); 
    147         print("Version 1.0\n\n"); 
     189        print("Copyright (c) 2002-2004  Jean Delvare\n"); 
     190        print("Version 1.1\n\n"); 
     191         
     192        $sysfs = 0; 
    148193} 
    149194 
     
    163208                vaio_decode('0','57'); 
    164209        } 
     210} 
     211elsif ( -r '/sys/bus/i2c/devices/0-0057') 
     212{ 
     213        $sysfs = 1; 
     214        vaio_decode('0', '57'); 
    165215} 
    166216else