[sane-devel] anyone working on the Canoscan 4200F protocol?
Carsten Juttner
carjay at gmx.net
Sat Apr 24 14:38:09 UTC 2010
Hi everyone,
Just joined the list or I would have replied to the "any sniff
volunteers unsupported Canon scanners: 4200F, 5200F, 9900F, 9950F" thread.
As indicated in the topic I have one of those scanners (
http://www.sane-project.org/unsupported/canon-4200f.html ) and would
like to help make it usable under Linux in SANE hopefully covering
similar devices as well.
I'm new to USB so read a lot about it and took a look at the components
involved. I didn't take the scanner apart and would like to avoid doing
this since I have no dustfree environment and it's tough enough to keep
the surface clean on the outside :) .
Maybe this is old news, the scanner is driven on windows from user space
side using a DLL that interfaces with the scanner using the Windows USB
Still Image I/O Control Codes (as "\\.\usbscan0", easy to spot since
IOCTL_[READ/WRITE]_REGISTERS control codes have fixed values for the USB
control transfer: requestType 0xc0 and request is either 0x0c (for a
length of 1) or 0x04).
The initial programming sequence after plugging in (different once the
firmware is downloaded) looks similar to this (the actual values read
back and written differ somewhat, they are obviously read and only
certain bits masked off):
IOCTL_READ_REGISTERS 0xe1:0xfe1f:1read from scanner: 26
IOCTL_READ_REGISTERS 0xe1:0xffef:1read from scanner: 00
IOCTL_WRITE_REGISTERS 0xe0:0xffef:2 write to scanner: 20 01
IOCTL_READ_REGISTERS 0xe1:0xffb4:1read from scanner: 0b
IOCTL_WRITE_REGISTERS 0xe0:0xffb4:2 write to scanner: 2b 01
IOCTL_READ_REGISTERS 0xe1:0xffed:1 read from scanner: 03
IOCTL_WRITE_REGISTERS 0xe0:0xffed:2 write to scanner: 03 01
IOCTL_READ_REGISTERS 0xe1:0xffe3:1 read from scanner: 05
IOCTL_WRITE_REGISTERS 0xe0:0xffe3:2 write to scanner: 05 01
IOCTL_READ_REGISTERS 0xe1:0xffe2:1 read from scanner: 00
IOCTL_READ_REGISTERS 0x40:0x00:8 read from scanner: 00 00 00 0c 58 02 00 00
IOCTL_WRITE_REGISTERS 0xf0:0x00:5 write to scanner: 00 00 00 00 a8
IOCTL_READ_REGISTERS 0x40:0x00:8 read from scanner: 00 00 00 0c 58 02 00 00
IOCTL_WRITE_REGISTERS 0xf3:0x00:4 write to scanner: 00 52 00 00 (this is
the length of the bulk transfer 0xa400 in 2-byte size)
the numbers are <value>:<index>:<length>
As mentioned the other parameters of the USB control transfer are fixed.
After that 41984 bytes are written to the scanner by bulk transfer
(firmware).
This block is read back immediately and verified.
I have no log of a real scan yet but working on that.
So far, anyone recognizing this sequence? If so, is there any work on
this in progress somewhere?
Regards,
Carsten
More information about the sane-devel
mailing list