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)

при печати pbm файла вылетает ошибка

При печати текстовой странички, преобразованной в pbm файл, где-то 3/4 страницы печать прерывается и выдает следующее сообщениие.....

rastertocapt: EOF / read error reading magic number

с чем это может быть связано?

Kixiro
()

А MF3110 из этой же оперы или нет? Если да, могу помочь посниффить (стоит подключенный к винде) - и попутно, ничего проприетарного к этой зверушке нет? У производителя опаньки...

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

Здесь заявляли, и прикрепили тему. Кроме того, я поиском нашел сообщения о драйвере на форумах и в чатах. Идея не удалась. Если найдется кодер именно с таким принтером, это будет случайность.

anonymous
()

Canon LBP-800

А в деле оживления LBP-800 (LPT) нет возможности помочь? а то скомпиленный из гуляющих по сети исходников драйвер работает, но печатать стабильно может токо одну страницу, при попытке печати более одной , виснет или глючить начинает.

V-ctor
()

Пытаюсь подсоединить принтер Canon i-SENSYS LBP5050 к роутеру Asus WL500W (прошивка 1.9.2.7-d-r2624). На сайте canon.ru появились драйверы i-SENSYS LBP5050 для Linux, в архиве по ссылке следующие папки:
32-bit_Driver\
64-bit_Driver\
Doc\
Src\

- я в этом чайник, но может это поможет?

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

Пытаюсь подсоединить принтер Canon i-SENSYS LBP5050 к роутеру Asus WL500W (прошивка 1.9.2.7-d-r2624). На сайте canon.ru появились драйверы i-SENSYS LBP5050 для Linux, в архиве по ссылке следующие папки:

32-bit_Driver\
64-bit_Driver\
Doc\
Src\
- я в этом чайник, но может это поможет?

В твоём случае - не поможет. В официальных драйверах есть уже скомпилированные бинарники под архитектуры x86 и amd64, но в твоём роутере скорее всего MIPS или ARM (менее вероятно).

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

> Чувак, пока ты напишешь полноценно работающий драйвер, сапоп уже 5 раз успеет сменить протокол, что собственно потихоньку и делает в новых принтерах.

Менять - дорого. Они за низкую стоимость принтера удавятся. Там менять нечего, слишком тупой протокол. С момента выхода LBP-810 поменялось только сжатие, потом ничего не менялось вообще.

Я полностью переписал код с нуля на C++. Теперь он использует libusb и напрямую работает с CUPS. Также удалось расшифровать кучу битов и байтов протокола - протокол оказался еще тупее, чем казалось сначала. Арбитраж страниц теперь полностью известен. Некоторые проблемы есть в арбитраже подаваемых на печать данных, иногда обрезается низ или печатается низ на месте верха, видимо где-то в принтере буфер переполняется.

Yampp
() автор топика
Ответ на: Canon LBP-800 от V-ctor

> А в деле оживления LBP-800 (LPT) нет возможности помочь?

В планах есть, но поскольку у меня нет такого принтера, сам я сделать почти ничего не могу. Новый драйвер на C++ легко переписать под любой притер.

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

> В официальных драйверах есть уже скомпилированные бинарники под архитектуры x86 и amd64, но в твоём роутере скорее всего MIPS или ARM (менее вероятно).

И это одна из причи, почему я стал писать свой. Другая - то, что у меня несколько принтеров, и фирменный драйвер Canon при установке портит нафиг все остальные принтеры. А после обновления системы еще и коркаться стал.

Yampp
() автор топика
15 августа 2011 г.

ПАРЕНЬ, спасибо тебе! У самого 3 года как Canon LBP-2900 - проприетарный драйвер кое-как поставил, но печать полное гавно и глюк на глюке! Как хорошо, что есть такие люди вроде тебя... Но все-равно, скоро сменю его на струйный цветной HP, т.к. хотел бы еще и печатать фотографии. Но ты все-равно молодец, модель принтера довольно распространенная!

ВОПРОС ВСЕМ: Правда, что HP делает хорошие и открытые драйверы под Linux для своих принтеров? И если да, то посоветуйте пожалуйста недорогой цветной принтер в пределах 3-5к для печати фото и доков.

Заранее спасибо!

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

Зашёл в тему, чтобы прочитать, есть ли прогресс. Сам владелец HP. Да, так и есть. Качество печати идеальное, при подключении принтера или сканера всё заработает сразу, в дистрибутиве любой давности.

ZenitharChampion ★★★★★
()

Развивается ли этот проект сейчас ?

Этот проект еще развивается? Последний комментарий в теме «Вышел драйвер для GDI-принтеров Canon» был 24.04.2011. В свое время сдуру купил Сапог i-sensys LBP 2900B. Под Windows он конечно печатает, но под Linux я с ним воюю уже не один год. Сначала установил со скрипом официальный драйвер, но потом когда перешел с Ubuntu на Sabayon, никак не мог установить (почему то отсутствовал dev\usblp), как выяснилось в новых версиях CUPS отказались от usblp, а разработчики драйвера не хотели принять во внимание этот факт. Ваша разработка дает мне надежду, что я таки смогу запустить свой Сапог под Linux. И хоть этот драйвер вроде бы не содействует популяризации Linux, но отсутствие оного может служить причиной отказа от Linux у того или иного пользователя. А таких принтеров, по моим наблюдениям, как грязи.

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

