Gast
#1116529
Ich habe einen Treiber entwickelt der mir die serielle Schnittstelle als
I2C-Bus emuliert, nun das Problem: Ich mache anscheinend einen Fehler
bei den Fuktionen READ-und WRITE_PORT_UCHAR: Der Treiber wird jetzt zu
Testzwecken mithilfe eines PYTHON - Programms aufgerufen. Laut
Debugmonitor funktionieren die DeviceIoControl-Funktionen. (wird richtig
ausgegeben) Nur wenn ich jetzt den Pegel messa am Port tut sich da
überhaupst nichts. Über Python wird auch die Serielle Schnittstelle
aktiviert (RTS und DSR auch)
Code:
#include "wdm1.h"
#include "Ioctl.h"
#include <string.h>
#include <wdm.h>
#define DTR 0 //Write Data Bit SDA
#define RTS 1 //SCL
#define CTS 4 //ReadData
#define DSR 0 //SCL
........................................
NTSTATUS Wdm1DeviceControl( IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PUCHAR MCR ;
PUCHAR MSR ;
MCR=(PUCHAR)(0x3FC);
MSR=(PUCHAR)(0x3FE);
UCHAR BufferREAD; //Buffer for READ_Register(MSR)
UCHAR BufferWRITE; //Buffer for Write_Register(MCR)
UCHAR BufferUART; //Buffer for UART
UCHAR BufferUSER; //Buffer for USERMODE
UCHAR GETBuffer;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS status = STATUS_SUCCESS;
ULONG BytesTxd = 0;
ULONG ControlCode =
IrpStack->Parameters.DeviceIoControl.IoControlCode;
ULONG InputLength =
IrpStack->Parameters.DeviceIoControl.InputBufferLength;
ULONG OutputLength =
IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
DebugPrint("DeviceIoControl: Control code %x InputLength %d
OutputLength %d",
ControlCode, InputLength, OutputLength);
// Get access to the shared buffer
KIRQL irql;
KeAcquireSpinLock(&BufferLock,&irql);
switch( ControlCode)
{
/////// Zero Buffer
case IOCTL_WRITE_SCL:
RtlCopyMemory(&BufferUSER,Irp->AssociatedIrp.SystemBuffer,sizeof(UCHAR))
;
BufferREAD=READ_PORT_UCHAR(MSR);
BufferWRITE=READ_PORT_UCHAR(MCR);
if(BufferUSER==1) //Set SCL
{
DebugPrint("SetSCL");
BufferWRITE|=(1<<RTS);
BufferREAD|=(1<<DSR);
DebugPrint("BufferWrite %d BufferRead %d",BufferWRITE,BufferREAD);
WRITE_PORT_UCHAR(MCR,BufferWRITE);
WRITE_PORT_UCHAR(MSR,BufferREAD);
}
else //Clear SCL
{
DebugPrint("ClearSCL");
BufferWRITE&=~(1<<RTS);
BufferREAD&=~(1<<DSR);
DebugPrint("BufferWrite %d BufferRead %d",BufferWRITE,BufferREAD);
WRITE_PORT_UCHAR(MCR,BufferWRITE);
WRITE_PORT_UCHAR(MSR,BufferREAD);
}
break;
case IOCTL_WRITE_SDA:
RtlCopyMemory(&BufferUSER,Irp->AssociatedIrp.SystemBuffer,sizeof(UCHAR))
;
BufferWRITE=READ_PORT_UCHAR(MCR);
if(BufferUSER==1) //Set SDA
{
DebugPrint("SetSDA");
BufferWRITE|=(1<<DTR);
WRITE_PORT_UCHAR(MCR,BufferWRITE);
}
else //Clear SDA
{
DebugPrint("ClearSDA");
BufferWRITE&=~(1<<DTR);
WRITE_PORT_UCHAR(MCR,BufferWRITE);
}
break;
case IOCTL_READ_SDA:
BufferUART=READ_PORT_UCHAR(MSR);
if (BufferUART & CTS) //Bit is Set
{
GETBuffer=1;
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&GETBuffer,sizeof(UCHAR));
DebugPrint("ReadHighSDA");
}
else //Bit is Clear
{
GETBuffer=0;
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&GETBuffer,sizeof(UCHAR));
DebugPrint("ReadLowSDA");
}
break;
default:
status = STATUS_INVALID_DEVICE_REQUEST;
}
// Release shared buffer
KeReleaseSpinLock(&BufferLock,irql);
// Complete IRP
return CompleteIrp(Irp,status,BytesTxd);
}
..........................................
Ich finde leider keinen Fehler mehr im Programm, muss ich irgendwas
bestimmtes beachten. Habe schon so ziemlich alle Möglichkeiten
gegoogelt, aber leider nichts relevantes gefunden.