|
Драйвер, написать самому |
|
|
|
Nov 14 2012, 04:50
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(Idle @ Nov 13 2012, 21:14)  ему надо опрашивать ацп со скоростью 100KS/s т.е. каждые 10 мкс программно через таймеры или delayed work это не получится т.к. слишком часто Опросы с нужной скоростью может обеспечить контроллер SPI. Если размер сэмпла, допустим, 16 бит, то установив скорость шины SPI 1600 кбит/с, автоматически получим скорость опроса 100 kS/s. Насколько я понял, проблема в том, что не допускается появление джиттера. А это IMHO скорее железо-специфичная чем linux-специфичная проблема. vshemm об этом уже все сказал. Если требуется за 10 мкс "вручную" по прерыванию перезаряжать DMA, то напрашивается мысль о реализации своего SPI-контроллера со встроенной буферизацией на ПЛИС...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Nov 14 2012, 05:37
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Цитата(vshemm @ Nov 14 2012, 00:00)  Простейший способ "в лоб" - это char device, внутри которого 2 буфера, в один пишем, другой готов к чтению из приложения через read(). При заполнении одного буфера DMA перезапускается на другой буфер. Либо "дмашить" в кольцевой буфер. так я и хотел делать! как работать с DMA на OMAP?! Ищу примеры, а пока курю даташит, но это путь через пустыню... Цитата(alx2 @ Nov 14 2012, 08:50)  Опросы с нужной скоростью может обеспечить контроллер SPI. Если размер сэмпла, допустим, 16 бит, то установив скорость шины SPI 1600 кбит/с, автоматически получим скорость опроса 100 kS/s. Насколько я понял, проблема в том, что не допускается появление джиттера. А это IMHO скорее железо-специфичная чем linux-специфичная проблема. vshemm об этом уже все сказал. Если требуется за 10 мкс "вручную" по прерыванию перезаряжать DMA, то напрашивается мысль о реализации своего SPI-контроллера со встроенной буферизацией на ПЛИС... А вот и нет. Без Linux в standalone всё делается просто и быстро. Из изерспейс просто нельзя так быстро дёргать SPI. Из юерспейс можно, например, неспешно опрашивать датчик температуры. ГОСПОДА! Прошу посмотреть намётаным глазом статью: http://habrahabr.ru/post/123266/там в разделе "4.Разработка протокольного SPI драйвера уровня ядра" упоминается DMA. Никак не могу понять. Они применяют какой-то DMA API? неужели то что мне надо...
Сообщение отредактировал Dubov - Nov 14 2012, 05:49
|
|
|
|
|
Nov 14 2012, 06:31
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Dubov @ Nov 14 2012, 09:37)  А вот и нет. Без Linux в standalone всё делается просто и быстро. Из изерспейс просто нельзя так быстро дёргать SPI. Из юерспейс можно, например, неспешно опрашивать датчик температуры. Тут дело не в юзерспейс, из ядра (kernel space) тоже нельзя так быстро дёргать программно. Просто в ядре можно настроить dma на приём. Цитата(Dubov @ Nov 14 2012, 09:37)  Прошу посмотреть намётаным глазом статью: http://habrahabr.ru/post/123266/там в разделе "4.Разработка протокольного SPI драйвера уровня ядра" упоминается DMA. Никак не могу понять. Они применяют какой-то DMA API? неужели то что мне надо... нет, там описана разравботка драйвера устройства, подключённого к spi слейвом этот драйвер использует драйвер мастера через стандартный набор функций я не думаю, что вы найдёте похожий пример т.к. то, что вам надо к линуксовой подсистеме spi отношения не имеет посмотрите в вашем драйвере spi omap работу с регистрами и dma (если используется) - а дальше сами
|
|
|
|
|
Nov 14 2012, 06:53
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Цитата(Idle @ Nov 14 2012, 10:31)  посмотрите в вашем драйвере spi omap работу с регистрами и dma (если используется) гдеж эти примеры взять  яж толкьо с SAM9 работал
Сообщение отредактировал Dubov - Nov 14 2012, 06:53
|
|
|
|
|
Nov 14 2012, 11:01
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Господа! Вопрос на засыпку: если 100кГц частота дискретизации АЦП для Linux - слишком быстро, то как понять такое: http://wiki.analog.com/resources/tools-sof.../iio-adc/ad7998как они собираются успевать данные забирать?
|
|
|
|
|
Nov 14 2012, 12:42
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Dubov @ Nov 14 2012, 10:53)  гдеж эти примеры взять  а вы дайте ссылку на исходники драйвера вашего spi мастера, я думаю народ подскажет какие макросы там используются для чтения-записи регистров и где лежат определения регистров Цитата(Dubov @ Nov 14 2012, 15:01)  Господа! Вопрос на засыпку: если 100кГц частота дискретизации АЦП для Linux - слишком быстро, то как понять такое: http://wiki.analog.com/resources/tools-sof.../iio-adc/ad7998как они собираются успевать данные забирать? я так понят тут вот чего - есть т.н. software triggers и hardware triggers последние(timer counter или внешний источник) вызывают прерывания с нужной частотой и успеть можно частота софтовых триггеров ограничена
|
|
|
|
|
Nov 14 2012, 20:53
|
Частый гость
 
Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803

|
Цитата(Dubov @ Nov 14 2012, 09:37)  так я и хотел делать! как работать с DMA на OMAP?! Ищу примеры, а пока курю даташит, но это путь через пустыню... Совершенно нормальный путь  Цитата(Dubov @ Nov 14 2012, 09:37)  А вот и нет. Без Linux в standalone всё делается просто и быстро. Из изерспейс просто нельзя так быстро дёргать SPI. Из юерспейс можно, например, неспешно опрашивать датчик температуры. Дергать SPI не надо, нужно запускать DMA как уже сказал Idle. Цитата(Dubov @ Nov 14 2012, 15:01)  Господа! Вопрос на засыпку: если 100кГц частота дискретизации АЦП для Linux - слишком быстро, то как понять такое: ... 100КГц быстро не для линукса, а для железа, если данные читать процессором ("дергать SPI"). Если же есть нормальный DMA, то тот же linux держит десятки и сотни МГц через iio или comedi.
|
|
|
|
|
Nov 15 2012, 11:27
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(vshemm @ Nov 15 2012, 00:53)  100КГц быстро не для линукса, а для железа, если данные читать процессором ("дергать SPI"). Если же есть нормальный DMA, то тот же linux держит десятки и сотни МГц через iio или comedi. как он может тянуть сотни мегагерц, если через IIO я запускал родной драйвер от AnalogDevices и при частоте 100кГц загрузка процессора была более 50%. А ещё они зачем-то software trigger придумали (дураки чтоли?), который, например, при обновлении экрана файлового менеджера MC просто переставал генерить меандр. Ну и нафиг тако тригер нужен спрашивается? Железный другое дело, но всё равно прерывания 100 000 раз в секунду - слишком много для Linux. Для AT91 был вариант без прерываний (на двух таймерах) на DMA - другое дело.
Сообщение отредактировал Zelepuk - Nov 15 2012, 11:51
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|