pcie驱动 简单框架 -v1

平台: x86 赛扬 E3400

内核版本:Linux linux 3.2.1 #11 SMP Sun Nov 2 13:27:52 CST 2014 i686 i686 i386 GNU/Linux

功能:枚举如下pcie设备,其中8111为PCIE-PCI桥,上行口为PCIE PORT,下行口为PCI PORT

01:00.0 0604: 10b5:8111 (rev 21)

02:04.0 0680: 10b5:86e1 (rev aa)

源码如下:

[email protected]:/study/driver/kobox/src/pcie_frame# cat pcie_drv.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/init.h>

static struct pci_device_id pci_drv_ids[] =
{
	{PCI_DEVICE(0x10b5, 0x8111), },
	{PCI_DEVICE(0x10b5, 0x86e1), },
	{0, }
};

MODULE_DEVICE_TABLE(pci, pci_drv_ids);

static int pci_drv_probe(struct pci_dev *dev, const struct pci_device_id *d)
{
	int i;
	unsigned uiVal;

	printk("Enter [%s][%d]\n", __FUNCTION__, __LINE__);
	printk("\n*********************************************\n");

	for(i=0; i<0x40; i+=4)
	{
		pci_read_config_dword(dev, i, &uiVal);

		printk("[addr:%03x] [hex:%08x]\n", i, uiVal);
	}	

	printk("\n*********************************************\n");
	printk("Leave [%s][%d]\n", __FUNCTION__, __LINE__);

	return 0;
}

static void pci_drv_remove(struct pci_dev *dev)
{
	return;
}

static struct pci_driver pci_drv_ops =
{
	.name = "pci_drv",
	.id_table = pci_drv_ids,
	.probe = pci_drv_probe,
	.remove = pci_drv_remove,
};

static int __init pci_drv_init(void)
{
	return pci_register_driver(&pci_drv_ops);
}

static void __exit pci_drv_exit(void)
{
	pci_unregister_driver(&pci_drv_ops);
}

module_init(pci_drv_init);
module_exit(pci_drv_exit);

MODULE_LICENSE("GPL");

执行结果:

[ 7539.354646] *********************************************
[ 7539.354653] [addr:000] [hex:811110b5]
[ 7539.354659] [addr:004] [hex:00100007]
[ 7539.354664] [addr:008] [hex:06040021]
[ 7539.354669] [addr:00c] [hex:00010001]
[ 7539.354675] [addr:010] [hex:fddf000c]
[ 7539.354680] [addr:014] [hex:00000000]
[ 7539.354685] [addr:018] [hex:20020201]
[ 7539.354690] [addr:01c] [hex:2200c0c0]
[ 7539.354696] [addr:020] [hex:fde0fde0]
[ 7539.354701] [addr:024] [hex:0000fff0]
[ 7539.354706] [addr:028] [hex:00000000]
[ 7539.354711] [addr:02c] [hex:00000000]
[ 7539.354716] [addr:030] [hex:00000000]
[ 7539.354721] [addr:034] [hex:00000040]
[ 7539.354726] [addr:038] [hex:00000000]
[ 7539.354731] [addr:03c] [hex:0000010c]
[ 7539.354734]
[ 7539.354735] *********************************************
[ 7539.354738] Leave [pci_drv_probe][31]

[ 7539.354765] Enter [pci_drv_probe][20]
[ 7539.354767]
[ 7539.354768] *********************************************
[ 7539.354774] [addr:000] [hex:86e110b5]
[ 7539.354780] [addr:004] [hex:02b00007]
[ 7539.354785] [addr:008] [hex:068000aa]
[ 7539.354790] [addr:00c] [hex:00002001]
[ 7539.354796] [addr:010] [hex:fdeff000]
[ 7539.354801] [addr:014] [hex:0000ce01]
[ 7539.354806] [addr:018] [hex:fdec0000]
[ 7539.354812] [addr:01c] [hex:fdea0000]
[ 7539.354817] [addr:020] [hex:00000000]
[ 7539.354822] [addr:024] [hex:00000000]
[ 7539.354827] [addr:028] [hex:00000000]
[ 7539.354833] [addr:02c] [hex:831110b5]
[ 7539.354838] [addr:030] [hex:00000000]
[ 7539.354843] [addr:034] [hex:00000040]
[ 7539.354849] [addr:038] [hex:00000000]
[ 7539.354854] [addr:03c] [hex:0000010c]
[ 7539.354856]
[ 7539.354857] *********************************************
[ 7539.354861] Leave [pci_drv_probe][31]

关于这个桥到信息,lspci -vx可以查看到:

01:00.0 PCI bridge: PLX Technology, Inc. PEX 8111 PCI Express-to-PCI Bridge (rev 21) (prog-if 00 [Normal decode])
	Flags: bus master, fast devsel, latency 0
	Memory at fddf0000 (64-bit, prefetchable) [size=64K]
	Bus: primary=01, secondary=02, subordinate=02, sec-latency=32
	I/O behind bridge: 0000c000-0000cfff
	Memory behind bridge: fde00000-fdefffff
	Capabilities: [40] Power Management version 2
	Capabilities: [50] MSI: Enable- Count=1/1 Maskable- 64bit+
	Capabilities: [60] Express PCI/PCI-X Bridge, MSI 00
	Capabilities: [100] Power Budgeting <?>
	Kernel driver in use: pci_drv
