驱动程序运行程序

驱动程序运行器是负责启动在驱动程序宿主环境中运行的组件的运行器。

使用驱动程序运行程序

如需使用驱动程序运行程序,组件的清单必须包含类似于以下内容的 program 块:

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
    }
}

驱动程序组件的 program 块至少需要包含以下字段:

  • runner - 此字段必须设置为字符串 driver
  • binary - 组件软件包中驱动程序二进制输出的路径。
  • bind - 组件软件包中已编译的绑定程序的路径。

选填字段

除了必需字段之外,驱动程序运行程序还接受一组可选字段,这些字段用于指定元数据或配置驱动程序组件的运行时环境。

主机托管

如果 colocate 字段设置为字符串 true,则驱动程序将尽可能放置在其父驱动程序所在的同一驱动程序宿主中。不过,这只是建议。驱动程序管理器仍可能会将驱动程序放在单独的驱动程序宿主中,例如,如果父设备具有 MUST_ISOLATE 设置。在 DFv1 中,如果父设备是复合设备,驱动程序始终会共置;但仍可通过在复合设备的主 fragment 上设置 MUST_ISOLATE 来强制隔离。

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        colocate: "true"
    }
}

如果未指定 colocate 字段,则其值默认为字符串 false

colocatehost_restart_on_crash 字段互斥。对于一个驱动程序,只能满足其中一个条件。

默认调度程序选项

default_dispatcher_opts 字段提供用于创建驱动程序的默认调度程序的选项,例如:

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        default_dispatcher_opts: [ "allow_sync_calls" ]
    }
}

此字段中的选项对应于 types.h 文件中定义的标志。目前,支持的选项包括:

  • allow_sync_calls:此选项表示调度程序可能不会与其他驱动程序共享 Zircon 线程。此设置允许驱动程序在调度程序上进行同步 Banjo 或 FIDL 调用,而不会发生死锁。

默认调度器调度程序角色

default_dispatcher_scheduler_role 字段提供用于创建驱动程序的默认调度程序的选项,例如:

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        default_dispatcher_scheduler_role: "fuchsia.graphics.display.driver"
    }
}

确保您指定的调度程序角色与组件通过 fuchsia.scheduler/RoleManager.SetRole FIDL API 发送的角色一致。

允许的调度程序角色

allowed_scheduler_roles 字段用于指定在创建新调度程序时允许作为 scheduler_role 传入的内容,例如:

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        allowed_scheduler_roles: "fuchsia.graphics.display.driver"
    }
}

这样一来,驱动程序便可在运行时创建新的调度器并指定 "fuchsia.graphics.display.driver" scheduler_role。

VMAR 调度程序角色

vmar_scheduler_role 字段提供在分配驱动程序映射到的 VMAR 时使用的选项,例如:

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        vmar_scheduler_role: "fuchsia.graphics.display.driver.vmar"
    }
}

确保您指定的调度程序角色与组件通过 fuchsia.scheduler/RoleManager.SetRole FIDL API 发送的角色一致。

后备

如果 fallback 字段设置为字符串 true,此回退驱动程序仅在所有基本驱动程序软件包都已编入索引后尝试绑定。此外,如果此驱动程序与某个节点匹配,并且某个非回退驱动程序也与同一节点匹配,则非回退驱动程序将绑定到该节点。

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        fallback: "true"
    }
}

如果未指定 fallback 字段,则其值默认为字符串 false

下一个 vDSO

如果 use_next_vdso 字段设置为字符串 true,则驱动程序将放置在 driver host 中,并链接到下一个 vdso。驱动程序还必须将 colocate 设置为 true,否则此字段将被忽略。

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        colocate: "true"
        use_next_vdso: "true"
    }
}

如果未指定 use_next_vdso 字段,则其值默认为字符串 false

设备类别

device_categories 字段提供元数据,用于指明驱动程序控制的设备类别,例如:

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        device_categories: [
            { category: "board", subcategory: "i2c" },
            { category: "sensor", subcategory: "temperature" },
        ]
    }
}

此元数据用于确定驱动程序在认证过程中将接受的测试。如需查看设备类别和子类别的完整列表,请参阅 FHCP 架构

崩溃时主机重启

host_restart_on_crash 字段用于告知驱动程序框架,如果驱动程序意外关闭,则应重新启动驱动程序所绑定的节点的驱动程序宿主。

包括以下情况:

  • 驱动程序主机崩溃。
  • 驱动程序在运行时关闭其 fuchsia.driver.framework/Node 协议的客户端。

由于这会影响驱动程序主机,因此只能由主机的根驱动程序进行设置。 根驱动程序是创建主机的驱动程序。当且仅当 colocate 字段设置为 false 时,才会出现这种情况。

因此,host_restart_on_crashcolocate 是互斥的。对于驱动程序,只能有一个是 true

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        host_restart_on_crash: "true"
    }
}

如果未指定 host_restart_on_crash 字段,则其值默认为字符串 false

host_restart_on_crashfalse 时,如果驱动程序意外关闭,则会从驱动程序框架的节点拓扑中移除相应节点。

Service Connect 验证

驱动程序 SDK 的 DriverBase 使用 service_connect_validation 字段来允许在服务功能连接上运行可用性验证。

为此,它会查看驱动器绑定节点可用的优惠,并确保所有 incoming()->Connect() 请求都尝试连接到有效的优惠。

在单父级情况下,这仅确保服务可供节点使用,因为当用户未指定任何实例时,所有请求都应发送到 "default" 实例。

在复合情况下,这可确保所请求的实例名称和 "default" 实例名称大小写形式具有来自相应父级的相应优惠。

如果这些验证失败,Connect() 方法将立即返回 ZX_ERR_NOT_FOUND,而不是建立仅在对其调用双向方法时才会失败的连接。

{
    program: {
        runner: "driver",
        binary: "driver/example.so",
        bind: "meta/bind/example.bindbc",
        service_connect_validation: "true"
    }
}

如果未设置此字段,则默认停用验证。

深入阅读

如需详细了解驱动程序的绑定方式,请参阅驱动程序绑定