pub mod card;
pub use card::{BusMode, CardDevice, Data, Identity, IdentityText, Phase, Reply, SdCard};
pub const DEFAULT_SLOT: &str = "sd0";
pub mod slots {
use alloc::string::String;
use alloc::sync::Arc;
use alloc::vec::Vec;
use core::fmt;
use super::card::SdCard;
use crate::core::error::Result;
use crate::core::hosts::{HostKind, HostObjects};
use crate::core::props::Props;
use crate::core::sync::{LockRank, Mutex};
pub const KIND: HostKind = HostKind::new("sd-slot");
pub const SLOT_RANK: LockRank = LockRank::new(0x4c00);
pub struct Slot {
card: Mutex<Option<Arc<SdCard>>>,
}
impl fmt::Debug for Slot {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Slot")
.field("occupied", &self.card.lock().is_some())
.finish()
}
}
impl Slot {
#[must_use]
pub fn new() -> Slot {
Slot {
card: Mutex::with_rank(SLOT_RANK, None),
}
}
pub fn insert(&self, card: Arc<SdCard>) -> core::result::Result<(), Arc<SdCard>> {
let mut slot = self.card.lock();
if slot.is_some() {
return Err(card);
}
*slot = Some(card);
Ok(())
}
pub fn eject(&self) -> Option<Arc<SdCard>> {
self.card.lock().take()
}
#[must_use]
pub fn card(&self) -> Option<Arc<SdCard>> {
self.card.lock().clone()
}
#[must_use]
pub fn is_occupied(&self) -> bool {
self.card.lock().is_some()
}
}
impl Default for Slot {
fn default() -> Slot {
Slot::new()
}
}
pub fn open(hosts: &HostObjects, name: &str) -> Result<Arc<Slot>> {
hosts.open(KIND, name, Slot::new)
}
pub fn attach(props: &Props, name: &str) -> Result<Arc<Slot>> {
props.host(KIND, name, Slot::new)
}
pub fn get(hosts: &HostObjects, name: &str) -> Result<Option<Arc<Slot>>> {
hosts.get(KIND, name)
}
pub fn close(hosts: &HostObjects, name: &str) -> bool {
hosts.close(KIND, name)
}
#[must_use]
pub fn names(hosts: &HostObjects) -> Vec<String> {
hosts.names(KIND)
}
}
pub fn register(registry: &mut crate::core::Registry) -> crate::core::error::Result<()> {
card::register(registry)
}
pub fn bind(bindings: &mut crate::machine::Bindings) -> crate::core::error::Result<()> {
card::bind(bindings)
}
#[must_use]
pub fn schemas() -> alloc::vec::Vec<crate::machine::validate::ClassSchema> {
alloc::vec![card::schema()]
}