|
Драйвер, написать самому |
|
|
|
 |
Ответов
|
Nov 12 2012, 11:20
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Dubov @ Nov 12 2012, 14:21)  Просто ранее я писал только standalone приложения и смущает отсутствие в Linux процедур прямого обращения к регистрам (здесь всё через обёртки какие то мудрёные). Это не так, именно через прямое обращение к регистрам SoC в адресном пространстве и происходит взаимодействие с железом. Цитата(Dubov @ Nov 12 2012, 14:21)  В линукс смущает то что нету так привычных мне *.h файлов где через дефайны описаны адреса всех регистров (по мануалу). Они как правило есть, но не всегда на _все_ регистры. Для написания драйвера _устройства_ подключённого через spi слейвом, обращаться напрямую к железу не надо - это делает драйвер spi контроллера (мастера).
|
|
|
|
|
Nov 12 2012, 12:46
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Цитата(Idle @ Nov 12 2012, 15:20)  Это не так, именно через прямое обращение к регистрам SoC в адресном пространстве и происходит взаимодействие с железом.
Они как правило есть, но не всегда на _все_ регистры.
Для написания драйвера _устройства_ подключённого через spi слейвом, обращаться напрямую к железу не надо - это делает драйвер spi контроллера (мастера). так вот этот драйвер мастера, насколько я могу понять, не может складывать данные в буфер произвольной длины, а только работает через read() или write(). Таким образом считать данные из ацп в пространстве пользователя нельзя, точнее можно, но данные будут не нерпрерывные, а спотреями, ввиду латентности операционки. Выход: написать драйвер "с нуля" на уровне ядра. как? пока сложно себе представляю... увидеть бы пример работы с SPI через DMA в драйвере. Цитата(xor.kruger @ Nov 12 2012, 15:54)  Сначала ознакомьтесь с принципами функционирования подсистемы SPI в ОС GNU/Linux. Инфа есть в каталоге Documentation/spi исходников ядра или например в книге Essential Linux Device Drivers. Также для примера можете подсмотреть как соведуют делать для семейства чипов AT91SAM9X link подсистема iio - мутная вещь. По моему намного проще обращаться к регистрам как в standalone приложении. Как раз для SAM9260 писал именно "напрямую" через SPI DMA, взяв пример кода из проекта плейера (тоже без ос). Получилось просто и быстро: standalone процедура превратилась в драйвер уровня ядра. Тем более, в книге Linux Device drivers написано что на уровне ядра к регистрам можно обращаться напрямую. IIO выдумали якобы для унифицирования, но мне показалось там слишком всё усложнено.Тем более из общения с разработчиками драйверов из AD я так и не смог выяснить зачем они написали софтовое тактирование АЦП из юзерспейс. Это же идиотизм: тактировать промышленный АЦП клоком с непредсказуемым джиттером. Отвлёкся от темы.
|
|
|
|
|
Nov 12 2012, 13:24
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Dubov @ Nov 12 2012, 16:46)  так вот этот драйвер мастера, насколько я могу понять, не может складывать данные в буфер произвольной длины, а только работает через read() или write() а как должно происходить чтение? вот есть, например, spi_w8r16 два байта читает - почему она не подходит?
Сообщение отредактировал Idle - Nov 12 2012, 13:25
|
|
|
|
|
Nov 12 2012, 13:39
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Цитата(Idle @ Nov 12 2012, 17:24)  а как должно происходить чтение? вот есть, например, spi_w8r16 два байта читает - почему она не подходит? Вообще планировалось сделать так: завести на уровне ядра большущий буфер(около 1 МБ), а чтение происходит в самом драйвере, пусть по 2 байта, но складываться всё должно тоже в буфер на уровне ядра (в тот самый большой буфер). В приложении же отобразить буфер в юзерспейс и читать указатель, который возвращает драйвер. Иными словами: User mode SPI device driver support - не подходит. P.S. Возможно я чего-то не понимаю. Все реализации что я до этого видел предлагают править файл борды и активировать User mode SPI device driver support. Но это не подходит. Цитата(Idle @ Nov 12 2012, 17:24)  а как должно происходить чтение? вот есть, например, spi_w8r16 два байта читает - почему она не подходит? и это как я понял, не DMA чтение
|
|
|
|
|
Nov 12 2012, 14:04
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Dubov @ Nov 12 2012, 17:39)  Вообще планировалось сделать так: завести на уровне ядра большущий буфер(около 1 МБ), а чтение происходит в самом драйвере, пусть по 2 байта, но складываться всё должно тоже в буфер на уровне ядра (в тот самый большой буфер). тогда можно выделить в драйвере буфер, периодически дёргать (через таймер, например) чтение по spi, складывать полученные данные в буфер создать в драйвере chardev и отдавать буфер при чтении из созданного файла как такой вариант?
|
|
|
|
|
Nov 12 2012, 15:25
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Dubov @ Nov 12 2012, 18:56)  Насколько я понял мне все пытаются объяснить что линукс предоставляет независимость от платформы даже в таких задачах (чтиение зSPI по DMA в модуле ядра). нет, пишу как я бы это делал Цитата(Dubov @ Nov 12 2012, 18:56)  А мне нужно потоковое накопление в буфере и периодическая отдача в юзерспейс. ну вот и накапливайте в буфере периодически читая при помощи дравера мастера, а в чём разница при чтении из полностю своего кода и при использовании драйвера? updя понял - вы хотите зарядить dma на чтение по spi  тогда линуксовая подсистема spi тут не нужна совсем, смотрите на реализацию мастера для своего SoC и пишите что нужно работа с регистрами происходит так же как и на bare metal - они в памяти работа с dma - через линуксовый api, с ним мне работать не приходилось
Сообщение отредактировал Idle - Nov 12 2012, 15:26
|
|
|
|
Сообщений в этой теме
Dubov Драйвер Nov 12 2012, 10:21       Dubov Цитата(Idle @ Nov 12 2012, 19:25) ну вот ... Nov 12 2012, 19:17        alx2 Цитата(Dubov @ Nov 13 2012, 00:17) Я дума... Nov 13 2012, 12:03         Dubov Цитата(alx2 @ Nov 13 2012, 16:03) Вам Idl... Nov 13 2012, 12:08         Idle Цитата(alx2 @ Nov 13 2012, 16:03) Вам Idl... Nov 13 2012, 16:14          Dubov Цитата(Idle @ Nov 13 2012, 20:14) ему над... Nov 13 2012, 17:59          alx2 Цитата(Idle @ Nov 13 2012, 21:14) ему над... Nov 14 2012, 04:50 xor.kruger Сначала ознакомьтесь с принципами функционирования... Nov 12 2012, 11:54 vshemm Простейший способ "в лоб" - это char dev... Nov 13 2012, 20:00 Dubov Цитата(vshemm @ Nov 14 2012, 00:00) Прост... Nov 14 2012, 05:37  Idle Цитата(Dubov @ Nov 14 2012, 09:37) А вот ... Nov 14 2012, 06:31   Dubov Цитата(Idle @ Nov 14 2012, 10:31) посмотр... Nov 14 2012, 06:53    Idle Цитата(Dubov @ Nov 14 2012, 10:53) гдеж э... Nov 14 2012, 12:42 Dubov Господа! Вопрос на засыпку:
если 100кГц частот... Nov 14 2012, 11:01 vshemm Цитата(Dubov @ Nov 14 2012, 09:37) так я ... Nov 14 2012, 20:53  Zelepuk Цитата(vshemm @ Nov 15 2012, 00:53) 100КГ... Nov 15 2012, 11:27 Dron_Gus Неужели сложно сделать grep dma -R ./drivers/spi/ ... Nov 16 2012, 13:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|