LINUX.ORG.RU

Canon LBP-2900 и другие CAPT-принтеры - ПИШУ ДРАЙВЕР

 ,


24

21

Попытался запустить LBP-2900 в Ubuntu. Довольно быстро выяснилось, что фирменный драйвер Canon - полный отстой, не поддерживается, и с этим надо что-то делать. Обнаружил также попытки написания энтузиастами аналогичного драйвера, но для 2900 он не работает. В связь с этим начал обратный инжениринг принтера и решил написать СОБСТВЕННЫЙ ДРАЙВЕР.

UPD: ТЕКУЩЕЕ СОСТОЯНИЕ

Исходники доступны на Github: https://github.com/agalakhov/captdriver

Чеклист к первому релизу:
[X] Передача параметров компрессии Hi-SCoA
[X] Компрессия Hi-SCoA
[X] Поддержка LBP-2900 и LBP-3000
[X] Баг «only 10 bytes»
[X] Печать многих страниц
[X] Ожидание наличия бумаги
[ ] Генерация PPD-файлов

Чеклист ко второму релизу:
[ ] Компрессия SCoA
[ ] Поддержка LBP-810 и LBP-1120

(Текст исходного верхнего поста следует)

Ищу единомышленников для Reverse Engineering протокола принтера. На сегодняшний день мне удалось полностью расшифровать протокол нижнего уровня USB и частично - протокол верхнего уровня. Мой драйвер уже может отсылать страницы на печать. ТРЕБУЕТСЯ расшифровать алгоритм сжатия пиксельных данных (он оказался отличным от алгоритма LBP-810 и, по-видимому, является какой-то модификацией ALPC-сжатия). Попытки прикрутить алгоритм от 810 привели к тому, что принтер включается и печатает, но на бумаге получаются только полосы, линии и регулярные узоры из пикселей. У меня пока нет времени на расшифровку, поэтому прошу помощи.

ОПИСАНИЕ ТОГО, ЧТО УДАЛОСЬ РАСШИФРОВАТЬ

Работать с принтером можно с помощью простого open(«/dev/usb/lp0») - libusb не требуется. Общение идет пакетами довольно простого формата. Формат пакета:

байты 1,2 - код команды - 16 бит (младший байт первый)

байты 3,4 - длина посылки (полная) - 16 бит (очевидно, меньше 4 байт не бывает)

байты с 5 - данные (опционально)

Если суммарная длина посылки превышает 4096 байт, посылка делится на части по 4096 байт.

Компьютер посылает принтеру команду. Принтер отвечает пакетом, содержащим код той же команды и минимум 2 байта данных (код возврата), всего не менее 6 байт. Эти 6 байт читают одним read(). Если длина превышает 6 байт, то затем делается read() на оставшуюся длину (она у меня никогда не превышала 4 килобайта, так что про ограничения ничего не знаю). Если не прочитать ответ принтера и продолжить посылать данные, он зависнет, и его придется выключить и включить снова.

Коды команд:

0xA1A1 - начало работы. Параметров нет (4 байта). Принтер отвечает длинной последовательностью байтов - видимо, номером модели, серийным номером, характеристиками и чем-то еще, я не разбирался.

0xA0A0 - какая-то проверка статуса? Встречается на 810, ни разу не видел на 2900. Параметров нет. Принтер отвечает длинной простышей байтов.

0xA0A8 - запрос какого-то статуса. Параметров нет. В коде возврата - явно битовые флаги.

0xA3A2 - что-то включает, меняет флаги в предыдущей команде. Параметров нет. Ответ всегда 0x0000.

0xE0A0 - проверка готовности. Если в ответе поднят бит 0x0008, то буфер принтера полон, надо ждать и не посылать больше данные.

0xA0A1 - проверка кучи вещей, в том числе наличия бумаги. Как оно работает на 2900 - не знаю.

0xA2A0 - загрузка первой магической последовательности. Параметр: магическая последовательность байтов.

0xE1A1 - загрузка второй магической последовательности.

0xE0A3, 0xE0A2, 0xE0A4 - что-то включают. Всегда идут в начале и в такой последовательности. Их отсутствие никак на печать не влияет(?). Возвращают 0, а при попытке вызвать повторно - 0x8800.

