3270cn 特殊文件

用途

通过 3270 连接适配器设备处理程序提供对 3270 连接适配器的访问。

描述

3270cn 字符特殊文件提供对 3270 连接适配器设备处理程序的访问,以用于仿真 3270 显示站和打印机。 设备处理程序是一个多路复用设备处理程序,它支持其每个通道上的独立逻辑 3270 会话。

设备处理程序支持两种操作方式:

描述
分布式功能终端 (DFT) 方式 在 DFT 方式下,适配器可以显示为多个 SNA 或非 SNA 显示会话和/或非 SNA 打印机会话,并且是控制单元的一个智能设备。 在此方式下,设备处理程序提供对多个 3278/79 显示站进行仿真的功能。 如果连接的控制单元不支持 "扩展异步事件设备状态" ,那么必须仅为一个会话配置控制单元端口或设备处理程序。
3278/79 仿真控制单元终端 (CUT) 方式 在 CUT 方式下,适配器将显示为控制单元的单会话,非智能设备。 在此方式下,设备处理程序提供对单个 3278/79 显示站进行仿真的功能。

设备处理程序最多支持四个 3270 连接适配器,其中每个适配器最多可以有五个 DFT 会话或一个 CUT 会话。

/usr/include/sys/io3270.h 文件包含由设备处理程序使用的结构的定义。

使用注意事项

当访问 3270 连接设备处理程序时,应考虑下列各项:

描述
驱动程序初始化和终止 可以装入和卸载设备处理程序。 设备处理程序支持用于初始化和终止自身的配置调用,但不支持用于查询重要产品数据 (VPD) 的配置调用。
特殊文件支持 将讨论除 关闭 以外的其他子例程,以确定设备处理程序的运行方式。

子例程支持

3270 设备处理程序为以下子例程提供特定于 3270 的支持:

打开和关闭子例程

设备处理程序将 3270cn 特殊文件作为字符多路复用特殊文件来支持。 必须同时打开特殊文件以进行读写操作 (0-RDWR)。

对于关闭 3270cn 特殊文件,存在特殊注意事项。 如果同时以 CUT 方式和 CUT-文件传输方式打开文件,那么针对 CUT-文件传输方式的 关闭 操作必须在针对 CUT 方式的 关闭 操作之前。

调用中使用的特殊文件名采用几种不同的格式,具体取决于设备的打开方式。 特殊文件名的类型为:

