35、PCI设备驱动简介
2010-12-07 00:06
405 查看
PCI(Peripheral Component Interconnect)总线标准是一种将系统外部设备连接起来的总线标准,速度可以达到133MB/s,它是PC中最重要的总线,其他总路线如ISA总线,USB总线等,都挂载在PCI总线上(通过桥接电路)。由Intel推出的一种局部总线,为32位数据地址总线,可以扩展为64位,支持突发读写,及多组外围设备。
在PCI系统中,Host/PCI称为北桥,连接主处理器总线到基础PCI局部总线;PCI-ISA桥称为南桥,连接基础PCI总线到ISA总线。其中南桥通常还含有中断控制器,IDE控制器,USB控制器和DMA控制器等设备。
代码
示例代码 P428
参考
[1] Windows 驱动开发技术详解,张帆
在PCI系统中,Host/PCI称为北桥,连接主处理器总线到基础PCI局部总线;PCI-ISA桥称为南桥,连接基础PCI总线到ISA总线。其中南桥通常还含有中断控制器,IDE控制器,USB控制器和DMA控制器等设备。
代码
#pragma PAGEDCODE NTSTATUS InitMyPCI(IN PDEVICE_EXTENSION pdx,IN PCM_PARTIAL_RESOURCE_LIST list) { PDEVICE_OBJECT fdo = pdx->fdo; ULONG vector; KIRQL irql; KINTERRUPT_MODE mode; KAFFINITY affinity; BOOLEAN irqshare; BOOLEAN gotinterrupt = FALSE; PHYSICAL_ADDRESS portbase; BOOLEAN gotport = FALSE; PCM_PARTIAL_RESOURCE_DESCRIPTOR resource = &list->PartialDescriptors[0]; ULONG nres = list->Count; BOOLEAN IsMem0 = TRUE; for (ULONG i = 0; i < nres; ++i, ++resource) { // for each resource switch (resource->Type) { // switch on resource type case CmResourceTypePort: portbase = resource->u.Port.Start; pdx->nports = resource->u.Port.Length; pdx->mappedport = (resource->Flags & CM_RESOURCE_PORT_IO) == 0; gotport = TRUE; break; case CmResourceTypeMemory: if (IsMem0) { pdx->MemBar0 = (PUCHAR)MmMapIoSpace(resource->u.Memory.Start, resource->u.Memory.Length, MmNonCached); pdx->nMem0 = resource->u.Memory.Length; IsMem0 = FALSE; }else { pdx->MemBar1 = (PUCHAR)MmMapIoSpace(resource->u.Memory.Start, resource->u.Memory.Length, MmNonCached); pdx->nMem1 = resource->u.Memory.Length; } break; case CmResourceTypeInterrupt: irql = (KIRQL) resource->u.Interrupt.Level; vector = resource->u.Interrupt.Vector; affinity = resource->u.Interrupt.Affinity; mode = (resource->Flags == CM_RESOURCE_INTERRUPT_LATCHED) ? Latched : LevelSensitive; irqshare = resource->ShareDisposition == CmResourceShareShared; gotinterrupt = TRUE; break; default: KdPrint(("Unexpected I/O resource type %d\n", resource->Type)); break; } // switch on resource type } // for each resource if (!(TRUE&& gotport&& gotinterrupt )) { KdPrint((" Didn't get expected I/O resources\n")); return STATUS_DEVICE_CONFIGURATION_ERROR; } if (pdx->mappedport) { // map port address for RISC platform pdx->portbase = (PUCHAR) MmMapIoSpace(portbase, pdx->nports, MmNonCached); if (!pdx->mappedport) { KdPrint(("Unable to map port range %I64X, length %X\n", portbase, pdx->nports)); return STATUS_INSUFFICIENT_RESOURCES; } } // map port address for RISC platform else pdx->portbase = (PUCHAR) portbase.QuadPart; NTSTATUS status = IoConnectInterrupt(&pdx->InterruptObject, (PKSERVICE_ROUTINE) OnInterrupt, (PVOID) pdx, NULL, vector, irql, irql, LevelSensitive, TRUE, affinity, FALSE); if (!NT_SUCCESS(status)) { KdPrint(("IoConnectInterrupt failed - %X\n", status)); if (pdx->portbase && pdx->mappedport) MmUnmapIoSpace(pdx->portbase, pdx->nports); pdx->portbase = NULL; return status; } #define IMAGE_LENGTH (640*480) //申请一段连续物理地址来读取图像 PHYSICAL_ADDRESS maxAddress; maxAddress.u.LowPart = 0xFFFFFFFF; maxAddress.u.HighPart = 0; pdx->MemForImage = MmAllocateContiguousMemory(IMAGE_LENGTH,maxAddress); PHYSICAL_ADDRESS pycialAddressForImage = MmGetPhysicalAddress(pdx->MemForImage); WRITE_REGISTER_BUFFER_UCHAR((PUCHAR)pdx->MemBar0+0x10000, (PUCHAR)&pycialAddressForImage.u.LowPart,4); return STATUS_SUCCESS; }
示例代码 P428
参考
[1] Windows 驱动开发技术详解,张帆
相关文章推荐
- PCI设备驱动简介
- PCI设备驱动开发
- linux platform设备驱动简介及实例
- PCI Express设备驱动 (4,PCIe配置空间和PCI设备中的寄存器)
- linux设备驱动之pci设备的驱动架构
- Pci设备驱动0:设备枚举
- 浅谈 Linux 内核开发之 PCI 设备驱动
- linux为PCI、USB设备找到合适的驱动
- WinCE流设备驱动简介及往BSP添加GPIO驱动
- PCI设备驱动开发
- 第21章 PCI设备驱动
- WinCE流设备驱动简介及GPIO驱动的实
- Linux驱动开发-PCI设备浅析
- PCI设备驱动
- PCI设备驱动开发
- pci设备驱动开发以及linux pci设备的重新遍历
- 字符设备驱动相关函数及数据结构简介 (ldd3)
- Linux下PCI设备驱动程序开发 --- linux 驱动框架(二)
- 《Linux设备驱动》读书笔记:第一章:设备驱动简介
- 浅谈 Linux 内核开发之 PCI 设备驱动