ddopen 设备驱动程序入口点

用途

准备设备以执行读,写或控制功能。

语法

#include <sys/device.h>
  
int ddopen (devno, devflag, chan,  ext)
dev_t  devno;
ulong  devflag;
chan_t  chan;
int ext;

参数

描述
德夫诺 指示主要和次要设备号。
德夫旗 指定打开文件控制标志。
指定通道号。
分机 指定扩展参数。

描述

当程序发出 克里特 子例程调用时,内核将调用设备驱动程序的 德开放 例程。 当系统调用,内核进程或其他设备驱动程序使用 fp_opendevfp_open 内核服务来使用该设备时,也可以调用此命令。

必要时, 德开放 例程必须先确保对设备的互斥存取。 许多字符设备 (例如,打印机和绘图仪) 应该一次只能由一个进程打开。 德开放 例程可以通过维护静态标志变量 (如果设备已打开,那么设置为 1; 如果未打开,那么设置为 0) 来 0 此操作。

每次调用 德开放 例程时,它都将检查标志的值。 如果该值不是 0 ,那么 德开放 例程会返回返回码 EbUSY ,以指示设备已打开。 否则, 德开放 例程将设置标志并正常返回。 德德德 入口点稍后会在设备关闭时清除该标志。

由于大多数块设备可以由多个进程同时使用,因此块驱动程序不应尝试强制由单个用户打开。

如果这是发生的第一个打开操作,那么 德开放 例程必须初始化设备。 初始化涉及以下步骤:

  1. 德开放 例程应将必需的系统资源 (例如 DMA 通道,中断级别和优先级) 分配给设备。 如果需要,它应该注册其设备中断处理程序以获取支持目标设备所需的中断级别。 (可使用 i_init初始化 内核服务来初始化这些资源。)
  2. 如果此设备驱动程序正在为设备提供头角色,而另一个设备驱动程序正在提供处理程序角色,那么 德开放 例程应该使用 fp_opendev 内核服务来打开设备处理程序。
    注: fp_opendev 内核服务需要 德夫诺 参数来标识要打开的设备处理程序。 当调用此设备驱动程序的 地址配置 例程时,从相应的设备从属结构 (DDS) 获取的此 德夫诺 值应该已存储在特殊保存区域中。

为 devflag 参数定义的标志

devflag 参数具有以下标志,如 /usr/include/sys/device.h 文件中所定义:

描述
内核 内核例程使用 fp_opendevfp_open 内核服务调用的入口点。
DREAD 打开以进行阅读。
DWRITE 打开以进行编写。
DAPPEND 打开以进行追加。
DNDELAY 设备以非阻塞方式打开。

执行环境

只有在进程环境中才会执行 德开放 例程。 它应该通过将锁定内核服务与驱动程序中定义的专用锁定字结合使用来提供其数据结构的必需序列化。

返回值

德开放 入口点可以通过返回非零返回码来向用户方式应用程序指示错误情况。 返回非零返回代码会导致 opencreat 子程序返回 -1 值,并使用户模式应用程序可以在 errno 全局变量中使用该返回代码。 使用的返回代码应是 /usr/include/errno.h 文件中定义的值之一。

如果 德开放 例程返回非零返回码,那么将认为打开请求失败。 因此,调用者没有对设备实例的访问权。 此外,对于未多路复用的驱动程序,如果失败的打开是设备实例的第一次打开,那么内核会调用驱动程序的 德德德 入口点以允许清除资源和设备驱动程序状态。 如果对驱动程序进行了多路复用,那么内核不会在打开故障时调用 德德德 入口点。

如果适用,应该使用 open 子例程的 POSIX 1003.1 标准中定义的返回值。