Changeset 5149

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

Add support for word register access mode.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • 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); 
  • i2c-tools/trunk/stub/i2c-stub-from-dump.8

    r5005 r5149  
    1 .TH I2C-STUB-FROM-DUMP 8 "November 2007
     1.TH I2C-STUB-FROM-DUMP 8 "March 2008
    22.SH NAME 
    33i2c-stub-from-dump \- feed i2c-stub with a dump file 
     
    2727 
    2828Adjust the bus number and chip address for your case. i2cdetect can help 
    29 you find out their values. 
     29you find out their values. If the device uses word (16-bit) register 
     30access instead of the traditional byte (8-bit) access, use mode \fBw\fR 
     31instead of \fBb\fR. 
    3032 
    3133Copy the dump file to system B. 
     
    4143.SH LIMITATIONS 
    4244There are some limitations to the kind of devices that can be handled: 
    43 .IP \(bu "\w'\(bu'u+1n" 
    44 Device must only use byte register access. i2c-stub supports word 
    45 access but i2c-stub-from-dump doesn't (yet). 
    4645.IP \(bu 
    4746Device must not have banks (as most Winbond devices do). 
    4847 
    4948.SH SEE ALSO 
    50  i2cdump(8), i2cdetect(8), i2cset(8) 
     49i2cdump(8), i2cdetect(8), i2cset(8) 
    5150 
    5251.SH AUTHOR