反射内存卡在linux系统下驱动安装说明
来源: | 作者:拓航科技 | 发布时间: 2025-06-26 | 263 次浏览 | 分享到:

安装说明

SFT-RFM2G-LNX

适用于 Linux RFM2g 共享内存设备驱动程序

 

本文档阐述了如何安装 RFM2g 驱动程序,包括可能需要的内核引导选项。同时,还讨论了为进出反射内存的 DMA 传输分配的专用缓冲区。

 

目录

1.  RFM2G 驱动程序安装

2.  RFM2G 驱动程序卸载

3.  防止将反射内存映射到虚拟空间时出现问题

4.  DMA 缓冲区分配

 

#############################################################################

1.  RFM2G 驱动程序安装

 

在安装 RFM2g 驱动程序之前,请切断计算机电源并将 RFM2g 板插入 PCI PMC 插槽。然后启动计算机。

卸载计算机上任何其他现有的 RFM2g 驱动程序。请参阅下面的 RFM2G 驱动程序卸载。

RFM2g 驱动程序以 zip 文件形式分发,文件名为 `162-RFM2G-DRV-LNX_R11_00`

解压并将 `rfm2g` 文件夹复制到您的主目录或所需位置。

注意: 在使用 Ubuntu 20.04 及更高版本时,请将 `"Ubuntu 20.04 and Greater"` 文件夹中的 Makefile 替换掉 `rfm2g/driver` 目录中的原始 Makefile

RFM2g 驱动程序使用统一的 Makefile,适用于单处理器和 SMP 机器。

root 用户身份登录后,通过输入以下命令构建驱动程序、API 库和诊断程序:

 

诊断程序是一个命令行解释器,允许用户通过键盘执行各种 RFM2g API 命令。切换到 `rfm2g/diags` 目录并输入:

 

输入 `help` 可显示命令列表。

注意: 启动 `rfm2g_util` 时可能会出现“分配失败”("allocation failed")错误。请参阅下面的 防止将反射内存映射到虚拟空间时出现问题 以获取解决方案。

 

 

 

#############################################################################

2.  RFM2G 驱动程序卸载

要卸载 RFM2g 驱动程序,请以 root 用户身份登录并切换到 `rfm2g` 目录。输入命令:

 

这将卸载除原始源代码之外的所有内容。

要完全删除源代码,只需删除 `rfm2g` 目录即可。

#############################################################################

3.  防止将反射内存映射到虚拟空间时出现问题

基于 x86 32 位系统的 Linux 内核仅限于 4GB 的虚拟地址空间。标准的 Linux 内核将这 4GB 空间划分为 3GB 用于用户空间,1GB 用于内核。内核会创建已安装系统内存的直接映射、驱动程序发出的 I/O 映射请求以及其他 I/O 资源。默认情况下,标准内核保留 128MB 来处理这些映射。

当内核映射了 1GB 或更多的系统内存,然后尝试映射一个或多个 RFM2g 板(每块板最多包含 256MB RAM)的内存时,可用的虚拟地址空间可能会很快耗尽。

请参阅硬件参考手册设置 DIP 开关 2,将 RFM 板使用的 RAM 量从 256MB 128MB 降低 到 64MB16MB 2MB,直到映射成功为止。

 

#############################################################################

4.  DMA 缓冲区分配