И еще вопрос. Можно ли установить этот драйвер в Sabayon (создан на основе Gentoo), и не нужно ли при этом содержимое, которое добавляется в usr/lib/cups добавлять в usr/libexec/cups? Я попытался установить драйвер, при этом преобразовал пакет cups-driver-capt_0.1.1_i386.deb в tar.gz формат, потом вручную размести все файлы пакета в соответствии с находящейся в них структорой каталогов ( http://code.google.com/p/highlights/wiki/vector ).Только файлы в каталоге lib копировал в libexec. Принтер устанавливается, при этом в списке драйверов есть LBP 2900 CAPT GDI, его и устанавливаю, но печатать не хочет. URL устройства capt://usb/Canon/LBP2900sn0000A383QFA6

anonymous
()
Ответ на: Развивается ли этот проект сейчас ? от anonymous

В Sabayon легко: скачал из SVN да поставил. Всё для сборки есть. Сам использовал Saabayonпостоянно в 2007 году. А убунту гнать.

P.S. Только что из бескрайних конференций в Jabber'е привёл вам одного пользователя.

ZenitharChampion ★★★★★
()
17 октября 2011 г.
Ответ на: комментарий от ZenitharChampion

re

Прошу извинить, конечно, но вики - почитал, свновские пакеты через Сульфур установил - а как дальше... из чего городить драйвер не врубаюсь. Где бы наставление почитать? Очень уж хочется этот сраный 2900 запустить.

ПЛЗ !

dima_best
()
19 ноября 2011 г.

cups

Занимаюсь разработкой ПО и ОС для терминалов (gentoo). Раньше так-же как ты писал дрова базируясь на /dev/usb/lp* и хардкодил их прям в прогу. Сейчас пишу дрова только под cups, что дает некую универсальность и экономит много времени. Подумай об этом. Мануалов о написании дров под cups в инете много.

dmitry_kozak
()
Ответ на: cups от dmitry_kozak

Так может если есть что улучшить, стоит разместить патч прямо сюда? Либо в SVN.

Оффтопик: а давайте все дружно скачаем драйвер автора темы, накрутим счётчик, и тогда ему захочется продолжать!

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

А в деле оживления LBP-800 (LPT) нет возможности помочь?

В планах есть, но поскольку у меня нет такого принтера, сам я сделать почти ничего не могу. Новый драйвер на C++ легко переписать под любой притер.

У меня есть такой, могу скомпилить и проверить, если скажешь где исходники твои взять. Svn/git репа есть в сети?

V-ctor
()
5 февраля 2012 г.
Ответ на: комментарий от HighwayStar

3010 использует другую версию протокола capt, но очень интересен тем, что имеет полное описание алгоритма сжатия и описание некоторых, не до конца здесь изученных, команд протокола, а так же подробный алгоритм печати в виде псевдокода

HighwayStar ★★★★★
()

Только что запустил чертов 3010 в Fedora 16 x86_x64. Все было просто до безумия (правда, не работало до недавнего обновления cups, и не работало с драйверами <2.40):

1) Установить RPM-ки с офсайта Canon. У меня все работает с 2.40.
2) sudo /usr/sbin/lpadmin -p LBP3010 -m CNCUPSLBP3050CAPTK.ppd -v ccp:/var/ccpd/fifo0 -E
3) sudo /usr/sbin/ccpdadmin -p LBP3010 -o /dev/usb/lp0
4) sudo /etc/init.d/ccpd start
Включаем принтер, запускаем captstatusui -P LBP3010 запускаем тестовую печать и если работает, добавляем ccpd в автозагрузку.

Кстати, принтер в Fedora реагирует намного оперативнее, чем в венде. Странно это.

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

Я купил HP именно основываясь на заявлениях о его отличной совместимости с Linux. МФУ Photosmart C4283. В принципе, когда нужно напечатать что-то формата A4 - так оно и есть. Однако я замучался с попыткой напечатать фотографию 10x15 без полей. Даже с использованием GutenPrint лучшее, что у меня получилось - осталось ОДНО поле с одной стороны. Причём результат не отличается хорошей повторяемостью. Справедливости ради надо сказать, что и в винде (специально притащил ноутбук с виндой) это у меня смогла только фирменная программа от HP. Так что проблемы есть везде.

По теме: автор проделал титаническую работу, жаль что руки у него опустились.

hobbit ★★★★★
()
22 июля 2012 г.

С официального сайта

http://www.canon.co.uk/Support/Consumer_Products/products/printers/Laser/i-SE...

Так-же заработал супер(с двухсторонней печатью) принтер, успел схватить в свое время почти задарма в Поиске LBP6200d за 4500р сейчас правда он дороже стал стоить.

брал: http://hghltd.yandex.net/yandbtm?text=tdpoisk.ru LBP6200d&url=http://www....

сейчас: http://market.yandex.ru/guru.xml?CMD=-RR=9,0,0,0-PF=1801946~EQ~sel~1870647-PF...

PaulAS
()