LINUX.ORG.RU

[Реквест подсказки]Самостоятельное написание драйвера под linux


0

2

Здравствуйте! Некое время назад попал ко мне замечательный модем Г-Link DU-562M, который на офсайте имеет драйвер под виндовс, который на офсайте производителя чипа (conexant) имеет ссылку на сайт с платным закрытым драйвером под линукс (или со «свободными» 28,8 Кб/сек). И хоть lsusb его показывает, как устройство он работать не хочет.

В связи с этим хочу научиться писать драйверы для usb устройств(хотя с адсл этот модем не нужен), чтобы лучше узнать принципы работы компьютера. Прошу знающих людей дать гайд по изучению написания драйверов, то есть пошаговую инструкцию с человеческим подходом. Например:

>1. Прочитать url(). Там описание типов потоков данных в usb и как что робит

2. Вызубрить учебник book() - там нет лишней информации, которая будет занимать некоторое время твоего обучения..

3. Вот учебник по assembler'у - ass(), там в пятой главе как раз обращения к устройствам и выделение памяти.

4. Если что в личку написал свой мыл, можешь задавать вопросы, потому что мне тоже интересно развитие всего что с СПО связано(или иные мотивы, либо без них :)).


Из знаний: php на уровне «могу сайт сбацать». mYsql - «могу в phpMA войти и таблицу создать». bash - «могу скрипт создать, сам все проверит, обновит, логи покажет и удалит хоум, если нужно». В профессиональном программировании - «0.1».

★★★★★

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

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

alexru ★★★★
()

Си не знаете? Тогда стоит прочитать Брайан Керниган, Деннис Ритчи «Язык программирования C». В любом случае не повредит.

И ищите спеки на модем. Если их нет, то придется слушать юсб-трафик и реверс-инженерить. Возможно, что это будет сложновато.

ntp
()

При современных ценах на железо, нет профита в написании драйверов для Г-поделий производителей, не дающих спеки на свои Г-поделки.

Хочешь скилл прокачать, напиши что-то полезное, а Г-поделку отдай врагам.

sdio ★★★★★
()

> Вот учебник по assembler'у - ass(), там в пятой главе как раз отлов констант вроде 28800 и вызовов sleep, как все это править или заменять на nop.

fixed

Самому бы такую книжку

simple_best_world_web_master
()

Два месяца назад начал писать драйвер для USB сканера Canon LiDE 70 (далее csl70). До этого имел нормальный опыт программирования только на Делфях под окнами (собственно писать начал, как только на линукс и перешёл). Дрова пришлось писать на основе логов УСБ сниффера. Сейчас дописываю фрон-энд.

Как у меня всё шло:
1. Разобраться как робит УСБ.
2. Несколько разных логов сниффером захватываешь. Пишешь прогу которая преобразует логи в читаемый вид.
Можно пробовать данные из лога передавать на устройство (для сканера - просто, для модема - х3, т.к. ответная реакция может быть иная, в зависимости от ответа какого-нибудь провайдера)
Ищешь закономерности в логе. Данные которые идут через УСБ могут представлять собой команды, данные, либо и то и другое одновременно в одном пакете. Например для csl70 данные передаваемые через УСБ в BULK пакете «01 46 01 00» означают читать(01) значение регистра 46. «00 46 01 00 22» - записать(00) в 46-ой регистр значение 22. Т.е. сначала надо разобраться со смыслом передаваемых пакетов.
Далее написал «детранслятор», который преобразует логи в вид наподобие
..
getreg(46)
setreg(46,22)
..
По сути создаешь свой мини-скриптовый язык.
3. Далее ищешь крупные закономерности. Например серия записей в регистры определяет ширину сканируемой картинки, или адрес в ОЗУ сканера для чтения\записси данных.
Улучшаешь детранслятор, чтоб он определял эти крупные функции.
И так до тех пор, пока всё не будет удобночитаемо.
Можно уже экспериментировать со значениями передаваемых данных, и последовательностью передаваемых команд.

