探索教育设备

edu 设备会连接到系统 PCI 总线,并使用以下配置寄存器值标识自身:

  • 供应商 ID (VID)0x1234
  • 设备 ID (DID)0x11E8

设备驱动程序使用中断和内存映射 I/O (MMIO) 寄存器与设备进行交互。

在此 Codelab 中,您将编写一个 Fuchsia 驱动程序,为其他系统组件提供此 edu 设备的功能。

启动模拟器

停止您当前可能正在运行的所有模拟器实例:

ffx emu stop --all

启动启用了 Driver Framework v2 的 Fuchsia 模拟器的新实例:

ffx emu start core.x64 --headless

探索设备节点

使用 ffx driver list-devices 命令列出系统已知的所有设备节点:

ffx driver list-devices

该命令会输出类似于以下内容的列表:

root
root.sys
root.sys.platform
root.sys.cpu-trace
root.sys.platform.pt
root.sys.platform.00_00_2d
root.sys.platform.00_00_2e
root.sys.platform.00_00_2f
root.sys.platform.00_00_30
root.sys.platform.00_00_1b
root.sys.cpu-trace.perfmon
root.sys.platform.pt.acpi
root.sys.platform.pt.PCI0
...

edu 设备位于 PCI 总线上,因此使用以下命令来缩小设备列表:

ffx driver list-devices | grep 'PCI'

您会看到类似于以下输出的简短列表:

root.sys.platform.pt.PCI0
root.sys.platform.pt.PCI0.bus
root.sys.platform.pt.PCI0.bus.00_00_0
root.sys.platform.pt.PCI0.bus.00_00_0_
root.sys.platform.pt.PCI0.bus.00_01_0
root.sys.platform.pt.PCI0.bus.00_01_0_
root.sys.platform.pt.PCI0.bus.00_02_0
root.sys.platform.pt.PCI0.bus.00_02_0_
root.sys.platform.pt.PCI0.bus.00_03_0
root.sys.platform.pt.PCI0.bus.00_03_0_
root.sys.platform.pt.PCI0.bus.00_04_0
root.sys.platform.pt.PCI0.bus.00_04_0_
root.sys.platform.pt.PCI0.bus.00_05_0
root.sys.platform.pt.PCI0.bus.00_05_0_
root.sys.platform.pt.PCI0.bus.00_06_0
root.sys.platform.pt.PCI0.bus.00_06_0_
root.sys.platform.pt.PCI0.bus.00_07_0
root.sys.platform.pt.PCI0.bus.00_07_0_
root.sys.platform.pt.PCI0.bus.00_0b_0
root.sys.platform.pt.PCI0.bus.00_0b_0_
root.sys.platform.pt.PCI0.bus.00_1f_0
root.sys.platform.pt.PCI0.bus.00_1f_0_
root.sys.platform.pt.PCI0.bus.00_1f_2
root.sys.platform.pt.PCI0.bus.00_1f_2_
root.sys.platform.pt.PCI0.bus.00_1f_3
root.sys.platform.pt.PCI0.bus.00_1f_3_

这些是当前模拟器实例中的 PCI 设备节点。

发现正确的设备

为了确定这些设备节点中的哪一个节点是 edu 设备,请使用 lspci 命令查找 edu 设备的 VID (0x1234) 和 DID (0x11e8) 相匹配的设备:

ffx driver lspci

该命令会输出类似于以下内容的列表,指明匹配的 PCI 设备节点为 00:06.0

00:00.0 Host bridge: Intel Corporation 82G33/G31/P35/P31 Express DRAM Controller (rev 00)
00:01.0 Audio device: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller (rev 01)
00:02.0 SCSI storage controller: Red Hat, Inc. Virtio block device (rev 00)
00:03.0 Mouse controller: Red Hat, Inc. Virtio input (rev 01)
00:04.0 Ethernet controller: Red Hat, Inc. Virtio network device (rev 00)
00:05.0 Keyboard controller: Red Hat, Inc. Virtio input (rev 01)
00:06.0 Unclassified device: [1234:11e8] (rev 10)
00:07.0 Mouse controller: Red Hat, Inc. Virtio input (rev 01)
00:0b.0 Unclassified device: [607d:f153] (rev 01)
...

在上一部分中的设备列表中,这意味着 edu 设备映射到 PCI 设备节点 root.sys.platform.pt.PCI0.bus.00_06_0_.pci-00_06.0-fidl

使用以下命令探索此设备节点的属性:

ffx driver list-devices root.sys.platform.pt.PCI0.bus.00_06_0_.pci-00_06.0-fidl --verbose

该命令会输出类似于以下内容的输出:

Name     : 0-fidl
Moniker  : root.sys.platform.pt.PCI0.bus.00_06_0_.pci-00_06.0-fidl
Driver   : None
11 Properties
[ 1/ 11] : Key fuchsia.BIND_FIDL_PROTOCOL     Value 0x000004
[ 2/ 11] : Key fuchsia.BIND_PCI_VID           Value 0x001234
[ 3/ 11] : Key fuchsia.BIND_PCI_DID           Value 0x0011e8
[ 4/ 11] : Key fuchsia.BIND_PCI_CLASS         Value 0x000000
[ 5/ 11] : Key fuchsia.BIND_PCI_SUBCLASS      Value 0x0000ff
[ 6/ 11] : Key fuchsia.BIND_PCI_INTERFACE     Value 0x000000
[ 7/ 11] : Key fuchsia.BIND_PCI_REVISION      Value 0x000010
[ 8/ 11] : Key fuchsia.BIND_PCI_TOPO          Value 0x000030
[ 9/ 11] : Key "fuchsia.hardware.pci.Device"  Value true
[10/ 11] : Key fuchsia.BIND_PROTOCOL          Value 0x000000
[11/ 11] : Key "fuchsia.platform.DRIVER_FRAMEWORK_VERSION" Value 0x000002

请注意,此设备当前未加载驱动程序(Driver 字段设置为 None)。这些属性描述了驱动程序框架在确定驱动程序是否与设备节点匹配时考虑的值。在下一部分中,您将使用这些属性声明一个绑定到此设备的驱动程序组件。