LINUX.ORG.RU

Помогите получить данные от PCI-устройства

 , , , ,


0

1

Здравствуйте, уважаемые дамы и господа.
Помогите, пожалуйста, с получением данных от PCI устройства.
Коротко: есть машина с архитектурой PowerPC c ОС ELDK Linux 2.6.14 на борту. В ней установлено устройство на шине PCI. Оно асинхронно выдает данные пачками по 32 бита на некоторый адрес в PCI. Требуется иметь возможность в пользовательской программе (с какими угодно правами) в произвольный момент времени считывать текущее (последнее по порядку и только его) значение этих 32-ух бит.

Подробно:

Машина - Motorola MVME5500.
Архитектура - PowerPC (ppc_74xx).
ОС: какая-то GNU/Linux. Называется ELDK, на чем основана не знаю, версия ядра - 2.6.14.
Устройство, которое выдает данные: Tundra Universe II. Это мост VME-PCI. Со стороны шины VME машина (MVME5500) подключена в крейт (корзину) с некоторым прочим оборудованием. Это оборудование шлет по VME данные от датчика к MVME5500.
Требуемая цепочка передачи данных:
Генератор сигналов -(VME)-> Universe II -(PCI)-> память, доступная программе.
Генератор сигналов настроен и работает исправно.
Мост Universe II Требует настройки. Самое сложное в настройке - получить (рассчитать) адрес начала буфера в PCI. Я не знаю, по каким соображениям этот адрес должен быть вычислен. Далее, после того, как Universe II выставляет данные на PCI, они должны чудесным образом попадать в такой же по размеру буфер в области памяти, доступной для чтения из пользовательской программы. Никаких прерываний, DMA и прочих хитростей не нужно.

В качестве попытки был предпринят отважный маневр копипасты с имеющегося в сети интерфейса взаимодействия с драйвером этого PCI-устройства. В частности, пробовал использовать функции kmalloc() для выделения буфера в реальной памяти, virt_to_bus() для получения адреса PCI, соответствующего смещению адреса буфера в реальной памяти. Ничего не вышло: заголовочный файл linux/slab.h работает только если #define __KERNEL__. Но при таком дефайне не собирается другой заголовочный файл stdder.h c руганью на синтаксис в части enum {false = 0, true =1};. Если закомментить этот кусок кода, то gcc вываливает тонны ошибок, среди которых неверный синтаксис, деление на ноль, «Я проиграл» и прочее.
Пробовал также действовать через __get_free_page(), результат примерно тот же.
Скажите, что мне делать, пожалуйста.


ИМХО, без знаний/справочника архитектуры машины и без справочника по либам будет проблематично.

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

Спасибо. Я эту книгу уже несколько дней курю. Подскажите, пожалуйста, хотя бы в виде тегов, где может быть проблема со сборкой приложения или как уйти от kmalloc() и __get_free_page()

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

Я эту книгу уже несколько дней курю

Тебе нужно взять готовый пример, скомпилировать его и загрузить в целевое ядро. До этого момента любой разговор бесполезен.

От kmalloc уходить не нужно, get_free_pages использовать не обязательно.

tailgunner ★★★★★ ()

Вангую, что у тебя искомый адрес в баре (bar* register в конфирурационом пространстве железки), например. Тогда man ioremap или как-то так.

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