编写取消配置方法
本文描述了 Unconfigure 设备方法的工作方式。 它还建议程序员编写自己的 Unconfigure 设备配置方法的准则。
语法
乌奇开发 -我 姓名
描述
Unconfigure 方法将 "可用设备" (在系统中可用) 设置为 "已定义" 状态 (在系统中不可用)。 有关该设备的所有定制信息都保留在数据库中,以便可以完全像以前一样重新配置该设备。
使设备定义所需要的实际操作取决于 Configure 方法如何使设备在第一位置可用。 例如,如果该设备具有设备驱动程序,那么 Configure 方法必须已在内核中装入设备驱动程序,并通过设备从属结构 (DDS) 将该设备描述给该驱动程序。 然后, "取消配置" 方法必须通知驱动程序删除设备实例并请求卸载该驱动程序。
如果该设备是中间设备,那么 "取消配置" 方法必须检查子设备的状态。 如果任何子设备处于 "可用" 状态,那么 Unconfigure 方法将失败并使设备处于已配置状态。 要确保正确的系统操作,必须先取消配置所有子设备,然后才能取消配置父设备。
虽然 "取消配置" 方法会检查子设备,但它不会检查 "定制依赖关系" (CuDep) 对象类中记录的设备依赖关系。
如果设备当前处于打开状态,那么 "取消配置" 方法也会失败。 在此情况下,当设备驱动程序请求该驱动程序删除设备时,设备驱动程序会将 EbUSY 的 错误号 全局变量的值返回到 Unconfigure 方法。 设备驱动程序是该时刻已知设备已打开的唯一组件。 与已配置的子设备一样, Unconfigure 方法将失败并使设备保持已配置状态。
当请求设备驱动程序终止设备时,可以返回除 EbUSY 之外的 错误号 全局变量值。 如果驱动程序不知道该设备,那么它应该返回 ENODEV 。 但在最好的情况下,不应该发生这种情况。 如果返回了 ENODEV ,那么 "取消配置" 方法应该取消配置设备,以便数据库和设备驱动程序一致。 如果设备驱动程序返回任何其他 错误号 全局值,那么它会删除指定设备实例的任何存储特征。 "取消配置" 方法通过将状态设置为 "已定义" 来指示设备已取消配置。
Unconfigure 方法通常不会释放设备的主要和次要号码分配,也不会删除 /dev 目录中该设备的特殊文件。
按照约定, Unconfigure 方法的名称的前 4 个字符应该是 乌奇。 名称的其余部分 (开发) 可以是任何标识使用该方法的设备或设备组的字符 (受操作系统文件名限制的限制)。
标志
| 项 | 描述 |
|---|---|
| -l 名称 | 指示要取消配置的设备的逻辑名。 |
编写取消配置方法的准则
此任务列表旨在作为编写 "取消配置" 方法的准则。 当您为特定设备编写方法时,可能会省略一些任务。 例如,如果设备不是中间设备或不具有驱动程序,那么可以相应地编写方法。 该设备可能具有这些任务中未列出的特殊需求。
Unconfigure 方法必须:
- 验证输入参数。 必须提供 -我 标志,以标识要取消配置的设备。
- 使用 odm_initialize 子例程初始化对象数据管理器 (ODM) ,并使用 odm_lock 子例程锁定配置数据库。 请参阅 "编写定义方法" 以获取示例。
- 检索要取消配置的设备的定制设备 (CuDv) 对象。 使用其 "设备名" 描述符与 -l 标志提供的名称匹配的 CuDv 对象。 如果找不到具有指定名称的对象,那么该方法将退出并返回错误。
- 请检查设备的状态。 如果 "设备状态" 描述符指示设备处于 "已定义" 状态,那么它已取消配置。 在此情况下,请退出。
- 检查处于可用状态的子设备。 可以通过查询 CuDv 对象类以查找其父设备逻辑名描述符与此设备的名称相匹配且其设备状态描述符未定义的对象来完成此操作。 如果找到匹配项,那么此方法必须退出并返回错误。
- 通过获取其唯一类型描述符与设备的 CuDv 对象的预定义设备对象类描述符的链接匹配的 PdDv 对象,检索要取消配置的设备的预定义设备 (PdDv) 对象。 将使用此对象来获取设备驱动程序名称。
- 从驱动程序和卸载驱动程序中删除设备实例。 确定该设备是否具有驱动程序。 Unconfigure 方法从 PdDv 对象的 Device Driver Name 描述符获取设备的名称。 如果此描述符是空字符串,那么表示设备没有驱动程序。 在此情况下,请跳至用于更新设备状态的任务。
如果设备具有设备驱动程序,那么 "取消配置" 方法需要包含以下任务:
- 设置定义的状态。 设备现在已取消配置。 "取消配置" 方法会将设备的 CuDv 对象的 "设备状态" 描述符更新为 "已定义" 状态。
- 关闭所有对象类并终止 ODM。 如果没有任何错误,请退出并返回退出代码 0 (零)。
文件
| 项 | 描述 |
|---|---|
| /usr/include/sysmacros.h | 包含宏的定义。 |