Administrative

Projects

Active

Future

Finished

Reference

Abandoned

Connecting FreeBSD to the Canon EOS 10D over USB

The goal of this project is to connect the Canon EOS 10D digital single lense reflex camera to a computer running FreeBSD using the USB connector.

This might finally lead to a gphoto plugin or self-contained executable to work on the CF card file system in the camera over the USB bus. Currently I plan to write this for FreeBSD, and then extend it to also work on Solaris.

Trying to find the protocol

A first mail from Canon support told me that the camera would support both the PTP (Picture Transfer Protocol) standard and a proprietary Canon protocol. I therefore tried connecting the camera and speaking PTP, but without any success. The camera did not respond.

A second mail to them, stating the efforts of my testing, caused Canon to react really nicely: They called me, gave me some phone numbers which I also called, and then finally I was told to register somewhere on a developer web site. Technical outcome of this so far is that the 10D does not support the PTP but only the Canon internal protocol.

Canon has responded that they were not going to disclose their internal camera protocol to me. I will try and investigate myself then.

Protocol analysis

I have sniffed the USB driver on a Windows machine and connected the camera with Canons driver and download tools. Now I am analyzing the data I have got from this. Here is a summary of my findings, ordered by "layer".

Device identification

The camera identifies itself as

idVendor=0x04a9 idProduct=0x3083

It has one configuration entry with one interface.

USB endpoints

There are three endpoints for communication with the camera.

descriptor 0:
bEndpointAddress=1-in
wMaxPacketSize=64
bmAttributes=2 (bulk)
bInterval=0

descriptor 1:
bEndpointAddress=2-out
wMaxPacketSize=64
bmAttributes=2 (bulk)
bInterval=0

descriptor 2:
bEndpointAddress=3-in
wMaxPacketSize=64
bmAttributes=3 (interrupt)
bInterval=96

In my dump, the following associations exist:

EndpointAddress descriptor  PipeHandle
0x000000081     0       0x809e2f60
0x000000002     1       0x809e2f7c
0x000000083     2       0x809e2f98

The interrupt endpoint is not seen throughout the whole dump.

Logbook