VME 设备驱动程序

驱动程序注册

与 Linux 内核中的其他子系统一样,VME 设备驱动程序向 VME 子系统注册,通常从设备的初始化例程中调用。 这通过调用 vme_register_driver() 来实现。

必须向注册函数提供指向 struct vme_driver 类型结构的指针,以及您的驱动程序能够支持的最大设备数量。

至少应正确设置 struct vme_driver 的 ‘.name’、’.match’ 和 ‘.probe’ 元素。 ‘.name’ 元素是指向保存设备驱动程序名称的字符串的指针。

‘.match’ 函数允许控制应向哪个 VME 设备注册驱动程序。 如果应探测设备,则匹配函数应返回 1,否则返回 0。 此示例匹配函数(来自 vme_user.c)将探测的设备数量限制为一个

#define USER_BUS_MAX    1
...
static int vme_user_match(struct vme_dev *vdev)
{
        if (vdev->id.num >= USER_BUS_MAX)
                return 0;
        return 1;
}

‘.probe’ 元素应包含指向探测例程的指针。 探测例程将 struct vme_dev 指针作为参数传递。

在此,“num”字段是指此特定驱动程序的顺序设备 ID。 可以使用 dev->bridge->num 访问桥号(或总线号)。

还提供了一个函数来从 VME 内核取消注册驱动程序,该函数称为 vme_unregister_driver(),通常应从设备驱动程序的退出例程中调用该函数。

资源管理

驱动程序向 VME 内核注册后,将调用提供的匹配例程,调用的次数是在注册期间指定的。 如果匹配成功,则应返回非零值。 返回零值表示失败。 对于所有成功的匹配,将调用相应驱动程序的探测例程。 探测例程会传递一个指向设备设备结构的指针。 应保存此指针,请求 VME 资源时需要它。

驱动程序可以请求一个或多个主窗口 (vme_master_request())、从窗口 (vme_slave_request()) 和/或 DMA 通道 (vme_dma_request()) 的所有权。 API 不是允许设备驱动程序请求特定的窗口或 DMA 通道(可能被不同的驱动程序使用),而是允许根据相关驱动程序的所需属性分配资源。 对于从窗口,这些属性分为需要在“aspace”中访问的 VME 地址空间和在“cycle”中需要的 VME 总线周期类型。 主窗口在“width”中添加了一组额外的属性,用于指定所需的数据传输宽度。 这些属性定义为位掩码,因此可以为单个窗口请求属性的任何组合,内核将分配一个满足要求的窗口,返回一个 vme_resource 类型的指针,该指针应用于标识使用时分配的资源。 对于 DMA 控制器,请求函数需要以路由属性提供任何传输的潜在方向。 这通常是 VME 到 MEM 和/或 MEM 到 VME,尽管某些硬件可以支持 VME 到 VME 和 MEM 到 MEM 传输以及测试模式生成。 如果找不到符合要求的未分配窗口,则将返回 NULL 指针。

还提供了用于释放不再需要的窗口分配的函数。 这些函数 (vme_master_free()vme_slave_free()vme_dma_free()) 应传递在资源分配期间提供的资源指针。

主窗口

主窗口提供从本地处理器到 VME 总线的访问。 可用窗口的数量和可用的访问模式取决于底层芯片组。 窗口必须先配置才能使用。

主窗口配置

分配主窗口后,可以使用 vme_master_set() 进行配置,可以使用 vme_master_get() 检索当前设置。 地址空间、传输宽度和周期类型与资源管理下描述的相同,但是某些选项是互斥的。 例如,只能指定一个地址空间。

主窗口访问

函数 vme_master_read() 可用于从配置的主窗口读取,vme_master_write() 可用于写入配置的主窗口。

除了简单的读取和写入之外,还提供了 vme_master_rmw() 来执行读取-修改-写入事务。 还可以使用 vme_master_mmap() 将 VME 窗口的部分映射到用户空间内存中。

从窗口

从窗口提供 VME 总线上的设备访问到本地内存的映射部分。 可用窗口的数量和可以使用的访问模式取决于底层芯片组。 窗口必须先配置才能使用。

从窗口配置

分配从窗口后,可以使用 vme_slave_set() 进行配置,可以使用 vme_slave_get() 检索当前设置。

地址空间、传输宽度和周期类型与资源管理下描述的相同,但是某些选项是互斥的。 例如,只能指定一个地址空间。

