Ну вот, я сделал то что хотел. Сканер не разбирал. Разобрался в драйвере, сделал модификацию. Кратко по пунктам, что пришлось сделать. Записываю больше для себя чтоб не забыть.
1. Надо выяснить текущую весию SANE-бакэнда, который установленн в системе. Для этого заходим в /usr/lib/sane и смотрим, какие версии у большинства libsane-* so-файлов. В моем случае (Kubuntu 7.04) это 1.0.18.
2. Идем на сайт
http://www.sane-project.org на страницу Download, потом переходим на зеркало, например
http://alioth.debian.org/frs/?group_id=30186. Скачиваем исходники бакэнда нужной версии. В моем случае это sane-backends-1.0.18.tar.gz
3. Распаковываем исходники в отдельный каталог. В этом каталоге даем команды configure и make. Make install не делаем! Убеждаемся что все компилируется, компиляция не вываливается с ошибкой.
4. Находим в исходниках файлы бакэнда для своей модели сканера. У меня сканер UMAX, определяется как plustek (можно увидеть это через команду scanimage -L -v), так что искал именно файлы для plustek.
5. Исходные файлы с бакэндом для plustek находятся в подкаталоге /backend, и называются
-rw-r--r-- 1 xi xi 82148 2006-07-03 01:32 c.c
-rw-r--r-- 1 xi xi 13459 2006-05-31 20:31 plustek.h
-rw-r--r-- 1 xi xi 41413 2008-04-03 01:33 plustek-usb.c
-rw-r--r-- 1 xi xi 39846 2006-06-11 15:10 plustek-usbcal.c
-rw-r--r-- 1 xi xi 22154 2006-06-11 15:10 plustek-usbcalfile.c
-rw-r--r-- 1 xi xi 97690 2006-05-31 20:31 plustek-usbdevs.c
-rw-r--r-- 1 xi xi 23277 2006-05-31 20:31 plustek-usb.h
-rw-r--r-- 1 xi xi 46310 2008-04-03 02:02 plustek-usbhw.c
-rw-r--r-- 1 xi xi 48229 2006-05-31 20:31 plustek-usbimg.c
-rw-r--r-- 1 xi xi 8764 2006-05-31 20:31 plustek-usbio.c
-rw-r--r-- 1 xi xi 6351 2006-05-31 20:31 plustek-usbmap.c
-rw-r--r-- 1 xi xi 47590 2006-05-31 20:31 plustek-usbscan.c
-rw-r--r-- 1 xi xi 92572 2006-05-31 20:31 plustek-usbshading.c
Там же еще будут конфигурационные файлы и файлы для осуществления автоматической сборки, но они нам неинтересны, нам нужны только исходники *.h и *.c. Там же будут файлы с названием plustek-pp.*, эти файлы тоже рассматривать не стоит, они нужны для сканеров, подключаемых по LPT порту, а у нас USB сканер.
6. Делаем пробное сканирование с получением полного дампа отладки, чтобы знать что примерно искать, и есть ли в этом дампе хоть какие упоминания о включении/выключении лампы. Пробное сканирование делается в моем случае двумя командами
export SANE_DEBUG_PLUSTEK=255
scanimage --mode Color --depth 8 --resolution 300 --format tiff >scanfile01.tif 2>dbg.log
После их выполнения, получим в текущем каталоге кучу *.raw файлов, файлов результатов калибровки сканера, и среди этой кучи будет текстовый файл полного лога сканирования dbg.log
7. Делаем поиск по логу по подстроке "lamp" чтобы понять если там какие-то упоминания о управлении лампы. Видим, что есть нечто
[plustek] REG[0x5a] = 0x45 (msk=0x08)
[plustek] LAMP-STATUS: 0x00000000
...
[plustek] REG[0x5a] = 0x45 (msk=0x08)
[plustek] REG[0x5b] = 0x74 (msk=0x80)
[plustek] LAMP-STATUS: 0x00000000
...
[plustek] REG[0x5a] = 0x45 (msk=0x08)
[plustek] REG[0x5b] = 0x74 (msk=0x80)
[plustek] LAMP-STATUS: 0x00000000
[plustek] Switching Lamp on
[plustek] usb_switchLampX(ON=0,TPA=1)
[plustek] Switch Lamp: 0, regs[0x5b] = 0x74
[plustek] usb_switchLampX(ON=1,TPA=0)
[plustek] Switch Lamp: 1, regs[0x5a] = 0x4d
[plustek] REG[0x5a] = 0x4d (msk=0x08)
[plustek] REG[0x5b] = 0x74 (msk=0x80)
[plustek] LAMP-STATUS: 0x00000001
...
[plustek] usb_switchLampX(ON=0,TPA=0)
[plustek] Switch Lamp: 0, regs[0x5a] = 0x45
...
[plustek] usb_switchLampX(ON=1,TPA=0)
[plustek] Switch Lamp: 1, regs[0x5a] = 0x4d
...
[plustek] sane_close
[plustek] sane_exit
[plustek] Shutdown called (dev->fd=-1, libusb:001:003)
[plustek] Waiting for scanner-ready...
[plustek] Switching lamp off...
[plustek] REG[0x5a] = 0x4d (msk=0x08)
[plustek] REG[0x5b] = 0x74 (msk=0x80)
[plustek] LAMP-STATUS: 0x00000001
[plustek] Switching Lamp off
[plustek] usb_switchLampX(ON=0,TPA=0)
[plustek] Switch Lamp: 0, regs[0x5a] = 0x45
[plustek] REG[0x5a] = 0x45 (msk=0x08)
[plustek] REG[0x5b] = 0x74 (msk=0x80)
[plustek] LAMP-STATUS: 0x00000000
8. Начинаем изучать исходники, чтобы понять как там все устроено. Быстро выясняем, что записи в логе вида usb_switchLampX(...) - это вызов функции с таким именем. Эта функция лежит в файле plustek-usbhw.c. Она вызывается только из функции usb_switchLamp(). Смотрим логику, как usb_switchLampX() вызывается из usb_switchLamp(). Понимаем, что usb_switchLamp() - это основная функция, используемая в коде, и она принимает два значения - идентификатор девайса, и булевое значение - включить или выключить лампу. А функция usb_switchLampX() выбирает внутри себя, какую конкретно лампу включать - обычную или лампу слайдадаптера (которого у меня нет).
9. Нам нужно сделать по-быстрому библиотеку, которая бы тупо не включала ни одну лампу вообще. Для этого, в начале функции usb_switchLamp() принудительно изменяем принятый ею параметр на "выключено"
on=SANE_FALSE;
10. Пробегаем исходники на предмет обнаружения прочих функций, работающих с лампой. В том же файле plustek-usbhw.c находим функцию usb_LampOn(...), которая включает-выключает лампу, вызывая внутри себя usb_switchLampX(...), но помимо этого что-то пишет в какие-то управляющие регистры сканера. С этой функцией поступаем точно так же, в начале функции принудительно изменив принимаемый ею параметр
fOn=SANE_FALSE;
11. Возвращаемся в корневой каталог, куда были размещены исходники, и снова даем команду make. Будет пересобран только файл libsane-plustek.so.1.0.18, который лежит в подкаталоге /backend/.libs
12. Сохраняем файл библиотеки
/usr/lib/sane/libsane-plustek.so.1.0.18
в укромное место, и под правами рута заменяем его на файл
каталог_с_исходниками/backend/.libs/libsane-plustek.so.1.0.18
Все! Теперь, если начать сканирование, лампа включаться не будет.
О результатах сканирования проецируемого изображения напишу пожже, пока скажу что они неудовлетворительные. А если на стекло сканера положить пленку, сверху прижать матовым стеклом, и светить яркой лампой, то качество гораздо лучше. Этакий бесплатный слайдадаптер получается. Но разрешение полученного изображения не то, какое бы хотелось. Да и полюбому готовый слайдадаптер дает более хорошую картинку. А картинка, снятая с настоящего слайд адаптера, меня тоже не удовлетворяет. Так что надо делать как-то по-другому.