
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.239.152.207] |
![]() |
|
Сообщ.
#1
,
|
|
|
0. Вроде как введение.
Эта тема о самом USB и о подключаемых девайсах, реализующих функции дисковых накопителей. На примере "прикрутки" часов фирмы GEMBURD с 256 MB Flash-диском "на борту" (т.н. F-Watch) показано как "прикрутить" к Линукс-боксу произвольное устройство типа Flash-disk. Конечно то, о чем я пишу в данной теме -- не более чем частный случай, но, вполне вероятно, что он натолкнет Вас на какие-то новые идеи. Дело в том, что по большому счету, для множества устройств, имеющих функции хранения данных и подключаемых по интерфейсу USB, вполне реализуемы одни и те же подходы. Как правило, они все удовлетворяют единым спецификациям на USB-устройства хранения данных. От этой "печки" и стоит начинать плясать... Если в мире M$ необходимы драйвера (в XP и выше сразу есть драйвера для Mass Storage Devices), то в Linux все не так запущено. Все уже есть. Надо только сконфигурироваться правильно. :D Пара слов про то, что это у нас за чудо-часики (фото в "пристежке). Ну что -- часы как часы, только оснащены Flash-картой на 256 MB с интерфейсом USB 1.1. Согласно документации, скорость чтения порядка 900 KB/sec., записи -- 800 KB/sec. Т.е., где-то в районе 1 MB/sec. Не знаю -- может, оно и долго, но исходя из моего опыта, вполне достаточно и сопоставимо с аналогичными девайсами этого ряда устройств. Самое положительное качество этого девайса -- исполнение. У Вас никогда не случалось такой засады, что Вы забывали бы флешку в чужом компе? У меня бывало. И не раз. Вставил, записываем, пока пишется -- разговариваем, поговорили, отвлеклись, собрался, поехал... Сижу уже в поезде, жду когда поезд тронется... Опппаньки, чего-то не хватает... :( Ну ясно чего... :( Ну, как-то вот так... :D Иногда можно вернуться и забрать диск, иногда -- себе дороже, приходится забирать диск "в следующий раз", а инфа нужна сегодня. :( Короче, при любом раскладе приходится терять самое важное -- время. А теперь попробуйте часы забыть. На руке нет чего-то привычного. Вот по этой самой причине я и приобрел себе сей волшебный девайс. Теперь я не теряю время. :D 1. Как подсистема USB устроена и что нам нужно. Общее описание USB не рассматривается. Рассматривается только что и как надобно делать для прикрутки девайса. 1.1 Ядреная часть. Собственно, в последних ядрах все должно быть. В 2.4.20 есть точно. Проверял. До начала всех развлечений с USB-девайсами, определитесь что же у Вас за USB-host установлен в системе. Может быть два варианта -- либо это UCHI, либо это OCHI. Насколько я понимаю, есть две группы производителей, которые никак не могут договориться (Господи, вот уже в какой раз!) и делают железо на основании своих внутренних представлений о том, как это должно работать. Нас это не должно пугать. Linux поддерживает оба типа устройств. Итак, в конфигурации ядра, в USB support включаем для UCHI (мой случай) UCHI и UCHI Alternate Driver (JE). Далее. Там же. Включаем какой тип устройств будем поддерживать. В нашем случае это -- USB Mass Storage. И, т.к. не ясно какой же у нас драйв, то все типы дисков. Потом то, что не используется, можно будет снести, но места они кушают мало, так что... Дело Ваше. В итоге как минимум у Вас должны загрузиться модули usbcore.o, usb-uchi.o, uchi.o. Здесь важно два момента: - Вот в этой точке возможно "ветвление". Т.е. мы загрузили саму подсистему USB. Теперь мы можем загружать либо последующие модули, реализующие работу конкретного устройства (принтера, сканнера), либо остановиться и "пустить все на самотек", уповая на возможности автоконфигурирования ядра. Это в случае "стандартных" устройств. В случае "нестандартных" (см. п.2) -- руки (Ваши) и мозги (опять-таки Ваши) -- Ваша лучшая помощь. - Кстати, Вы можете сделать модули, а можете напрямую вкомпилировать код в ядро. Моя рекомендация (следовать ей или нет -- дело Ваше) на момент "отладки" работы с девайсами все-таки работать с модулями. Когда "отладитесь" -- решите что же Вам делать дальше. Далее. В конфигурации ядра Вам нужно будет указать использование Preliminary USB Device Filesystem. Не забыть указать поддержку эмуляции SCSI и SCSI-дисков. Без этой поддержки Flash-диски не работают, т.к. в нашем случае поддержка Mass-Storage Devices реализована через уровень SCSI. Очевидно, проблемы в организации доступа к Flash, но почему именно так сделано -- БМП. И без того проблем хватает, но уже своих. Не забудьте указать поддержку ядром ФС vfat и fat. Дело в том, что как бы флешка не хранила свои данные, доступ к ним идет на основе этих правил. С ядром все -- компилитесь, ставьтесь... Теперь Вам необходимо указать в /etc/fstab точку монтирования для usbdevfs. Что это за фс. Довольно интересная это ФС. Она является "динамической" ФС. Она может монтироваться в любой точке "базовой" ФС и, учитывая то, что "под" этой ФС работают разнородные устройства, она отражает их реальные ("физические") особенности в неком "усредненном" виде, который и позволяет нам работать с практически любым USB-девайсом некоторым "средним" образом (в частности читать/писать файлы). Единственное ,"но" -- запись в /etc/fstab относительно новой ФС должна идти после записи про саму /proc. Это объясняется тем, что файл обрабатывается построчно и usdevfs должна монтироваться в каталог /proc/bus/usb. Учтите, что если что-то прописано до "родительской" ФС, то это вызовет сообщение об ошибке. Аккуратнее здесь, pls. Итак, получаем запись в /etc/fstab: ![]() ![]() none /proc/bus/usb usbdevfs defaults 0 0 ВНИМАНИЕ! После перезагрузки система может заоорать, что ей, видете ли, некуда подмонтировать драйв, т.к. она не в курсе что это вообще такое (none). Не беспокойтесь -- все подмонтирует как миленькая, когда нам это понадобится. Так что на все вопли системы не всегда нужно обращать внимание. Проверяемся: ![]() ![]() $ ls -l /proc/bus/usb итого 0 dr-xr-xr-x 1 root root 0 date:time 001 -r--r--r-- 1 root root 0 date:time devices -r--r--r-- 1 root root 0 date:time drivers Ок. Работает. Чего получилось: - каталог 001. Это каталог "шины". Т.е. это описание того, что висит на данной шине. Но именно каталог 001 всегда присутствует. Дело в том, что этот каталог -- описание самого активного хоста USB на Вашем компе. По мере подключения устройств у Вас будет множится число каталогов (002, 003, ...). Если Вы будете подключать модули "врукопашную", то именно в этих каталогах и будут храниться эти модули. - devices -- девайсы на шине USB и их состояния на данный момент (см. п. 2.2). Всегда можно проверить: ![]() ![]() $ cat /proc/bus/usb/devices - drivers -- чего подгружено в данный момент. Всегда можно проверить: ![]() ![]() $ cat /proc/nus/usb/drivers Теперь, чтоб не париться каждый раз, пропишем в /etc/fstab: ![]() ![]() /dev/sda1 /mnt/fwatch vfat rw,uid=XXX,codepage=866,iocharset=koi8-r 0 0 Да. Я знаю -- этой командой я отдал драйв пользователю с uid=ХХХ. И для меня это приемлемо, т.к. больше на моем боксе никто не работает. Как Вы сделаете -- БМП. Кроме того, я возжелал, чтоб у меня русские буковки были видны. Ну, люблю я комфорт... Угу... Скрытый виндузятник... Ж~D Теперь цепляем наш драйв к боксу, проверяем изменилось ли состояние системы (а оно должно измениться, если все правильно сделано) и переходим к прикладным развлечениям. 1.3 "Клиентская часть". У Вас должно быть право на монтирование ФС (или делайте это из-под рута или создайте группу, включите своего пользователя в группу и разрешите группе монтирование/демонтирование ФС. Можете не создавать группу, а просто разрешите пользователю эти действия. Как Вам удобнее... ). Создайте каталог, в который будете монтировать свой драйв. В моем случае это, напоминаю, /mnt/fwatch. Итак. ![]() ![]() $ mount /dev/sda1 $ cd /mnt/fwatch $ ls -l $ cd ~/ ... читаем/пишем ... $ umount /mnt/fwatch Все. Точка. Работает. Самое радостное -- в Nautilus'е так же работает. 2. Как вообще читать кофигурацию USB и чего можно делать. Ну, в нашем случае мы довольно легко "отбились" -- сразу всё было ясно и понятно. Бывают случаи по-сложнее. Когда, вроде, порт USB есть, но вот комп "в упор не видит" прикрепленный девайс. Поставить себе Windows, что ли? :D Постараемся обойтись. Просто, придется несколько поглубже поковыряться в софте. Вы еще не привыкли? Ну, ничего. Не долго привыкать осталось. Скоро без этого Вы не сможете обходиться. 2.1 Вас ждет долгая дорога на http://usb-linux.sourceforge.net. Там есть великолепный документ, который (один из ряда документов) я использовал при написании сего текста. Качайте USB-guide.ps ("The Linux USB sub-system" by Brad Hards). Ежели чего-то не ясно -- загляните в сию великую книгу. Там есть многие ответы. Правда, ориентирован сей документ на ядро 2.4.0-test9. Но пугать это не должно, т.к. все основные моменты, описанные в этом документе работают четко. Более того, если Вы достаточно регулярно "развлекаетесь" с USB-сканнерами, принтерами, клавиатурами, мышами, etc, то это -- Ваша настольная Кама-Сутра. :D 2.2 Как читать конфигурацию. Если у Вас на шнурке болтается "неведома зверушка" и Вы вообще БМП чего с ней сделать, то для разборок с этой зверью :D Вам понадобится инфа из ![]() ![]() $ cat /proc/bus/usb/devices Подробные описания данной таблицы приведены в "USB-guide" и в /usr/src/linux-<ver>/Documentation/usb/proc_usb_info.txt <-- здесь наиболее полно (есть примеры как чего выводится), ниже просто идет сокращенное описалово, чтоб было ясно куда смотреть и чего искать. Я привел только самые (на мой взгляд) интересные параметры, которые можно найти в данных. Все, IMHO, достаточно простенько и со вкусом. Это, по сути дела, таблица. Т.е. в качестве "строк" используются записи ("столбцы" указаны после точки в описании строки): - T: топология устройства. Bus -- устройство на шине включено, Lev -- уровень девайса по отношению к рутовому хабу (00), Prnt -- уровень родительского устройства для рассматриваемого устройства, Port -- порт на родительском устройстве, куда включено данное устройство. Пара Prnt/Port должна быть уникальна в наборе данных, т.к. именно по этой паре идет адресация при доступе к девайсу. Cnt сколько девайсов на данном уровне. Dev# -- уникальный номер данного девайса. Spd -- скорость девайса в Mbps. MxCh -- максимальное число каналов (т.е. ск. устройств могут присоединяться к данному устройству. Если "00", то это -- хаб). Driver -- каким драйвером пользуемся для доступа. Т.е. здесь становится понятно видит или нет комп. наш девайс. - B: полоса пропускания устройства (просто число и в % от возможной). - D: описание девайса. Ver -- версия спецификации девайса. Cls -- класс девайса. Sub -- подкласс девайса. Prot -- протокол девайса. MxPS -- макс. размер пакета. #Cfgs -- возможное число конфигураций. Здесь становится ясно что это за железка такая неведомая. - P: как бы подзапись в описании девайса (D). Vendor -- ID производителя. ProdID -- Product ID. Rev -- revision. - S: информация о продукте и производителе. - C: информация о конфигурации. #Cfgs и * -- текущий конфиг (здесь см. MxPwr -- этот параметр показывает в миллиамперах макс. питание устроства. Аккуратнее, pls, т.к. макс. питание одного порта USB -- 500 mA и что будет в случае, если Вы перегрузите по току порт не знает ни кто, хотя, лично я и не пробовал, но гнетут меня смутные сомнения... ). #If -- число интерфейсов. Cfg# -- номер описанной конфигурации. Atr -- атрибуты девайса (0х80 -- питание от шины, 0х40 -- свое питание, 0х20 -- "пробуждающее" комп. устройство). Не менее интересная инфа, т.к. подчас, вместо того, чтобы с диким воплем и матюгами разбирать "пациента", можно просто посмотреть а что, собственно, с "пациентом" творится-то... - I: описание интерфейса. If# -- текущий интерфейс. Alt -- доп. установки. Etc. - E: расширение записей I. MxPS -- макс. размер пакета. Когда мы подключаем "неводому зверушку" к порту и смотрим как и чего "видится", то подобрать готовый софт для обмена данными с ней уже не составляет труда или написать свой софт... То же не велика проблема... :D Особенно, если становится понятно как именно данная железка должна обмениваться данными с боксом. Конечно, придется вооружаться "слесарным инструментом" и обтёсывать софт до нужной формы, но это уже... Ваше дело. :) Успехов! PS Все-таки не забывайте что Вы работаете с UNIX-системой. По окончании работы с девайсом его лучше явно отмонтировать, а уж только потом выдергивать шнурок. Не надо Linux пугать своей "гениальностью"... :D А! И ещё вспомнил... Есть такой утиль (зачем его сделали я так и не понял), который выводит список USB-девайсов -- lsusb, вроде даже инфу по девайсам показывает. Не знаю -- не пользуюсь. Мне как-то и утилиты cat выше крыши хватает. |
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
А! Да! Верно! Прошу меня простить, господа, за-тор-мо-зи-л-с-с-с... :-)
Спасибо, ygor! |
Сообщ.
#4
,
|
|
|
ну, много утилит можно заменить cat-ом.
например - lspci, uname, ps, vi... ![]() |
Сообщ.
#5
,
|
|
|
Ага... А DEiL сразу будет шуметь что это -- "старый стиль", "архаика"... :-DDD
|