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)
Ответ на: комментарий от Kuzz

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

Модель принтера? Понятно, почему следующая задача не печатается - предыдущая еще «не кончилась». Драйвер чего-то ждет. (Команда A0 E0 - это опрос статуса принтера). Чего, интересно?..

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

ясненько

Если что, там в исходниках в комментариях и в текстовых файлах есть наброски, какой битик может за что отвечать. Не так все плохо. Просто трудно все кодить одному. У меня кроме captdriver еще куча проектов, и не только на github, и не только софтовых.

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

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

+1

Зависает после каждой печати, после pdf-совсем, odt - иногда вдруг печатает после длительного простоя. Очистка очереди печати и перевключение принтера помогают.

LBP2900, Lubuntu 14.04 LTS i686, драйвер собирал и ставил вот так. // но всёравно спасибо за драйвер

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

И еще одно:
При печати нескольких страниц (хоть с того же pdf, хоть с других источников) начиная с 4-й страницы начинается «сдвиг кадра».
Т.е. левый край листа отпечатываются справа после белого промежутка

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

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

Тут существенно, что на всех моделях принтеров драйвер ведет себя чуть-чуть по-разному. Практика показала, что «лечение по телефону» бесполезно, нужно работать с принтером непосредственно.

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

Я так понимаю, за определение принтера отвечают строки вида «register_printer(«LBP3000», lbp2900_ops.ops, EXPERIMENTAL);» в файле prn_lbp2900.c? И ежели дописать подобную с именем другого принтера, то драйвер будет пытаться с ним аналогичным образом оперировать?

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

Да, это так. Можно сделать и копию файла (и добавить в Makefile), например, lbp6000_ops.c, и тогда тоже все будет работать.

Что при этом будет - не знаю. Что угодно может быть. Может оказаться, что 6000 просто работает с драйвером от 2900. Но более вероятно, что он вернет какую-нибудь лажу в ответ на команду запроса статуса, и тогда драйвер либо выдаст ошибку, либо зациклит в бесконечном опросе статуса («ожидание готовности»). Тут я помочь смогу очень мало - надо будет читать лог драйвера, читать SPECS, сверять все это со сниффом виндового драйвера, догадываться о назначении неизвестных байтов, делать выводы, пробовать разные команды... Удачи!

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

Других файлов не ставит, так что достаочно стереть этот файл руками.

make install пока не работает, надо руками в директорию к фильтрам cups скопировать. Это отчасти потому что руки не дошли, а отчасти специально - драйвер еще не готов для использования людьми, совсем незнакомыми с cups.

Yampp
() автор топика
20 августа 2014 г.
Ответ на: комментарий от Yampp

Спасибо большое за вашу работу! Я тоже счастливый обладатель Саnог LBP 2900 и ужу с 2009 года не могу решить проблему работы сего девайса под Линукс. Вот информация которая может быть полезна разработчикам, хотя уже возможно и не актуальна, если это так то прошу прощения. Здесь уже выкладывали ссылку на драйвер LBP 3010 для соляриса, но возможyно эту информацию обошли стороной, поэтому выложу здесь самое главное, что нашел там - файл с описанием разработчиков Сapt 3.0 протокола: Сюда!http://myupy.ru/4106652f1

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

ps: Наверно было бы справедливо поблагодарить работников компании Сanon, за такую «заботу» о пользователях Linux создав пасхальное яйцо в этом драйвере, которое при определенных параметрах пробной печати выводит лист с благодарностью от имени всех тех безымянных воин, которые годами пытаются исправить их косяки в надежде увидить рабочий принтер под Linux.

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

Спасибо! Если вы читали AUTHORS в моем драйвере, то там есть ссылка и на драйвер для соляриса, и на файл с протоколом. К сожалению, в этом описании нашлись ошибки, некоторые флажки на самом деле имеют немного другой смысл.

Сейчас такая ситуация: я переезжаю. После переезда у меня не останется LBP-2900, хотя, возможно, рискну купить один из цветных CAPT-принтеров и довести до ума драйвер под него. Так вот, предложение для ЖИТЕЛЕЙ ЕКАТЕРИНБУРГА и окрестностей: отдам Canon LBP-2900 (пробег маленький, картридж с покупки ни разу не заменяли) в обмен на обязательство активной разработки драйвера :) Обещаю посильную поддержку в разработке, объяснение непонятных мест, могу помочь подтянуть знания Си.

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

Конечно могу. Разница невелика, но есть тонкости. Все эти принтеры частично совместимы, и 99% проблем тут - это недостаток информации по уже «поддержанным» принтерам (невозможность определить назначение некоторых битов, поскольку они во время анализа алгоритма всегда принимали одно и то же значение).

Yampp
() автор топика
14 апреля 2015 г.
Ответ на: комментарий от Softwayer

Похоже на то. Я принимаю pull request и помогаю консультациями, если требуется. Но принтера у меня действительно больше нет. За 4000 км от меня остался.

Yampp
() автор топика
22 сентября 2015 г.
8 ноября 2015 г.
16 февраля 2016 г.

для CAPT вроде есть методика?

Canon CAPT заводил по вот этой методике: http://forum.miackuban.ru/viewtopic.php?f=37&t=40

ставил модели: LBP2900 LBP3010 LBP6020, ОС Debian6 и Debian8. всё что печатал-работало, только у LBP2900 были проблемы с разворотом страницы при печати по сети. сейчас долбаюсь с LBP6030 (usb) но он не CAPT а UFR2.

PavelB
()
20 августа 2016 г.

ТС, у тебя не было идеи производить и разрабатывать принтеры, раз ты в драйверах для них уже эксперт? Пусть не всё сам сделаешь, но наверняка найдется в окружении те кто готов помочь, на партнерских основаниях. Это прибыльно ведь.

И еще, Google обещало что будут принтеры и таким протоколом, который будет унифицирован типа как и USB-флэшки (которые без сомнения работают везде и на любой ОС). Как эта спецификация называется?

I-Love-Microsoft ★★★★★
()
31 октября 2016 г.

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

для LBP-1120 имеется официальный драйвер (последняя версия от 10 ноября 2015), который ставится и работает без проблем (ubuntu 16.04-16.10)

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

в архиве с драйвером лежит инструкция. там команд около 5. выполняешь их. все работает. если не работает на x64 системе - доставляешь пару библиотек для 32битной системы и все работает.

на xubuntu 16.04 у меня было ровно так. через несколько недель обновился на 16.10 - все продолжает работать.

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

я отмечу еще, что я не против разработки. тред на самом деле вообще почти не читал. увидел в стартовом сообщении про свой принтер - поделился своим опытом.

я конечно же допускаю, что возможно с предыдущей версией официального драйвера или даже с последней могут быть проблемы. у меня к счастью все прошло гладко. драйвер v2.7.0 стал без проблем и все завелось.

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

anonymous
()
21 декабря 2016 г.
28 марта 2017 г.
19 сентября 2019 г.
Ответ на: комментарий от anonymous

Если в сети есть виндовый сервер или линуксовый со старыми работающими драйверами i586, м.б. x64 (не под ARM неподдерживаемый в общем..), можно попробовать пробрасывать USB через IP к нему.

anonymous
()
26 февраля 2020 г.