PCI驱动程序 (国嵌)

PCI驱动程序 

总线是一种传输信号的信道; 总线是连接一个或多个导体的电气连线。
总线由电气接口和编程接口组成,我们重点关注编程接口。


PCI是Peripheral Component Interconnect(外围设备互联) 的简称, 是在桌面及更大型的计算机上普遍使用的外设总线。

PCI总线具有三个非常显著的优点:
1在计算机和外设间传输数据时具有更好的性能
2能够尽量独立于具体的平台
3可以方便地实现即插即用

PCI总线依赖于一个PCI桥(是一个硬件设备)才能生成出来。

PCI总线上挂载设备数量有限

每个PCI设备由一个总线号、一个设备号和一个功能号确定。PCI规范允许一个系统最多拥有256条总线,每条总线最多带32个设备,但每个设备可以是最多8个功能的多功能板


lspci查看设备,画出PCI设备结构图

/proc/iomem描述了 系统中所有的设备I/O在内 存地址空间上的映射。我们来看地址从1G开始的第一个设备在
/proc/iomem中是如何描述的:
40000000-400003ff : 0000:00:1 f.1
这是一个PCI设备, 40000000-400003ff是它所映射的内存空间地址, 占据了 内 存地址空间 1024 bytes的位置, 
而0000:00:1 f.1则是这个PCI外设的地址,它以冒号和逗号分隔为 4个部分,
     0000:00:1 f.1
第一个16位表示域
第二个8位表示一个总线号 
第三个5位表示一个设备号 
最后是3位, 表示功能号。

    每个PCI设备都有一组固定格式的寄存器, 即配置寄存器, 配置寄存器由Linux内核中的PCI初始化代码与驱动程序共同使用 。内核在启动时负责对配置寄存器进行初始化,包括设置中断号以及I/O基址等。

00H—01 H Vendor ID 制造商标识
02H—03H Device ID 设备标识
04H—05H Command 命令寄存器
06H—07H Status 状态寄存器
08H Revision ID 版本识别号寄存器
09H—0bH Class Code 分类代码寄存器
0cH Cache Line Size CACHE行长度寄存器
0dH Latency Timer 主设备延迟时间寄存器
0eH Header Type 头标类型寄存器
0fH Bulit-in-teset Register 自测试寄存器
10H—13H Base Address Register 0 基地址寄存器0
14H—17H Base Address Register 1 基地址寄存器1
18H—1bH Base Address Register 2 基地址寄存器2
1cH—19H Base Address Register 3 基地址寄存器3
20H—23H Base Address Register 4 基地址寄存器4
24H—27H Base Address Register 5 基地址寄存器5
28H—2bH Cardbus CIS Pointer 设备总线CIS指针寄存器
2cH—2dH Subsystem Vendor ID 子设备制造商标识
2eH—2fH Subsystem Device ID 子设备标识
30H—33H Expasion ROM Base Address 扩展ROM基地址
34H—3bH ——— 保留
3cH Interrupt Line 中断线寄存器
3dH Interrupt Pin 中断引脚寄存器
3eH Min_Gnt 最小授权寄存器
3fH Max_Lat 最大延迟寄存器

 

PCI驱动程序
1.使用struct pci_driver结构来描述
成员
id_table //驱动支持的设备列表
(*probe) //函数指针
(*remove)//函数指针

 


2.PCI驱动注册

pci_register_driver(struct pci_driver *drv)


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

pci_enable_device(struct pci_dev *dev)

4.获取基地址

一个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)
返回指定区域的末地址。


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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值