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。也可能返回硬件特定的错误。

设备,如果提供了无效的资源或提供了无效的属性,则返回 -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。也可能返回硬件特定的错误。

设备,如果提供了无效的资源或提供了无效的属性,则返回 -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 总线上映射到 VME 主设备窗口的偏移量位置读取计数字节的数据到 buf。

返回

读取的字节数,如果资源不是 VME 主设备则返回 -EINVAL

资源或不支持读取操作。如果提供了无效的偏移量,则返回 -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 到 VME 总线上映射到偏移量位置的 VME 主设备窗口写入计数字节的数据。

返回

写入的字节数,如果资源不是 VME 主设备则返回 -EINVAL

资源或不支持写入操作。如果提供了无效的偏移量,则返回 -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 总线上的位置。 - 使用掩码选择的位与比较进行比较。 - 如果选定的位与比较中的位匹配并在交换中选择,则交换该位。 - 结果写回 VME 总线上的位置。

返回

成功写入的字节数,如果资源不是 VME 主设备则返回 -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 主窗口的区域内存映射到用户空间。

返回

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

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

void vme_master_free(struct vme_resource *resource)

释放 VME 主窗口。

参数

struct vme_resource *resource

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

描述

释放提供的 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)

创建“模式”类型的 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 上 DMA 传输位置的 VME 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 总线上 DMA 传输位置的 VME 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 列表及其所有条目。

返回

成功返回 0,如果 VME 资源无效则返回 -EINVAL,如果资源

仍在使用中则返回 -EBUSY。 也可能发生特定于硬件的错误。

int vme_dma_free(struct vme_resource *resource)

释放 VME DMA 资源。

参数

struct vme_resource *resource

指向 VME DMA 资源的指针。

描述

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

返回

成功返回 0,如果 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 位置监视器的分配。

警告:此函数当前期望已

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

返回

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

监视器资源。

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 设备驱动程序。