linux下 PCI驱动实现

export需实现函数:

module_init(xx_init_module);
module_exit(xx_cleanup_module);

 

xx_init_module函数:

1. 使用struct pci_dev *pci_get_device(unsigned int vendor,   unsigned int device, struct pci_dev *from)探测相关设备。

//First 256 bytes are a mirror of PCI config space.具体划分请参考“PCI设置头示意图”

vendor:厂家标识符, 16bit--(0-15)

device:设备标识符,芯片上电后立即发送过来的注册值, 16bit--(16-31)

from:没有就填NULL

 

 

2. 接着进行注册驱动。

int __must_check pci_register_driver(struct pci_driver *driver)

 

struct pci_driver {
 struct list_head node;
 char *name; 
 const struct pci_device_id *id_table; /* NULL if wants all devices */
 int (*probe)(struct pci_dev *dev, const struct pci_device_id *id);   /* New device inserted */
 void (*remove)(struct pci_dev *dev); /* Device removed (NULL if not a hot-plug
                                                              * capable driver)
                                                              */
 void (*suspend)(struct pci_dev *dev); /* Device suspended */
 void (*resume)(struct pci_dev *dev); /* Device woken up */
};

 

1)node 不设置。name填你驱动名称。

2)建立一个

static int __devinit xx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)作为probe

   2.1) allocate device private data,然后通过pci_set_drvdata(pdev, void* data)进行设置进去。

   2.2) pci_enable_device() 使能PCI驱动

   2.3) pci_resource_flags(pdev, 0),进行check whether find proper PCI device base address

   2.4) pci_request_regions(pdev, driverName) , Reserved PCI I/O and memory resources,从而判断是否obtain PCI resources

   2.5) pci_set_master(pdev) - enables bus-mastering for device dev

   2.6) pci_resource_start

   2.7) 编写你的private data对应的各个function实现

   2.8) request_irq 注册中断handler。

           request_irq的大致流程为先对申请的中断线进行安全检测,然后根据request_irq传进来的参数,动态创建该中断对应的irqaction结构体,最后通过setup_irq函数将该irqaction注册进内核适当的位置。

 

3)

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 class, class_mask; /* (class,subclass,prog-if) triplet */
 kernel_ulong_t driver_data; /* Data private to the driver */
};

这个id_table表,填的vendor,device和前面值一样。剩下的填PCI_ANY_ID

 

4)建立一个static void __devexit xx_remove(struct pci_dev *pdev) 作为remove

5)剩下的自己觉得要不要。

 

 

 

基本上这样。待续。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核的PCI驱动主要负责管理和控制计算机系统中的PCI(Peripheral Component Interconnect)总线。PCI总线是一种用于连接计算机系统中各种外设的通信接口标准。 Linux内核的PCI驱动做了以下几方面的工作: 1. 设备的探测和识别:PCI驱动会检测系统中的PCI总线,自动扫描和识别连接在总线上的所有设备。它会读取设备的标识符信息,确定设备的类型和功能。 2. 设备的初始化和配置:PCI驱动负责配置每个设备的寄存器和中断线路,以确保设备能够正确工作。它会根据设备的设备信息,设置设备的资源分配和中断分配等参数。 3. 提供访问接口:PCI驱动为其他内核模块和用户空间程序提供了访问PCI设备的接口。其他模块可以通过调用PCI驱动提供的函数来访问设备的寄存器和内存区域,执行读写操作。 4. 中断处理:当PCI设备产生中断时,PCI驱动会负责处理中断并相应地通知到其他相关的模块和用户空间程序。它会注册中断处理函数,并将中断请求与相应的设备及其处理函数关联起来。 5. 硬件资源的管理:PCI驱动会跟踪管理系统中的PCI设备和它们所占用的硬件资源,包括内存空间、寄存器、DMA通道等。它会协调设备之间的资源冲突,确保每个设备能够按需访问和使用硬件资源。 通过这些工作,Linux内核的PCI驱动实现了对PCI设备的统一管理和控制,提供了稳定可靠的访问接口,使各个设备能够在系统中协同工作,实现各种功能和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值