0xE0A5 - третья магическая последовательность.

0xD0A9 - загрузка магической последовательности, непосредственно предшествующая загрузке данных печати. Ответа на эту команду не дожидаются (?).

0xC0A0 - Главная Команда. Загружает в принтер сжатое изображение или его часть. Ответа принтера нет.

0xC0A4 - Конец Загрузки. Выдается сразу после 0xC0A0.

0xE0A7 - Включение Печати. Когда принтер подтвердит готовность после загрузки, выдают эту команду, и принтер начинает печатать. Параметр: 16-битное число 0x0001 (видимо, означающее «включить»).

Дополнительная информация - в исходниках драйвера http://www.boichat.ch/nicolas/capt/

Исходники того, что написал на данный момент, могу прислать.



Последнее исправление: cetjs2 (всего исправлений: 5)
Ответ на: комментарий от Yampp

да, работает только так.

Еще заметил сегодня такое - между печатью страниц иногда происходят паузы, по звуку как будто принтер перестает печатать и начинает печатать заново.

ILLIOS
()
Ответ на: комментарий от ILLIOS

да, работает только так.

Так есть символ «^H» в строке ID принтера (той, которую СИСТЕМА определяет, а не мой драйвер) или нету его? Я так и не понял. По-моему, нету.

Еще заметил сегодня такое - между печатью страниц иногда происходят паузы, по звуку как будто принтер перестает печатать и начинает печатать заново.

Это нормально. Просто рендер не всегда успевает за принтером. Особенно перед сложными страницами это вероятно. В принципе есть способ буферизовать больше одной страницы, но я не вижу смысла усложнять драйвер ради убирания этих маленьких пауз. Лучше пусть надежным будет.

Yampp
() автор топика
14 декабря 2013 г.
Ответ на: комментарий от Yampp

I need Help

Товарищи, что там слышно с драйвером. Меня жена уже скоро с дома выгонит с моим линуксом....Ей печатать надо много. Вопрос - текущая версия драйвера работает более-менее работает, и как его собрать под ARMHF ( у меня Cubieboard)?

finberg
()
Ответ на: I need Help от finberg

Текущая версия драйвера вполне работает под LBP-2900 и LBP-3000. Она может по случайному стечению обстоятельство поддерживать более поздние модели принтеров. Принтеры LPB-810 и LBP-1120 поддержать можно, но прямо сейчас поддержки нет.

Сборка под ARMHF не проблема, собирать как любую другую программу соответствующим кросс-компилятором. Если же есть компилятор прямо на Cubieboard, тогда просто ./configure;make. Установка через make install пока не работает, нужно вручную скопировать rastertocapt в директорию с фильтрами CUPS и поставить прилагаемый PPD.

Баги - могут быть. Но известных багов, мешающих печатать на LBP-2900, на данный момент нет.

Yampp
() автор топика
Ответ на: Спасибо, буду пробовать! от finberg

ошибка

Добрый день. Скачал, распаковал. при запуске ./configure, выдает, что нет такого файла или каталога. В каталоге есть файл ./configure.ac, после его запуска выдает следующее..

./configure.ac: line 1: syntax error near unexpected token `[2.69]' ./configure.ac: line 1: `AC_PREREQ([2.69])'

finberg
()
Ответ на: ошибка от finberg

при запуске ./configure, выдает, что нет такого файла или каталога. В каталоге есть файл ./configure.ac

... внимательный читатель уже догадался, что в такой ситуации нужно сперва сгенерировать configure вызовом autoconf, чего и вам непременнейше советует.

bormant ★★★★★
()
Ответ на: комментарий от ZenitharChampion

До апстрима есть еще несколько важных шагов. В частности, надо нормально интегрироваться с CUPS, а не теми костылями, которые сейчас сделаны. Сейчас там стоит отладочная времянка.

Yampp
() автор топика
Ответ на: комментарий от bormant

Спасибо, извините за мою неопытность.

Первый раз autoconf выдал следующее autoconf configure.ac:6: error: possibly undefined macro: AM_INIT_AUTOMAKE If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation.

