123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- README for Linux device driver for the IBM "C-It" USB video camera
- INTRODUCTION:
- This driver does not use all features known to exist in
- the IBM camera. However most of needed features work well.
- This driver was developed using logs of observed USB traffic
- which was produced by standard Windows driver (c-it98.sys).
- I did not have data sheets from Xirlink.
- Video formats:
- 128x96 [model 1]
- 176x144
- 320x240 [model 2]
- 352x240 [model 2]
- 352x288
- Frame rate: 3 - 30 frames per second (FPS)
- External interface: USB
- Internal interface: Video For Linux (V4L)
- Supported controls:
- - by V4L: Contrast, Brightness, Color, Hue
- - by driver options: frame rate, lighting conditions, video format,
- default picture settings, sharpness.
- SUPPORTED CAMERAS:
- Xirlink "C-It" camera, also known as "IBM PC Camera".
- The device uses proprietary ASIC (and compression method);
- it is manufactured by Xirlink. See http://xirlinkwebcam.sourceforge.net,
- http://www.ibmpccamera.com, or http://www.c-itnow.com/ for details and pictures.
- This very chipset ("X Chip", as marked at the factory)
- is used in several other cameras, and they are supported
- as well:
- - IBM NetCamera
- - Veo Stingray
- The Linux driver was developed with camera with following
- model number (or FCC ID): KSX-XVP510. This camera has three
- interfaces, each with one endpoint (control, iso, iso). This
- type of cameras is referred to as "model 1". These cameras are
- no longer manufactured.
- Xirlink now manufactures new cameras which are somewhat different.
- In particular, following models [FCC ID] belong to that category:
- XVP300 [KSX-X9903]
- XVP600 [KSX-X9902]
- XVP610 [KSX-X9902]
- (see http://www.xirlink.com/ibmpccamera/ for updates, they refer
- to these new cameras by Windows driver dated 12-27-99, v3005 BETA)
- These cameras have two interfaces, one endpoint in each (iso, bulk).
- Such type of cameras is referred to as "model 2". They are supported
- (with exception of 352x288 native mode).
- Some IBM NetCameras (Model 4) are made to generate only compressed
- video streams. This is great for performance, but unfortunately
- nobody knows how to decompress the stream :-( Therefore, these
- cameras are *unsupported* and if you try to use one of those, all
- you get is random colored horizontal streaks, not the image!
- If you have one of those cameras, you probably should return it
- to the store and get something that is supported.
- Tell me more about all that "model" business
- --------------------------------------------
- I just invented model numbers to uniquely identify flavors of the
- hardware/firmware that were sold. It was very confusing to use
- brand names or some other internal numbering schemes. So I found
- by experimentation that all Xirlink chipsets fall into four big
- classes, and I called them "models". Each model is programmed in
- its own way, and each model sends back the video in its own way.
- Quirks of Model 2 cameras:
- -------------------------
- Model 2 does not have hardware contrast control. Corresponding V4L
- control is implemented in software, which is not very nice to your
- CPU, but at least it works.
- This driver provides 352x288 mode by switching the camera into
- quasi-352x288 RGB mode (800 Kbits per frame) essentially limiting
- this mode to 10 frames per second or less, in ideal conditions on
- the bus (USB is shared, after all). The frame rate
- has to be programmed very conservatively. Additional concern is that
- frame rate depends on brightness setting; therefore the picture can
- be good at one brightness and broken at another! I did not want to fix
- the frame rate at slowest setting, but I had to move it pretty much down
- the scale (so that framerate option barely matters). I also noticed that
- camera after first powering up produces frames slightly faster than during
- consecutive uses. All this means that if you use 352x288 (which is
- default), be warned - you may encounter broken picture on first connect;
- try to adjust brightness - brighter image is slower, so USB will be able
- to send all data. However if you regularly use Model 2 cameras you may
- prefer 176x144 which makes perfectly good I420, with no scaling and
- lesser demands on USB (300 Kbits per second, or 26 frames per second).
- Another strange effect of 352x288 mode is the fine vertical grid visible
- on some colored surfaces. I am sure it is caused by me not understanding
- what the camera is trying to say. Blame trade secrets for that.
- The camera that I had also has a hardware quirk: if disconnected,
- it needs few minutes to "relax" before it can be plugged in again
- (poorly designed USB processor reset circuit?)
- [Veo Stingray with Product ID 0x800C is also Model 2, but I haven't
- observed this particular flaw in it.]
- Model 2 camera can be programmed for very high sensitivity (even starlight
- may be enough), this makes it convenient for tinkering with. The driver
- code has enough comments to help a programmer to tweak the camera
- as s/he feels necessary.
- WHAT YOU NEED:
- - A supported IBM PC (C-it) camera (model 1 or 2)
- - A Linux box with USB support (2.3/2.4; 2.2 w/backport may work)
- - A Video4Linux compatible frame grabber program such as xawtv.
- HOW TO COMPILE THE DRIVER:
- You need to compile the driver only if you are a developer
- or if you want to make changes to the code. Most distributions
- precompile all modules, so you can go directly to the next
- section "HOW TO USE THE DRIVER".
- The ibmcam driver uses usbvideo helper library (module),
- so if you are studying the ibmcam code you will be led there.
- The driver itself consists of only one file in usb/ directory:
- ibmcam.c. This file is included into the Linux kernel build
- process if you configure the kernel for CONFIG_USB_IBMCAM.
- Run "make xconfig" and in USB section you will find the IBM
- camera driver. Select it, save the configuration and recompile.
- HOW TO USE THE DRIVER:
- I recommend to compile driver as a module. This gives you an
- easier access to its configuration. The camera has many more
- settings than V4L can operate, so some settings are done using
- module options.
- To begin with, on most modern Linux distributions the driver
- will be automatically loaded whenever you plug the supported
- camera in. Therefore, you don't need to do anything. However
- if you want to experiment with some module parameters then
- you can load and unload the driver manually, with camera
- plugged in or unplugged.
- Typically module is installed with command 'modprobe', like this:
- # modprobe ibmcam framerate=1
- Alternatively you can use 'insmod' in similar fashion:
- # insmod /lib/modules/2.x.y/usb/ibmcam.o framerate=1
- Module can be inserted with camera connected or disconnected.
- The driver can have options, though some defaults are provided.
- Driver options: (* indicates that option is model-dependent)
- Name Type Range [default] Example
- -------------- -------------- -------------- ------------------
- debug Integer 0-9 [0] debug=1
- flags Integer 0-0xFF [0] flags=0x0d
- framerate Integer 0-6 [2] framerate=1
- hue_correction Integer 0-255 [128] hue_correction=115
- init_brightness Integer 0-255 [128] init_brightness=100
- init_contrast Integer 0-255 [192] init_contrast=200
- init_color Integer 0-255 [128] init_color=130
- init_hue Integer 0-255 [128] init_hue=115
- lighting Integer 0-2* [1] lighting=2
- sharpness Integer 0-6* [4] sharpness=3
- size Integer 0-2* [2] size=1
- Options for Model 2 only:
- Name Type Range [default] Example
- -------------- -------------- -------------- ------------------
- init_model2_rg Integer 0..255 [0x70] init_model2_rg=128
- init_model2_rg2 Integer 0..255 [0x2f] init_model2_rg2=50
- init_model2_sat Integer 0..255 [0x34] init_model2_sat=65
- init_model2_yb Integer 0..255 [0xa0] init_model2_yb=200
- debug You don't need this option unless you are a developer.
- If you are a developer then you will see in the code
- what values do what. 0=off.
- flags This is a bit mask, and you can combine any number of
- bits to produce what you want. Usually you don't want
- any of extra features this option provides:
- FLAGS_RETRY_VIDIOCSYNC 1 This bit allows to retry failed
- VIDIOCSYNC ioctls without failing.
- Will work with xawtv, will not
- with xrealproducer. Default is
- not set.
- FLAGS_MONOCHROME 2 Activates monochrome (b/w) mode.
- FLAGS_DISPLAY_HINTS 4 Shows colored pixels which have
- magic meaning to developers.
- FLAGS_OVERLAY_STATS 8 Shows tiny numbers on screen,
- useful only for debugging.
- FLAGS_FORCE_TESTPATTERN 16 Shows blue screen with numbers.
- FLAGS_SEPARATE_FRAMES 32 Shows each frame separately, as
- it was received from the camera.
- Default (not set) is to mix the
- preceding frame in to compensate
- for occasional loss of Isoc data
- on high frame rates.
- FLAGS_CLEAN_FRAMES 64 Forces "cleanup" of each frame
- prior to use; relevant only if
- FLAGS_SEPARATE_FRAMES is set.
- Default is not to clean frames,
- this is a little faster but may
- produce flicker if frame rate is
- too high and Isoc data gets lost.
- FLAGS_NO_DECODING 128 This flag turns the video stream
- decoder off, and dumps the raw
- Isoc data from the camera into
- the reading process. Useful to
- developers, but not to users.
- framerate This setting controls frame rate of the camera. This is
- an approximate setting (in terms of "worst" ... "best")
- because camera changes frame rate depending on amount
- of light available. Setting 0 is slowest, 6 is fastest.
- Beware - fast settings are very demanding and may not
- work well with all video sizes. Be conservative.
- hue_correction This highly optional setting allows to adjust the
- hue of the image in a way slightly different from
- what usual "hue" control does. Both controls affect
- YUV colorspace: regular "hue" control adjusts only
- U component, and this "hue_correction" option similarly
- adjusts only V component. However usually it is enough
- to tweak only U or V to compensate for colored light or
- color temperature; this option simply allows more
- complicated correction when and if it is necessary.
- init_brightness These settings specify _initial_ values which will be
- init_contrast used to set up the camera. If your V4L application has
- init_color its own controls to adjust the picture then these
- init_hue controls will be used too. These options allow you to
- preconfigure the camera when it gets connected, before
- any V4L application connects to it. Good for webcams.
- init_model2_rg These initial settings alter color balance of the
- init_model2_rg2 camera on hardware level. All four settings may be used
- init_model2_sat to tune the camera to specific lighting conditions. These
- init_model2_yb settings only apply to Model 2 cameras.
- lighting This option selects one of three hardware-defined
- photosensitivity settings of the camera. 0=bright light,
- 1=Medium (default), 2=Low light. This setting affects
- frame rate: the dimmer the lighting the lower the frame
- rate (because longer exposition time is needed). The
- Model 2 cameras allow values more than 2 for this option,
- thus enabling extremely high sensitivity at cost of frame
- rate, color saturation and imaging sensor noise.
- sharpness This option controls smoothing (noise reduction)
- made by camera. Setting 0 is most smooth, setting 6
- is most sharp. Be aware that CMOS sensor used in the
- camera is pretty noisy, so if you choose 6 you will
- be greeted with "snowy" image. Default is 4. Model 2
- cameras do not support this feature.
- size This setting chooses one of several image sizes that are
- supported by this driver. Cameras may support more, but
- it's difficult to reverse-engineer all formats.
- Following video sizes are supported:
- size=0 128x96 (Model 1 only)
- size=1 160x120
- size=2 176x144
- size=3 320x240 (Model 2 only)
- size=4 352x240 (Model 2 only)
- size=5 352x288
- size=6 640x480 (Model 3 only)
- The 352x288 is the native size of the Model 1 sensor
- array, so it's the best resolution the camera can
- yield. The best resolution of Model 2 is 176x144, and
- larger images are produced by stretching the bitmap.
- Model 3 has sensor with 640x480 grid, and it works too,
- but the frame rate will be exceptionally low (1-2 FPS);
- it may be still OK for some applications, like security.
- Choose the image size you need. The smaller image can
- support faster frame rate. Default is 352x288.
- For more information and the Troubleshooting FAQ visit this URL:
- http://www.linux-usb.org/ibmcam/
- WHAT NEEDS TO BE DONE:
- - The button on the camera is not used. I don't know how to get to it.
- I know now how to read button on Model 2, but what to do with it?
- - Camera reports its status back to the driver; however I don't know
- what returned data means. If camera fails at some initialization
- stage then something should be done, and I don't do that because
- I don't even know that some command failed. This is mostly Model 1
- concern because Model 2 uses different commands which do not return
- status (and seem to complete successfully every time).
- - Some flavors of Model 4 NetCameras produce only compressed video
- streams, and I don't know how to decode them.
- CREDITS:
- The code is based in no small part on the CPiA driver by Johannes Erdfelt,
- Randy Dunlap, and others. Big thanks to them for their pioneering work on that
- and the USB stack.
- I also thank John Lightsey for his donation of the Veo Stingray camera.
|