среда, 20 февраля 2008 г.

Спецификация USB, заметки по сути.

USB - универсальная последовательная шина, позволяющая подключать до 127 устройств самого различного плана и имеющая пропускную способность до 480Мбит/сек (USB 2.0), бла-бла и бла-бла... Это все знают, это можно легко прочитать на той же вики и интересно это может быть лишь для общего развития. ИМХО куда интересней собрать какую-нить свою поделку взаимодействущую с ПК через эту шину.

Задача:

Организовать soft-usb на МК AVR серии ATmega.

Но перво-наперво надо понять как в принципе работает эта шина.

Пойдем путём настоящих джедаев и скачаем с www.usb.org полную версию спецификации 2.0...

Признаться, стиль в котором там всё составлено мне совершенно не понравился, уж слишком много воды, повторений и пр.. Можно было, конечно, написать тоже более лаконично и логично, но признаем что это просто адский труд и скажем спасибо разработчикам за то, что имеем. И так, постараюсь выделить самую суть, которую просто необходимо понимать для того чтобы работать с usb на самом низком уровне.

  1. Все транзакции определяются хостом: устройство должно принять данные по запросу хоста, устройство может передать данные только после того как хост спросит, нет ли данных на отправку и пр.
  2. Каждое устройство при подключении проходит стадию конфигурирования: получает от хоста уникальный адрес, передаёт информацию о типе, о производителе (об этом чуть позже).
  3. Хост идентифицирует каждое устройство по его адресу на шине, поле адреса занимает 7 байт, отсюда максимальное число устройств на шине - 127 (нулевой используется при конфигурации и не может быть назначен в качестве рабочего)
  4. Данные по шине передаются пакетами, каждый пакет начинается с поля синхронизации, затем идёт поле PID, определяющее тип пакета, дальнейший формат определяется типом пакета. Особо стоит обратить внимание на типы Token, DATA, Handshake. (В спецификации описание взаимодействия конечного устройства с ПК переплетается с описанием взаимодействия ПК с USB-хабом, функционал хаба мы не предусматриваем и не рассматриваем всё что его касается)
  5. Для контроля правильности передачи в каждом пакете предусмотрено поле CRC.
  6. Для кодирования данных в линии используется формат NRZI в котором постоянство логического уровня в линии соответствует единице, а изменение - нулю.
  7. Процесс передачи/получения данных выглядит следующим образом: хост посылает token с адресом устройства и указанием чего хочет - либо передать данные, либо принять их. В первом случае после token-а следует пакет с данными, после которого устройство должно ответить ASK в случае успеха или NAK в случае невозможности принять данные, ошибок CRC и пр. Во втором случае устройство само передаёт пакет данных и ожидает ASK от хоста, а с случае неудачи повторяет попытку.
  8. Процесс конфигурирования. ИМХО самая сложная стадия... Есть token-пакет типа SETUP. После него устройство должно ожидать пакета DATA0 в котором в поле данных особым образом сформирован запрос хоста (request), стандартные запросы описаны в секции Standart Device Request спецификации. Наше устройство должно уметь распознавать все типы запросов. Кроме прочего в запросе есть информация о том, куда должен быть направлен следующий пакет данных - в хост или в устройство.
  9. Более того, устройство должно уметь формировать ответ на запросы - должно сообщить хосту о своих свойствах через так называемые дескрипторы (Standart USB Descriptor). Полное их описание также довольно хорошо представлено в спецификации. Более того, именно этим разделам стоит уделить особое внимание. Отмечу лишь что через дескрипторы устройство сообщает свои Class, SubClass, Protocol, которые уже активно используются на уровне ОС и драйверов.

P.S. в дальнейшем тема обязательно будет продолжена, но уже с точки зрения железа и подготовки прошивки для МК.

понедельник, 18 февраля 2008 г.

Optical Spectrum Analyzer: сливаем данные

преамбула:

Приятно смотреть когда растёт материальная база научны лабораторий, появляются новые, современне приборы и пр, но как мы с ними работаем? Как правило для того чтобы хоть как-то проводить измерения зачастую можно даже не читать инструкции, и в единичных случаях это оправдано, ибо зачем читать толстую книжку, да ещё на английском, чтобы провести одно измерение... Другое дело, когда приходиться промерять некоторые зависимости, хотелось бы свести к минимуму рутинную и однообразную работу, тем более что приборы, о которых идёт речь, обладают множеством функций, скрытых от глаз обывателя.

удалённое управление:

Первый этап, сохранение графиков, с анализатора спектра на флеш. Прибор может быть подключён к компу посредством Ethernet, rs-232, GP-IB, остановимся на первом варианте (последний - пока экзотика, а ком-порта у меня на ноуте нет). К анализатору предлагается хороший мануал с описанием команд, которые можно посылать прибору через любой из этих интерфейсов. Таким образом задача сводиться к отправке команд в прибор,и в некоторых случаях, к анализу ответа. В качестве инструмента я остановился на python-е, погуглил как с его помощью работать с сетью, постаивл доки по стандартным функциям языка.