从窗口缓冲区分配

提供了一些函数,允许用户分配 (vme_alloc_consistent()) 和释放 (vme_free_consistent()) VME 桥可访问的连续缓冲区。 这些函数不必使用,可以使用其他方法来分配缓冲区,但必须注意确保它们是连续的并且 VME 桥可以访问。

从窗口访问

从窗口将本地内存映射到 VME 总线上,应使用访问内存的标准方法。

DMA 通道

VME DMA 传输提供运行链接列表 DMA 传输的能力。 API 引入了 DMA 列表的概念。 每个 DMA 列表都是一个链接列表,可以传递给 DMA 控制器。 可以创建、扩展、执行、重用和销毁多个列表。

列表管理

提供了函数 vme_new_dma_list() 来创建 DMA 列表,提供了 vme_dma_list_free() 来销毁 DMA 列表。 列表的执行不会自动销毁列表,从而使列表可以重用于重复性任务。

列表填充

可以使用 vme_dma_list_add() 将项目添加到列表中(需要在调用此函数之前创建源和目标属性,这在“传输属性”下介绍)。

注意

在将条目添加到 DMA 列表之前,不会检查传输源和目标的详细属性,请求 DMA 通道只是检查控制器预期传输数据的方向。 因此,此调用可能会返回错误,例如,如果源或目标位于不受支持的 VME 地址空间中。

传输属性

源和目标的属性与将项目添加到列表中分开处理。 这是由于每种类型的源和目标所需的各种属性所致。 有一些函数可以为 PCI、VME 和模式源和目标(如果适用)创建属性

函数 vme_dma_free_attribute() 应用于释放属性。

列表执行

函数 vme_dma_list_exec() 将列表排队以供执行,并在列表执行完毕后返回。

中断

VME API 提供了一些函数,用于将回调附加到特定的 VME 级别和状态 ID 组合,以及用于生成具有特定 VME 级别和状态 ID 的 VME 中断。

附加中断处理程序

函数 vme_irq_request() 可用于附加,vme_irq_free() 可用于释放特定的 VME 级别和状态 ID 组合。 任何给定的组合只能分配一个回调函数。 提供了一个 void 指针参数,其值会传递给回调函数,此指针的用途由用户定义。 回调参数如下。 在编写回调函数时必须小心,回调函数在中断上下文中运行

void callback(int level, int statid, void *priv);

中断生成

函数 vme_irq_generate() 可用于在给定的 VME 级别和 VME 状态 ID 生成 VME 中断。

位置监视器

VME API 提供以下功能来配置位置监视器。

位置监视器管理

提供了函数 vme_lm_request() 来请求使用位置监视器块,提供了 vme_lm_free() 在不再需要它们后释放它们。 每个块可以提供多个位置监视器,监视相邻位置。 函数 vme_lm_count() 可用于确定提供了多少个位置。

位置监视器配置

分配了位置监视器库后,提供了函数 vme_lm_set() 来配置位置监视器的位置和模式。 函数 vme_lm_get() 可用于检索现有设置。

位置监视器使用

函数 vme_lm_attach() 允许将回调附加到每个位置监视器位置,vme_lm_detach() 允许从每个位置监视器位置分离。 每个位置监视器可以监视多个相邻位置。 回调函数声明如下。

void callback(void *data);

插槽检测

函数 vme_slot_num() 返回所提供的桥的插槽 ID。

总线检测

函数 vme_bus_num() 返回所提供的桥的总线 ID。

VME API

struct vme_dev

表示 VME 设备的结构

定义:

struct vme_dev {
    int num;
    struct vme_bridge *bridge;
    struct device dev;
    struct list_head drv_list;
    struct list_head bridge_list;
};

成员

num

设备号

bridge

指向此设备所在桥设备的指针

dev

内部设备结构

drv_list

设备列表(每个驱动程序)

bridge_list

设备列表(每个桥)

struct vme_driver

表示 VME 驱动程序的结构

定义:

struct vme_driver {
    const char *name;
    int (*match)(struct vme_dev *);
    int (*probe)(struct vme_dev *);
    void (*remove)(struct vme_dev *);
    struct device_driver driver;
    struct list_head devices;
};

成员

name

驱动程序名称,在 VME 驱动程序中应唯一,并且通常与模块名称相同。

match

用于确定是否应运行探测的回调。

probe

