LINUX.ORG.RU

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

 ,


23

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)

30 октября 2012 г.
Ответ на: комментарий от Chaser_Andrey

а смысл, зачем его продавать, если можно перезагрузиться в масдай и напечатать over 9000 документов, просто хотелось бы без этих танцев с бубном, а в обслуге принтер очень дешев и качество печати неплохое....да и за сколько его продашь..

staff67
()
30 мая 2013 г.
26 августа 2013 г.
Ответ на: комментарий от Artificial_Thought

Проект все еще развивается.

Статус:

1. Существует независимый проект по поддержке LBP3010; человек полностью расшифровал протокол, и там есть некоторые отличия. Сверяю это с моими результатами. Кажется, я теперь знаю ВСЕ команды SCoA и Hi-SCoA и все нужные команды A0.

2. Новые версии CUPS позволяют обойтись без упячки с capt:// и перейти на нормальный usb://, но для этого придется переписать значительную часть кода.

3. Новая информация указала на неточности в понимании алгоритма взаимодействия с принтером. Это я тоже учел. В результате код переписан почти полностью - изменена архитектура с прицелом на поддержку ВСЕХ принтеров CAPT в будущем.

4. Я сохранил свой LBP-2900 только ради того, чтобы отлаживать на нем драйвер. Судя по всему, LBP-2900 и LBP-3000 почти идентичны. Еще у меня есть кому тестировать под LBP-1120, он почти идентичен LBP-810. Эти четыре модели будут в скором времени работать полностью. Все остальные модели (включая цветные) я могу исследовать по поведению фирменного драйвера, но не могу проверить до конца.

5. В некоторых моделях принтеров есть ошибка прошивки, приводящая к нарушению протокола со стороны принтера! Это было причиной появления ошибок в драйверы. Этот quirk учтен.

6. Владельцев новых принтеров (LBP-5xxx, LBP-6xxx), особенно цветных, умеющих программировать на Си, прошу откликнуться. Я дам подробные инструкции по реверс-инженирингу ваших принтеров, по которым вы сами сможете добавить их поддержку в драйвер. Логи снифферов мне, как правило, больше не нужны (их у меня и так уже много) - нужны именно активные пробы кода на реальном железе.

7. Драйвер будет работать всюду, где работает CUPS, не только на Linux и не только на x86.

Yampp
() автор топика
Ответ на: Проект все еще развивается. от Yampp

> 2. Новые версии CUPS позволяют обойтись без упячки с capt:// и перейти на нормальный usb://, но для этого придется переписать значительную часть кода.

Ну вы это, не удаляйте этот код, пожалуйста. Энтерпрайсу нужен ваш драйвер!

ZenitharChampion ★★★★★
()
Ответ на: Проект все еще развивается. от Yampp

Еще статус:

8. Код уже практически переписан и находится в стадии отладки. Но это чуть-чуть позже, а пока...

9. Поскольку фирма Canon в своем драйвере сделала замечательную зацепку для RE - captfilter - я решил сначала сделать тестовый фреймворк. А именно - программку, которая по сжатым (Hi)SCoA-данным восстанавливает битмэп. Ее можно оттестировать на captfilter, а потом по ней тестировать драйвер, не портя бумагу. Уже написано, но пока не работает. В процессе выявились мелкие различия сжатия на разных моделях, и это надо будет исследовать особо. Похоже, там при одном и том же алгоритме используются разные константы.

10. Алгоритм сжатия разработан на редкость неграмотно. Такое впечатление, что в Canon едва знакомы с энтропийным сжатием. Я совершенно перестаю уважать эту фирму.

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

Аналогично. Я и так печатал мало, а потом для фотографий купил струйник, ну а пару страничек текста в месяц можно и на струйнике. 2900 оставил исключительно для целей хакинга. Ну и может еще ЛУТ для печатных плат на нем делать.

Я у драйвера 3010 прочитал документацию. Там сжатие отличается константами. Команда, которая на 2900 «повтор байтов», на 3010 «повтор байтов со сдвигом на 3». Там есть пять команд повтора с разными сдвигами, и видимо сами команды остаются постоянными, а сдвиги зависят от типа принтера (оптимизируются под конкретный dithering?)

Ну зато угадал я правильно - в сжатии все команды идут кодом Элиаса. Три команды, о которых я догадывался, но никогда не видел - действительно существуют и действительно имеют такой формат, как я думал. Это значит, что всего команд у сжатия 8, и мы все их знаем.

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

О как. Там, оказывается, длина строки и число строк в полосе переменные, их можно менять. И параметры сжатия тоже. Похоже, команда 0xD0A0 (внутри команды 0xD9A0) - это установка настроек декомпрессора!

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

Протокол сжатия известен ПОЛНОСТЬЮ. Команда D0A4 в основном раскодирована - она содержит таблицу констант декомпрессора. Из 8 байтов точно известны 3, предполагаются еще 3, неизвестны 2 (есть гипотезы и насчет их значения).

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

