| --- |
| name: use-pdev-dfv2 |
| description: Use Platform Device (pdev) in DFv2 drivers. |
| --- |
| |
| # Using Platform Device (pdev) in DFv2 |
| |
| ## Dependencies |
| |
| **GN:** |
| ```gn |
| deps = [ |
| "//sdk/lib/driver/platform-device/cpp", # For fdf::PDev |
| ] |
| ``` |
| |
| **Bazel:** |
| ```bazel |
| deps = [ |
| "@fuchsia_sdk//pkg/driver_platform_device_cpp", # For fdf::PDev |
| ] |
| ``` |
| |
| ## Implementation Steps |
| |
| ### 1. Component Manifest (.cml) Update |
| |
| Declare that the driver uses the service in its `.cml` file: |
| |
| ```cml |
| use: [ |
| { service: "fuchsia.hardware.platform.device.Service" }, |
| ], |
| ``` |
| |
| ### 2. Code Implementation |
| |
| Include the header: |
| ```cpp |
| #include <lib/driver/platform-device/cpp/pdev.h> |
| ``` |
| |
| To connect to `pdev` in your `Start()` method: |
| ```cpp |
| zx::result pdev_client = incoming()->Connect<fuchsia_hardware_platform_device::Service::Device>(); |
| if (pdev_client.is_error()) { |
| fdf::error("Failed to connect to pdev: {}", pdev_client.status_string()); |
| return pdev_client.take_error(); |
| } |
| fdf::PDev pdev(std::move(pdev_client.value())); |
| ``` |
| |
| ### Common Operations |
| |
| * **Map MMIO**: |
| ```cpp |
| zx::result mmio = pdev.MapMmio(0); |
| ``` |
| * **Get Interrupt**: |
| ```cpp |
| zx::result irq = pdev.GetInterrupt(0); |
| ``` |
| * **Get BTI**: |
| ```cpp |
| zx::result bti = pdev.GetBti(0); |
| ``` |
| |
| ## Further Reading |
| |
| * For more information on FIDL usage, see the [Driver FIDL Usage Implementation |
| Skill |
| (C++)](/src/devices/skills/driver_fidl_usage/implementation/cpp/SKILL.md). |