На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила трёх "С"
Пожалуйста,
1. Соблюдайте правила Форума.
2. Слушайте советы Модераторов.
(например, http://forum.sources.ru/index.php?act=ST&f=7&t=80382 )
3. Сверяйтесь с учебником по Великому и Могучему
  
> USB, FlashDisk... , ... на примере F-Watch от GEMBURD
    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:
    ExpandedWrap disabled
       
      none    /proc/bus/usb   usbdevfs    defaults    0 0

    ВНИМАНИЕ! После перезагрузки система может заоорать, что ей, видете ли, некуда
    подмонтировать драйв, т.к. она не в курсе что это вообще такое (none).
    Не беспокойтесь -- все подмонтирует как миленькая, когда нам это понадобится.
    Так что на все вопли системы не всегда нужно обращать внимание.

    Проверяемся:
    ExpandedWrap disabled
       
      $ 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).
    Всегда можно проверить:
    ExpandedWrap disabled
      $ cat /proc/bus/usb/devices


    - drivers -- чего подгружено в данный момент.
    Всегда можно проверить:
    ExpandedWrap disabled
      $ cat /proc/nus/usb/drivers
    .

    Теперь, чтоб не париться каждый раз, пропишем в /etc/fstab:
    ExpandedWrap disabled
       
      /dev/sda1   /mnt/fwatch vfat    rw,uid=XXX,codepage=866,iocharset=koi8-r 0 0

    Да. Я знаю -- этой командой я отдал драйв пользователю с uid=ХХХ. И для
    меня это приемлемо, т.к. больше на моем боксе никто не работает. Как Вы
    сделаете -- БМП. Кроме того, я возжелал, чтоб у меня русские буковки были видны.
    Ну, люблю я комфорт... Угу... Скрытый виндузятник... Ж~D

    Теперь цепляем наш драйв к боксу, проверяем изменилось ли состояние системы
    (а оно должно измениться, если все правильно сделано) и переходим к прикладным
    развлечениям.

    1.3 "Клиентская часть".
    У Вас должно быть право на монтирование ФС (или делайте это из-под рута или
    создайте группу, включите своего пользователя в группу и разрешите группе
    монтирование/демонтирование ФС. Можете не создавать группу, а просто разрешите
    пользователю эти действия. Как Вам удобнее... ).

    Создайте каталог, в который будете монтировать свой драйв. В моем случае это,
    напоминаю, /mnt/fwatch.

    Итак.
    ExpandedWrap disabled
       
      $ 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 Вам понадобится инфа из
    ExpandedWrap disabled
       
      $ 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 выше крыши хватает.
      Цитата
      http://usb-linux.sourceforge.net

      http://linux-usb.sourceforge.net Помоему так правильно ;)
        А! Да! Верно! Прошу меня простить, господа, за-тор-мо-зи-л-с-с-с... :-)
        Спасибо, ygor!
          ну, много утилит можно заменить cat-ом.
          например - lspci, uname, ps, vi... :)
            Ага... А DEiL сразу будет шуметь что это -- "старый стиль", "архаика"... :-DDD
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0234 ]   [ 15 queries used ]   [ Generated: 16.04.24, 17:56 GMT ]