用于设备绑定的回调,在新设备被检测到时调用。

remove

回调,在删除设备时调用。

driver

底层通用设备驱动程序结构。

devices

与此驱动程序关联的 VME 设备列表 (struct vme_dev)。

void *vme_alloc_consistent(struct vme_resource *resource, size_t size, dma_addr_t *dma)

分配连续内存。

参数

struct vme_resource *resource

指向 VME 资源的指针。

size_t size

所需分配的大小。

dma_addr_t *dma

指向变量的指针,用于存储分配的物理地址。

描述

为驱动程序分配一个连续的内存块以供使用。 这用于创建从窗口的缓冲区。

返回

成功时返回分配的虚拟地址,失败时返回 NULL。

void vme_free_consistent(struct vme_resource *resource, size_t size, void *vaddr, dma_addr_t dma)

释放先前分配的内存。

参数

struct vme_resource *resource

指向 VME 资源的指针。

size_t size

要释放的分配的大小。

void *vaddr

分配的虚拟地址。

dma_addr_t dma

分配的物理地址。

描述

释放先前分配的连续内存块。

size_t vme_get_size(struct vme_resource *resource)

返回 VME 窗口大小的辅助函数

参数

struct vme_resource *resource

指向 VME 从属或主属资源的指针。

描述

确定所提供的 VME 窗口的大小。 这是一个辅助函数,它包装了对 vme_master_get 或 vme_slave_get 的调用,具体取决于传递给它的窗口资源类型。

返回

成功时返回窗口大小,失败时返回零。

struct vme_resource *vme_slave_request(struct vme_dev *vdev, u32 address, u32 cycle)

请求 VME 从设备窗口资源。

参数

struct vme_dev *vdev

指向分配给驱动程序实例的 VME 设备的指针 struct vme_dev

u32 address

所需的 VME 地址空间。

u32 cycle

所需的 VME 数据传输周期类型。

描述

请求使用一个 VME 窗口资源,该资源能够设置为请求的地址空间和数据传输周期。

返回

成功时返回指向 VME 资源的指针,失败时返回 NULL。

int vme_slave_set(struct vme_resource *resource, int enabled, unsigned long long vme_base, unsigned long long size, dma_addr_t buf_base, u32 aspace, u32 cycle)

设置 VME 从设备窗口配置。

参数

struct vme_resource *resource

指向 VME 从设备资源的指针。

int enabled

窗口应配置到的状态。

unsigned long long vme_base

窗口的基地址。

unsigned long long size

VME 窗口的大小。

dma_addr_t buf_base

用于提供 VME 从设备窗口存储的缓冲区的基地址。

u32 aspace

VME 窗口的 VME 地址空间。

u32 cycle

VME 窗口的 VME 数据传输周期类型。

描述

设置提供的 VME 从设备窗口的配置。

返回

成功时返回零,如果设备不支持该操作、提供了无效的资源或提供了无效的属性,则返回 -EINVAL。也可能返回硬件特定的错误。

设备错误,如果提供了无效资源或提供了无效属性。也可能返回硬件相关的错误。

int vme_slave_get(struct vme_resource *resource, int *enabled, unsigned long long *vme_base, unsigned long long *size, dma_addr_t *buf_base, u32 *aspace, u32 *cycle)

检索 VME 从设备窗口配置。

参数

struct vme_resource *resource

指向 VME 从设备资源的指针。

int *enabled

指向用于存储状态的变量的指针。

unsigned long long *vme_base

指向用于存储窗口基地址的变量的指针。

unsigned long long *size

指向用于存储窗口大小的变量的指针。

dma_addr_t *buf_base

指向用于存储从设备缓冲区基地址的变量的指针。

u32 *aspace

指向用于存储 VME 地址空间的变量的指针。

u32 *cycle

指向用于存储 VME 数据传输周期类型的变量的指针。

描述

返回提供的 VME 从设备窗口的配置。

返回

成功时返回零,如果设备不支持该操作、提供了无效的资源或提供了无效的属性,则返回 -EINVAL。也可能返回硬件特定的错误。

设备或提供了无效资源。

void vme_slave_free(struct vme_resource *resource)

释放 VME 从设备窗口

参数

struct vme_resource *resource

指向 VME 从设备资源的指针。

描述

释放提供的从设备资源,以便可以重新分配它。

struct vme_resource *vme_master_request(struct vme_dev *vdev, u32 address, u32 cycle, u32 dwidth)

