#!/usr/bin/perl # sub parse_data( @ ) { my @numbers; foreach my $line (@_) { $line =~ s/^\s*[0-9A-Fa-f]+:\s*//; $line =~ s/\s*$//; my @nums = split(/\s+/,$line); foreach my $num (@nums) { push @numbers,$num; } } return @numbers; } sub print_data( @ ) { my @numbers = @_; my $cnt = 0; foreach my $num (@numbers) { print " " if (($cnt & 0x3) == 0); print " 0x$num,"; $cnt++; print "\n" if (($cnt & 0x7) == 0) ; } print "\n" unless (($cnt & 0x7) == 0) ; } sub processurbpair( $ ) { my ($urb_r) = @_; my %urb = %{$urb_r}; printf "/* num %d time %d*/\n",$urb{num},$urb{timed}; if ($urb{"typed"} eq "bulk" || $urb{"typeu"} eq "bulk") { print "BULK"; if ($urb{"diru"} eq "out") { print ">(".$urb{"spd"}->{"size"}.")\n"; print_data(parse_data(@{$urb{"datad"}})); } else { print "<(".$urb{"spu"}->{"size"}.")\n"; print_data(parse_data(@{$urb{"datau"}})); } } elsif ($urb{"typed"} eq "vendor" || $urb{"typeu"} eq "vendor") { if ($urb{"spd"}->{"requesttype"} == 0xc0) { #in if ($urb{"spd"}->{"request"} == 0x0c) { #register if ($urb{"spd"}->{"value"} == 0x84) { #read register my @d = parse_data(@{$urb{"datau"}}); print "read_register(); //==0x".$d[0]."\n"; } elsif ($urb{"spd"}->{"value"} == 0x86) { #read status my @d = parse_data(@{$urb{"datau"}}); print "read_status(); //==0x".$d[0]."\n"; } elsif ($urb{"spd"}->{"value"} == 0x8E && $urb{"spd"}->{"size"} == 1) { #read unknown my @d = parse_data(@{$urb{"datau"}}); print "unknown8e(".$urb{"spd"}->{"index"}."); //==0x".$d[0]."\n"; } else { print "Unknown in register value ".$urb{"spd"}->{"value"}."\n"; } } elsif ($urb{"spd"}->{"request"} == 0x04) { #buffer if ($urb{"spd"}->{"value"} == 0x8E && ($urb{"spd"}->{"index"} & 0xff) == 0x22) { #read register set my @d = parse_data(@{$urb{"datau"}}); #the last data item is always 0x55 for(my $i = 0; $i < $#d; $i ++) { printf "read_register(0x%02x); //==0x%s\n", ($urb{"spd"}->{"index"} >> 8)+$i,$d[$i]; } } else { printf "Unknown in buffer value 0x%02x (index: 0x%04x, size: 0x%04x, data: %s)\n", $urb{"spd"}->{"value"}, $urb{"spd"}->{"index"}, $urb{"spd"}->{"size"}, join(",",map {"0x".$_ } @d); } } } elsif ($urb{"spd"}->{"requesttype"} == 0x40) { #out if ($urb{"spd"}->{"request"} == 0x0c) { #register if ($urb{"spd"}->{"value"} == 0x83) { #set register my @d = parse_data(@{$urb{"datad"}}); print "set_register(0x".$d[0]."); \n"; } elsif ($urb{"spd"}->{"value"} == 0x85) { #read register my @d = parse_data(@{$urb{"datad"}}); print "write_register(0x".$d[0].");\n"; } elsif ($urb{"spd"}->{"value"} == 0x8c && $urb{"spd"}->{"size"} == 1) { #buf endaccess my @d = parse_data(@{$urb{"datad"}}); print "buf_endaccess(".$urb{"spd"}->{"index"}. ", 0x".$d[0].");\n"; } else { print "Unknown out request value ".$urb{"spd"}->{"value"}."\n"; } } elsif ($urb{"spd"}->{"request"} == 0x04) { #buffer if ($urb{"spd"}->{"value"} == 0x82) { #buffer my @d = parse_data(@{$urb{"datad"}}); print "buf_prepaccess(0x".$d[7].$d[6].$d[5].$d[4].","; print "BULK_OUT);\n" if $d[0] == 0x1; print "BULK_IN);\n" if $d[0] == 0x0; print "Data: @d\n"; print "Index: ".$urb{"spd"}->{"index"}."\n"; } elsif ($urb{"spd"}->{"value"} == 0x83) { #set register my @d = parse_data(@{$urb{"datad"}}); for(my $i = 0; $i <= $#d; $i += 2) { print "set_write_register(0x".$d[$i+0].", 0x".$d[$i+1].");\n"; } } else { print "Unknown out buffer value ".$urb{"spd"}->{"value"}."\n"; } } } } } sub pairurbs( $$$$$$$ ) { my ($num,$time,$isup,$type,$dir,$sp_r,$data_r) = @_; our %currenturb; if (!$isup) { $currenturb{"num"} = $num; $currenturb{"timed"} = $time; $currenturb{"typed"} = $type; $currenturb{"dird"} = $dir; $currenturb{"spd"} = $sp_r; $currenturb{"datad"} = $data_r; } else { if ($currenturb{"num"} != $num) { print STDERR "Up urb ".$currenturb{"num"}." without down urb!\n"; return; } $currenturb{"timeu"} = $time; $currenturb{"typeu"} = $type; $currenturb{"datau"} = $data_r; $currenturb{"diru"} = $dir; $currenturb{"spu"} = $sp_r; processurbpair(\%currenturb); } } sub processurblines( $$$@ ) { my $num = shift; my $time = shift; my $isup = shift; my @lines = @_; my %sp; my $type = "unknown"; my $dir = "unknown"; my @data; while ($line = shift @lines) { $type = "bulk" if $line =~ /-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER/; $type = "control" if $line =~ /-- URB_FUNCTION_CONTROL_TRANSFER/; $type = "vendor" if $line =~ /-- URB_FUNCTION_VENDOR_DEVICE/; $dir = "out" if $line =~ /TransferFlags.*USBD_TRANSFER_DIRECTION_OUT/; $dir = "in" if $line =~ /TransferFlags.*USBD_TRANSFER_DIRECTION_IN/; $sp{"requesttype"} = eval("0x$1") if $line =~ /RequestTypeReservedBits\s*=\s*([0-9a-fA-F]+)/; $sp{"request"} = eval("0x$1") if $line =~ /Request\s*=\s*([0-9a-fA-F]+)/; $sp{"value"} = eval("0x$1") if $line =~ /Value\s*=\s*([0-9a-fA-F]+)/; $sp{"index"} = eval("0x$1") if $line =~ /Index\s*=\s*([0-9a-fA-F]+)/; $sp{"size"} = eval("0x$1") if $line =~ /TransferBufferLength\s*=\s*([0-9a-fA-F]+)/; if ($line =~ /SetupPacket\s*=/) { shift @lines; } if ($line =~ /TransferBufferMDL\s*=/) { while (my $l = shift @lines) { if ($l =~ /[0-9a-fA-F]+:\s*[0-9a-fA-F]+/) { push @data,$l; } else { unshift @lines,$l; last; } } } } pairurbs($num,$time,$isup,$type,$dir,\%sp,\@data); } my @urb; my $urbnum; my $urbtime; my $urbisup; while (my $line = ) { if ($line =~ /^\[(\d+) ms\] (.*)$/) { my $time = $1; my $msg = $2; if ($#urb >= 0) { processurblines($urbnum,$urbtime,$urbisup,@urb); } @urb = (); if ($msg =~ />>> URB (\d+) going down >>>/) { $urbtime = $time; $urbnum = $1; $urbisup = 0; } if ($msg =~ /<< URB (\d+) coming back <<