Здравствуйте!
Разрабатываю PCI устройство на базе ПЛИС. Оно имеет один BAR для настройки и обмена данными. Со стороны ОС в ПЛИС можно писать и читать. ПЛИС не поддерживает работу в режиме мастера PCI, и DMA контроллер в ней не реализован.
Работоспособность устройства подтверждена на ОС QNX. Сейчас стоит задача написать драйвер WDF под Windows 7 x32.
Использую пример PLX9x5x от Microsoft.
Изменил пример следующим образом.
В инициализации памяти:
desc = WdfCmResourceListGetDescriptor(ResourcesTranslated, i); // desc->Type == CmResourceTypeMemory
regsBasePA = desc->u.Memory.Start;
regsLength = desc->u.Memory.Length;
foundRegs = TRUE;
bar = "BAR0";
DevExt->RegsBase = (PUCHAR)LocalMmMapIoSpace(regsBasePA,
regsLength);
DevExt->RegsLength = regsLength;
DevExt->Regs = (PPCI9656_REGS)DevExt->RegsBase;
Получаю подтверждение о трансляции регистровой памяти.
Создаю очереди обработки запросов на чтение и запись запросов DMA. При этом убрал запуск выполнения DMA (поскольку у меня его нет), а так же ряд других функций, которые приводили к падению.
Сейчас драйвер устанавливается на устройство. При запуске пользовательского приложения ( находится в том же примере) устройство находится, можно инициализировать транзакцию чтения, которая выглядит так:
VOID
PLxEvtIoRead(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length
)
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
PDEVICE_EXTENSION devExt;
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_READ,
"--> PLxEvtIoRead: Request %p", Request);
//
// Get the DevExt from the Queue handle
//
devExt = PLxGetDeviceContext(WdfIoQueueGetDevice(Queue));
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_READ,"--> My Write:");
// Мои вызовы функций записи в устройство.
WRITE_REGISTER_UCHAR((PUCHAR)&devExt->Regs + 0xa000,8);
WRITE_REGISTER_ULONG((PULONG)&devExt->Regs+0xa000, 1);
WRITE_REGISTER_ULONG((PULONG)&devExt->RegsBase, 2);
WRITE_REGISTER_ULONG((PULONG)&devExt->RegsBase+0xA001, 3);
WRITE_PORT_ULONG((PULONG)&devExt->RegsBase, 4);
status = STATUS_SUCCESS;
WdfRequestComplete(Request, status);
return;
Эта функция выполняется, но мои запросы на запись через функции WRITE_REGISTER_ULONG не приводят к транзакции записи на PCI шине (это отслеживаю через отладчик для ПЛИС).
Мой вопрос: как произвести чтение, запись в регистровую память устройства?
В QNX для этого достаточно знать указатель на начало транслированного буфера. Может для Windows нужно сделать что-то ещё?
Имею очень слабые представления о драйверах, читаю MSDN и Орвика.