linux驱动程序之PCI驱动程序设计

news/2025/2/19 15:25:48/

文章目录

    • PCI驱动描述
    • PCI驱动注册
    • 使能PCI设备
    • 获取PCI配置寄存器基地址
    • 中断
    • 部分代码

PCI驱动描述

在linux内核中,PCI驱动使用 struct pic_driver 结构来描述:

struct pci_driver
{/*以上还有很多成员*///id_table 中包含了PCI设备的相关信息const struct pci_device_id *id_table;int (*probe) (struct pci_dev *dev,const struct pci_device_id *id);void (*remove) (struct pci_dev *dev);/*Device removed (NULL if not a hot-plug capable driver)*/
};

PCI驱动注册

注册PCI驱动,使用

pci_register_driver(struct pci_driver *drv);

使能PCI设备

在PCI驱动使用PCI设备的任何资源(I/O区或者中断)之前,驱动必须调用如下函数来使能设备:

int pci_enable_device(struct pci_dev *dev)

获取PCI配置寄存器基地址

一个PCI设备最多可以实现6个地址区域,大多数PCI设备在这些区域实现I/O寄存器。Linux提供了一组函数来获取这些区间的基地址:

pci_resource_start(struct pci_dev *dev,int bar)

返回指定区域的起始地址;这个区域通过参数 bar 指定,范围从 0—5,表示6个PCI区域的一个

pci_resource_end(struct pci_dev *dev,int bar)

返回指定区域的末地址

中断

中断号存放于配置寄存器 PCI_INTERRUPT_LINE 中,驱动不必去检查它,因为从PCI_INTERRUPT_LINE 中找到的值保证是正确的。**如果设备不支持中断,寄存器 PCI_INTERRUPT_LINE 中的值是0,**否则它是非0的值。但因为驱动开发者通常知道设备是否是支持中断,所以常常不需要访问 PCI_INTERRUPT_LINE。

相关的驱动程序分析,在内核文件 /driver/net/hamachi.c

部分代码

init函数

static int __init hamachi_init (void)
{
/* when a module, this is printed whether or not devices are found in probe */
#ifdef MODULEprintk(version);
#endifif (pci_register_driver(&hamachi_driver) > 0)return 0;pci_unregister_driver(&hamachi_driver);return -ENODEV;
}

驱动描述

static struct pci_driver hamachi_driver = {name:		DRV_NAME,id_table:	hamachi_pci_tbl,probe:		hamachi_init_one,remove:		__devexit_p(hamachi_remove_one),
};

PCI 设备表

static struct pci_device_id hamachi_pci_tbl[] = {{ 0x1318, 0x0911, PCI_ANY_ID, PCI_ANY_ID, },{ 0, }
};

该表记录的能够支持的PCI设备,分别是厂商号,设备号,子厂商号,子设备号,其中子厂商号,子设备号为 PCI_ANY_ID ,表示支持各种子类型。

其他更多函数可在内核代码 /driver/hamachi.c


http://www.ppmy.cn/news/274641.html

相关文章

PCI驱动编程

一、字符设备和块设备 Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。Li…

Linux设备驱动程序学习(十)——PCI驱动程序

前面介绍的是最底层的硬件控制,这部分将介绍高级总线架构的一些综述,总线由电气接口和编程接口够成。下面将重点介绍PCI总线的编程接口以及对应的内核函数。 PCI(外围设备互联)接口 PCI总线是当今普遍使用在桌面以及更大型计算机…

dpdk pci驱动探测

上一篇文章已经介绍了pci设备的背景知识, 现在我们来分析下pci设备是如何探测到支持的驱动,进而与驱动进行关联;pci与驱动的解除绑定;pci设备与uio设备的关联。 一、pci驱动注册 网卡驱动的注册使用了一种奇技淫巧的方法&#xf…

virtio_net 与 virtio-pci 驱动关联浅析

virtio-pci 驱动映射 virtio common_cfg resource 空间 virtio-pci 获取 comon_cfg 物理空间的函数调用如下: mdev->common vp_modern_map_capability(mdev, common,sizeof(struct virtio_pci_common_cfg), 4,0, sizeof(struct virtio_pci_common_cfg),NULL, …

VFIO代码分析(2)VFIO-PCI驱动1

VFIO-PCI驱动作为PCIE驱动,在原来的PCIE驱动卸载后,加载VFIO-PCI驱动,与内核之前扫描到的PCIE设备匹配,触发vfio_pci_probe(),进行本驱动的初始化。该驱动提供了用户态访问PCIE设备的配置空间/BAR空间/中断等资源接口&…

linux设备模型:pci驱动程序注册过程

一个具有正常探测功能的pci驱动程序应具有基本的pci_driver结构实现,如: static struct pci_driver driver_ops {.name "driver_name", // 驱动名称.id_table pci_ids, // 驱动ids结构.probe pci_probe, // 驱动探测函数.remove pci_remo…

Linux PCI驱动编写

这几天将以前为内核2.6写的驱动移植到了4.1下,在这里记录一下过程,以及从头整理一下linux下pci驱动的编写方法。   以前的驱动没有使用到linux下的probe方法,在4.1内核下成功编译后,一直无法进入中断,因此参考ch36x的…

Linux的PCI驱动介绍(入门)

1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间和PCI的配置空间。CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置空间则由Linux内核中的PCI初始化代码使用。内核在启动时负…