Версия пока не выпущена. Новой информации о принтере столько, что я просто не успеваю ее переварить.

Если в эти выходные у меня мой принтер заработает с новым кодом, я выложу этот новый код. Но автомаГической установки не ждите - собирать придется с напильником. Автоматика будет, но всему свое время. Сначала алгоритм.

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

Огромное спасибо за ценный труд. Сам очень стльно нуждаюсь в драйвере для 2900 по линукс. У меня Cubieboard, ARHF, с дебиан на борту. Работает как сервер, торенты. Очень хотелось прикрутить к нему принтер, для печати по сети. Кстати, пробовал собрать под свой кубик, во что выдает:

root@cubie:/home/cubie/Temp/cupscapt-0.1.1# make install install -D -m 755 -s capt /usr/lib/cups/backend/capt install -D -m 755 cupscat /usr/lib/cups/filter/cupscat mkdir -p /usr/local/share/ppd/cupscapt/ install -D -m 644 ppd/*.ppd.gz /usr/local/share/ppd/cupscapt/ install: cannot stat `ppd/*.ppd.gz': No such file or directory make: *** [install] Error 1

Опыта с линуксом пока не много, подскажите чего не хватает.

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

Это он с новым CUPS несовместим, там методы создания ppd изменили. Переделаю.

Драйвер 2900 скоро точно будет, причем, вероятно, полнофункциональный (даже с режимом экономии тонера). Вот про новые принтеры бы узнать что-нибудь...

Кто-нибудь знает, в фирменном драйвере под цветные принтеры с какими опциями cupsfilter запускается? По фирменным ppd пока разбираться некогда.

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

Эх, не успел сегодня попрограммировать. Выборы...

Статус: полный алгоритм сжатия оттестирован, распаковка дает исходный файл бит к биту. Ошибок нет.

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

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

Наверное сегодня получу доступ к LBP3000, линукс и ошмётки воспоминаний о протоколе имеются (мать вашу, почти 4 года прошло), хотелось бы поработать напильником.

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

Хорошо. Я сразу дополню информацию по протоколу: 0xD0A9 содержит внутри другие команды. Среди них: 0xD0A0 - формат бумаги. Известные поля: размер изображения и размер листа (в пикселах, в дюйме ровно 600 пикселов). Размер картинки ПЕРЕМЕННЫЙ, мы думали неправильно! 0xD0A4 - параметры сжатия. Набор констант сдвигов, используемых при распаковке. Константы ПЕРЕМЕННЫЕ, мы думали неправильно, автор capt3 тоже неправ!

Все остальное документировано более-менее в SPECS в исходниках драйвера capt3.

Я поковырял фирменный драйвер (позапускал captfilter и посмотрел на содержимое *.dat, в которых оказались тоже A0-команды). У цветных принтеров тот же протокол. Там параметры сжатия передаются четырежды (D0A4, D0A5, D0A6, D0A7) и, похоже, просто гонятся подряд четыре картинки листа. Хотелось бы проверить как-то. Если так, то цветные принтеры поддержать легко!

Фирменный драйвер вполне хакабельный. Там есть пара утилиток, которые можно запускать и анализировать вывод. Рекомендую.

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

А почему несколько лет назад ты просил захватывать обмен данными с принтером из Windows? В Linux это тоже возможно, я встречал упоминания об этом, но сходу не вспомню как это сделать. Проанализировали бы драйвер для Linux! Который закрытый...

И ещё, для «прикреплённых тем» доступно редактирование. Предлагаю вместо старой ссылки на проект добавить ссылку на SVN на SourceForge. Чтобы щёлк - и перейти по ней, и чтобы не искать её по страницам темы, а найти её в исходном сообщении.

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

Так я закрытый драйвер и анализирую. В основном. Но некоторые вещи по нему определять очень трудно. Он иногда «умничает». Поэтому и Windows.

По закрытому драйверу я предполагаю, что протокол 6000-х и 7000-х принтеров (даже цветных) прежний. Но проверить это надо именно на Windows.

Там уже не SVN, а Git, и скоро будет вообще новый проект. Потому что изменилось слишком много, чтобы имело смысл развивать старый код, а не писать новый.

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

Т.е. размер изображения может быть меньше размера листа, раз эти данные идут отдельно?

Непонятно. Похоже, что есть несколько валидных размеров изображения.

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

Слова по смещениям 26 и 28 - это размер картинки. По 26 находится длина строки (LINESIZE в байтах), по 28 - общее число строк. Число строк в полосе нигде не указывается и, похоже, высоту полос можно выбирать произвольно. Драйвер делает всегда 70 строк.

По смещению 4 байт, который принимает значение 0x0D для Letter и 0x02 для A4. Смысл не знаю.

По смещению 19 - режим экономии тонера (0 - выкл, 1 - вкл).

