//=========================================================================== // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (c) 1996 - 2000 Microsoft Corporation. All Rights Reserved. // //=========================================================================== /*++ Module Name: Device.c Abstract: This file contains code to read/write request from the DCam. Author: Yee J. Wu 9-Sep-97 Environment: Kernel mode only Revision History: --*/ #include "strmini.h" #include "ksmedia.h" #include "1394.h" #include "wdm.h" // for DbgBreakPoint() defined in dbg.h #include "dbg.h" #include "dcamdef.h" #include "dcampkt.h" #include "sonydcam.h" NTSTATUS DCamReadRegister( IN PIRB pIrb, PDCAM_EXTENSION pDevExt, ULONG ulFieldOffset, ULONG * pulValue ) { NTSTATUS status; LARGE_INTEGER deltaTime; PIRP pIrp; // // Delay for camera before next request // ASSERT(pDevExt->BusDeviceObject != NULL); pIrp = IoAllocateIrp(pDevExt->BusDeviceObject->StackSize, FALSE); if (!pIrp) { ASSERT(FALSE); return (STATUS_INSUFFICIENT_RESOURCES); } // // Delay for camera before next request // if(KeGetCurrentIrql() < DISPATCH_LEVEL) { deltaTime.LowPart = DCAM_DELAY_VALUE; deltaTime.HighPart = -1; KeDelayExecutionThread(KernelMode, TRUE, &deltaTime); } pIrb->FunctionNumber = REQUEST_ASYNC_READ; pIrb->Flags = 0; pIrb->u.AsyncRead.DestinationAddress.IA_Destination_Offset.Off_High = INITIAL_REGISTER_SPACE_HI; pIrb->u.AsyncRead.DestinationAddress.IA_Destination_Offset.Off_Low = pDevExt->BaseRegister + ulFieldOffset; pIrb->u.AsyncRead.nNumberOfBytesToRead = sizeof(ULONG); pIrb->u.AsyncRead.nBlockSize = 0; pIrb->u.AsyncRead.fulFlags = 0; InterlockedExchange(&pIrb->u.AsyncRead.ulGeneration, pDevExt->CurrentGeneration); pDevExt->RegisterWorkArea.AsULONG = 0; // Initilize the return buffer. pIrb->u.AsyncRead.Mdl = IoAllocateMdl(&pDevExt->RegisterWorkArea, sizeof(ULONG), FALSE, FALSE, NULL); MmBuildMdlForNonPagedPool(pIrb->u.AsyncRead.Mdl); DbgMsg3(("\'DCamReadRegister: Read from address (%x, %x)\n", pIrb->u.AsyncRead.DestinationAddress.IA_Destination_Offset.Off_High, pIrb->u.AsyncRead.DestinationAddress.IA_Destination_Offset.Off_Low)); status = DCamSubmitIrpSynch(pDevExt, pIrp, pIrb); if (status) { ERROR_LOG(("DCamRange: Error %x while trying to read from register\n", status)); } else { *pulValue = pDevExt->RegisterWorkArea.AsULONG; DbgMsg3(("\'DCamReadRegister: status=0x%x, value=0x%x\n", status, *pulValue)); } IoFreeMdl(pIrb->u.AsyncWrite.Mdl); IoFreeIrp(pIrp); return status; } NTSTATUS DCamWriteRegister( IN PIRB pIrb, PDCAM_EXTENSION pDevExt, ULONG ulFieldOffset, ULONG ulValue ) { NTSTATUS status; LARGE_INTEGER deltaTime; PIRP pIrp; ASSERT(pDevExt->BusDeviceObject != NULL); pIrp = IoAllocateIrp(pDevExt->BusDeviceObject->StackSize, FALSE); if (!pIrp) { ASSERT(FALSE); return (STATUS_INSUFFICIENT_RESOURCES); } // // Delay for camera before next request // if(KeGetCurrentIrql() < DISPATCH_LEVEL) { deltaTime.LowPart = DCAM_DELAY_VALUE; deltaTime.HighPart = -1; KeDelayExecutionThread(KernelMode, TRUE, &deltaTime); } pIrb->FunctionNumber = REQUEST_ASYNC_WRITE; pIrb->Flags = 0; pIrb->u.AsyncWrite.DestinationAddress.IA_Destination_Offset.Off_High = INITIAL_REGISTER_SPACE_HI; pIrb->u.AsyncWrite.DestinationAddress.IA_Destination_Offset.Off_Low = pDevExt->BaseRegister + ulFieldOffset; pIrb->u.AsyncWrite.nNumberOfBytesToWrite = sizeof(ULONG); pIrb->u.AsyncWrite.nBlockSize = 0; pIrb->u.AsyncWrite.fulFlags = 0; InterlockedExchange(&pIrb->u.AsyncWrite.ulGeneration, pDevExt->CurrentGeneration); pDevExt->RegisterWorkArea.AsULONG = ulValue; // Initilize the return buffer. pIrb->u.AsyncWrite.Mdl = IoAllocateMdl(&pDevExt->RegisterWorkArea, sizeof(ULONG), FALSE, FALSE, NULL); MmBuildMdlForNonPagedPool(pIrb->u.AsyncWrite.Mdl); DbgMsg3(("\'DCamWriteRegister: Write to address (%x, %x)\n", pIrb->u.AsyncWrite.DestinationAddress.IA_Destination_Offset.Off_High, pIrb->u.AsyncWrite.DestinationAddress.IA_Destination_Offset.Off_Low)); status = DCamSubmitIrpSynch(pDevExt, pIrp, pIrb); if (status) { ERROR_LOG(("\'DCamWriteRegister: Error %x while trying to write to register\n", status)); } IoFreeMdl(pIrb->u.AsyncWrite.Mdl); IoFreeIrp(pIrp); return status; }