Здравствуйте, уважаемые дамы и господа.
Помогите, пожалуйста, с получением данных от 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(), результат примерно тот же.
Скажите, что мне делать, пожалуйста.