По смещениям 12 и 36 - тип бумаги (обычная или толстая) - видимо, какие-то отдельные режимы. Не знаю, что значат.

Команда D0A4 - с ней почти все ясно. Всего 8 байт, кодируют соответственно: L3, L5, 0x01??, 0x01??, L0?=0x00, L2, (L4 L4). Знаковые. Эти константы используются в сжатии: там алгоритм, похожий на LZ77, но умеющий повторять только определенные смещения. В SPECS от capt3 он описан полностью, за исключением L-значений, автор думал, что они константы, и написал просто цифры. На самом деле у него 592=L0+LINESIZE, 587=L2+LINESIZE, 3=L3, 12=L5. И им соответствует вот такая посылка: a4 d0 0c 00 03 0c 01 01 00 fb 80 01

Еще в командах часто встречаются числа 60, -60, -120, -180, 96 - интересно, что они значат. См. команды E1A1, A3A9 и т.д. - комбинация байтов 0x88 0xFF, например.

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

Размеры картинок: я видел только две длины строки, 592 и очень редко 608. Похоже, длина строки обязана делиться на 16 и разрешены только немногие значения. Даже на маленьких картинках выбирается 592. Алгоритм выбора неясен.

Для тестов можно запускать captfilter от фирменного драйвера. Он на выходе дает нечто в формате команд принтера - там чередуются A0-команды (идут прямиком на принтер) и команды с другими кодами, которые явно потом bidi-монитор преобразует в команды принтера. Надо попытаться bidi-монитор научиться тоже отдельно запускать.

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

Утилиты для обратной разработки:

https://github.com/agalakhov/anticapt

Пожалуйста, запустите captdefilter на CNABGCL.BIN из фирменного драйвера и попытайтесь понять, какого формата битмэп получается. То же самое с другими файлами. А то я что-то туплю :(

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

Новые версии CUPS позволяют обойтись без упячки с capt:// и перейти на нормальный usb://, но для этого придется переписать значительную часть кода.

Правильный ход. Тоже не понимаю, зачем нужны эти извращения

Владельцев новых принтеров (LBP-5xxx, LBP-6xxx), особенно цветных, умеющих программировать на Си, прошу откликнуться. Я дам подробные инструкции по реверс-инженирингу ваших принтеров, по которым вы сами сможете добавить их поддержку в драйвер. Логи снифферов мне, как правило, больше не нужны (их у меня и так уже много) - нужны именно активные пробы кода на реальном железе.

По закрытому драйверу я предполагаю, что протокол 6000-х и 7000-х принтеров (даже цветных) прежний...

Как владелец нового принтера, могу чем-нибудь посодействовать. Программировать, к сожалению, не умею, но какими-нибудь данными, по возможности, постараюсь снабдить, заодно протестировать

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

Правильный ход. Тоже не понимаю, зачем нужны эти извращения

Они когда-то были нужны по чисто техническим причинам: эти принтеры довольно хитро работают с USB, и старая версия CUPS стандартным usb:// нужные функции поддерживать не умела. Новая - умеет.

Как владелец нового принтера, могу чем-нибудь посодействовать.

Какой именно у вас принтер? Хорошо бы цветной :) Посодействовать очень даже можете - снимите снифф любым USB-сниффером и пришлите мне. Сниффер устроит любой, лишь бы я файл смог открыть без винды (могу и под wine). Я тогда смогу понять, правильны ли мои догадки относительно протокола этих принтеров. Для сниффа лучше печатать документ в несколько страниц, лучше цветных или полутоновых, только не печатайте ничего секретного - я ведь все увижу :). Больших изображений делать не надо, а то снифф гигантский получится. Лучше всего пару строк цветного текста на каждой странице.

Есть очень хорошие шансы при должном содействии поддержать в недалеком будущем в опенсорсном драйвере ВСЕ принтеры CAPT. Чем больше информации я собираю, тем понятнее становится протокол. Сейчас он уже известен где-то на 95%. (При этом foo2capt, который на sf.net лежит, делался тогда, когда я еще только 20% протокола знал).

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

...старая версия CUPS стандартным usb:// нужные функции поддерживать не умела. Новая - умеет.

«новая» это начиная с которой?

Какой именно у вас принтер? Хорошо бы цветной :)

Так цветной и есть, LBP7018C, я где-то тему насчет него создавал...

Только я вот чего не могу понять - думаю, для многих не секрет, что некоторые принтеры HP и Canon являются клонами, и различаются только небольшим рестайлингом, от них даже расходники подходят друг к другу как родные. Мой принтер не исключение - это клон HP CP1025. Только вот НР имеют открытый драйвер, и на линукс встают сразу, из коробки, а вот с Сапопами приходится повозится. Так в чем же кардинальная разница между ними? В прошивке? Или все таки аппаратные различия есть какие-то?

Itaris
()