При повторном запуске уже не ругался, но ./configure ./configure: line 1733: syntax error near unexpected token `1.9' ./configure: line 1733: `AM_INIT_AUTOMAKE(1.9 no-dist-gzip dist-xz tar-ustar)'

Куда копнуть, подскажите.

finberg
()
Ответ на: комментарий от bormant

Спасибо за терпение

Собираю впервые, честно говоря думал это процесс попроще. Не хватает опыта в линуксе, чтобы разобраться самому.

autoheader: error: AC_CONFIG_HEADERS not found in configure.ac

automake configure.ac:6: required file `./install-sh' not found configure.ac:6: `automake --add-missing' can install `install-sh' configure.ac:6: required file `./missing' not found configure.ac:6: `automake --add-missing' can install `missing' src/Makefile.am: required file `./depcomp' not found src/Makefile.am: `automake --add-missing' can install `depcomp'

finberg
()
Ответ на: Спасибо за терпение от finberg

Он же сам подсказывает: нет файла такого-то, возможно исправить вызовом «automake --add-missing». Так и выполните перед automake, как подсказано:

$ automake --add-missing

думал это процесс попроще

Он на самом деле для сборщика попроще, согласно документации autotools обеспечение правильного ./configure лежит на разработчике ПО. А его, разработчика, работа изначально предполагается более сложной, чем сборка оттестированного ПО. Но поскольку код драйвера всё ещё в активной разработке, генерация ./configure на каждый чих в исходниках тоже не выглядит разумной задачей. Поэтому такой компромисс, по крайней мере до релиза (imho).

bormant ★★★★★
()
Ответ на: комментарий от Kuzz

Спасибо за помощь.

Скопировал из папки src файл rastertocapt в папку /usr/lib/cups/filter/, потом при установке принтера подсунул файл Canon-LBP-2900.pdd, вроде установилось и даже один раз распечатало тестовую страницу. пара вопросов: 1. если выбрать свойство принтера, то в диалоговом окне появляется Ошибка, параметр printer-resolution имеет значени unknown iPP tag. 2. Марка и модель принтера в свойствах пишет Canon LBP-2900 CAPT GDI printer, 0.1.0 Все ли правильно я установил?

finberg
()
Ответ на: комментарий от bormant

Поэтому такой компромисс, по крайней мере до релиза (imho).

Строго говоря, это общепринято для кода, лежащего в git. Файл ./configure в git (а равно и в cvs и в svn) не кладут, его кладут только в *.tar.gz с релизом. Поскольку *.tar.gz с релизом пока нет, то и класть ./configure физически некуда.

В git-версии всегда так и будет - ./configure надо будет генерировать. В версиях, распространяемых в виде *.tar.gz, будет ./configure.

Yampp
() автор топика
Ответ на: Спасибо за помощь. от finberg

если выбрать свойство принтера, то в диалоговом окне появляется Ошибка, параметр printer-resolution имеет значени unknown iPP tag

Баг в PPD-файле, который давно не обновлялся и вообще не факт, что подходит к новым версиям CUPS. Это как раз времянка, про которую я говорил. В финальной версии не будет *.ppd в архиве, а будет «драйвер», который их на лету генерирует.

Если что не так - правьте ppd руками и не стесняйтесь.

Yampp
() автор топика
Ответ на: комментарий от Yampp

Вопросик.

У меня печатает тестовую страницу, а потом пока не выкл-влк принтер из розетки не печатает. Передернешь, опять напечатает одну страничку. И еще, подскажите, если я хочу печатать по сети (на ноуте стоит Ubunta), какой драйвер принтера мне нужно ставить на ноутбук?

finberg
()
Ответ на: Вопросик. от finberg

У меня печатает тестовую страницу, а потом пока не выкл-влк принтер из розетки не печатает.

Странно. Я думал, этот баг давным-давно поправлен. Можно лог посмотреть?

какой драйвер принтера мне нужно ставить на ноутбук?

В такой схеме надо настраивать, чтобы компьютер, на котором CAPT-принтер, эмулировал стандартный сетевой PostScript-принтер. Драйвер CAPT по сети нормально работать не будет никогда из-за двустороннего обмена с принтером в реальном времени.

Yampp
() автор топика