постановка задачи:

Чего хотелось бы прямо сразу:

  1. Скрипт, который по заданному шаблону формировал имена для файлов с крафикой и с данными. (для каждого типа - свой фиксированный префикс файла, основная часть имени задаётся пользователем)
  2. Сохранение графики и указанных спектров (в csv) на флеш (напрямую по сети можно получить лишь сырые csv, но с другой стороны есть простые команды для сохранения всего на флеш, т.е. нет необходимости заморачиваться ещё и обработкой, так что выбираем второй вариант)
  3. Файловые операции: переход в рабочую директорию или её создание, если таковой не существует, создание директории формата ггммдд для сохранения всех файлов.

решение:

На скорую руку в течении дня дня написал скрипт, который более-менее справляется с поставленной задачей. Написан он сейчас крайне не оптимально, контроль ошибок - минимальный, нет контроля от перезаписи файлов. Выложил файлик OSA_storage.py, вскоре причешу его и положу обновлённый вариант. Вскоре буду организовывать запись и сохранение нескольких участков спектра. Буду рад замечаниям и предложениям.

понедельник, 11 февраля 2008 г.

Синхронизуемся!

преамбула:

констатируем факт, что зачастую можно прекрасно выполнять свою работу не находясь на своём рабочем месте. В данном контексте речь идёт о обработке данных, программировании, написании статей и пр. Если "менять место работы" приходиться лишь периодически, то проблема синхронизации рабочих файлов неактуальна - пару файлов можно и вручную скопировать на что угодно и перенести на основное рабочее место. Однако если работа на дому является обычной практикой, а кроме домашней и рабочей машины есть ещё и бук, то проблема синхронизации предстаёт во всей красе.

что имеем:

Домашний комп, ОС Linux; Ноут, ОС Linux; Рабочий комп, ОС Windows.

что хотим:

Двухсторонняя синхронизация рабочих файлов через флешку с рабочим компом и напрямую (или через ssh) с буком.

что делаем:

Идём на гугл с запросом "linux синхронизация файлов" и буквально первой строкой находим на opennet список программ для самвх различных нужд. Из описаний находим, что то что надо, называется unison.

Если коротко, программа использует алгоритм rsync но кроме того сохраняет сведения о дате последней синхронизации благодаря чему правильно обрабатывает изменения и удаления файлов в обоих направлениях, проста в настройке, является кроссплатформенной и свободной. Синхронизация осуществляется по профилям - файлы с расширением *.prf которые лежат в ./unison, настройку которых рассмотрим чуть позже.

установка:

altlinux

# apt-cache search unison

# apt-get install unison-beta

В windows для начала необходимо скачать и установить gtk2 for win32 после чего скачать винарник unison с домашней страницы проекта. Не имея желания разбираться с путями, я скинул бинарник прямо в папку bin, что находиться в дирктории с установленним gtk и вынес ярлык на стол.

настройка:

# unison --help даёт список доступных параметров, из которого сходу трудно выделить значимое. С домашней странички проекта http://www.cis.upenn.edu/~bcpierce/unison/docs.html идём по ссылке "User manual" читаем по выбору что интересно, но главное - останавливаемся на "Sample Profiles". В секции "Sample Profiles" находим несколько примеров профилей. За основу берём "A Basic Profile", поскольку бекап пока не интересен, удаляем все связанные с ним строчки. Указываем корневые директории для синхронизации (локальную, и удалённую)

# Roots of the synchronization

root = /home/bcpierce/Documents

root = /media/disk/Documents

Указываем пути, которые необходимо синхронизовать.

# Paths to synchronize

path = current

path = common

path = .netscape/bookmarks.html

Без этих параметров под синхронизацию попадаут все "Documents", более того, при первом запуске программы через GUI можно указать директории root1 и root2 но нельзя указать переменные path (может я конечно недостаточно внимательно всё осмотрел), именно по этой причине и рассматриваю настройку через прямую правку профилей. Ещё одна особенность - в windows при графической настройке пути root не должны содержать русских символов, т.к. программа почему-то не может зайти в них. Однако все вложенные директории обрабатываются вполне корректно.

Отметим что unison кроме содержания файлов также обращает внимание и на их права. В случае с флешкой от этой роскоши мы отказываемся, а чтобы программа не обращала внимания на различие прав добавляем в профиль строчку:

perms = 0o1600

Теперь сохраняем файл в ~./unison/flash.prf после чего запускаем:

# unison flash

При первой синхронизации программа выдаст предупреждение, что нет инфомации о прошлых сессиях, но при следующх запусках этого уже быть не должно. Аналогично настраивается синхронизация с буком, для чего можно сделать профиль, например, notebook. Параметр perms в этом случае уже лишний, если конечно устраивает его значение по-умолчанию 0o1777.

Успешной синхронизации!

День Рождения блога

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