精华内容
下载资源
问答
  • linux驱动结构pcipci_bus

    千次阅读 2011-01-13 14:49:00
    linux驱动结构之pcipci_bus原型、解释及调用

    struct pci_bus {
    struct list_head node;

    /* 链表元素node:对于PCI根总线而言,其pci_bus结构通过node成员链接到本节一开始所述的根总线链表中,根总线链表的表头由一个list_head类型的全局变量pci_root_buses所描述。而对于非根pci总线,其pci_bus结构通过node成员链接到其父总线的子总线链表children中*/
    struct pci_bus *parent;

    /*parent指针:指向该pci总线的父总线,即pci桥所在的那条总线*/
    struct list_head children;

    /*children指针:描述了这条PCI总线的子总线链表的表头。这条PCI总线的所有子总线都通过上述的node链表元素链接成一条子总线链表,而该链表的表头就由父总线的children指针所描述*/
    struct list_head devices;

    /* list of devices on this bus */
    struct pci_dev *self;

    /* devices链表头:描述了这条PCI总线的逻辑设备链表的表头。除了链接在全局PCI设备链表中之外,每一个PCI逻辑设备也通过其 pci_dev结构中的bus_list成员链入其所在PCI总线的局部设备链表中,而这个局部的总线设备链表的表头就由pci_bus结构中的 devices成员所描述*/
    struct resource *resource[PCI_BUS_NUM_RESOURCES];
    /* 资源指针数组:指向应路由到这条pci总线的地址空间资源,通常是指向对应桥设备的pci_dev结构中的资源数组resource[10:7]*/
    struct pci_ops *ops;

    /* 指针ops:指向一个pci_ops结构,表示这条pci总线所使用的配置空间访问函数*/
    void *sysdata;

    /* 无类型指针sysdata:指向系统特定的扩展数据*/
    struct proc_dir_entry *procdir;

    /* 指针procdir:指向该PCI总线在/proc文件系统中对应的目录项*/
     unsigned char number;

    /* number:这条PCI总线的总线编号(bus number),取值范围0-255 */
    unsigned char primary;

    /* primary:表示引出这条PCI总线的“桥设备的主总线”(也即桥设备所在的PCI总线)编号,取值范围0-255*/
    unsigned char secondary;

    /* secondary:表示引出这条PCI总线的桥设备的次总线号,因此secondary成员总是等于number成员的值。取值范围0-255*/
    unsigned char subordinate;

    /* subordinate:这条PCI总线的下属PCI总线(Subordinate pci bus)的总线编号最大值,它应该等于引出这条PCI总线的桥设备的subordinate值*/
    char name[48];
    /* name[48]:这条PCI总线的名字字符串*/
     unsigned short  bridge_ctl;

    /**/
    unsigned short  pad2;


    /* */
     struct device *bridge;
    /* */
     struct device class_dev;

    /* */
    struct bin_attribute *legacy_io;

    struct bin_attribute *legacy_mem;

     /* */
    };

    展开全文
  • 在vxworks系统中,调用...linux系统下bus、deviceNo以及devfn数据由驱动内部函数使用 (编写驱动过程中这些数据几乎用不到),并且没有提供明确的接口,需要我们自己分析驱动函数调用这些数据的方式。首先在Terminal输入

      在vxworks系统中,调用pciFindDevice()函数可以直接获取到指定设备的bus、deviceNo以及devfn数据信息。相对于linux系统,vxworks编写驱动相对简单一些。

      linux系统下bus、deviceNo以及devfn数据由驱动内部函数使用 (编写驱动过程中这些数据几乎用不到),并且没有提供明确的接口,需要我们自己分析驱动函数调用这些数据的方式。

    首先在Terminal输入: lspci -vmmD;
    这里写图片描述
      我们看到设备信息第一行Slot:0000表示设备域,02表示bus信息,05表示deviceNo信息,0表示devfn信息;

      了解到要得到数据信息后,开始追踪Pci相关文件,首先跟踪到linux/pci.h头文件找到
        #define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f)
        #define PCI_FUNC(devfn) ((devfn) & 0x07),

      根据定义名称我们知道 PCI_SLOT表示PCI槽,PCI_FUNC表示PCI函数信息(或者称为描述信息),我们得到了deviceNo和devfn的转换方法。下面继续跟踪找到struct pci_dev结构体,结构体内找到了unsigned int devfn; , 到这里可以确定devfn和deviceNo就是用这个变量转换过来的。

      现在还需要得到bus号,在pci_dev结构体中没有定义bus变量,说明我们的设备bus号应该不能直接获取到
    继续检查pci_dev结构体发现struct pci_bus bus; / bus this device is on /,看到这个注释明白了我们要找的设备bus号在pci_bus结构体内 , 跟踪 pci_bus结构体 找到unsigned char number; / bus number */。

      现在我们知道这些数据的获取方式,想要获取到数据需要用到struct pci_dev *dev指针。Pci入口函数static int __init pci_probe(struct pci_dev *dev, const struct pci_device_id *id)第一参数就是我们要用到的指针数据,结合上一篇的Pci驱动实例来描述具体实现方式,下面贴上代码:

    
    #define DevName 	"test"
    #define ClassName 	"class_test"
    #define VendorID 	0xFA01
    #define DeviceID   	0x1234
    
    unsigned char bus;//增加bus号定义
    unsigned int deviceNo;
    unsigned int devfn;
    
    struct class    *mem_class;
    struct Pci_Test
    {
    	struct cdev 	_cdev;
    	dev_t    	dev;
    	char 		msi_enabled;
    }*pci_test;
    
    
    static int Test_open(struct inode *inode,struct file *filp)
    {
    	return 0;
    }
    
    static int Test_release(struct inode *inode,struct file *filp)
    {
    	return 0;
    }
    
    
    static struct file_operations test_fops = {
    .owner = THIS_MODULE,
    //.ioctl = Test_ioctl,
    .open = Test_open,
    .release = Test_release,
    };
    
    //字符驱动
    static init_chrdev(struct Pci_Test *test_ptr)
    {
    	int result = alloc_chrdev_region(&test_ptr->dev, 0, 2, DevName);
    	if (result < 0)
    	{
    		printk("Err:failed in alloc_chrdev_region!\n");
    		return result;
    	}
    	
    	mem_class = class_create(THIS_MODULE,ClassName);// /dev/ create devfile 
        	if (IS_ERR(mem_class))
        	{
    		printk("Err:failed in creating class!\n");
      	}
    	device_create(mem_class,NULL,test_ptr->dev,NULL,DevName);
    
    	cdev_init(&test_ptr->_cdev,&test_fops);
    	test_ptr->_cdev.owner = THIS_MODULE;
    	test_ptr->_cdev.ops = &test_fops;//Create Dev and file_operations Connected
    	result = cdev_add(&test_ptr->_cdev,test_ptr->dev,1);
    	return result;
    }
    
    //PCI驱动入口函数   在这个函数中增加bus、device和devfn数据获取方法
    static int __init pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
    {
    	int rc = 0;
    	pci_test = dev;
        	pci_set_drvdata(dev, pci_test);
        //在这里创建字符设备驱动
    	rc = init_chrdev(pci_test); 
        	if (rc) {
            	dev_err(&dev->dev, "init_chrdev() failed\n");
            	return -1;
        	}
    
    	rc = pci_enable_device(dev);
        	if (rc) {
            	dev_err(&dev->dev, "pci_enable_device() failed\n");
           		return -1;
        	} 
    
    	rc = pci_request_regions(dev, DevName);
        	if (rc) {
            	dev_err(&dev->dev, "pci_request_regions() failed\n");
            	return -1;
        	}
    
        	pci_set_master(dev);
        	rc = pci_enable_msi(dev);
       	if (rc) {
            	dev_info(&dev->dev, "pci_enable_msi() failed\n");
            	pci_test->msi_enabled = 0;
        	} else {
            	dev_info(&dev->dev, "pci_enable_msi() successful\n");
           	 	pci_test->msi_enabled = 1;
       	}
    
    //在这里增加获取bus、deviceNo和devfn数据的方法
    bus = dev->bus->number;
    deviceNo = (((dev->devfn) >> 3 ) && 0x1f);
    devfn = ((dev->devfn) && 0x07);
    
    return rc;
    }
    
    static void __exit pci_remove(struct pci_dev *dev)
    {
        	if (0 != mem_class)
        	{
    		device_destroy(mem_class,pci_test->dev);
    		class_destroy(mem_class);
    		mem_class = 0;
        	}
    
    	pci_test = pci_get_drvdata(dev);
        	cdev_del(&pci_test->_cdev);
        	unregister_chrdev_region(pci_test->dev, 1);
       	pci_disable_device(dev);
    
        	if(pci_test) {
            	if(pci_test->msi_enabled) {
                		pci_disable_msi(dev);
                		pci_test->msi_enabled = 0;
            		}
        	}
     
        	pci_release_regions(dev);
    }
    
    static struct pci_device_id pci_ids[] = {
        { PCI_DEVICE( VendorID, DeviceID) },
        { 0 }
    };
    
    static struct pci_driver driver_ops = {
        .name = DevName,
        .id_table = pci_ids,
        .probe = pci_probe,
        .remove = pci_remove,
    };
    //驱动模块入口函数
    static int Test_init_module(void)
    {
    	int rc = 0;
    	pci_test = kzalloc(sizeof(struct Pci_Test), GFP_KERNEL);
    	//配对设备以及注册PCI驱动,如果找到对应设备调用PCI入口函数
    	rc = pci_register_driver(&driver_ops);
        	if (rc) {
           		printk(KERN_ALERT  ": PCI driver registration failed\n");
        	}
    	
    	return rc;
    }
    
    static void Test_exit_module(void)
    {
    	pci_unregister_driver(&driver_ops);
    	kfree(pci_test);
    }
    module_init(Test_init_module);
    module_exit(Test_exit_module);
    MODULE_AUTHOR(DevName);
    MODULE_LICENSE("GPL");
    
    

    上一篇Pci驱动调用字符设备驱动方式:http://blog.csdn.net/a29562268/article/details/78446178!

    展开全文
  • 很多装了windows 2003版的朋友没有声音,相信大家也在网上找了很多方法试,但大多都是重复的几种方法,但没有得到根本的解决。...本人的声卡驱动是主板自带的,型号为nvidia mcp55 high definition audio 首先,
     
    
    很多装了windows 2003版的朋友没有声音,相信大家也在网上找了很多方法试,但大多都是重复的几种方法,但没有得到根本的解决。
    本人也是出现了这样的问题,终于解决了。本人的声卡驱动是主板自带的,型号为nvidia mcp55 high definition audio

    首先,在装声卡驱动时,出现了这样的警告框
    Warning! You need to update your HD Audio bus driver.  
    Please go to the below website to get the latest HD Audio bus driver.  
    http://support.microsoft.com/?kdib=901105


    在点了这个之后,然后出现这个提示框
    Do you want to continue installation ?  
    这个时候不管你点是还是点否,都没有任何作用。声音还是没有。
    现在我们来分析下先前的警告框是什么意思。
    Warning! You need to update your HD Audio bus driver.  
    警告!你需要升级你的HD音频总线驱动。
    Please go to the below website to get the latest HD Audio bus driver.
    请访问以下网站获取最新的HD音频总线驱动。  
    总的来说,因为你安装的是HD音频驱动,所以需要先安装HD音频总线驱动,这个总线驱动通常需要从网站下载。
    至于要理解这个警告的意思,可以参考这个
    http://support.microsoft.com/kb/901105/zh-cn
    现在,问题就是要下载 HD音频总线驱动。
    http://www.microsoft.com/downloads/details.aspx?familyid=D0934D06-15B3-4A65-8C52-746BEB24E86C&displaylang=zh-tw
    上面这个连接就是HD音频总线驱动,注意一下字体,就现在而言绝大多数都是简体中文版,请先选择简体中文版(根据自己系统需要),然后下载,
    安装完这个补丁后,再执行次你的声卡驱动。
    然后重启,把音箱(耳机插上)等重启后自动添加硬件。
    这个时候,再就是在服务里打开windows audio的服务。
    点击开始 运行 输入 services.msc
    找到windows audio这个服务,把它设为自动,并且启用。
    基本上ok了。
    展开全文
  • 一般一类设备在出厂的时候会有相同的一串classid,而classid记录在/sys/bus/pci/devices/*/class文件中 如果知道出厂设备的classid,可以通过以下命令进行查询出对应devices目录下那个目录 grep -irn /sys/bus/pci...

    一般一类设备在出厂的时候会有相同的一串classid,而classid记录在/sys/bus/pci/devices/*/class文件中

    如果知道出厂设备的classid,可以通过以下命令进行查询出对应devices目录下那个目录

    grep -irn /sys/bus/pci/device/*/class

    然后/sys/class目录下net/scsi_host/fc_host/infiband_host等是/sys/bus/pci/devices/*/class下面pci设备的映射,映射到它们指定的类型中。

    而我们常说的四元组,则记录在pci设备目录下,跟class目录同级: vendor、device、subsystem_verdor、subsystem_device四个文件中。

    如果觉得这篇文章能让你对pci设备目录文件夹有个基本的认识,可以点击关注分享,谢谢!

    展开全文
  • PCI驱动

    2019-09-14 22:18:51
    pci设备由三个东西标识 总线编号0-255 设备编号0-31 ...cat /proc/bus/pci/devices | cut -f1-12 每种外设硬件电路对如下三种地址空间的查询进行应答: 内存位置 I/O端口 配置寄存器 ...
  • 一、PCI总线注册 1、pci总线注册对应构造函数 ...pci_bus_type); } postcore_initcall(pci_driver_init); #define postcore_initcall(fn) __define_initcall("2",fn) #define __define_initcall(level,fn) \ ...
  • struct pci_bus { /* 链表元素node:对于PCI根总线而言,其pci_bus结构通过node成员链接到本节一开始所述的根总线链表中,根总线链表 的表头由一个list_head类型的全局变量pci_root_buses所描述。而对于非根pci...
  • PCI 设备全套驱动源码

    2018-01-22 19:29:56
    PCI 设备 驱动 源码 This package contains the PCI Utilities, version 3.1.7. The PCI Utilities package contains a library for portable access to PCI bus configuration registers and several utilities ...
  • [longyu@debian-10:07:29:41] dpdk $ su -c ‘echo test > /sys/bus/pci/drivers/virtio-pci/test’
  • pci驱动框架

    2015-06-14 16:06:55
    struct pci_bus { //根总线链接到全局根总线链表,非根总线,链接到父总线的总线链表中 struct list_head node; /* node in list of buses */ //pci总线的父总线 struct pci_bus *parent; /* parent bus this ...
  • PCI Local BUS 3.0

    2016-06-28 19:15:58
    PCI LocalBus Spec 3.0 ------YasinChen 第一页 PCI (Peripheral Component Interconnect) 在处理器体系结构中,PCI总线属于局部总线(Local Bus)。局部总线是系统总线的延伸,其主要功能是连接外围设备。 The PCI...
  • 2、PCI总线的数据结构3、PCI设备的数据结构4、PCI配置空间二、PCI设备驱动结构1、pci_driver结构体2、PCI设备驱动的组成三、驱动实例(省略返回值及部分代码) 一、PCI总线与配置空间 1、PCI桥:一种特殊的PCI设备。...
  • PCI驱动编程

    千次阅读 2017-02-08 23:09:38
    一、 字符设备和块设备 二、 设备驱动程序接口 ...五、 PCI驱动程序框架 1. 关键数据结构 2. 基本框架 六、 框架的具体实现之模块操作 七、 框架的具体实现之设备文件操作 八、 附录及参考
  • FPGA 实现PCI转localbus

    千次阅读 2019-05-29 15:35:43
    PCI转localbus调通了,取代了以前使用的PCI芯片PCI9030,PCI9054等芯片.全部用FPGA实现。 使用P1020主板可以识别到FPGA PCI卡,DEVICE_ID和VENDOR_ID的参数在config_mux.v里面设置。以及后面的class/rev参数设置...
  • dpdk pci驱动探测

    2019-09-03 22:46:28
    上一篇文章已经介绍了pci设备的背景知识, 现在我们来分析下pci设备是如何探测到支持的驱动,进而与驱动进行关联;pci驱动的解除绑定;pci设备与uio设备的关联。 一、pci驱动注册 网卡驱动的注册使用了一种...
  • PCI驱动开发

    千次阅读 2013-06-20 11:33:07
    1. PCI 简介 PCI 总线标准是一种将系统外部设备连接起来的总线标准,是PC中最重要的总线,实际上是系统的各个部分如何交互的接口。传输速率可达到 133MB/s。在当前的PC体系结构中,几乎所有的外部设备采用的各种各样...
  • PCI总线驱动

    千次阅读 2015-09-06 22:52:01
    一、PCI总线系统体系结构 PCI是外围设备互连(Peripheral Component Interconnect)的简称,作为一种通用的总线接口标准,它在目前的计算机系统中得到了非常广泛的应用。PCI提供了一组完整的总线接口规范,其目的是...
  • PCI设备驱动解析

    2020-07-24 16:24:34
    首先我想引用一下官方的源代码中的文档,对设备驱动的工作做一个概括性的叙述: 1 首先是调用 pci_register_driver()函数,对设备进行注册。 2.Once the driver knows about a PCI device and takes ownership, the ...
  • 驱动工程师最关心就是如何编写PCI设备驱动了. 经过前面的处理,所有设备及其信息都已经遍历出来了.在深入分析PCI驱动架构之前,我们来回顾一下前面遍历PCI设备时,对pci_...pci_dev->dev的所属bus,parent和name的赋值:
  • pci驱动开发详解

    千次阅读 2018-05-11 18:40:36
    一、在了解pic启动开发前,作为开发人员...struct pci_device_id { __u32 vendor, device;/* Vendor and device ID or PCI_ANY_ID*/ __u32 subvendor, subdevice;/* Subsystem ID's or PCI_ANY_ID */ __u32 clas...
  • PLX PCI卡 linux驱动

    2018-01-26 11:24:35
    PCI8系列 PCI9系列 PCI9054 linux驱动程序 PLX SDK Samples ================================================================ ABOUT This document provides a brief description of the samples included ...
  • The PCI bus achieves better performance by using a higher clock rate than ISA; its clock runs at 25 or 33 MHz (its actual rate being a factor of the system clock), and 66-MHz and even 133-MHz implemen...
  • PCI驱动框架简单分析

    万次阅读 多人点赞 2016-07-05 14:34:32
    PCI规范能够实现32位并行数据传输,工作频率为 33MHz 或 66MHz ,最大吞吐率高达266MB/s,PCI的衍生物包括 CardBus、mini-PCIPCI-Express、cPCI等。  PCI总线体系结构是一种层次式的体系结构。在这种层次体系结构...
  • pci 驱动总结

    千次阅读 2016-10-10 16:15:23
    pci驱动pci调用pci_scan_device扫描每个设备的每个功能,当发现该功能存在时(通过读设备的vendor及product ID确定),就为该设备功能建立一个完整的pci_dev(通过pci_setup_device 完成),并将该设备功能加入到...
  • Realtek8168网卡时pci接口的网卡,其驱动程序就是一个PCI设备的驱动程序实例,我们一起看看其流程。 1. 首先,初始化模块调用static inline int pci_register_driver(struct pci_driver *driver)函数来注册设备...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,714
精华内容 6,685
关键字:

bus驱动pci