Надо включить максимум болтливости в CUPS и лог тогда будет в /var/log/cups/error_log.

Какая точно модель принтера и какая версия драйвера используется (от какой даты)? Точно последняя?

Дело в том, что у других людей до сих пор печать многих страниц шла нормально. Неужто разница в прошивках принтеров? Этого еще не хватало :(

Yampp
() автор топика

распаковал

Это получилось бы, если код к себе получить как

git clone https://github.com/agalakhov/captdriver.git

В архиве нет .git и версии не увидишь.

Kuzz ★★★
()

git log

commit 32a1f6fb63a4f201d98d2c66cb911a53488ed295 Author: Alexey Galakhov <agalakhov@gmail.com> Date: Mon Dec 16 22:03:37 2013 +0600

Add experimental LBP3010 support Signed-off-by: Alexey Galakhov <agalakhov@gmail.com>

commit db62b19a9f66aa18ff5eb45274599c878b3fb82b Author: Alexey Galakhov <agalakhov@gmail.com> Date: Mon Dec 16 22:00:35 2013 +0600

Add container_of macro Signed-off-by: Alexey Galakhov <agalakhov@gmail.com>

commit e02a9edcbf94c263d3cea758fc3c68c23c986007 Author: Alexey Galakhov <agalakhov@gmail.com> Date: Mon Dec 16 21:48:25 2013 +0600

Allow getting xstatus without getting status first Signed-off-by: Alexey Galakhov <agalakhov@gmail.com>

commit fc9d5d790e142ccf80985f5defad2ab6e4c7daec Author: Alexey Galakhov <agalakhov@gmail.com> Date: Fri Nov 22 21:46:55 2013 +0600

Fix buffer start handling

commit 2554f169f4cb78b39a20e812941bbf943bad6b91 Author: Alexey Galakhov <agalakhov@gmail.com> Date: Wed Nov 20 23:56:13 2013 +0600

Fix multiple buffer receiving (close #3)

commit 7370d091266075cf98717c6ab53c77adafdb892b Author: Alexey Galakhov <agalakhov@gmail.com> Date: Wed Sep 25 20:56:31 2013 +0600

Reset after paper out Signed-off-by: Alexey Galakhov <agalakhov@gmail.com>

commit 7cf71d957749d46785e750090ac25805d2290a18 Author: Alexey Galakhov <agalakhov@gmail.com> Date: Tue Sep 24 20:58:38 2013 +0600

finberg
()

Не могу даже установить что-то

sudo: ./configure: команда не найдена

./configure.ac: 1: ./configure.ac: Syntax error: word unexpected (expecting ")")

configure.ac:1: error: Autoconf version 2.69 or higher is required configure.ac:1: the top level autom4te: /usr/bin/m4 failed with exit status: 63 automake: autoconf failed with exit status: 63

(автомейк последний)

Deleted
()
Ответ на: комментарий от ILLIOS

Обнаружил еще один момент: печать копий не работает, печатает только один раз. Может уже починили, не проверял.

Подтверждаю, тоже столкнулся с такой проблемой.

hypuson
()
Ответ на: комментарий от Yampp

В такой схеме надо настраивать, чтобы компьютер, на котором CAPT-принтер, эмулировал стандартный сетевой PostScript-принтер. Драйвер CAPT по сети нормально работать не будет никогда из-за двустороннего обмена с принтером в реальном времени.

Неужели нельзя какой костылик нагородить, чтобы принт-сервер общался с принтером по CAPT, а с компьютером, отдавшим команду на печать, общался как стандартный PostScript-принтер?

И в конце концов, вроде существуют принт-серверы, поддерживающие принтеры LBP...

Softwayer ★★
()

Зависает задание

D [20/Mar/2014:10:47:42 +0200] [Job 586] CUPS_SC_CMD_DRAIN_OUTPUT received from driver...
D [20/Mar/2014:10:47:42 +0200] [Job 586] Wrote 4 bytes of print data...
D [20/Mar/2014:10:47:42 +0200] [Job 586] CAPT: waiting for 6 bytes
D [20/Mar/2014:10:47:42 +0200] [Job 586] Read 6 bytes of back-channel data...
D [20/Mar/2014:10:47:42 +0200] [Job 586] CAPT: waiting for 50 bytes
D [20/Mar/2014:10:47:42 +0200] [Job 586] Read 50 bytes of back-channel data...
D [20/Mar/2014:10:47:42 +0200] [Job 586] CAPT: recv  A8 A0 38 00 30 8A 00 00 0F 00 00 00 00 00 80 00
D [20/Mar/2014:10:47:42 +0200] [Job 586] CAPT: 00 00 01 00 00 00 00 00 00 00 00 00 57 00 00 00
D [20/Mar/2014:10:47:42 +0200] [Job 586] CAPT: 01 00 00 00 00 01 01 00 00 00 00 00 01 00 00 00
D [20/Mar/2014:10:47:42 +0200] [Job 586] CAPT: 00 00 00 00 00 00 00 00
D [20/Mar/2014:10:47:42 +0200] [Job 586] CAPT: printer status P1=0 P2=0 B=0 B1=0 nE=1
D [20/Mar/2014:10:47:42 +0200] [Job 586] CAPT: pages 1/0/0/0
D [20/Mar/2014:10:47:43 +0200] [Job 586] CAPT: send  A0 E0 04 00
D [20/Mar/2014:10:47:43 +0200] [Job 586] Read 4 bytes of print data...
D [20/Mar/2014:10:47:43 +0200] [Job 586] CUPS_SC_CMD_DRAIN_OUTPUT received from driver...
D [20/Mar/2014:10:47:43 +0200] [Job 586] Wrote 4 bytes of print data...
D [20/Mar/2014:10:47:43 +0200] [Job 586] CAPT: waiting for 6 bytes
D [20/Mar/2014:10:47:43 +0200] [Job 586] Read 6 bytes of back-channel data...
D [20/Mar/2014:10:47:43 +0200] [Job 586] CAPT: waiting for 6 bytes
D [20/Mar/2014:10:47:43 +0200] [Job 586] Read 6 bytes of back-channel data...
D [20/Mar/2014:10:47:43 +0200] [Job 586] CAPT: recv  A0 E0 0C 00 30 8A 00 00 0F 00 00 00
---------
D [20/Mar/2014:10:47:44 +0200] [Job 586] CAPT: send  A0 E0 04 00
D [20/Mar/2014:10:47:44 +0200] [Job 586] Read 4 bytes of print data...
D [20/Mar/2014:10:47:44 +0200] [Job 586] CUPS_SC_CMD_DRAIN_OUTPUT received from driver...
D [20/Mar/2014:10:47:44 +0200] [Job 586] Wrote 4 bytes of print data...
D [20/Mar/2014:10:47:44 +0200] [Job 586] CAPT: waiting for 6 bytes
D [20/Mar/2014:10:47:44 +0200] [Job 586] Read 6 bytes of back-channel data...
D [20/Mar/2014:10:47:44 +0200] [Job 586] CAPT: waiting for 6 bytes
D [20/Mar/2014:10:47:44 +0200] [Job 586] Read 6 bytes of back-channel data...
D [20/Mar/2014:10:47:44 +0200] [Job 586] CAPT: recv  A0 E0 0C 00 30 8A 00 00 0F 00 00 00
---------
Отмеченный кусок потом повторяется много раз

После печати одностраничной пдф-ки следующая не печатается

Kuzz ★★★
()
Последнее исправление: Kuzz (всего исправлений: 1)
Ответ на: комментарий от false

А настройку экономии (или хотя бы отключение экономии) тонера сложно добавить?

Легко, это один битик где-то, но я пока не знаю, который. Там непонятных битиков много.

Yampp
() автор топика
Ответ на: Canon LBP-1120 от Sky777

у меня сабж. пока нет поддержки в вашем проекте ? ждем ?

Вообще ждем, но у меня пока совсем-совсем нет времени. Если кто-то готов помочь, я скажу, что делать. Там программирование несложное.

То же самое со всеми остальными моделями: владельцу принтера это написать на самом деле проще, чем мне. Минимального знания Си достаточно, остальное я объясню/подправлю. Кто хочет заняться, пишите на почту.

Yampp
() автор топика