Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Драйвер PCI
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > ISA/PCI/PCI-X/PCI Express
sabbatazh
Приветствую ВСЕХ!!!
Подскажите уважаемые Знатоки, чем воспользоваться для решения вот такой задачи!
Написан драйвер под ХР, для платы PCI еще годов так n назад, в nuMega… и встал вопрос переноса его на win7…
Кто-то ХР дрова переносил, сталкивался с проблемами и какими подручными средствами лучше всего воспользоваться?!
пересмотрел примеры из ДДК и стряпал первый пробник...
и пытаюсь прочитать с помощью
Код
NTSTATUS MDMAI_IO_READ_Handler(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp, UINT *pdwDataWritten)
{
    NTSTATUS status = STATUS_UNSUCCESSFUL;    
    PCHAR pInputBuffer;
    PCHAR pOutputBuffer;
    PCHAR pReturnData;
    UINT dwDataRead = 0, dwDataWritten = 0;
    UINT dwDataSize = sizeof(ULONG);    
    USHORT Port;

         DbgPrint("ReadDirectOutIO Called \r\n");

    pInputBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer;
    pOutputBuffer = NULL;

    if(Irp->MdlAddress)
    {
         pOutputBuffer = (PCHAR)MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
    }

      if(pInputBuffer && pOutputBuffer)
      {
         if(pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength >= dwDataSize)
         {
            Port = pInputBuffer[0];
             pReturnData = (PCHAR)READ_PORT_UCHAR((PUCHAR)Port); // ну очень смущает!!!!!!!!!
                  /*
                   * We use "RtlCopyMemory" in the kernel instead of memcpy.
                   * RtlCopyMemory *IS* memcpy, however it's best to use the
                   * wrapper in case this changes in the future.
                   */
                  RtlCopyMemory(pOutputBuffer, pReturnData, dwDataSize);
                  *pdwDataWritten = dwDataSize;
                  status = STATUS_SUCCESS;
         }
         else
         {
                 *pdwDataWritten = dwDataSize;
                  status = STATUS_BUFFER_TOO_SMALL;
         }  
      }    
    return status;
}

в результате ни чего и ошибки!(
направьте на путь истинный!
Спасибо!!!
Kuzmi4
2 sabbatazh
Из общих замечаний: сначала вы должны сделать map/translate ресурсов вашей карточки, это будет выглядеть как то так:
Цитата
..
rawResourceList = &ioStack->Parameters.StartDevice.AllocatedResources->List[0].PartialResourceList;
rawResource = &rawResourceList->PartialDescriptors[0];

translatedResourceList = &ioStack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].PartialResourceList;
translatedResource = &translatedResourceList->PartialDescriptors[0];
...
for (i = 0; i < rawResourceList->Count; i++, rawResource++, translatedResource++)
...
deviceExtension->MemoryLength[idx] = translatedResource->u.Memory.Length;
deviceExtension->MemoryStart[idx] = MmMapIoSpace (
translatedResource->u.Memory.Start,
translatedResource->u.Memory.Length,
MmNonCached);
deviceExtension->Memory[idx] = translatedResource->u.Memory.Start;
...


Ну а потом пишем читаем как то так:
Цитата
...
*pBufferDW = READ_REGISTER_ULONG ((PULONG) address_32);
...

где "address_32" - это как раз наш map адрес + какое то смещение

Я работал с девайсами которые имели только Mem, у вас судя по всему это IO, там заменить процедуры надоlaughing.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.