extern crate alloc;
use alloc::{sync::Arc, vec};
use axdevice_base::{
AccessWidth, BusAccess, BusKind, BusResponse, Device, DeviceAccess, DeviceError, DeviceId,
NoopDeviceAccess, Resource,
};
struct DeviceA;
impl Device for DeviceA {
fn name(&self) -> &str {
"device-a"
}
fn resources(&self) -> &[Resource] {
static RESOURCES: [Resource; 1] = [Resource::MmioRange {
base: 0x1000,
size: 0x1000,
}];
&RESOURCES
}
fn access(
&self,
access: &BusAccess,
_context: &mut dyn DeviceAccess,
) -> Result<BusResponse, DeviceError> {
Ok(BusResponse::Read { value: access.addr })
}
}
struct DeviceB;
impl Device for DeviceB {
fn name(&self) -> &str {
"device-b"
}
fn resources(&self) -> &[Resource] {
static RESOURCES: [Resource; 1] = [Resource::MmioRange {
base: 0x2000,
size: 0x1000,
}];
&RESOURCES
}
fn access(
&self,
access: &BusAccess,
_context: &mut dyn DeviceAccess,
) -> Result<BusResponse, DeviceError> {
Ok(BusResponse::Read { value: access.addr })
}
}
#[test]
fn test_device_type_test() {
let devices: Vec<Arc<dyn Device>> = vec![Arc::new(DeviceA), Arc::new(DeviceB)];
for (index, device) in devices.iter().enumerate() {
let addr = 0x1000 + index * 0x1000;
let mut context = NoopDeviceAccess::new(DeviceId::new(index as u32));
let resp = device
.access(
&BusAccess {
kind: BusKind::Mmio,
is_read: true,
addr: addr as u64,
width: AccessWidth::Byte,
data: 0,
},
&mut context,
)
.unwrap();
assert!(matches!(
resp,
BusResponse::Read { value } if value as usize == addr
));
}
}