Jump to content

    

Драйвер

ему надо опрашивать ацп со скоростью 100KS/s т.е. каждые 10 мкс

программно через таймеры или delayed work это не получится т.к. слишком часто

Опросы с нужной скоростью может обеспечить контроллер SPI. Если размер сэмпла, допустим, 16 бит, то установив скорость шины SPI 1600 кбит/с, автоматически получим скорость опроса 100 kS/s.

Насколько я понял, проблема в том, что не допускается появление джиттера. А это IMHO скорее железо-специфичная чем linux-специфичная проблема. vshemm об этом уже все сказал. Если требуется за 10 мкс "вручную" по прерыванию перезаряжать DMA, то напрашивается мысль о реализации своего SPI-контроллера со встроенной буферизацией на ПЛИС...

Share this post


Link to post
Share on other sites
Простейший способ "в лоб" - это char device, внутри которого 2 буфера, в один пишем, другой готов к чтению

из приложения через read(). При заполнении одного буфера DMA перезапускается на другой буфер. Либо "дмашить"

в кольцевой буфер.

так я и хотел делать! как работать с DMA на OMAP?! Ищу примеры, а пока курю даташит, но это путь через пустыню...

 

Опросы с нужной скоростью может обеспечить контроллер 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?

неужели то что мне надо...

Edited by Dubov

Share this post


Link to post
Share on other sites
А вот и нет. Без Linux в standalone всё делается просто и быстро. Из изерспейс просто нельзя так быстро дёргать SPI. Из юерспейс можно, например, неспешно опрашивать датчик температуры.

Тут дело не в юзерспейс, из ядра (kernel space) тоже нельзя так быстро дёргать программно. Просто в ядре можно настроить dma на приём.

 

 

Прошу посмотреть намётаным глазом статью: http://habrahabr.ru/post/123266/

там в разделе "4.Разработка протокольного SPI драйвера уровня ядра" упоминается DMA. Никак не могу понять. Они применяют какой-то DMA API?

неужели то что мне надо...

нет, там описана разравботка драйвера устройства, подключённого к spi слейвом

этот драйвер использует драйвер мастера через стандартный набор функций

 

я не думаю, что вы найдёте похожий пример т.к. то, что вам надо к линуксовой подсистеме spi отношения не имеет

посмотрите в вашем драйвере spi omap работу с регистрами и dma (если используется) - а дальше сами

Share this post


Link to post
Share on other sites
посмотрите в вашем драйвере spi omap работу с регистрами и dma (если используется)

гдеж эти примеры взять :crying:

яж толкьо с SAM9 работал

Edited by Dubov

Share this post


Link to post
Share on other sites

Господа! Вопрос на засыпку:

если 100кГц частота дискретизации АЦП для Linux - слишком быстро, то как понять такое:

http://wiki.analog.com/resources/tools-sof.../iio-adc/ad7998

как они собираются успевать данные забирать?

Share this post


Link to post
Share on other sites
гдеж эти примеры взять :crying:

а вы дайте ссылку на исходники драйвера вашего spi мастера, я думаю народ подскажет какие макросы там используются для чтения-записи регистров и где лежат определения регистров

 

Господа! Вопрос на засыпку:

если 100кГц частота дискретизации АЦП для Linux - слишком быстро, то как понять такое:

http://wiki.analog.com/resources/tools-sof.../iio-adc/ad7998

как они собираются успевать данные забирать?

я так понят тут вот чего - есть т.н. software triggers и hardware triggers

последние(timer counter или внешний источник) вызывают прерывания с нужной частотой и успеть можно

частота софтовых триггеров ограничена

Share this post


Link to post
Share on other sites
так я и хотел делать! как работать с DMA на OMAP?! Ищу примеры, а пока курю даташит, но это путь через пустыню...

Совершенно нормальный путь :)

 

А вот и нет. Без Linux в standalone всё делается просто и быстро. Из изерспейс просто нельзя так быстро дёргать SPI. Из юерспейс можно, например, неспешно опрашивать датчик температуры.

Дергать SPI не надо, нужно запускать DMA как уже сказал Idle.

 

Господа! Вопрос на засыпку:

если 100кГц частота дискретизации АЦП для Linux - слишком быстро, то как понять такое:

...

100КГц быстро не для линукса, а для железа, если данные читать процессором ("дергать SPI"). Если же есть нормальный DMA,

то тот же linux держит десятки и сотни МГц через iio или comedi.

 

Share this post


Link to post
Share on other sites
100КГц быстро не для линукса, а для железа, если данные читать процессором ("дергать SPI"). Если же есть нормальный DMA,

то тот же linux держит десятки и сотни МГц через iio или comedi.

как он может тянуть сотни мегагерц, если через IIO я запускал родной драйвер от AnalogDevices и при частоте 100кГц загрузка процессора была более 50%.

А ещё они зачем-то software trigger придумали (дураки чтоли?), который, например, при обновлении экрана файлового менеджера MC просто переставал генерить меандр. Ну и нафиг тако тригер нужен спрашивается?

Железный другое дело, но всё равно прерывания 100 000 раз в секунду - слишком много для Linux.

Для AT91 был вариант без прерываний (на двух таймерах) на DMA - другое дело.

 

Edited by Zelepuk

Share this post


Link to post
Share on other sites

Неужели сложно сделать grep dma -R ./drivers/spi/ ?

Посмотрите, как другие драйвера SPI используют стандартный API DMA и сделайте так же.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now