LINUX.ORG.RU

Драйвер для USB АЦП-платы, разрывы в сигнале, битые данные?

 , ,


0

1

Написал драйвер для девайса. Чтение идет через read. Задача требует непрерывного сбора данных (сигнала) с АЦП. Для этого в цикле читаю в буфер данные и пишу их в файл. Просматривая данные в программе-визуализаторе вижу разрывы в сигнале (подаю постоянное напряжение), некоторые точки выпадают. Внутри драйвера чтение реализовано с помощью usb_fill_bulk_urb. На аппаратном уровне знаю только что на самой плате есть FIFO откуда собственно и идет вычитка данных. Получается что несколько байт в случайном месте буфера приходят битыми, потому неверно отображаются на графики в визуализаторе. В чем причина? Аппаратная или скорее всего программная?


По описанию судить невозможно. Однако следует напомнить, что bulk transfers не предназначены для передачи realtime-данных.

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

По описанию судить невозможно.

Ну а ты по-шамански поводи руками...

ttnl ★★★★★
()

некоторые точки выпадают

А по чему график-то строишь? Устройство метки данных передает или номера отсчетов?

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

В двух последовательно идущих байтах записано значение отсчета в МЗРах, соответственно собрав например 1Кб данных в файл получаю 512 точек, по которым и строю график. Проблема не в графиках - визуализация данных написана не мной и проверялась на других платах(правда под виндой, но не важно), с которыми работает корректно. FIFO реализовано програмно в прошивке платы - моя задача считать c endpoint'а данные.

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

Так изменяются значения или отсутствуют? Во втором случае как ты присваиваешь точкам, например время - на стороне ПК? Тогда просто возникают непредвиденные задержки: например твоя прога дожидается ресурса, работает подкачка и т.д. Бороться с этим можно только отправляя с отсчетами либо временной штамп липо порядковый номер. Ну ещё попробуй максимальный приоритет проге выставить.

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

из фраз:

некоторые точки выпадают

В двух последовательно идущих байтах записано значение

можно предположить два варианта:
1) отличие в этих «выпадающих» точках МЗР так в 256 (или более общий случай - один из двух байт изменился, второй от старого числа, точная ошибка зависит от кода прошивки), если правда - смотреть в прошивку платы в место укладки в FIFO очередного числа и место чтения очередного числа из АЦП.
2) выпадает последовательность точек - недостаточная скорость чтения из FIFO (этот вариант можно проверить записывая значение 3-мя байтами, в общем случае - числом байт остаток от деления на которое размера буфера FIFO даст число отличное от нуля).

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

Ну ты как маленький. Запускаешь плату под виндовсом: если все работает правильно - то проблема в линуксе, если появляются ошибки - проблема в карте. Можно ещё с разными картами протестировать если они есть под рукой.

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

xawe

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

Эхе-хе, какая уверенность в непогрешимости винды!

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

Да, бывает что расстояние между разрывами кратно количеству байт в собираемом буффере, если ты это имел ввиду под «выровнены», бывает что удается насобирать несколько раз буффер без искажения, потом идут разрывы. Особой закономерности в том как расположены выпадающие точки не удалось выявить.

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

Плата снабжена только двумя bulk-enpoint'ами.

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

Плата сделана на usb 1.1. но хинтом восмпользуюсь.

ЕМНИП, в USB 1.1 тоже есть изохронный режим.

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

Да, бывает что расстояние между разрывами кратно количеству байт в собираемом буффере, если ты это имел ввиду под «выровнены»,

Тогда похоже, что данные не успевают уходить в USB - может, из-за того, что передача в bulk mode.

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

А в чем проблема с bulk mode?

Проблема не «с bulk mode», а с ее использованием не по назначению. Твое устройство генерирует поток данных реального времени, а bulk mode не предназначен для передачи таких данных - он даже не пытается гарантировать ограниченную задержку или гарантированную полосу пропускания. Условно говоря, bulk mode предназначен для передачи больших объемов данных с устройств, которые могут и подождать обслуживания (блочные устройства). Твое устройство ждать не может, и для него скорее подходит isochronous transfer. Или даже interrupt.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Dimuk

У устройства только bulk - endpoint'ы

Плохо. Тут уже нужно лезть в детали (fullspeed или hispeed устройство, размеры пакетов и прочее, что я уже подзабыл). Но я могу быть неправ и ошибка не в переполнении FIFO - первым делом проверь это.

А переделать прошивку устройство никак?

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

Устройство full-speed, размер пакета 64 байта. Переделать прошивку - может сломаться под виндой, возникнет какая-нибудь проблема с драйвером WDF. Это крайне хотелось бы избежать, переделки прошивки. Может быть проблема в том что я при чтении вызываю функцию usb_fill_bulk_urb, указываю в buffer_length размер который хочу считать, например 4кб. Может следует внутри драйвера вычитывать по 64 байта, набирать их в какой-нибудь внутренний буффер а потом делать copy_to_user этого внутреннего буффера?

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

Может следует внутри драйвера вычитывать по 64 байта, набирать их в какой-нибудь внутренний буффер а потом делать copy_to_user этого внутреннего буффера?

Боюсь, тут я ничем не могу помочь. Сам я общался с с USB через libusb. Вы осознанно отказались от нее или просто по привычке написали ядерный драйвер?

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

Тогда можно попробовать libusb. Насчет buffer_length - думаю, что usbcore достаточно разумен, чтобы разбить трансфер на несколько, иначе вы бы получали ошибочные коды возврата.

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

Тогда попробую еще что нибудь пошаманить с модулем, а когда желание сделать перевесит желание сделать праивильно и тру - возьмусь за libusb, благо они недавно выкатили 1.0 версию. Очень кстати.

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

Как раз винда в не-консъюмерских девайсах плохой критерий для оценки работоспосоьности USB. Более-менее сложные железки приходится специально затачивать под баги. Проверь каким USB-монитором, или на худой конец wireshark.

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

Dimuk

Устройство full-speed, размер пакета 64 байта. Переделать прошивку - может сломаться под виндой, возникнет какая-нибудь проблема с драйвером WDF. Это крайне хотелось бы избежать, переделки прошивки.

Однако, это, вероятно, единственный вариант. Самый простой и быстрый способ — записывать в FIFO ровно столько данных, сколько можно отправить, например выровнять нулями (или последними значениями) по 64 байтам. Если выбрали для коммуникации full-speed USB, то потеря некоторого количества данных не должна сильно беспокоить.

P.S. Пожалейте себя и других людей, пишите сразу на libusb. Лично мне очень нравятся программы, которые не требуют установки драйверов и без проблем работают с ограниченными правами...

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

С переходом на libusb ситуация улучшилась, но разрывы в сигнале остались, хотя их стало значительно меньше. Пока не знаю с чем это связывать и что делать дальше.

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