Здравствуйте, 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);