blob: f1a1e43ee8f55b392ac5d09e45cd64e70e9902f1 [file] [log] [blame] [view]
# Explore the `edu` device
The `edu` device connects to the system PCI bus and identifies itself using the
following configuration register values:
* **Vendor ID (VID):** `0x1234`
* **Device ID (DID):** `0x11E8`
Device drivers interact with the device using Interrupts and Memory-Mapped I/O
(MMIO) registers.
Note: For complete details on the `edu` device and its MMIO regions, see the
[device specification][edu-device-spec].
In this codelab, you'll write a Fuchsia driver that provides the features of
this `edu` device to other system components.
<<_common/_start_femu.md>>
## Explore the device nodes
Use the `ffx driver list-devices` command to list all the device nodes known to
the system:
```posix-terminal
ffx driver list-devices
```
The command outputs a list similar to the following:
```none {:.devsite-disable-click-to-copy}
root
root.sys
root.sys.platform
root.sys.cpu-trace
root.sys.platform.pt
root.sys.platform.ram-disk
root.sys.platform.ram-nand
root.sys.platform.virtual-audio
root.sys.platform.bt-hci-emulator
root.sys.platform.00_00_1b
root.sys.cpu-trace.perfmon
root.sys.platform.pt.acpi
root.sys.platform.pt.PCI0
...
```
The `edu` device is on the PCI bus, so use the following command to narrow down
the list of devices:
```posix-terminal
ffx driver list-devices | grep 'PCI'
```
You'll see a shorter list similar to the following output:
```none {:.devsite-disable-click-to-copy}
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_
```
These are the PCI device nodes in the current emulator instance.
Note: The driver framework team is currently migrating drivers from
Banjo to [FIDL][drivers-fidl] interfaces. During the migration,
each device node appears twice to represent each interface type.
## Discover the correct device
In order to determine which of these device nodes is the `edu` device, use the
`lspci` command to find the device with the matching VID (`0x1234`) and
DID (`0x11e8`) of the `edu` device:
```posix-terminal
ffx driver lspci
```
The command prints a list similar to the following, indicating the matching PCI
device node is `00:06.0`:
```none {:.devsite-disable-click-to-copy}
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)
{{ '<strong>' }}00:06.0 Unclassified device: [1234:11e8] (rev 10){{ '</strong>' }}
00:07.0 Mouse controller: Red Hat, Inc. Virtio input (rev 01)
00:0b.0 Unclassified device: [607d:f153] (rev 01)
...
```
From the device list in the previous section, this means the `edu` device maps
to the PCI device node `root.sys.platform.pt.PCI0.bus.00_06_0_.pci-00_06.0-fidl`.
Explore the properties of this device node using the following command:
```posix-terminal
ffx driver list-devices root.sys.platform.pt.PCI0.bus.00_06_0_.pci-00_06.0-fidl --verbose
```
The command prints output similar to the following:
```none {:.devsite-disable-click-to-copy}
Name : 0-fidl
{{ '<strong>' }}Moniker : root.sys.platform.pt.PCI0.bus.00_06_0_.pci-00_06.0-fidl{{ '</strong>' }}
Driver : None
10 Properties
[ 1/ 10] : Key fuchsia.BIND_FIDL_PROTOCOL Value 0x000004
{{ '<strong>' }}[ 2/ 10] : Key fuchsia.BIND_PCI_VID Value 0x001234{{ '</strong>' }}
{{ '<strong>' }}[ 3/ 10] : Key fuchsia.BIND_PCI_DID Value 0x0011e8{{ '</strong>' }}
[ 4/ 10] : Key fuchsia.BIND_PCI_CLASS Value 0x000000
[ 5/ 10] : Key fuchsia.BIND_PCI_SUBCLASS Value 0x0000ff
[ 6/ 10] : Key fuchsia.BIND_PCI_INTERFACE Value 0x000000
[ 7/ 10] : Key fuchsia.BIND_PCI_REVISION Value 0x000010
[ 8/ 10] : Key fuchsia.BIND_PCI_TOPO Value 0x000030
[ 9/ 10] : Key "fuchsia.hardware.pci.Device" Value true
[10/ 10] : Key fuchsia.BIND_PROTOCOL Value 0x000000
```
Notice that this device does not currently have a driver loaded (the `Driver`
field is set to `None`). These properties describe the values that the driver
framework considers in determining whether a driver matches the device node.
In the next section, you'll declare a driver component that binds to this device
using these properties.
<!-- Reference links -->
[drivers-fidl]: /docs/development/drivers/concepts/device_driver_model/fidl.md
[edu-device-spec]: https://fuchsia.googlesource.com/third_party/qemu/+/refs/heads/main/docs/specs/edu.txt