sdmmc-core 0.5.0

SD/MMC core data structures and algorithms
Documentation
use crate::result::Result;

use super::{ExtCsd, ExtCsdIndex};

mod index;

pub use index::*;

impl ExtCsd {
    /// Gets the `VENDOR_SPECIFIC_FIELD` of the [ExtCsd] register.
    pub const fn vendor_specific(&self, index: Index) -> u8 {
        self.0[index.into_ext_csd_index().into_inner()]
    }

    /// Sets the `VENDOR_SPECIFIC_FIELD` of the [ExtCsd] register.
    pub fn set_vendor_specific(&mut self, index: Index, val: u8) {
        self.0[index.into_ext_csd_index().into_inner()] = val;
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::result::Error;

    #[test]
    fn test_vendor_specific() {
        let mut ext_csd = ExtCsd::new();

        (0..=63)
            .filter_map(|i| Index::try_from_inner(i).ok())
            .for_each(|index| {
                assert_eq!(ext_csd.vendor_specific(index), 0);
                assert!(
                    (ExtCsdIndex::VENDOR_SPECIFIED_START..=ExtCsdIndex::VENDOR_SPECIFIED_END)
                        .contains(&index.into_ext_csd_index().into_inner())
                );

                (0..=u8::MAX).for_each(|val| {
                    ext_csd.set_vendor_specific(index, val);
                    assert_eq!(ext_csd.vendor_specific(index), val);
                });
            });

        (64..=505).for_each(|invalid_index| {
            let exp_err =
                Error::invalid_field_variant("ext_csd::vendor_specific::index", invalid_index);

            assert_eq!(Index::try_from_inner(invalid_index), Err(exp_err));
        });

        (0..=505)
            .filter_map(|r| {
                if !(ExtCsdIndex::VENDOR_SPECIFIED_START..=ExtCsdIndex::VENDOR_SPECIFIED_END)
                    .contains(&r)
                {
                    ExtCsdIndex::try_from_inner(r).ok()
                } else {
                    None
                }
            })
            .for_each(|invalid_ext_csd_index| {
                let exp_err = Error::invalid_field_variant(
                    "ext_csd::vendor_specific::index",
                    invalid_ext_csd_index.into_inner(),
                );

                assert_eq!(
                    Index::try_from_ext_csd_index(invalid_ext_csd_index),
                    Err(exp_err)
                );
            });
    }
}