适用于 Linux RFM2g 驱动程序支持在用户进程和反射内存之间进行 DMA 传输。由于不支持分散聚集(scatter-gatherDMA,因此必须分配并使用一块连续的 RAM 作为 DMA 缓冲区。为了保证 DMA 缓冲区由连续的 RAM 组成,需要阻止 Linux 访问该 RAM。这通过使用引导参数保留一部分高端内存来实现。之后,用户进程可以使用 RFM2g API 函数在保留的高端内存区域中分配和映射一个 DMA 缓冲区。

要在高端内存区域保留 DMA 缓冲区,请使用内核引导参数 `mem=XXXXM` 来告知 Linux 内核要使用多少 RAM。建议使用 8MB DMA 缓冲区用于 API DMA 写入和读取。

`mem=XXXXM` 引导参数需要添加到您引导的内核的 "kernel" 行中,该行位于 Grub 配置文件(通常在 `/etc/default/grub`)中。

请参考 `rfm2g_dma.c` 示例,了解如何使用 DMA 读写来实现最佳性能。



支持版本

README.txt Abaco Systems, Inc.

 

版权 (C) 2002, 2005-2020 Abaco Systems, Inc.

受国际版权保护。保留所有权利。

 

这是 Abaco Systems, Inc. Linux 开发的 RFM2g 反射内存设备驱动程序:

 

支持的内核/发行版:

       (4.x 内核): Fedora 23 64, Ubuntu 14.04, Ubuntu 16.04, Ubuntu 18.04 Ubuntu 20.04, Red Hat Enterprise Linux 版本 8.0 8.2

           注意: Ubuntu 20.04 及更高版本需要替换 `rfm2g/driver` 目录下的 `Makefile` 文件。请参阅 "Ubuntu 20.04 and Greater" (Ubuntu 20.04 及更高版本) 文件夹。

       (3.x 内核): Ubuntu 14.04 64, Fedora 20 64, Red Hat Enterprise Linux 版本 7.1 7.8

       (2.4 内核): Red Hat(tm) 7.2, 7.3, 8.0, 9.0

       (2.6 内核): Red Hat(tm) Enterprise Linux 5

       (2.6 内核): Fedora Core 2, 3, 4, 6, 8, 12

       (X86-64 内核): Fedora Core 5 Fedora 8

       (2.4 内核): Red Haggis Linux LSP-7436 (适用于 PPC 平台)

 

此版本实现了以下功能集:

 

   `打开 (Open)`

   `关闭 (Close)`

   `从反射内存读取缓冲区 (Read a buffer from reflective memory)`

   `向反射内存写入缓冲区 (Write a buffer to reflective memory)`

   `从反射内存窥探一个字节、字或长字 (Peek a byte, word, or longword from reflective memory)`

   `向反射内存写入一个字节、字或长字 (Poke a byte, word, or longword to reflective memory)`

   `使用 RFM2g 板卡的 DMA 引擎进行读取或写入 (Read or write using the RFM2g board's DMA engine)`

   `向另一个 RFM2g 节点发送中断事件 (Send an interrupt event to another RFM2g node)`

   `获取或设置 RFM2g 板卡状态指示灯 (Status LED) 的状态 (Get or set the status of the RFM2g board's Status LED)`

   `获取或设置驱动程序的调试标志 (Get or set the driver's debug flag settings)`

   `同步事件通知 (Synchronous event notification)`: 允许用户在有中断事件到达时(带超时)阻塞等待。

   `异步事件通知 (Asynchronous event notification)`: 允许在中断事件到达时执行用户指定的回调函数。

 

API 函数原型请参见 `rfm2g/include/rfm2g_api.h`

 

要在您的应用程序中使用 RFM2g 驱动程序,您必须包含 `rfm2g_api.h` 头文件,并链接 RFM2g API 库和 POSIX 线程库。

有关示例,请切换到 `rfm2g/samples` 目录,查看文件 `Makefile_s`, `Makefile_r`, `Makefile_m`, `Makefile_dma`, `rfm2g_sender.c`, `rfm2g_receiver.c`, `rfm2g_map.c` `rfm2g_dma.c`

 

安装说明请参见分发介质上的 `install.txt` 文件。

 

 

 

@(#)发布说明 Abaco Systems, Inc.

 

版权 (C) 2002, 2005-2020 Abaco Systems, Inc.

受国际版权保护。保留所有权利。

 

重要提示: 每当 RFM2g 驱动程序 升级到新版本时,请务必 重新构建并重新链接 您的应用程序。

版本 R11.00

   添加对内核 4.12 或更高版本的支持 - 内核变更导致无法编译 - `rfm2g_driver.h` 文件的第 72 行添加了以下代码:

   

    ```

   添加支持最多 七块 反射内存板卡

   支持 Ubuntu 14.04, 16.04, 18.04 20.04。请参阅文件夹 `"Ubuntu 20.04 and Greater" (Ubuntu 20.04 及更高版本)`

   支持 CentOS 7 版本 2003 CentOS 8 版本 2004

 

版本 R10.01

   在驱动程序中添加了 `pci_set_master()` 调用,确保为 MSI 中断 设置了 总线主控 (Bus Master)

 

版本 R10.00

   支持 大容量 Flash 设备

   支持 MSI 中断 (Message Signaled Interrupts)

   支持 Fedora 23 RHEL 7.2 64

    > 此驱动程序版本仅进行了有限的单元测试。

    > 在发布时尚未进行产品验收测试。

 

版本 R09.00

   支持 Ubuntu 14.04 64位 和 Fedora 20 64

    > 此驱动程序版本仅进行了有限的单元测试。在发布时尚未进行产品验收测试。

   修复了 可中断状态下的 DMA 竞态条件 (interruptible state DMA race condition),该问题偶尔会阻止用户线程收到通知(即被唤醒)。

 

版本 B08.01 (Beta)

   支持 Fedora 12 32Linux

    > 请注意,此 Beta 版本仅在此发行版上进行了测试。

 

版本 R07.03

   `rfm2g_util` 工具现在会存储由 `mapuser` `mapuserbytes` 命令返回的指针。后续调用 `unmapuser` `unmapuserbytes` 时使用存储的指针,不再需要手动输入指针值。

   修复了 `rfm2g_util` 性能测试 (`Performance Test`) 命令中导致 DMA 操作无法执行 的问题。

   修复了 `RFM2gOpen()` 函数中映射 小内存窗口 (small memory windows) 时的问题。

 

版本 R06.04

   添加了对 内存大于 4 GB 的系统(运行 64 Linux 或 支持 PAE (物理地址扩展) Linux)中 DMA 的支持。

   添加了对 RFM 滑动窗口 (RFM Sliding Windows) 的支持。

 

版本 R05.02

   更新了 `manual.txt` 文件。

 

版本 R05.01

   添加了对 64 位机器 的支持。

   添加了对 Fedora 8 的支持。

 

版本 R04.01

   添加了对 Fedora Core 6 的支持。

 

版本 R04.00

   添加了对 256 MB RFM2g 设备 的支持。

 

版本 R03.01

   修复了 PPC 平台下驱动程序的 `mmap` 返回 非缓存内存 (non-cached memory) 的问题。

   在配置信息 (`config info`) 中添加了修订版本 `BuildId`

   更新了 `rfm2g_util config` 命令,在配置信息中显示 `BuildId`

   修正了配置信息中的 `BoardRevision` `RevisionId`

 

版本 R03.00

   修复了驱动程序在 Red Haggis Linux 下返回 错误设备名称 的问题。

 

版本 R02.01

   发布包已通过 产品验收 (Product Acceptance) 测试。

 

版本 B01.23 (Beta)

   修复了 `rfm2g_util.c` `memop` 参数的 验证 (validation) 问题。

 

---

 

Ubuntu 14.04 Linux 的一个旧版,它不使用 systemd 服务。

Ubuntu 16.0418.04 20.04 则使用 systemd 服务。

因此,该驱动程序是利用 rc.local.service 功能启动的。

所以,在 Ubuntu 14.04 上构建 RFM 驱动程序时,您会看到一些关于 systemd 服务启动的“错误”消息。请忽略这些消息。




程序说明与使用

目录说明
本目录包含示例程序,演示如何在您的应用程序中使用该驱动程序和 API

包含的示例程序
包含四个示例程序:

 

rfm2g_sender.c

rfm2g_receiver.c

rfm2g_map.c

rfm2g_dma.c

 

rfm2g_map.c 程序说明
rfm2g_map.c 程序提供了使用 RFM2gMapUserMemory()  RFM2gUnMapUserMemory() 函数的示例。这允许用户无需调用读写函数即可直接读写 RFM 卡的内存区域。

建议: 为了获得最佳性能,建议使用 API 提供的 DMA(直接内存访问)读写调用。请参见下面的 rfm2g_dma.c 示例。

rfm2g_sender.c rfm2g_receiver.c 程序说明
这两个程序旨在协同工作,演示基本的数据传输和中断握手机制。

使用前提:

需要两台计算机。

每台计算机安装一块反射内存 (Reflective Memory) 卡。

两块 RFM 卡需通过反射内存网络互连。

两台计算机均需安装 RFM2g 设备驱动程序。

rfm2g_sender.c 程序 (运行在计算机 #1 ) 执行以下操作

打开 RFM2g 驱动程序。

将一小块数据缓冲区写入反射内存。

向计算机 #2 发送一个中断事件。

等待接收来自计算机 #2 的中断事件。

从反射内存的不同位置读取一块数据缓冲区(此数据由计算机 #2 写入)。

关闭 RFM2g 驱动程序。

rfm2g_receiver.c 程序 (运行在计算机 #2 ) 执行以下操作

打开 RFM2g 驱动程序。

等待接收来自计算机 #1 的中断事件。

从反射内存读取数据缓冲区(此数据由计算机 #1 写入)。

将该数据缓冲区写入反射内存的另一个不同位置。

向计算机 #1 发送一个中断事件。

关闭 RFM2g 驱动程序。

rfm2g_dma.c 程序说明
rfm2g_dma.c 程序旨在帮助客户理解、设置和使用 DMA 读写功能,以实现反射内存的最高性能。

重要提示: 在构建此程序前请仔细审阅代码。它展示了如何通过内核引导参数 mem=XXXXM 来设置保留的 DMA 内存区域(DMA Reserved Memory Area。此区域的大小需根据计算机安装的 RAM 大小来决定。您将创建一个 8MB DMA 保留内存区。

配置示例:

假设您的计算机安装了 8GB RAM,您需要设置一个 8MB DMA 保留内存区,并将 RAM 偏移量上限 + 1 的地址传递给 RFM2gUserMemory() 函数(如 rfm2g_dma.c 示例所示)。

计算过程如下:

总内存: 8192 MB (8GB)

保留 DMA 区大小: 8 MB

系统可用内存: 8192 MB - 8 MB = 8184 MB

计算字节地址偏移量:

8184 MB × 1024 (KB/MB) × 1024 (Bytes/KB) = 8,581,545,984 字节

8,581,545,984 字节的十六进制表示为:0x1FF800000

操作步骤:

添加内核引导参数: 在内核引导行中添加参数 mem=8184M (不带引号)

重启计算机: 使参数生效。

验证 DMA 保留内存区:

使用命令 cat /proc/iomem (不带引号)

查找 "System RAM" 的上限地址,应为 0x3FF7FFFF

该地址加 1 得到 0x3FF80000

这个地址 0x3FF80000 将作为 RFM_MEM_OFFSET 参数在 rfm2g_dma.c 代码中的 RFM2gUserMemory() 函数里使用。


Linux操作手册

概述
目录
SFT-RFM2G-LNX 驱动程序概述
目标受众
SFT-RFM2G-LNX 驱动程序及支持的板卡
获取更多信息
Abaco Systems 技术支持

引言

本手册提供的信息允许您在 Linux 平台上安装和运行 SFT-RFM2G-LNX (RFM 2 GigaBaud) 驱动程序,从而使您能够访问各种 PCI PMC RFM2g 硬件的特性。
可以在同一系统中安装多个 RFM2g 设备。

SFT-RFM2G-LNX 驱动程序概述
RFM2g 驱动程序提供了所有必要的文件、脚本和程序,供您在系统中安装、测试和使用任何受支持的反射内存 (RFM) 接口卡。

RFM2g 驱动程序提供以下特性

设备驱动程序 I/O 控制命令 - RFM2g 驱动程序提供 I/O 命令,用于与主机计算机上的 RFM2g 设备交换数据。有关支持的 I/O 命令信息,请参见附录 A I/O 控制命令”。

应用程序编程接口 (API)  - 应用程序可以使用 RFM2g 应用程序编程接口 (API) 库提供的服务,以可移植的方式访问 RFM2g 设备的特性。使用 API 库可以轻松切换到不同型号的 RFM 接口,或者将您的应用程序移植到其他受支持的主机平台。

命令行解释器 - rfm2g_util 程序是一个命令行解释器,允许用户通过在键盘输入命令来执行各种 RFM2g API 命令。要使用 rfm2g_util,请切换到包含该程序的目录并输入 rfm2g_util。输入 help  ? 可显示命令列表。更多信息请参阅 *SFT/RFM2G 驱动程序的通用 RFM2g 应用程序编程接口 (API) 和命令行解释器参考手册*

目标受众

假设读者了解 Linux 操作系统。

根据您的卡类型,RFM 卡应安装在计算机系统的 PCI 总线、PMC 总线或 PCIE 总线插槽中。

所有版本的 RFM2g 驱动程序都需要 C 编程知识。

  

以下文件随 SFT-RFM2G-LNX 驱动程序软件一起分发:

 

 

 

 


SFT-RFM2G-LNX Linux 驱动程序

引言
本章提供安装和卸载 SFT-RFM2G-LNX 驱动程序的步骤。
注意: 完成许多安装步骤需要 root 权限。

系统要求
要安装和运行 SFT-RFM2G-LNX 驱动程序,您必须满足以下条件:

硬件
5565反射内存卡系列

软件

Linux 内核 2.6 或更高版本

此外,软件开发人员应具备 C 编程基础知识和 Linux 环境经验。

预安装说明
安装驱动程序之前,请执行以下步骤:

断开计算机电源。

插入 RFM 板卡。

启动进入 Linux 操作系统。

安装驱动程序
SFT-RFM2G-LNX 驱动程序的安装包括以下步骤:

从传输介质移动驱动程序源文件

构建、安装和加载驱动程序

DMA 使用配置

警告: 如果在 Linux Red Hat 7.3 中使用 "mem=" 引导行参数保留 DMA 缓冲区,保留的内存量可能不如早期 Linux 版本那么大。为确保所有内存都可用于映射,请检查 /proc/iomem 文件中的以下行: 

注意:
以下过程需要对通过调用 RFM2gOpen() RFM2g 设备的系统 open() 函数获得的每个句柄(handle)执行。每个句柄可以有不同的阈值(Threshold)和 DMA 缓冲区区域。

此示例假设 PC 安装了 128 MB RAM,并且顶部 1 MB 将被保留并用作 DMA 缓冲区空间。

安装驱动程序
保留 DMA 缓冲区区域
RFM2g 设备驱动程序可以使用 DMA 传输之前,必须为 DMA 保留一个缓冲区区域。为 DMA 使用而保留的本地缓冲区区域必须是连续的,并且可以在启动时使用 Linux 引导 mem 命令行参数预留。
例如,要在 128 MB 内存的 CPU 上预留顶部 1 MB 的物理内存,请在内核引导命令行中添加以下内容:

 

有关修改 LILO GRUB 引导加载程序参数的过程,请参阅 Red Hat Linux 文档。
预留区域的大小以及缓冲区的划分(如果需要)必须由用户确定。

映射 DMA 缓冲区
使用 RFM2g 系统函数 RFM2gUserMemory() DMA 缓冲区映射到用户定义的虚拟地址。例如:

 

现在 pDmaMemory 变量指向 DMA 缓冲区区域的起始位置。
与当前句柄关联的所有 DMA 读写操作都将使用此区域作为数据从 RFM 卡复制到该区域或从该区域复制到 RFM 卡进行基于 DMA 的传输的位置。

设置 DMA 阈值 (Threshold)
DMA 阈值使驱动程序能够确定是否应使用 DMA 传输而不是标准 I/O 传输。
默认 DMA 阈值为 0xFFFFFFFF。由于没有传输能达到这个大小(即没有任何 RFM 卡包含这么多 RAM),因此在将此值设置为较低值之前不会使用 DMA。如果请求的传输大小(以字节为单位)大于或等于 DMA 阈值,读写函数将使用 DMA。使用 RFM2gSetDmaThreshold() 函数设置 DMA 阈值。例如:

 

在上面的示例中,所有大小大于或等于 256 字节的读写操作都将使用 DMA DMA 缓冲区进行传输。

启动 DMA 传输
要执行 DMA 写传输,必须首先将所需数据放置在由上述“设置 DMA 阈值”步骤中初始化的 pDmaMemory 变量指向的区域中。数据传输到 DMA 缓冲区区域后,可以调用写函数来启动传输。例如:

 

安装驱动程序
解压缩 162-RFM2G-DRV-LNX-R11_00-000.zip 文件

X86_64 平台上构建、安装和加载 Linux RFM2g 驱动程序
要创建和安装 RFM2g 驱动程序,请运行带有命令行参数的 make 实用程序,执行以下操作:

以超级用户 (#) 身份登录。

切换到 RFM2g 目录。

输入:

 

 

这将完整构建 rfm2g.ko 内核模块,安装所有目录和文件,然后在 rfm2g/diags 目录中构建 rfm2g_util 实用程序应用程序。
要运行该实用程序,请切换到 /diags 目录并以超级用户身份运行 ./rfm2g_util


移除驱动程序
要移除 RFM2g 驱动程序及其所有关联的文件和子目录,请执行以下操作:

以超级用户 (#) 身份登录。

切换到 RFM2g 目录。

输入:

 

组件
SFT-RFM2G-LNX Linux 设备驱动程序包含以下组件:

可安装设备驱动程序 (rfm2g.ko)
该设备驱动程序可以安装到正在运行的系统中,无需重新启动或干扰任何正在执行的程序。
应用程序程序通过打开驱动程序创建的名为 /dev/rfm2g0(对于系统中的第一个 RFM2g 设备)之类的文件来获得对底层 RFM2g 硬件的访问权限。
当此文件打开后,应用程序程序可以使用驱动程序的 mmap() 请求将 RFM2g 设备的本地内存映射到其虚拟地址空间,然后可以使用普通的数组访问技术。
或者,应用程序可以发出其他 I/O 控制请求来以 8 位字节、16 位字或 32 位长字的方式访问反射内存。
驱动程序为应用程序程序提供最多三种类型的 RFM2g 中断事件。应用程序可以向任何其他单个 RFM2g 节点发送 RFM2g 中断事件,也可以向所有其他 RFM2g 节点广播 RFM2g 中断事件。应用程序还可以等待接收由另一个 RFM2g 节点发送的下一个 RFM2g 中断事件。
该驱动程序可以安全地用于多处理器系统。它是线程安全的,因此多个应用程序线程可以访问它。

C 语言驱动程序头文件 (rfm2g_api.h)
驱动程序提供服务的应用程序编程接口在 /user/lib/rfm2g/rfm2g_api.h 头文件中定义。使用此头文件可以调用简单的函数来控制板和访问板。此文件适用于包含在标准 C C++ 编译中。使用 /user/lib/rfm2g/librfm2g.a 文件链接应用程序。

示例应用程序 (rfm2g_sender.c, rfm2g_receiver.c, rfm2g_map.c, rfm2g_dma.c)
SFT-RFM2G-LNX Linux 设备驱动程序包含四个示例程序,演示如何在您的应用程序中使用驱动程序和 API

rfm2g_sender.c - 在计算机 1 上运行,此程序将一小块数据缓冲区写入反射内存;向计算机 2 发送中断事件;等待接收来自计算机 2 的中断事件;从反射内存的不同位置读取一块数据缓冲区(此数据由计算机 2 写入);然后关闭 RFM2g 驱动程序。

rfm2g_receiver.c - 在计算机 2 上运行,此程序打开 RFM2g 驱动程序;等待接收来自计算机 1 的中断事件;从反射内存读取数据缓冲区(此数据由计算机 1 写入);将该数据缓冲区写入反射内存的另一个不同位置;向计算机 1 发送中断事件;然后关闭 RFM2g 驱动程序。

这两个程序旨在协同工作以演示基本的数据传输和中断握手机制。要一起使用这些程序,需要满足以下条件:

存在两台计算机

每台计算机包含一块反射内存卡

计算机中的反射内存卡彼此连接

每台计算机都安装了 RFM2g 设备驱动程序

rfm2g_map.c - 演示 mmap() 函数的用法,该函数使您能够获得用于直接访问 RFM2g 设备内存的指针。

rfm2g_dma.c - 作为如何设置 DMA 以及执行 DMA 读写以实现最佳性能的示例提供。

API 命令行应用程序 (rfm2g_util)
RFM2g/diags 文件夹包含 rfm2g_util 程序,这是一个命令行应用程序,允许您执行驱动程序的所有 API 功能。构建并启动诊断程序后,在提示符处输入 help 以获取可以使用 rfm2g_util 运行的命令列表。要获取特定命令的详细帮助,请输入 help <command>,其中 <command>  help 命令列出的任何命令。rfm2g_util.c 文件中的代码可作为如何使用每个 API 命令的示例,方法是检查 do_<command>() 函数,其中 <command>  help 命令列出的任何命令。

构建示例应用程序
要构建示例应用程序:

打开一个控制台窗口。

以超级用户 (#) 身份登录。

输入以下命令构建 rfm2g_sender 

输入以下命令构建 rfm2g_receiver

 

输入以下命令构建 rfm2g_map

 

输入以下命令构建 rfm2g_dma

 

附录 A
I/O 控制命令

引言
本附录描述了可用于 SFT-RFM2G-LNX 设备驱动程序的 I/O 控制 (IOCTL) 命令。在您的应用程序中使用 IOCTL 将使您的程序特定于 Linux 驱动程序,并且无法在其他操作系统上使用其他 RFM2g 驱动程序进行编译。如果您希望代码在 RFM2g 驱动程序支持的所有操作系统上工作,请在您的应用程序中使用 RFM2g API 调用。

I/O 控制命令
以下 I/O 控制命令仅适用于 SFT-RFM2G-LNX 设备驱动程序:

 

 

 

I/O 控制命令详解

IOCTL_RFM2G_ATOMIC_PEEK
IOCTL_RFM2G_ATOMIC_PEEK 命令从反射内存读取单个字节、字或长字。

输入参数
输入参数必须是按如下所示填充的 RFM2GATOMIC 结构: 

 

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_CANCEL_EVENT
取消先前调用 IOCTL_RFM2G_WAIT_FOR_EVENT 的另一个线程的阻塞。

输入参数
输入参数必须是 RFM2GEVENTINFO 结构,如下所示:

 

只需使用 RFM2GEVENTTYPE 枚举中的有效值填充结构的 Event 元素。
输出参数
此命令不需要输出参数。

 

只需使用 RFM2GEVENTTYPE 枚举中的有效值填充结构的 Event 元素。
输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_CLEAR_EVENT
清除设备上和 S/W 队列中的事件。

输入参数
输入参数必须是来自 RFM2GEVENTTYPE 枚举的有效值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_CLEAR_EVENT_COUNT
清除给定事件的事件计数。

输入参数
输入参数必须是来自 RFM2GEVENTTYPE 枚举的有效值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_CLEAR_EVENT_STATS
清除指定事件队列的统计信息。

输入参数
输入参数必须是来自 RFM2GEVENTTYPE 枚举的有效值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_CLEAR_OWN_DATA
清除“自身数据”LED 并返回清除前该 LED 的状态。

输入参数
此命令不需要输入参数。

输出参数
包含“自身数据”LED 状态的 RFM2G_BOOL 值。

 

IOCTL_RFM2G_DISABLE_EVENT
禁用指定的 Event 元素。来自指定事件的中断将不再被处理或发送给等待的线程。

输入参数
输入参数必须是 RFM2GEVENTINFO 结构,如下所示:

 

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_ENABLE_EVENT
启用指定的事件。来自指定事件的中断将被处理或发送给等待的线程。如果当前没有线程在等待指定的事件,则该事件将保持排队状态,直到发出中断调用。

输入参数
输入参数必须是 RFM2GEVENTINFO 结构,如下所示:

 

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_FLUSH_QUEUE
清空指定队列中的排队事件。

输入参数
输入参数必须是 RFM2GEVENTINFO 结构,如下所示:

 

 

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_GET_CONFIG
返回板配置信息。调用此函数将填充该结构的内容。

输入参数
输入参数必须是指向 RFM2GCONFIG 结构的指针:

 

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_GET_DARK_ON_DARK
返回板的Dark on Dark”特性值。

输入参数
此命令不需要输入参数。

输出参数
包含Dark on Dark”特性状态的 RFM2G_BOOL 值。

 

IOCTL_RFM2G_GET_DEBUG_FLAGS
注意: 除非 Abaco Systems 的支持人员指示,否则应用程序不应使用此命令。
获取驱动程序调试消息标志的副本,并返回一个 32 位映射,指示设置了哪些标志。应用程序程序可以使用此命令显示或获取当前设置的标志集,以确定哪些标志可以更改。

输入参数
此命令不需要输入参数。

输出参数
包含调试标志的 32 位值。

 

 

IOCTL_RFM2G_GET_DMA_BYTESWAP
返回板的 DMA 字节交换设置值。

输入参数
此命令不需要输入参数。

输出参数
包含 DMA 字节交换设置状态的 RFM2G_BOOL 值。

 

IOCTL_RFM2G_GET_DMA_THRESHOLD
获取当前的 DMA 阈值。应用程序程序可以使用此命令将 DMA 阈值作为 32 位参数返回。传输字节数大于或等于此 DMA 阈值大小的读写函数调用将使用 DMA 进行传输。

输入参数
此命令不需要输入参数。

输出参数
包含 DMA 阈值的 32 位值。

 

IOCTL_RFM2G_GET_EVENT_STATS
返回事件队列的统计信息。RFM2GQINFO 参数指示要从中获取数据的事件队列,驱动程序将通过此调用填充该结构。

输入参数
输入参数必须是指向 RFM2GQINFO 结构的指针,如下所示:

 

输出参数
此命令不需要输出参数。

 

 

 

IOCTL_RFM2G_GET_LED
返回反射内存板状态 LED 的当前状态。调用时,如果 LED 被禁用(熄灭),参数包含 RFM2G_FALSE;如果 LED 被启用(点亮),则包含 RFM2G_TRUE

输入参数
此命令不需要输入参数。

输出参数
包含状态 LED 状态的 RFM2G_BOOL 值。

 

IOCTL_RFM2G_GET_LOOPBACK
返回板的环回设置状态。

输入参数
此命令不需要输入参数。

输出参数
包含板的环回设置状态的 RFM2G_BOOL 值。

 

IOCTL_RFM2G_GET_MEMORY_OFFSET
返回板设置的内存偏移量。

输入参数
指向用于存储结果的 RFM2G_MEM_OFFSETTYPE 的指针。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_GET_PARITY_ENABLE
返回板的奇偶校验启用状态。

输入参数
指向用于存储结果的 RFM2G_UINT8 的指针。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_GET_PIO_BYTESWAP
返回板的 PIO 字节交换设置值。

输入参数
指向用于存储结果的 RFM2G_UINT8 的指针。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_GET_TRANSMIT_DISABLE
返回板的发射器状态。

输入参数
指向用于存储结果的 RFM2G_UINT8 的指针。

输出参数
此命令不需要输出参数。

 

 

IOCTL_RFM2G_READ_REG
从寄存器窗口读取单个字节、字或长字。

输入参数
指向用于存储结果的 RFM2GLINUXREGINFO 的指针。
输入参数必须是 RFM2GLINUXREGINFO 结构,如下所示: 

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SEND_EVENT
向环上的另一个节点发送中断事件。

输入参数
作为参数传递的 RFM2GEVENTINFO 结构地址包含特定事件、要发送事件的节点以及一个 32 位扩展数据值,接收节点可以将此值用作用户级消息或命令。
输入参数必须是 RFM2GEVENTINFO 结构,如下所示: 

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_DARK_ON_DARK
设置板的Dark on Dark”特性值。

输入参数
包含Dark on Dark”特性状态的 RFM2G_BOOL 值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_DEBUG_FLAGS
注意: 除非 Abaco Systems 的支持人员指示,否则应用程序不应使用此命令。
设置或清除指定的调试标志。应用程序程序可以使用该映射来设置调试消息标志。
设置为 0 的所有位将被禁用。
使用 IOCTL_RFM2G_GET_DEBUG_FLAGS 获取所有调试标志的当前值。

输入参数
包含要设置 (1) 或清除 (0) 的标志的 32 位值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_DMA_BYTE_SWAP
设置板的 DMA 字节交换值。

输入参数
包含 DMA 字节交换状态的 RFM2G_BOOL 值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_DMA_THRESHOLD
为应用程序程序设置当前的 DMA 阈值。要设置的值在 32 位参数中传递。
传输字节数大于或等于此 DMA 阈值的读写函数调用将使用 DMA 进行传输。默认值为 0xFFFFFFFF,这将禁用所有传输的 DMA 使用。

输入参数
32 DMA 阈值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_LED
设置反射内存板状态 LED 的当前状态。如果参数包含 RFM2G_FALSE,则 LED 被禁用(熄灭)。如果参数包含 RFM2G_TRUE,则 LED 被启用(点亮)。

输入参数
包含状态 LED 状态的 RFM2G_BOOL 值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_LOOPBACK
设置板的环回状态。

输入参数
包含板的环回状态的 RFM2G_BOOL 值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_MEMORY_OFFSET
设置板的内存偏移量。

输入参数
包含板的内存偏移量的 RFM2G_MEM_OFFSETTYPE 值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_PARITY_ENABLE
设置板的奇偶校验启用状态。

输入参数
包含板的奇偶校验启用状态的 RFM2G_BOOL 值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_PIO_BYTE_SWAP
设置板的 PIO 字节交换值。

输入参数
包含板的 PIO 字节交换状态的 RFM2G_BOOL 值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_SET_TRANSMIT_DISABLE
设置板的发射器状态。

输入参数
包含板的发射器状态的 RFM2G_BOOL 值。

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_WAIT_FOR_EVENT
指定所需的事件和超时时间。参数是指向 RFM2GEVENTINFO 结构的指针,并在事件到达时填充该结构的元素。调用线程将执行阻塞,直到请求的事件到达或超时到期。

输入参数
输入参数必须是 RFM2GEVENTINFO 结构,如下所示:

 

 

输出参数
此命令不需要输出参数。

 

IOCTL_RFM2G_WRITE_REG
向寄存器窗口写入单个字节、字或长字。

输入参数
指向包含要写入信息的 RFM2GLINUXREGINFO 的指针。
输入参数必须是 RFM2GLINUXREGINFO 结构,如下所示:

 

输出参数
此命令不需要输出参数。