00: b5 10 11 81 07 00 10 00 21 00 04 06 01 00 01 00
10: 0c 00 df fd 00 00 00 00 01 02 02 20 c0 c0 00 22
20: e0 fd e0 fd f0 ff 00 00 00 00 00 00 00 00 00 00
30: 00 00 00 00 40 00 00 00 00 00 00 00 0c 01 00 00

02:04.0 Bridge: PLX Technology, Inc. Device 86e1 (rev aa)
	Subsystem: PLX Technology, Inc. Device 8311
	Flags: bus master, 66MHz, medium devsel, latency 32, IRQ 12
	Memory at fdeff000 (32-bit, non-prefetchable) [size=512]
	I/O ports at ce00 [size=256]
	Memory at fdec0000 (32-bit, non-prefetchable) [size=128K]
	Memory at fdea0000 (32-bit, non-prefetchable) [size=128K]
	Capabilities: [40] Power Management version 2
	Capabilities: [48] CompactPCI hot-swap <?>
	Capabilities: [4c] Vital Product Data
	Kernel driver in use: pci_drv
00: b5 10 e1 86 07 00 b0 02 aa 00 80 06 01 20 00 00
10: 00 f0 ef fd 01 ce 00 00 00 00 ec fd 00 00 ea fd
20: 00 00 00 00 00 00 00 00 00 00 00 00 b5 10 11 83
30: 00 00 00 00 40 00 00 00 00 00 00 00 0c 01 00 00

可以看到,从驱动中读取到到config配置,和lspci -vx查看到下config区域的配置是相同的

时间: 2024-10-18 10:36:57

pcie驱动 简单框架 -v1的相关文章

Farseer.net轻量级开源框架 V1.x 入门篇:数据库配置及其它配置文件

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级开源框架 V1.x 入门篇:表实体类映射 前言 Farseer.Net是支持多数据库的ORM,使用者通过配置文件即可切换指定的数据库而不需要修改项目中的任何代码.本篇讲述如何进行数据库环境的配置.同时也讲述其它配置文件的使用. 配置文件 1.配置文件的路径: 不管是WebForm.Mvc.WinForm,配置文件统一放在:~

Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 前言 上文讲述了数据库配置使用,搭建好数据库的链接方式了我们知道怎么做了. 事实上,至今我们仍然还没有讲到代码方面,花了前面这么多篇幅讲解,主要是想由浅入深,不然一上来给大家讲解这讲解那的,听的也一头雾水,反而得不到效果. 这篇比较重要,因为它是我们在使用Far

Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表/视图缓存操作 TableCahceSet.ViewCahceSet 前言 在上篇中,我们学会了存储过程的关系映射,其中知道了存储过程需要使用:ProcSet作为操作的上下文,以及在Field特性上,我们知道了新的两个属性用来存储过程的参数输入输出. 在上篇末尾,提到了

Farseer.net轻量级开源框架 V1.x 入门篇:表的数据操作

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级开源框架 V1.x 入门篇:视图实体类映射 前言 先跟大家抱歉下,教程迟迟没有更新,因为一个人的精力实在有限(借口?好吧,我认了). 想要Farseer.Net发展的更好,需要认真.客观解读群里朋友们的建议,实际上也确实是这样,有些思想.功能自己确实没想到(必境我自己所能接触的业务场景是非常有限的). 当然在考虑Farse

Farseer.net轻量级开源框架 V1.x 入门篇:新版本说明

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次版本的开发从3月份开始,花了一个月的时间完成了概念版本设计.开发.到了4月份进行多次的内核的重构设计.到了5月份进行大规模的BUG修复.代码优化. 截止到今天(6月初),已知的BUG都已修复,并已在2个项目中应用了,并且运行良好. 本篇主题 1.新增队列管理: 新版本改变了V0.x时的使用方式,以Entityf

WDM驱动模型框架简介

前几天刚刚看了<windows驱动开发技术详解>,在网上看到这篇文章时觉得总结的很好,所以整理收藏! ========================================================= WDM驱动程序的前世今生 2012年10月06日 ⁄ windows驱动开发 ⁄ 共 2710字 ⁄ 暂无评论 WDM驱动程序在2000年左右还是一种很新的东西,相信很多人都跟我一样,对它很感兴趣,但是又找不到学习的切入点.究其原因,还是因为WDM是一种非常“死板板”的程序,它一

Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 前言 我们知道对于关系数据库,视图的出现可以在一定的情况下减少因要进行数据关联而带来的大量SQL语句,它可以让我们就像访问一张表一样的简单操作. 作为ORM来说,支持视图也是一项最基础的工作.然而大部份的ORM中,对视图没有特意去提供这个类,因为视图的SQ

Farseer.net轻量级开源框架 V1.x 入门篇:表实体类映射

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 V1.x 入门篇:数据库配置及其它配置文件 下一篇:Farseer.net轻量级开源框架 V1.x 入门篇:表的数据操作 前言 上文讲述了数据库配置及其它配置文件的使用,搭建好数据库的链接方式了,接下来就是数据库中的表与实体类的关联了(映射). 在V1.x中,新增了视图.存储过程的映射.在以往的解决方案中,视图是当成”表“来操作的. 但是我们的视图通常只是为了方便查询而建的.而表支持写操作

Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 前言 在V1.0中,新增了视图的映射.在以往的版本中,视图是当成”表“来操作的. 但是我们的视图通常只是为了方便查询而建的.而表支持写操作.会显的很不入调(当然MSSQL的视图也是支持写的,但是这里的视图映射是为了只读视图而来的) 先看下我DEMO中的上下文与视