#!/usr/bin/perl sub inquiry { @cmd = (0x12,0x00,0x00,0x00,120,0x00 ); usb_cmd(@cmd); usb_read(8); $inq = usb_read(120); usb_read(8); $ivendor = substr($inq,8,8); $iproduct = substr($inq,16,16); $irev = substr($inq,32,4); $ifirmware = substr($inq,96,22); if($verbose) { print "Scanner Information (from scanner)\n"; print "\tVendor: $ivendor\n"; print "\tVersion: $irev\n"; print "\tModel: $iproduct\n"; print "\tFirmware date: $ifirmware\n"; print "\n"; } } sub upload_firmware { $filename = shift; open FIRM, "<$filename" or die("Can't open $filename"); undef $/; $firmware = ; close FIRM; $info = substr($firmware, length($firmware)-128); $chip = substr($info,0,5); $vendor = substr($info,0x5,0x8); $model = substr($info,0xd,0x10); $version = substr($info,0x1d,5); $size = substr($info,0x22,0x2); $size = ord(substr($size,0,1)) + (ord(substr($size,1,1)) << 8); $fdate = substr($info,0x26,22); if( $vendor eq $ivendor && $model eq $iproduct && $fdate eq $ifirmware ) { if($verbose) { printf "Firmware is up to date.\n"; } return 1; } if($verbose) { print "Firmware Information (from file)\n"; print "\tChip: $chip\n"; print "\tVendor: $vendor\n"; print "\tVersion: $version\n"; print "\tModel: $model\n"; print "\tFirmware date: $fdate\n"; print "\tSize: $size\n"; print "\n"; } @cmd = (0x2a,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00); $cmd[7] = $size >> 8; $cmd[8] = $size & 0xff; usb_cmd(@cmd); usb_read(8); if($verbose) { print "Uploading new firmware...\n"; } usb_write(substr($firmware,0,$size)); sleep(1); if($verbose) { print "Done!\n"; } return 0; } sub print_binstr { my $str = shift; for($i=0; $i= 1) { $device = shift(@ARGV); } else { $device = "/dev/usbscanner"; } open(S,"+>$device") or die("Can't open scanner device"); inquiry(); if(!upload_firmware($ARGV[0])) { inquiry(); } close S; exit 0;