Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение\запись в PCI устрйоство на Windows 7  (Прочитано 1230 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sergeyvass
Интересующийся

ru
Offline Offline

« : 26-07-2016 07:26 » 

Здравствуйте!
Разрабатываю 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 и Орвика. 
Записан
sergeyvass
Интересующийся

ru
Offline Offline

« Ответ #1 : 29-07-2016 07:08 » 

Эта проблема решена. Я неправильно вызывал функцию чтения. первый аргумент у меня не указывал на начало буфера.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines