9.硬件接口

硬件处理

函数名

功能

函数形成

参数

描述

Disable_irq_nosync

不用等待使一个irq无效

void inline disable_irq_nosync (unsigned int irq)

irq为中断号

使所选择的中断线无效。使一个中断无效。与disable_ irq不同,这个函数并不确保IRQ处理程序的现有实例在退出前已经完成。可以从IRQ的上下文中调用该函数。

Disable_irq

等待完成使一个irq无效

void disable_irq (unsigned int irq)

irq为中断号

使所选择的中断线无效。使一个中断无效。

这个函数要等待任何挂起的处理程序在退出之前已经完成。如果你在使用这个函数,同时还持有IRQ处理程序可能需要的一个资源,那么,你就可能死锁。要小心地从IRQ的上下文中调用这个函数。

Enable_irq

启用irq

void enable_irq (unsigned int irq)

irq为中断号

重新启用这条IRQ线上的中断处理。在IRQ的上下文中调用这个函数。

Probe_irq_mask

扫描中断线的位图

unsigned int probe_irq_mask (unsigned long val)

val为要考虑的中断掩码

扫描ISA总线的中断线,并返回活跃中断的位图。然后把中断探测的逻辑状态返回给它以前的值。

MTRR处理

Mtrr_add

增加一种内存区类型

int mtrr_add (unsigned long base, unsigned long size, unsigned int type, char

increment)

base为内存区的物理基地址,size为内存区大小,typeMTRR期望的类型,increment为布尔值,如果为真,则增加该内存区的引用计数。

内存区类型寄存器控制着较新的Intel处理器或非Intel处理器上的高速缓存。这个函数可以增加请求MTRR的驱动程序。每个处理器实现的详细资料和硬件细节都对调用者隐藏。如果不能增加内存区,则可能因为所有的区都在使用,或CPU就根本不支持,于是返回一个负数。成功则返回一个寄存器号,但应当仅仅当作一个cookie来对待。

可用的类型为:

MTRR_TYPE_UNCACHEABLE :无高速缓存

MTRR_TYPE_WRITEBACK:随时以猝发方式写回MTRR_TYPE_WRCOMB:立即写回,但允许猝发

Mtrr_del

删除一个内存区类型

int mtrr_del (int reg, unsigned long base, unsigned long size);

reg为由mtrr_add返回的寄存器,base为物理基地址,size为内存区大小。

如果提供了寄存器reg,则basesize都可忽略。这就是驱动程序如何调用寄存器。如果引用计数降到0,则释放该寄存器,该内存区退回到缺省状态。成功则返回寄存器,失败则返回一个负数。

PCI支持库

pci_find_slot

从一个给定的PCI插槽定位PCI

struct pci_dev * pci_find_slot (unsigned int bus, unsigned int devfn)

bus为所找PCI设备所驻留的PCI总线的成员,devfnPCI插槽的成员。

给定一个PCI总线和插槽号,所找的PCI设备位于PCI设备的系统全局链表中。如果设备被找到,则返回一个指向它的数据结构,否则返回空。

pci_find_device

根据PCI标识号开始或继续搜索一个设备

struct pci_dev * pci_find_device (unsigned int vendor, unsigned int device,

const struct pci_dev * from)

vendor为要匹配的PCI商家id,或要与所有商家id匹配的PCI_ANY_IDdevice为要匹配的PCI设备id,或要与所有商家id匹配的PCI_ANY_IDfrom为以前搜索中找到的PCI设备,或对于一个新的搜索来说为空。

循环搜索已知PCI设备的链表。如果找到与vendordevice匹配的PCI设备,则返回指向设备结构的指针,否则返回NULL

from参数传递NULL参数则开始一个新的搜索,否则,如果from不为空,则从那个点开始继续搜索。

 

pci_find_class

根据类别开始或继续搜索一个设备

struct pci_dev * pci_find_class (unsigned int class, const struct pci_dev *

from)

class:根据类别名称搜索PCI设备;

Previous:在搜索着找到的PCI设备,对于新的搜索则为NULL

 

循环搜索已知PCI设备的链表。如果找到与 class匹配的PCI设备,则返回指向设备结构的指针,否则返回NULL

from参数传递NULL参数则开始一个新的搜索,否则,如果from不为空,则从那个点开始继续搜索。

pci_find_capability

查询设备的权能

int pci_find_capability (struct pci_dev * dev, int cap)

dev为要查询的PCI设备,

cap为权能取值。

 

断定一个设备是否支持给定PCI权能。返回在设备PCI配置空间内所请求权能结构的地址,如果设备不支持这种权能,则返回0

pci_find_parent_resource

返回给定区父总线的资源区

struct resource * pci_find_parent_resource (const struct pci_dev * dev,

struct resource * res)

dev为设备结构,该结构包括要搜索的资源,res为要搜索的子资源记录。

对于给定设备的给定资源区,返回给定区所包含的父总线的资源区。

pci_set_power_state

设置一个设备电源管理的状态。

int pci_set_power_state (struct pci_dev * dev, int new_state)

devPCI设备,new_state为新的电源管理声明(0 == D0, 3 == D3)

设置设备的电源管理状态。对于从状态D3的转换,并不像想象的那么简单,因为很多设备在唤醒期间忘了它们的配置空间。返回原先的电源状态。

pci_save_state

保存设备在挂起之前PCI的配置空间

int pci_save_state (struct pci_dev * dev, u32 * buffer)

dev为我们正在处理的PCI设备,buffer为持有配置空间的上下文。

缓冲区必须足够大,以保持整个PCI2.2的配置空间(>= 64 bytes)

pci_restore_state

恢复PCI设备保存的状态

int pci_restore_state (struct pci_dev * dev, u32 * buffer)

dev为我们正在处理的PCI设备,buffer为保存的配置空间。

 

pci_enable_device

驱动程序使用设备前进行初始化

int pci_enable_device (struct pci_dev * dev)

dev为要初始化的PCI设备。

驱动程序使用设备前对设备进行初始化。请求低级代码启用I/O和内存。如果设备被挂起,则唤醒它。小心,这个函数可能失败。

pci_disable_device

使用PCI设备之后使其无效

void pci_disable_device (struct pci_dev * dev)

dev为使无效的PCI设备

向系统发送信号,以表明系统不再使用PCI设备。这仅仅包括使PCI总线控制(如果激活)无效。

pci_enable_wake

当设备被挂起时启用设备产生PME#

int pci_enable_wake (struct pci_dev * dev, u32 state, int enable)

dev为对其实施操作的PCI 设备,state为设备的当前状态,enable为启用或禁用“产生”的标志。

当系统被挂起时,在设备的PM能力中设置位以产生PME#。如果设备没有PM能力,则返回-EIO。如果设备支持它,则返回-EINVAL,但不能产生唤醒事件。如果操作成功,则返回0

pci_release_regions

释放保留的PCI I/O和内存资源

void pci_release_regions (struct pci_dev * pdev)

pdev PCI设备,其资源以前曾由pci_request_regions保留。

释放所有的PCI I/O和以前对pci_request_regions成功调用而使用的内存。只有在PCI区的所有使用都停止后才调用这个函数。

pci_request_regions

保留PCI I/O和内存资源

int pci_request_regions (struct pci_dev * pdev, char * res_name)

pdevPCI设备,它的资源要被保留,res_name为与资源相关的名字。

把所有与PCI设备pdev相关联的PCI区进行标记,设备pdev是由属主res_name保留的。除非这次调用成功返回,否则不要访问PCI内的任何地址。

成功返回0,出错返回EBUSY,失败时也打印警告信息。

pci_register_driver

注册一个PCI设备

int pci_register_driver (struct pci_driver * drv)

drv为要注册的驱动程序结构。

 

 

 

把驱动程序结构增加到已注册驱动程序链表,返回驱动程序注册期间所声明的PCI设备号。即使返回值为0,驱动程序仍然是已注册。

pci_unregister_driver

注销一个PCI设备

void pci_unregister_driver (struct pci_driver * drv)

drv为要注销的驱动程序结构。

 

从已注册的PCI驱动程序链表中删除驱动程序结构,对每个驱动程序所驱动的设备,通过调用驱动程序的删除函数,给它一个清理的机会,把把这些设备标记为无驱动程序的。

pci_insert_device

插入一个热插拔设备

void pci_insert_device (struct pci_dev * dev, struct pci_bus * bus)

dev为要插入的设备,busPCI总线,设备就插入到该总线。

把一个新设备插入到设备列表,并向用户空间(/sbin/hotplug)发出通知。

pci_remove_device

删除一个热插拔设备

void pci_remove_device (struct pci_dev * dev)

dev为要删除的设备

把一个新设备从设备列表删除,并向用户空间(/sbin/hotplug)发出通知。

pci_dev_driver

获得一个设备的pci_driver

struct pci_driver * pci_dev_driver (const struct pci_dev * dev)

dev为要查询的设备

返回合适的pci_driver结构,如果一个设备没有注册的驱动程序,则返回NULL

 

pci_set_master

为设备dev启用总线控制

void pci_set_master (struct pci_dev * dev)

dev为要启用的设备

启用设备上的总线控制,并调用pcibios_set_master对特定的体系结构进行设置。

pci_setup_device

填充一个设备的类和映射信息

int pci_setup_device (struct pci_dev * dev)

dev为要填充的设备结构

用有关设备的商家、类型、内存及IO空间地址,IRO线等初始化设备结构。在PCI子系统初始化时调用该函数。成功返回0,设备类型未知返回-1