Expand description
PCI bus
Users can implement the bus under the PciDriver
to the PCI bus to register devices,
when the physical device and the driver match successfully, it will be provided through the driver construct
function
to construct a structure that implements the PciDevice
trait. And in the end,
PCI bus will store a reference to the structure and finally call the driver’s probe function to remind the driver of a new device access.
Use case:
#[derive(Debug)]
pub struct PciDeviceA {
common_device: PciCommonDevice,
}
impl PciDevice for PciDeviceA {
fn device_id(&self) -> PciDeviceId {
self.common_device.device_id().clone()
}
}
#[derive(Debug)]
pub struct PciDriverA {
devices: Mutex<Vec<Arc<PciDeviceA>>>,
}
impl PciDriver for PciDriverA {
fn probe(
&self,
device: PciCommonDevice,
) -> Result<Arc<dyn PciDevice>, (PciDriverProbeError, PciCommonDevice)> {
if device.device_id().vendor_id != 0x1234 {
return Err((PciDriverProbeError::DeviceNotMatch, device));
}
let device = Arc::new(PciDeviceA {
common_device: device,
});
self.devices.lock().push(device.clone());
Ok(device)
}
}
pub fn driver_a_init() {
let driver_a = Arc::new(PciDriverA {
devices: Mutex::new(Vec::new()),
});
PCI_BUS.lock().register_driver(driver_a);
}
Modules§
- bus
- PCI bus
- capability
- PCI device capabilities.
- cfg_
space - The PCI configuration space.
- common_
device - PCI device common definitions or functions.
- device_
info 🔒 - PCI device Information
Structs§
- PciDevice
Id - PCI device ID
- PciDevice
Location - PCI device Location
Statics§
- PCI_BUS
- PCI bus instance
Functions§
- init 🔒