描述
dev /3270c n/C Starts the device handler in CUT mode for the selected port, where the value of N is 0 <= N <= 7.
/ dev/3270c n/F Starts the device handler in CUT File-Transfer mode for the selected port, where the value of N is 0 <= N <= 7. 当前必须以 CUT 方式打开该文件,然后才能以 CUT 文件传输方式打开该文件。
/ dev/3270c n/* Starts the device handler in DFT mode for the selected port, where the value of N is 0 <= N <= 7 and the * (asterisk) is defined by P/A, as follows:
P/00 , P/01 , P/02 , ...P /1F
P 变量指定的打印机会话等于控制单元会话地址,并且 A 的值小于或等于 0x1F。
01 到 05
终端会话号。
/dev/3270c n 以DFT模式启动所选端口的设备处理程序,其中n的取值范围为0 ≤ n ≤ 7。

在非 SNA DFT 方式下读取子例程

通信适配器从主机接收到的数据将放置在缓冲区中,直到消息完成或缓冲区已满为止。 当出现任一情况时,驱动程序会将程序控制返回给应用程序。 该应用程序可以通过发出 WDC_INQ ioctl 操作来确定 子例程调用的状态。

如果 WDC_INQ 操作返回指示有更多数据可用的状态,那么应用程序应立即发出另一个 调用。 必须尽快读取可用数据以避免降级链接或降低主机性能。

如果进行了 调用并且没有可用的数据,那么调用过程将被阻止,直到数据变为可用为止。 要避免阻塞,请使用 轮询 子例程来确定数据是否可用。

主机将数据作为出站 3270 数据流进行发送。 设备处理程序将转换出站 3270 数据流中的命令代码。 以下是命令代码和转换:

命令码 转换为驱动程序 司机外
擦除所有未受保护的项 0x6F 0x0F
擦除/写入 0xF5 0x03
擦除/写入备用项 0x7E 0x0D
读取缓冲区 0xF2 0x02
已修改读取 0xF6 0x06
0xF1 0x01
写入结构化字段 0xF3 0x11

以 SNA DFT 方式读取子例程

通信适配器从各个 SNA 数据段中的控制单元接收数据。 设备驱动程序通知应用程序,数据可用。 在 子例程调用期间,数据从设备驱动程序的内核空间 (没有来自控制单元的 TCA 头) 被传送到应用程序的用户空间,并且控制被传递回应用程序。 设备驱动程序对接收到的每个 SNA 数据段进行确认,从而使应用程序不必在 调用后查询链路状态。
注: 在 SNA DFT 方式下, 统计信息 ACK ioctl 操作无效。

与非 SNA DFT 方式不同,在 SNA DFT 方式下,设备驱动程序既不执行链接也不执行命令解释。 应用程序必须同时累积 SNA 数据段以形成响应单元 (RU) 并解释其中包含的任何 3270 数据。

非 SNA DFT 方式下的 readx 子例程

通信适配器从主机接收到的数据将放置在缓冲区中,直到消息完成或缓冲区已满为止。 在完成 调用后, 扩展指向的 io3270 结构将包含状态。 下列其中一个状态码是在io_flagsio3270 结构的字段:

描述
WDI_可用性 此链接地址的其他数据可用。
WDI_COMM 出现通信错误。 该io_status字段包含相应的消息代码。
WDI_PROG 发生程序错误。 该io_status字段包含相应的消息代码。
WDI_MACH 发生硬件错误。 该io_status字段包含相应的消息代码。
WDI_致命 发生了阻止与主机进一步通信的错误。 除了 WDI_COMMWDI_PROGWDI_MACH 标志之外,还可以选择设置此标志。 它也会在发生 coax 故障时设置。 在这种情况下,io_status字段包含 WEB_610值,但是未设置 WDI_COMMWDI_PROG WDI_MACH 标志。

重置时, WDI_DAVAIL 标志指示刚刚读取的数据将标记出站 3270 数据流已完成。

如果 WDI_DAVAIL 标志指示更多数据可用,那么应立即发出另一个 子例程。 必须尽快读取可用数据以避免降级链接或降低主机性能。

如果进行了 子例程调用并且没有可用的数据,那么调用过程将被阻止,直到数据变为可用为止。 要避免阻塞,请使用 轮询 子例程来确定数据是否可用。

从主机接收到的数据以出站 3270 数据流的形式出现。 设备驱动程序在出站 3270 数据流中对 命令代码 进行转换。
注: 3270 写命令需要应用程序将状态发送至主机。 状态是使用 WDC_SSTAT ioctl 操作发送的。

在非 SNA DFT 方式下写子例程

在非 SNA DFT 方式下, 子例程会将入站 3270 数据流发送至主机。 在 子例程调用上指定的缓冲区必须包含完整的入站 3270 数据流。 当 调用已从子例程调用上指定的缓冲区成功传输时,它已完成。

SNA DFT 方式下的写子例程

在 SNA DFT 方式下, 子例程将 SNA 数据传送至主机系统。 此数据可以是具有 SNA 头的 3270 数据流,也可以是 SNA 响应。

应用程序将数据发送到设备驱动程序,一次发送一个 RU。 然后,设备驱动程序负责对入站 SNA 数据进行分段。 如果在处理第一个调用之前进行第二个 调用,那么在设备驱动程序就绪之前,第二个调用不会继续。 在将数据从应用程序的用户空间传送到设备驱动程序的内核空间之后, 子例程完成,并将控制权返回给应用程序。

如果设备驱动程序检测到两个 调用之间的 coax 断开连接,那么第二个 调用将返回到应用程序,并且 错误号 全局变量设置为 EFAULT

非 SNA DFT 方式下的 writex 子例程

子例程会将入站 3270 数据流发送至主机。 在 子例程调用上指定的缓冲区必须包含完整的入站 3270 数据流。

子例程从指定缓冲区成功传输数据时,它已完成。 在完成 子例程调用后, 扩展所指向的 io3270 结构将包含状态。 下列其中一个状态码是在io_flagsio3270 结构的字段:

描述
WDI_可用性 指示数据可用于此链接地址; 必须先读取数据,然后才能执行任何写入操作。
WDI_COMM 指示通信错误。 该io_status字段包含相应的消息代码。
WDI_PROG 指示程序错误。 该io_status字段包含相应的消息代码。
WDI_MACH 指示硬件错误。 该io_status字段包含相应的消息代码。

DFT 方式下的 ioctl 子例程

当设备处理程序处于 DFT 方式时,可以向它发出 ioctl 子例程。 下列是可用的 ioctl 操作:

描述
IOCINFO 返回逻辑终端号。 此数字是 iocinfo 结构中的控制器类型和控制器连接协议的 EBCDIC 表示法。
WDC_AUTO 仅对非 SNA DFT 方式有效。 为处理程序提供选项以自动确认接收到有效的 3270 数据流。 仅当 3270 数据流的开头包含以下内容时,才会发送应答:0xF3 00 06 40 00 F1 C2 xx xx 10 14,其中xx不检查字段。 此命令还允许驱动程序在收到数据后不指示确认。
WDC_INQ 查询由应用程序发出的最后一次非 SNA 调用的状态。 此外, WDC_INQ 操作将确定数据是否可用于读取。 该状态将放置在io_flagsio3270 结构的字段。 此字段接受以下值:
WDI_可用性
有数据可供读取。 在驱动程序或通信适配器中对数据进行缓冲。 应立即读取这些数据以避免其对性能产生影响。

在非 SNA DFT 方式下,在读取数据之前, 子例程调用不能完成。 在 SNA DFT 方式下, WDI_DAVAIL 标志仅用于指示在设备驱动程序从控制单元接收数据后唤醒应用程序 (如果正在等待 轮询选择 调用) 时数据可用。

WDI_COMMWDI_PROG WDI_MACH
分别表明通信检查,程序检查或机器检查。 在上述每一个案例中,io_status字段包含用于指定检查类型的消息代码。
WDI_致命
指示发生了错误,该错误阻止应用程序与设备驱动程序之间的进一步通信,通常是 coax 断开连接或适配器故障。 可将此标志与 WDI_COMMWDI_PROGWDI_MACH 标志一起设置。 如果通信故障是由 coax 断开连接引起的,那么io_status字段包含值 WEB_610
WDI_WCUS_30
当存在网络故障并且控制单元仍在与通信适配器通信时发生的通信检查提示。 特定类型的错误包含在以下文件中:io_status字段 (as a)5XX错误代码。 在纠正网络状况后,自动清除通信检查提示。
WDI_WCUS_31
指示通信检查提示已被清除。
WDI_CU
仅对 SNA DFT 方式有效。 表示设备驱动程序已接收到 ACTLUDACTLU 请求。 附带的数据包含在io_extraio3270 结构的字段。
WDC_POR 首先禁用链路地址,然后重新启用该地址以模拟 3270 终端开机复位功能。
WDC_SSTAT 仅对非 SNA DFT 方式有效。 将状态发送到主机。 自变量字段包含下列其中一个值:
统计信息 ACK
先前接收到的 3270 数据流有效,并且会对主机进行正确的响应。
统计信息重置
将 RESET 键发送至 DFT 设备处理程序。
STAT_PRTCMP
打印机会话已完成数据的打印。
统计信息-BERR
接收到错误的缓冲区顺序或无效的缓冲区地址。
统计信息 _UNSUP
接收到不受支持的 3270 命令。

/usr/include/sys/io3270.h 文件包含由设备处理程序使用的结构的定义。

DFT 方式中的错误条件

通过 3270cn 特殊文件访问设备处理程序时,可能返回以下错误条件:

描述
EBUSY 针对已打开的通道请求了打开。
EFAULT 由调用程序指定的缓冲区无效。
EINTR 子例程调用已中断。
EINVAL 接收到无效参数。
EIO 在请求的数据传输上发生不可恢复的 I/O 错误。
ENODEV 为无效通道请求了打开。
ENOMEM 驱动程序无法分配内存以在数据传输中使用。
ENXIO 对无效的次要设备号请求了操作。

在 CUT 方式下读取子例程

子例程将通信适配器接收到的数据放置在缓冲区中。
注: 要将偏移量设置到通信适配器的缓冲区中进行读取,请使用 Emseek ioctl 操作。

两个 ioctl 操作控制 子例程的操作方式: EMNWAIT电子邮件等待 操作。 EMNWAIT 操作指示应立即满足后续读调用的要求。 电子邮件等待 ioctl 操作 (缺省值) 指示只有在来自控制单元的中断指示屏幕上的某些内容已更改之后,才应该满足读调用。 以下是控制单元中断:

描述
Buffer Modification Complete 子例程返回请求的字节数。
Load I/O Address Command Decoded 对于读取的字节数, 子例程返回 0。

在 CUT 方式下写子例程

子例程会将入站 3270 数据流发送至主机。 在 子例程上指定的缓冲区必须包含完整的入站 3270 数据流。 要将偏移量设置到通信适配器缓冲区以开始写入,请使用 Emseek ioctl 操作。

CUT 方式下的 ioctl 子例程

可以在 CUT 方式下向设备处理程序发出 ioctl 子例程。 以下是可接受的 ioctl 操作:

描述
EMKEY 将扫描代码发送至仿真适配器。 扫描代码通过 EMKEY 操作进行逻辑 OR 运算,结果将用作 ioctl 子例程调用的命令字段。
EMCPOS 返回光标相对于通信适配器缓冲区开始位置的位置。
EMXPOR 禁用链路地址,然后重新启用它来仿真 3270 终端开机复位功能。
EMNWAIT 指定应该立即满足 子例程调用。
电子邮件等待 指定只有在更改仿真缓冲区或光标位置 (这是缺省设置) 之后,才应该满足 子例程调用。
EMVISND 返回仿真 "可视/声音" 寄存器的当前内容。integer。 此字段的地址将指定为 EMVISND 操作的参数。
艾米面具 提供掩码以指定显示哪些中断。 "参数" 字段指定掩码的地址。 掩码的 0 位 7 0 到 7) 对应于中断状态寄存器的 0 7 7 位。 掩模的第 8 位至第 15 位对应于视觉/声音寄存器的第 0 位至第 7 位。

此操作允许驱动程序忽略视觉或声音中断,但那些专门屏蔽 ON 的位除外。 当某个位处于开启状态时,对应于该位位置的中断将出现。 与掩码中的 off (0) 位位置相对应的 0 将被设备处理程序废弃。 先前掩码设置将返回到掩码字段中的调用者。 在 IBM® 3270 连接技术参考中记录了中断状态位以及可视位或声音位。

IOCINFO /usr/include/sys/devinfo.h 文件中定义的设备信息结构返回到用户指定的区域。 该devtype字段的值为 DD_EM78(在 devinfo.h 文件中定义) ,标志字段值的值为 0。
Emseek 将偏移量设置到通信适配器缓冲区以开始 子例程调用。

CUT 方式中的错误条件

通过 dev/3270cn 特殊文件访问设备处理程序时,可能返回以下错误条件:

描述
EBUSY 针对已打开的通道请求了打开。 击键缓冲区已满。
EFAULT 由调用者指定的缓冲区无效。
EINTR 子例程调用已中断。
EINVAL ioctl 调用上指定了无效参数。
EL3RST 通信适配器已接收到 重置 命令。
ENOCONNECT 在指定了 电子邮件等待 ioctl 操作的 操作处于等待状态时,与控制单元的连接已停止。
EIO 在请求的数据传输上发生不可恢复的 I/O 错误。
ENXIO 请求了对次设备号执行无效的操作。

此特殊文件需要 IBM 3270 连接适配器。