请求 VME 主设备窗口资源。

参数

struct vme_dev *vdev

指向分配给驱动程序实例的 VME 设备的指针 struct vme_dev

u32 address

所需的 VME 地址空间。

u32 cycle

所需的 VME 数据传输周期类型。

u32 dwidth

所需的 VME 数据传输宽度。

描述

请求使用一个 VME 窗口资源,该资源能够设置为请求的地址空间、数据传输周期和宽度。

返回

成功时返回指向 VME 资源的指针,失败时返回 NULL。

int vme_master_set(struct vme_resource *resource, int enabled, unsigned long long vme_base, unsigned long long size, u32 aspace, u32 cycle, u32 dwidth)

设置 VME 主设备窗口配置。

参数

struct vme_resource *resource

指向 VME 主设备资源的指针。

int enabled

窗口应配置到的状态。

unsigned long long vme_base

窗口的基地址。

unsigned long long size

VME 窗口的大小。

u32 aspace

VME 窗口的 VME 地址空间。

u32 cycle

VME 窗口的 VME 数据传输周期类型。

u32 dwidth

VME 窗口的 VME 数据传输宽度。

描述

设置提供的 VME 主设备窗口的配置。

返回

成功时返回零,如果设备不支持该操作、提供了无效的资源或提供了无效的属性,则返回 -EINVAL。也可能返回硬件特定的错误。

设备错误,如果提供了无效资源或提供了无效属性。也可能返回硬件相关的错误。

int vme_master_get(struct vme_resource *resource, int *enabled, unsigned long long *vme_base, unsigned long long *size, u32 *aspace, u32 *cycle, u32 *dwidth)

检索 VME 主设备窗口配置。

参数

struct vme_resource *resource

指向 VME 主设备资源的指针。

int *enabled

指向用于存储状态的变量的指针。

unsigned long long *vme_base

指向用于存储窗口基地址的变量的指针。

unsigned long long *size

指向用于存储窗口大小的变量的指针。

u32 *aspace

指向用于存储 VME 地址空间的变量的指针。

u32 *cycle

指向用于存储 VME 数据传输周期类型的变量的指针。

u32 *dwidth

指向用于存储 VME 数据传输宽度的变量的指针。

描述

返回提供的 VME 主设备窗口的配置。

返回

成功时返回零,如果设备不支持该操作、提供了无效的资源或提供了无效的属性,则返回 -EINVAL。也可能返回硬件特定的错误。

设备或提供了无效资源。

ssize_t vme_master_read(struct vme_resource *resource, void *buf, size_t count, loff_t offset)

将数据从 VME 空间读入缓冲区。

参数

struct vme_resource *resource

指向 VME 主设备资源的指针。

void *buf

指向应该传输数据的缓冲区的指针。

size_t count

要传输的字节数。

loff_t offset

从 VME 主设备窗口的哪个偏移量开始传输。

描述

执行从 VME 总线上某个位置读取 count 个字节的数据的操作,该位置映射到 VME 主设备窗口中偏移量为 offset 的位置,并将数据读取到 buf 中。

返回

读取的字节数,如果资源不是 VME 主设备资源或不支持读取操作,则返回 -EINVAL。如果提供了无效的偏移量,则返回 -EFAULT。也可能返回硬件特定的错误。

不支持资源或读取操作。如果提供了无效偏移量,则返回-EFAULT。也可能返回硬件相关的错误。

ssize_t vme_master_write(struct vme_resource *resource, void *buf, size_t count, loff_t offset)

将数据从缓冲区写入 VME 空间。

参数

struct vme_resource *resource

指向 VME 主设备资源的指针。

void *buf

指向包含要传输的数据的缓冲区的指针。

size_t count

要传输的字节数。

loff_t offset

从 VME 主设备窗口的哪个偏移量开始传输。

描述

执行将 buf 中的 count 个字节的数据写入 VME 总线上某个位置的操作,该位置映射到 VME 主设备窗口中偏移量为 offset 的位置。

返回

写入的字节数,如果资源不是 VME 主设备资源或不支持写入操作,则返回 -EINVAL。如果提供了无效的偏移量,则返回 -EFAULT。也可能返回硬件特定的错误。

不支持资源或写入操作。如果提供了无效偏移量,则返回-EFAULT。也可能返回硬件相关的错误。

