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 降低 到 64MB、16MB 或 2MB,直到映射成功为止。
#############################################################################
4. DMA 缓冲区分配
适用于 Linux 的 RFM2g 驱动程序支持在用户进程和反射内存之间进行 DMA 传输。由于不支持分散聚集(scatter-gather)DMA,因此必须分配并使用一块连续的 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 32位 Linux
> 请注意,此 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.04、18.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() 函数里使用。
概述
目录
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 结构,如下所示:
输出参数
此命令不需要输出参数。