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)

15 июля 2020 г.
21 апреля 2021 г.
11 ноября 2021 г.

Я может не в свою тарелку лезу но есть шанс сделать что-то вроде Ndiswrapper только для драйверов под принтера? Под каждую модель принтера дебажить драйвера это мягко говоря сложновато. А что если сделать обертку и подключать уже имеющиеся win драйвера к дженерик юзерспейс драйверу.

Unixson
()
Ответ на: комментарий от Sh-

Не согласен.

Не знаю как у в других регионах, а к примеру в Оренбургской области сейчас идет массовый переход на отечественное программное обеспечение.

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

Вот теперь представь, сотни больниц и поликлиник получили компьютеры по целевой гос программе. Школы. Детские сады. Различные администрации. Другие государственные учреждения.

А принтеры там как раз старые. НР 1018/1020, Canon 2900 и прочее древнючее чудо.

Это поможет миллионам пользователей.

Так что это правда. Может не миллионам, но уж точно тысячам…

ivanlex ★★★★★
()
16 февраля 2022 г.
16 августа 2022 г.
13 февраля 2023 г.
23 апреля 2023 г.
Ответ на: комментарий от Yampp

Можно и не покупать. Я устанавливал Canon LBP3000 на Debian, Ubuntu, Fedora37, Fedora38, OpenSUSE,Oracle, Manjaro, Endevour, Solus (написал мануал тут на форуме).Пришлось знатно «потанцевать с бубном, надев ритуальный костюм», перелопатить массу форумов.Но всё завелось.(Еще несколько лет назад я в злобе отказался от линукс именно из-за принтера, но тогда руки не дошли заняться проблемой всерьез). Принтер стал печатать, когда я нашел несколько рациональных зерен, о которых забыли как Canon, так и многие авторы на форумах. Нужно убрать возможность автоматической установки принтера при подключении. Это будет только мешать. И в конце-выполнить перезагрузку демонов («reload») и обеспечить автозагрузку демона ccpd («reenable»).Плюс для некоторых линукс надо создавать файл ccpd.service заново и вносить его в систему. И для debian 64 разрядных-доустанавливать i386 библиотеки, без которых драйвер на 64 разр. просто импотент. В силу определенных обстоятельств, имея достаточно свободного времени, написал bash-скрипты, протестировал. Единственное,-manjaro.Она то хочет собирать пакеты, то не хочет.Там не только бубен и костюм применялись, но еще и красная свеча.Шутка, конечно.Но, тем не менее, алгоритм действий был разработан и проте тирован.Всё успешно. Принтер lbp2900 «недалеко ушел от lbp3000»,они почти близнецы, поэтому однозначно, за новым принтером идти точно не нужно. Если бы 15 лет назад кто то бы выложил рецептуру (а я,уверен-знали, но молчали), то многим было бы легче.

alex001223
()
1 ноября 2023 г.

Хотите прикол? Этот принтер до сих пор выпускается. Да-да, принтер 2005 года выпускается в 2023 году.

Оказывается, их выпускают для рынка Азии, а по параллельному импорту завозят в Россию откуда-то то ли из Вьетнама, то ли из Таиланда. Дата производства: 2022.

Это, вероятно, единственный современный принтер, картриджи которого не чипованы. Совместимые картриджи продаются за 500-600 рублей!

https://market.yandex.ru/product--printer-lazernyi-canon-laser-shot-lbp2900-ch-b-a4/1617112

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

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

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

Нормальная цена, более-менее приличные принтеры начального уровня примерно так и стоят. Аналогичные HP или Brother тоже ± 2 тысячи от этой цены. Только расходники у этой модели крайне дешевые, а механика и устройство — одно из лучших.

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

Если качество такое же как было у оригинальных LBP2900, то это очень даже нормальная цена. Аппарат реально рабочая лошадь, неубиваемый. Лучше любого современного одноклассника.

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

А у ТСа, я смотрю, последнее шевеление на гитхабе было год назад, пуллреквесты принимал (хотя на ЛОРе не появляется гораздо дольше). Так что можно надеяться, что драйвер даже соберётся с современными линуксами…

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
23 января 2024 г.

Давно не владею таким принтером, но случайно набрёл на альтернативную плату форматтера для LBP2900 у китайцев - RINGRI SQ-05:

https://www.aliexpress.com/item/1005004827744403.html

Судя по всему, она построена на основе STM32 (нашёл качественные фото только аналогичной платы для SQ-02 LJ1020) что с одной стороны значит, что кто-то зареверсил протоколы GDI принтеров, а с другой - что возможны модификации и альтернативные прошивки для этой платы.

Интересно, насколько хорошо эта плата притворяется оригиналом, и работает-ли с Subj драйвером

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

Китайцы могли отреверсить. Интересно попытаться отреверсить теперь уже китайскую прошивку, прошивки ARM реверсить в Ghidra довольно легко. Только времени отнимает много.

anonymous
()
5 марта 2024 г.
Ответ на: комментарий от jekader

А это интересно, ведь можно использовать управляющий компьютер с нормальными pcl/ps вместо огрызка, требующего постоянный поток данных. Зачем китайцы повторили говнопуть сапога.

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

CV1800B with realtime motor controller + 64 mb built-in ram.

https://xyzdims.com/3d-printers/misc-hardware-notes/iot-milk-v-duo-risc-v-esbc-running-linux/

Интересно, а хватит точности таймера линукса и сабжа для управления печатью?

PS: у него ещё и отдельное ядро есть для этого.

Но есть ещё проблема вот в этих: «Windows users». Наставят кучу негативных отзывов с криками, что принтер не определяется как сапог, а требует непонятных его душе generic postscript драйверов.

steemandlinux ★★★★★
()
Последнее исправление: steemandlinux (всего исправлений: 4)

Низкий поклон за вашу работу. У меня есть проблема со сканером, HP ScanJet 5400c, если не ошибаюсь, под офтопиком. Мне помогла установка виртуалбокс с Windows 2000 (можно XP). При таком раскладе эту виртуалку, наверное, можно установить как сервер сканера/принтера. Но мне сканирование нужно эпизодически, потому не заморачивался. Рассматривал купить Ethernet-USB принтсервер, что бы воткнуть в него старые сканеры, принтеры, которые ещё работоспособны и весьма порой неплохи. Но такого вроде нет в широкой продаже, а в том что нашёл - нужно докупать какой то проприетарный софт. Было бы хорошо получить такое решение в виде «коробочки», для любого старого железа, сканера, принтера. Тем более старые принтеры HP используют HPGL протокол.

Заодно спрошу, вот такой Сетевой контроллер MiniNP330 случаем не может работать как Ethernet-USB мост к любому абстрактному принтеру? Могут быть какие-то решения на распбери, старых роутерах?

baaba ★★★
()