unsigned int vme_master_rmw(struct vme_resource *resource, unsigned int mask, unsigned int compare, unsigned int swap, loff_t offset)

执行读-修改-写周期。

参数

struct vme_resource *resource

指向 VME 主设备资源的指针。

unsigned int mask

要在操作中比较和交换的位。

unsigned int compare

要与从偏移量读取的数据进行比较的位。

unsigned int swap

要交换到从偏移量读取的数据中的位。

loff_t offset

要在 VME 主设备窗口中执行操作的偏移量。

描述

对提供的位置执行读-修改-写周期: - 读取 VME 总线上的位置。 - 由 mask 选择的位与 compare 进行比较。 - 如果选定的位与 compare 中的位匹配,并且在 swap 中被选中,则交换该位。 - 结果写回 VME 总线上的位置。

返回

成功时返回写入的字节数,如果资源不是 VME 主设备资源或不支持 RMW 操作,则返回 -EINVAL。也可能返回硬件特定的错误。

不支持资源或RMW操作。也可能返回硬件相关的错误。

int vme_master_mmap(struct vme_resource *resource, struct vm_area_struct *vma)

将 VME 主设备窗口的区域进行内存映射。

参数

struct vme_resource *resource

指向 VME 主设备资源的指针。

struct vm_area_struct *vma

指向用户映射的定义的指针。

描述

将 VME 主设备窗口的一个区域内存映射到用户空间。

返回

成功时返回零,如果资源不是 VME 主设备资源,则返回 -EINVAL,如果映射超出窗口大小,则返回 -EFAULT。也可能返回其他通用 mmap 错误。

如果映射超出窗口大小,则返回资源或-EFAULT。也可能返回其他通用mmap错误。

void vme_master_free(struct vme_resource *resource)

释放 VME 主设备窗口

参数

struct vme_resource *resource

指向 VME 主设备资源的指针。

描述

释放提供的主设备资源,以便可以重新分配它。

struct vme_resource *vme_dma_request(struct vme_dev *vdev, u32 route)

请求 DMA 控制器。

参数

struct vme_dev *vdev

指向分配给驱动程序实例的 VME 设备的指针 struct vme_dev

u32 route

所需的源/目标组合。

描述

请求一个 VME DMA 控制器,该控制器能够执行请求的源/目标组合之间的传输。

返回

成功时返回指向 VME DMA 资源的指针,失败时返回 NULL。

struct vme_dma_list *vme_new_dma_list(struct vme_resource *resource)

创建新的 VME DMA 列表。

参数

struct vme_resource *resource

指向 VME DMA 资源的指针。

描述

创建一个新的 VME DMA 列表。用户有责任在使用 vme_dma_list_free() 释放不再需要的列表。

返回

指向新的 VME DMA 列表的指针,分配失败或无效的 VME DMA 资源时返回 NULL。

VME DMA资源。

struct vme_dma_attr *vme_dma_pattern_attribute(u32 pattern, u32 type)

创建 “Pattern” 类型 VME DMA 列表属性。

参数

u32 pattern

用作模式的值

u32 type

要写入的模式的类型。

描述

创建用于模式生成的 VME DMA 列表属性。用户有责任使用 vme_dma_free_attribute() 释放已使用的属性。

返回

指向 VME DMA 属性的指针,失败时返回 NULL。

struct vme_dma_attr *vme_dma_pci_attribute(dma_addr_t address)

创建“PCI”类型VME DMA列表属性。

参数

dma_addr_t address

DMA传输的PCI基地址。

描述

创建指向PCI上位置的VME DMA列表属性,用于DMA传输。用户有责任使用vme_dma_free_attribute()释放使用的属性。

返回

指向 VME DMA 属性的指针,失败时返回 NULL。

struct vme_dma_attr *vme_dma_vme_attribute(unsigned long long address, u32 aspace, u32 cycle, u32 dwidth)

创建“VME”类型VME DMA列表属性。

参数

unsigned long long address

DMA传输的VME基地址。

u32 aspace

用于DMA传输的VME地址空间。

u32 cycle

用于DMA传输的VME总线周期。

u32 dwidth

用于DMA传输的VME数据宽度。

描述

创建指向VME总线上位置的VME DMA列表属性,用于DMA传输。用户有责任使用vme_dma_free_attribute()释放使用的属性。

返回

指向 VME DMA 属性的指针,失败时返回 NULL。

void vme_dma_free_attribute(struct vme_dma_attr *attributes)

释放DMA列表属性。

参数

struct vme_dma_attr *attributes

指向DMA列表属性的指针。

描述

释放VME DMA列表属性。一旦vme_dma_list_add()返回,可以安全地释放VME DMA列表属性。

int vme_dma_list_add(struct vme_dma_list *list, struct vme_dma_attr *src, struct vme_dma_attr *dest, size_t count)

将条目添加到VME DMA列表。

参数

struct vme_dma_list *list

指向VME列表的指针。

struct vme_dma_attr *src

指向用作源的DMA列表属性的指针。

struct vme_dma_attr *dest

指向用作目标的DMA列表属性的指针。

size_t count

要传输的字节数。

描述

将条目添加到提供的VME DMA列表。该条目需要指向源和目标DMA属性的指针以及计数。

请注意,作为传输的源和目标支持的属性取决于硬件。

返回

成功时返回零,如果设备不支持该操作、提供了无效的资源或提供了无效的属性,则返回 -EINVAL。也可能返回硬件特定的错误。

设备错误,或者如果链接列表已经提交执行。也可能出现硬件相关错误。

int vme_dma_list_exec(struct vme_dma_list *list)

将VME DMA列表排队以供执行。

参数

struct vme_dma_list *list

指向VME列表的指针。

描述

将提供的VME DMA列表排队以供执行。一旦列表被执行,调用将返回。

返回

成功时返回零,如果设备不支持该操作、提供了无效的资源或提供了无效的属性,则返回 -EINVAL。也可能返回硬件特定的错误。

设备错误。也可能出现硬件相关错误。

int vme_dma_list_free(struct vme_dma_list *list)

释放VME DMA列表。

参数

struct vme_dma_list *list

指向VME列表的指针。

描述

释放提供的DMA列表及其所有条目。

返回

成功时返回零,无效VME资源时返回-EINVAL,资源

仍在被使用时返回-EBUSY。也可能出现硬件相关错误。

int vme_dma_free(struct vme_resource *resource)

释放VME DMA资源。

参数

struct vme_resource *resource

指向 VME DMA 资源的指针。

描述

释放提供的DMA资源,以便可以重新分配它。

返回

成功时返回零,无效VME资源时返回-EINVAL,资源

仍在活动状态。

int vme_irq_request(struct vme_dev *vdev, int level, int statid, void (*callback)(int, int, void*), void *priv_data)

请求特定的VME中断。

参数

struct vme_dev *vdev

指向分配给驱动程序实例的 VME 设备的指针 struct vme_dev

int level

正在请求的中断优先级。

int statid

正在请求的中断向量。

void (*callback)(int, int, void *)

指向接收到VME中断/向量时调用的回调函数的指针。

void *priv_data

将传递给回调函数的通用指针。

描述

请求将回调附加为具有提供的级别和statid的VME中断的处理程序。

返回

成功时返回零,无效的vme设备、级别或如果不

支持该函数时返回-EINVAL,如果级别/statid组合已被使用时返回-EBUSY。也可能出现硬件相关错误。

void vme_irq_free(struct vme_dev *vdev, int level, int statid)

释放VME中断。

参数

struct vme_dev *vdev

指向分配给驱动程序实例的 VME 设备的指针 struct vme_dev

int level

正在释放的中断的中断优先级。

int statid

正在释放的中断的中断向量。

描述

从VME中断优先级/向量中移除先前附加的回调。

int vme_irq_generate(struct vme_dev *vdev, int level, int statid)

生成VME中断。

参数

struct vme_dev *vdev

指向分配给驱动程序实例的 VME 设备的指针 struct vme_dev

int level

断言中断的中断优先级。

int statid

与中断关联的中断向量。

描述

生成具有提供的级别和statid的VME中断。

返回

成功时返回零,无效的vme设备、级别或如果不

不支持该函数。也可能出现硬件相关错误。

struct vme_resource *vme_lm_request(struct vme_dev *vdev)

请求VME位置监视器

参数

struct vme_dev *vdev

指向分配给驱动程序实例的 VME 设备的指针 struct vme_dev

描述

为驱动程序分配位置监视器资源。位置监视器允许驱动程序监视对VME总线上连续地址的访问。

返回

成功时返回指向VME资源的指针,失败时返回NULL。

int vme_lm_count(struct vme_resource *resource)

确定监视的VME地址数

参数

struct vme_resource *resource

指向VME位置监视器资源的指针。

描述

监视的连续地址的数量取决于硬件。返回位置监视器监视的连续地址的数量。

返回

监视的地址计数,或者当提供一个

无效的位置监视器资源时,返回-EINVAL。

int vme_lm_set(struct vme_resource *resource, unsigned long long lm_base, u32 aspace, u32 cycle)

配置位置监视器

参数

struct vme_resource *resource

指向VME位置监视器资源的指针。

unsigned long long lm_base

要监视的基地址。

u32 aspace

要监视的VME地址空间。

u32 cycle

要监视的VME总线周期类型。

描述

设置要由位置监视器监视的访问的基地址、地址空间和周期类型。

返回

成功时返回零,当提供无效的位置

监视器资源或不支持该函数时,返回-EINVAL。也可能返回硬件相关的错误。

int vme_lm_get(struct vme_resource *resource, unsigned long long *lm_base, u32 *aspace, u32 *cycle)

检索位置监视器设置

参数

struct vme_resource *resource

指向VME位置监视器资源的指针。

unsigned long long *lm_base

用于输出监视的基地址的指针。

u32 *aspace

用于输出监视的地址空间的指针。

u32 *cycle

用于输出监视的VME总线周期类型的指针。

描述

检索要由位置监视器监视的访问的基地址、地址空间和周期类型。

返回

成功时返回零,当提供无效的位置

监视器资源或不支持该函数时,返回-EINVAL。也可能返回硬件相关的错误。

int vme_lm_attach(struct vme_resource *resource, int monitor, void (*callback)(void*), void *data)

为位置监视器地址提供回调

参数

struct vme_resource *resource

指向VME位置监视器资源的指针。

int monitor

应附加回调的偏移量。

void (*callback)(void *)

指向触发时调用的回调函数的指针。

void *data

将传递给回调函数的通用指针。

描述

将回调附加到位置监视器监视的地址中指定的偏移量。提供一个通用指针,以便在调用时可以将数据传递给回调。

返回

成功时返回零,当提供无效的位置

监视器资源或不支持该函数时,返回-EINVAL。也可能返回硬件相关的错误。

int vme_lm_detach(struct vme_resource *resource, int monitor)

移除位置监视器地址的回调

参数

struct vme_resource *resource

指向VME位置监视器资源的指针。

int monitor

应移除回调的偏移量。

描述

移除与位置监视器监视的地址中指定的偏移量关联的回调。

返回

成功时返回零,当提供无效的位置

监视器资源或不支持该函数时,返回-EINVAL。也可能返回硬件相关的错误。

void vme_lm_free(struct vme_resource *resource)

释放已分配的VME位置监视器

参数

struct vme_resource *resource

指向VME位置监视器资源的指针。

描述

释放VME位置监视器的分配。

警告:此函数当前期望已

经附加到位置监视器的任何回调都已被移除。

返回

成功时返回零,当提供无效的位置

监视器资源。

int vme_slot_num(struct vme_dev *vdev)

检索插槽ID

参数

struct vme_dev *vdev

指向分配给驱动程序实例的 VME 设备的指针 struct vme_dev

描述

检索与提供的VME设备关联的插槽ID。

返回

成功时返回插槽ID,如果无法确定VME桥接

或者不支持该函数,则返回-EINVAL。也可能返回硬件相关的错误。

int vme_bus_num(struct vme_dev *vdev)

检索总线号

参数

struct vme_dev *vdev

指向分配给驱动程序实例的 VME 设备的指针 struct vme_dev

描述

检索与提供的VME设备关联的总线枚举。

返回

成功时返回总线号,如果无法确定VME桥接,

则返回-EINVAL。

int vme_register_driver(struct vme_driver *drv, unsigned int ndevs)

注册一个 VME 驱动

参数

struct vme_driver *drv

指向要注册的 VME 驱动程序结构的指针。

unsigned int ndevs

允许枚举的最大设备数量。

描述

向 VME 子系统注册 VME 设备驱动程序。

返回

成功时返回零,注册失败时返回错误值。

void vme_unregister_driver(struct vme_driver *drv)

注销一个 VME 驱动

参数

struct vme_driver *drv

指向要注销的 VME 驱动程序结构的指针。

描述

从 VME 子系统注销 VME 设备驱动程序。