4. Когда всё ясно, и больше узнавать НЕ`ЧЕГО, то можно скрипты перетаскивать на с \ с++ или др. язык.

PS. Использовать лучше libusb1, чтоб с ядром не заморачиваться. Видмо придётся ещё разбираться с созданием всяких интерфесов\устройств - tun и т.п. - в этом не разбираюсь, подсказать не могу. Если доки на модем найдутся - то отлично.

rip86oz
()

Спасибо! Не ожидал что столько полезной информации без троллинга здесь можно найти.. Гугл однообразные ответы без субъективной практики дает, в нем подобного искать - замучаешься. Еще раз спасибо! Теперь есть стимул.

А насчет Г-поделок: устройство есть, почему оно должно место в кладовке занимать? Менять железо из-за особенностей ПО - виндовс вей с их запросами на ОЗУ и место под солнцем на жестком, не так ли?

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

> почему оно должно место в кладовке занимать?

Избавляйся от плюшкинизма, подарить врагу - самое оно

simple_best_world_web_master
()

Не сказал бы, что для USB сложно писать, в январе пытались написать для принтера Canon LBP3000 написать, собственно, потом тут кто-то ещё пытался, дальше продвинулся, но так или иначе мы споткнулись на формате сжатия картинки.

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

Я хочу написать драйвер для своего принтера canon IP1700. Где мне искать документацию к нему?

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

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

Сниффер использовал вот этот http://benoit.papillault.free.fr/usbsnoop/

Могу ещё прогу кинуть которая парсит лог от этого сниффера - выдает массив (точнее std vector с++) bulk-пакетов, на основе которых можно получить удобночитаемую инфу а так-же «запускать» этот массив,.. правда надо её немного подпилить, а то она заточена под сканер. Можно будет добавить функцию автоматического пойска закономерностей для любого устройства, но это займёт некоторое время. Если надо, то киньте, лог, т.к. возможно модем использует interrupt пакеты, а мне с ними сталкиваться не приходилось - надо будет допиливать. Сделаю библиотеку, т.к. удобней, если надо.

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

под Linux есть ?

Под линукс wireshark есть, хотя я обхожусь и cat /sys/kernel/debug/usb/usbmon/2t

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

Сниффер виндовский, т.к.устройство работает под виндой, а лог парсится и т.п. в линуксовой проге.

Насчёт УСБ снифферов для линукса - не знаю, не интересовался.

rip86oz
()

Сниффинг USB под линуксом

Можно запускать оффтопик в виртуалке (умеющей пробрасывать USB, разумеется) и снифать USB-трафик Wireshark'ом.

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

Как доберусь до состояния «почти разобрался» и почитаю про него все, обязательно отпишу вам :) Модем маааленький, чип крохотный, вроде много и писать то не надо(надеюсь). Conexant грубо давлеют над линуксом (linuxant.com), требуя от его пользователей плату в размере 20$, хотя для другой ОС драйвер бесплатен.

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

>> Я хочу написать драйвер для своего принтера canon IP1700. Где мне искать документацию к нему?

Для начала пошукай драйвер в GutenPrint, если у него качество - говно, то тогда тебе сюда: www.turboprint.info

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

Copyright (c) 2003-2004 Linuxant inc.

Copyright (c) 2001-2004 Conexant Systems, Inc.

1. Permitted use.

Вы зашли на linuxant, скачали драйвер, про который я в треде писал, что он с ограничением и копирайтом от линуксант, и дарите мне. Спасибо

minakov ★★★★★
() автор топика

дооолго ты будешь писать этот драйвер..

лучше скачай бесплатный и похакай. или попроси кого-нибудь похакать
ограничение скорости там скорей всего искусственное.

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

>ограничение скорости там скорей всего искусственное.
Искусственное... возможно, что в драйвере просто нет поддержки высокоскоростных протоколов. Если так, то всё равно надо будет самому копать.

ЗЫ 2 minakov - ещё один ньюанс вспомнил - надо обращать внимание, в некоторых случаях, на временных интервалы между передачами пакетов. У меня было так, что если в «одном месте» не выдержать секундную паузу или в других по 10 мсек, то устройство работать не будет.

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

> Можно будет добавить функцию автоматического пойска закономерностей для любого устройства

можно попробовать применить вот это: http://delta.tigris.org danielwilkerson.com/delta_codecon.ppt

средство по методологии Delta Debugging для поиска failure-inducing changes (или для минимизации «интересного» текста. Например, есть программа, которая не компилируется, пишется тест-драйвер на bash, запускается тулза, на выходе — минимальный набор строк, из-за которых программа не компилируется. Или: поискать ей в логе конкретный пакет под конкретную функцию)

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

> Можно пробовать данные из лога передавать на устройство (для сканера - просто, для модема - х3, т.к. ответная реакция может быть иная, в зависимости от ответа какого-нибудь провайдера)

А разве у модемов не стандартные AT-команды http://articles.org.ru/cfaq/index.php?qid=1101 ? Расширения вот разные могут быть, может команды какие-то нестандартные (вроде модем/GPRS/SMS)

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

х3. Там приведён пример, что с помощью этих команд можно например изменить значение регистров. Но в разных модемах регистры могут иметь разное предназначение. С другой стороны если машинное представление этих команд унифицировано для всех модемов, или его можно узнать, то это облегчит процесс разработки - т.е. этап №2 можно будет перепрыгнуть.

rip86oz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.