Show
Ignore:
Timestamp:
03/19/08 15:04:25 (4 years ago)
Author:
khali
Message:

Add support for word register access mode.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • i2c-tools/trunk/stub/i2c-stub-from-dump

    r5091 r5149  
    11#!/usr/bin/perl -w 
    22# 
    3 # Copyright (C) 2007       Jean Delvare <khali@linux-fr.org> 
     3# Copyright (C) 2007-2008  Jean Delvare <khali@linux-fr.org> 
    44# 
    55# This program is free software; you can redistribute it and/or modify 
     
    2323 
    2424use strict; 
    25 use vars qw($bus_nr $addr $count); 
     25use vars qw($bus_nr $addr $bytes $words); 
    2626 
    2727# Kernel version detection code by Mark M. Hoffman, 
     
    6767} 
    6868 
     69sub process_dump 
     70{ 
     71        my $dump = shift; 
     72 
     73        open(DUMP, $dump) || die "Can't open $dump: $!\n"; 
     74 OUTER_LOOP: 
     75        while (<DUMP>) { 
     76                if (m/^([0-9a-f]0):(( [0-9a-f]{2}){16})/) { 
     77                        # Byte dump 
     78                        my $offset = hex($1); 
     79                        my @values = split(/ /, $2); 
     80                        shift(@values); 
     81                        for (my $i = 0; $i < 16 && (my $val = shift(@values)); $i++) { 
     82                                last OUTER_LOOP if system("i2cset", "-y", 
     83                                        $bus_nr, $addr, 
     84                                        sprintf("0x\%02x", $offset+$i), 
     85                                        "0x$val", "b"); 
     86                                $bytes++; 
     87                        } 
     88                } elsif (m/^([0-9a-f][08]):(( [0-9a-f]{4}){8})/) { 
     89                        # Word dump 
     90                        my $offset = hex($1); 
     91                        my @values = split(/ /, $2); 
     92                        shift(@values); 
     93                        for (my $i = 0; $i < 8 && (my $val = shift(@values)); $i++) { 
     94                                last OUTER_LOOP if system("i2cset", "-y", 
     95                                        $bus_nr, $addr, 
     96                                        sprintf("0x\%02x", $offset+$i), 
     97                                        "0x$val", "w"); 
     98                                $words++; 
     99                        } 
     100                } 
     101        } 
     102        close(DUMP); 
     103} 
     104 
    69105if ($>) { 
    70106        print "You must be root to use this script\n"; 
     
    96132 
    97133$bus_nr = get_i2c_stub_bus_number(); 
     134$bytes = $words = 0; 
    98135 
    99136# We don't want to see the output of 256 i2cset 
    100137open(SAVEOUT, ">&STDOUT"); 
    101138open(STDOUT, ">/dev/null"); 
    102  
    103 $count = 0; 
    104 open(DUMP, $ARGV[1]) || die "Can't open $ARGV[1]: $!\n"; 
    105 OUTER_LOOP: 
    106 while (<DUMP>) { 
    107         next unless m/^([0-9a-f]0):(( [0-9a-f]{2}){16})/; 
    108         my $offset = hex($1); 
    109         my @values = split(/ /, $2); 
    110         shift(@values); 
    111         for (my $i = 0; $i < 16 && (my $val = shift(@values)); $i++) { 
    112                 last OUTER_LOOP if system("i2cset", "-y", 
    113                         $bus_nr, $addr, 
    114                         sprintf("0x\%02x", $offset+$i), 
    115                         sprintf("0x\%02x", hex($val)), "b"); 
    116                 $count++; 
    117         } 
    118 } 
    119 close(DUMP); 
     139process_dump($ARGV[1]); 
    120140close(STDOUT); 
    121141 
    122 if ($count) { 
    123         printf SAVEOUT "$count byte values written to \%d-\%04x\n", 
     142if ($bytes) { 
     143        printf SAVEOUT "$bytes byte values written to \%d-\%04x\n", 
    124144                $bus_nr, oct($addr); 
    125145} 
    126146 
    127 exit($count == 0); 
     147if ($words) { 
     148        printf SAVEOUT "$words word values written to \%d-\%04x\n", 
     149                $bus_nr, oct($addr); 
     150} 
     151 
     152exit($bytes + $words == 0);