Re[2]: Драйвер для Com-порта
От: kai62  
Дата: 27.12.04 10:31
Оценка:
Здравствуйте, ArtSh, Вы писали:

AS>Здравствуйте, kai62, Вы писали:


K>>Здравствуйте!


K>>Написал драйвер для работы с последовательным портом COM1.

K>>Так вот, не могу прочесть из драйвера его регистры
K>>При чтении получаю 0xff.
K>>Каким то образом надо заставить ACPI подать питание на порт!

K>>Кто нибудь сталкивался с этим???


AS>Что-то непонятно, как Вы это делаете и зачем? Если с целью общаться с внешним устройством, то использовать стандартный драйвер, а в противном случае, приведите пример кода...



Привожу часть кода драйвера:

UCHAR inport(USHORT portid)
{
unsigned char value;

__asm mov dx,portid
__asm in al,dx
__asm mov value,al
return value;
}

NTSTATUS DriverInitialize (PDRIVER_OBJECT pDriverObject,
PUNICODE_STRING pusRegistryPath)
{
...
gpDeviceContext->PortAddress = 0x3f8;
...
}


NTSTATUS ComTransmitData(USHORT PortAddress,
UCHAR* pInput, ULONG dInput,
UCHAR* pOutput, ULONG dOutput,
PDWORD pdInfo)
{
NTSTATUS ns = STATUS_SUCCESS;

*pInput = inport(PortAddress);
*pdInfo = 1;

return ns;
}

NTSTATUS ComDispatcher (PDEVICE_CONTEXT pDeviceContext,
DWORD dCode,
PVOID pInput,
DWORD dInput,
PVOID pOutput,
DWORD dOutput,
PDWORD pdInfo)
{
...
case COM_IO_TRANSMIT:
ns = ComTransmitData(pDeviceContext->PortAddress, pInput, dInput, pOutput, dOutput, pdInfo);
break;
...

return ns;
}

NTSTATUS DeviceDispatcher (PDEVICE_CONTEXT pDeviceContext,
PIRP pIrp)
{
PIO_STACK_LOCATION pisl;
DWORD dInfo = 0;
NTSTATUS ns = STATUS_NOT_IMPLEMENTED;

pisl = IoGetCurrentIrpStackLocation (pIrp);

switch (pisl->MajorFunction)
{
...
case IRP_MJ_DEVICE_CONTROL:
ns = ComDispatcher (pDeviceContext,
...
break;
}

pIrp->IoStatus.Status = ns;

pIrp->IoStatus.Information = dInfo;

IoCompleteRequest (pIrp, IO_NO_INCREMENT);
return ns;
}

NTSTATUS DriverDispatcher (PDEVICE_OBJECT pDeviceObject,
PIRP pIrp)
{
return (pDeviceObject == gpDeviceObject
? DeviceDispatcher (gpDeviceContext, pIrp)
: STATUS_INVALID_PARAMETER_1);
}


A здесь пример кода обращения к драйверу:

hDevice = CreateFile ("\\\\.\\MyDrv", GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);

DeviceIoControl(hDevice, COM_IO_TRANSMIT,
NULL, 0,
byte, 1,
&dData, NULL);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.