首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

多设备驱动开发解决方法

2013-08-10 
多设备驱动开发问题:我想用一个驱动程序实现多个PCI设备的驱动PCI设备上挂接了4个串口转PCI的硬件设备,还

多设备驱动开发
问题:我想用一个驱动程序实现多个PCI设备的驱动

PCI设备上挂接了4个串口转PCI的硬件设备,还有一个FPGA的PCI设备,我想用一个驱动程序实现这5个PCI设备的驱动,不知如何实现。
[解决办法]
应该没有关系的吧,pdo不是都一样的吗?嗯~ o(* ̄▽ ̄*)o 因为硬件模块上已经有芯片转成了PCI接口的时序了,所以可以直接用DDK的程序模块去处理,这部分我们貌似也写不了。
楼主之前写过的PCI驱动应该能用的,对那几个设备都挂上这个驱动就可以了吧 "o((>ω< ))o" 我猜的。
如果是加驱动实例 WDM 驱动是在AddDevice里面加,NT 驱动在CreateDevice里面加。

给楼主一个 NT 驱动加两个设备的栗子,虽然不是PCI的  \( ̄︶ ̄)/


/************************************************************************
* 文件名称:Driver.cpp                                                 
* 作    者:张帆
* 完成日期:2007-11-1
*************************************************************************/

#include "Driver.h"

#pragma INITCODE
void Dump(IN PDRIVER_OBJECTpDriverObject)
{
KdPrint(("----------------------------------------------\n"));
KdPrint(("Begin Dump...\n"));
KdPrint(("Driver Address:0X%08X\n",pDriverObject));
KdPrint(("Driver name:%wZ\n",&pDriverObject->DriverName));
KdPrint(("Driver HardwareDatabase:%wZ\n",pDriverObject->HardwareDatabase));
KdPrint(("Driver first device:0X%08X\n",pDriverObject->DeviceObject));

PDEVICE_OBJECT pDevice = pDriverObject->DeviceObject;
int i=1;
for (;pDevice!=NULL;pDevice = pDevice->NextDevice)
{
KdPrint(("The %d device\n",i++));
KdPrint(("Device AttachedDevice:0X%08X\n",pDevice->AttachedDevice));
KdPrint(("Device NextDevice:0X%08X\n",pDevice->NextDevice));
KdPrint(("Device StackSize:%d\n",pDevice->StackSize));
KdPrint(("Device's DriverObject:0X%08X\n",pDevice->DriverObject));
}

KdPrint(("Dump over!\n"));
KdPrint(("----------------------------------------------\n"));
}

/************************************************************************
* 函数名称:CreateDevice
* 功能描述:初始化设备对象
* 参数列表:
      pDriverObject:从I/O管理器中传进来的驱动对象
* 返回 值:返回初始化状态


*************************************************************************/
#pragma INITCODE
NTSTATUS CreateDevice (
IN PDRIVER_OBJECTpDriverObject) 
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;

//创建设备名称
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");

//创建设备
status = IoCreateDevice( pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
0, TRUE,
&pDevObj );
if (!NT_SUCCESS(status))
return status;

pDevObj->Flags 
[解决办法]
= DO_BUFFERED_IO;
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice = pDevObj;
pDevExt->ustrDeviceName = devName;
//创建符号链接
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
pDevExt->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status)) 
{
IoDeleteDevice( pDevObj );
return status;
}

return STATUS_SUCCESS;
}

#pragma INITCODE
NTSTATUS CreateDevice2 (
IN PDRIVER_OBJECTpDriverObject) 
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;

//创建设备名称
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice2");

//创建设备
status = IoCreateDevice( pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
0, TRUE,
&pDevObj );
if (!NT_SUCCESS(status))
return status;

pDevObj->Flags 
[解决办法]
= DO_BUFFERED_IO;
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice = pDevObj;
pDevExt->ustrDeviceName = devName;
//创建符号链接
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK2");
pDevExt->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status)) 
{
IoDeleteDevice( pDevObj );
return status;
}
return STATUS_SUCCESS;
}

/************************************************************************


* 函数名称:HelloDDKUnload
* 功能描述:负责驱动程序的卸载操作
* 参数列表:
      pDriverObject:驱动对象
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) 
{
PDEVICE_OBJECTpNextObj;
KdPrint(("Enter DriverUnload\n"));
pNextObj = pDriverObject->DeviceObject;
while (pNextObj != NULL) 
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
pNextObj->DeviceExtension;

//删除符号链接
UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&pLinkName);
pNextObj = pNextObj->NextDevice;
IoDeleteDevice( pDevExt->pDevice );
}
}

/************************************************************************
* 函数名称:HelloDDKDispatchRoutine
* 功能描述:对读IRP进行处理
* 参数列表:
      pDevObj:功能设备对象
      pIrp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
 IN PIRP pIrp) 
{
KdPrint(("Enter HelloDDKDispatchRoutine\n"));
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0;// bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("Leave HelloDDKDispatchRoutine\n"));
return status;
}

/************************************************************************
* 函数名称:DriverEntry
* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
* 参数列表:
      pDriverObject:从I/O管理器中传进来的驱动对象
      pRegistryPath:驱动程序在注册表的中的路径
* 返回 值:返回初始化驱动状态
*************************************************************************/
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath) 
{
NTSTATUS status;
KdPrint(("Enter DriverEntry\n"));

//注册其他驱动调用函数入口
pDriverObject->DriverUnload = HelloDDKUnload;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;



//创建驱动设备对象
status = CreateDevice(pDriverObject);
status = CreateDevice2(pDriverObject);

Dump(pDriverObject);

KdPrint(("DriverEntry end\n"));
return status;
}

[解决办法]
例外,求楼主筒子指点一下在下的迷津,这事您发过的一个帖子  求解答
http://bbs.csdn.net/topics/390409432

热点排行