Support raw things

This commit is contained in:
Dylan McKay 2017-12-13 22:17:28 +13:00
parent 906b548dfa
commit 468289e05f
3 changed files with 58 additions and 34 deletions

View File

@ -26,13 +26,13 @@ pub trait Pin {
/// Sets the pin up as an input. /// Sets the pin up as an input.
#[inline(always)] #[inline(always)]
fn set_input() { fn set_input() {
Self::DDR::unset(Self::MASK); Self::DDR::unset_raw(Self::MASK);
} }
/// Sets the pin up as an output. /// Sets the pin up as an output.
#[inline(always)] #[inline(always)]
fn set_output() { fn set_output() {
Self::DDR::set(Self::MASK); Self::DDR::set_raw(Self::MASK);
} }
/// Set the pin to high. /// Set the pin to high.
@ -40,7 +40,7 @@ pub trait Pin {
/// The pin must be configured as an output. /// The pin must be configured as an output.
#[inline(always)] #[inline(always)]
fn set_high() { fn set_high() {
Self::PORT::set(Self::MASK); Self::PORT::set_raw(Self::MASK);
} }
/// Set the pin to low. /// Set the pin to low.
@ -48,7 +48,7 @@ pub trait Pin {
/// The pin must be configured as an output. /// The pin must be configured as an output.
#[inline(always)] #[inline(always)]
fn set_low() { fn set_low() {
Self::PORT::unset(Self::MASK); Self::PORT::unset_raw(Self::MASK);
} }
/// Toggles the pin. /// Toggles the pin.
@ -59,7 +59,7 @@ pub trait Pin {
// FIXME: We can optimise this on post-2006 AVRs. // FIXME: We can optimise this on post-2006 AVRs.
// http://www.avrfreaks.net/forum/toggle-state-output-pin // http://www.avrfreaks.net/forum/toggle-state-output-pin
// set(Self::PIN, Self::MASK); // set(Self::PIN, Self::MASK);
Self::PORT::toggle(Self::MASK); Self::PORT::toggle_raw(Self::MASK);
} }
/// Check if the pin is currently high. /// Check if the pin is currently high.
@ -67,7 +67,7 @@ pub trait Pin {
/// The pin must be configured as an input. /// The pin must be configured as an input.
#[inline(always)] #[inline(always)]
fn is_high() -> bool { fn is_high() -> bool {
Self::PIN::is_set(Self::MASK) Self::PIN::is_set_raw(Self::MASK)
} }
/// Checks if the pin is currently low. /// Checks if the pin is currently low.
@ -75,7 +75,7 @@ pub trait Pin {
/// The pin must be configured as an input. /// The pin must be configured as an input.
#[inline(always)] #[inline(always)]
fn is_low() -> bool { fn is_low() -> bool {
Self::PIN::is_clear(Self::MASK) Self::PIN::is_clear_raw(Self::MASK)
} }
} }

View File

@ -34,51 +34,71 @@ pub trait Register<T: RegisterValue> : Sized {
unsafe { *Self::ADDR } unsafe { *Self::ADDR }
} }
fn set(mask: Mask<T, Self>) {
Self::set_raw(mask.mask);
}
/// Sets a bitmask in a register. /// Sets a bitmask in a register.
/// ///
/// This is equivalent to `r |= mask`. /// This is equivalent to `r |= mask`.
#[inline(always)] #[inline(always)]
fn set(mask: T) { fn set_raw(mask: T) {
unsafe { unsafe {
*Self::ADDR |= mask; *Self::ADDR |= mask;
} }
} }
fn unset(mask: Mask<T, Self>) {
Self::unset_raw(mask.mask);
}
/// Clears a bitmask from a register. /// Clears a bitmask from a register.
/// ///
/// This is equivalent to `r &= !mask`. /// This is equivalent to `r &= !mask`.
#[inline(always)] #[inline(always)]
fn unset(mask: T) { fn unset_raw(mask: T) {
unsafe { unsafe {
*Self::ADDR &= !mask; *Self::ADDR &= !mask;
} }
} }
fn toggle(mask: Mask<T, Self>) {
Self::toggle_raw(mask.mask);
}
/// Toggles a mask in the register. /// Toggles a mask in the register.
/// ///
/// This is equivalent to `r ^= mask`. /// This is equivalent to `r ^= mask`.
#[inline(always)] #[inline(always)]
fn toggle(mask: T) { fn toggle_raw(mask: T) {
unsafe { unsafe {
*Self::ADDR ^= mask; *Self::ADDR ^= mask;
} }
} }
fn is_set(mask: Mask<T, Self>) -> bool {
Self::is_set_raw(mask.mask)
}
/// Checks if a mask is set in the register. /// Checks if a mask is set in the register.
/// ///
/// This is equivalent to `(r & mask) == mask`. /// This is equivalent to `(r & mask) == mask`.
#[inline(always)] #[inline(always)]
fn is_set(mask: T) -> bool { fn is_set_raw(mask: T) -> bool {
unsafe { unsafe {
(*Self::ADDR & mask) == mask (*Self::ADDR & mask) == mask
} }
} }
fn is_clear(mask: Mask<T, Self>) -> bool {
Self::is_clear_raw(mask.mask)
}
/// Checks if a mask is clear in the register. /// Checks if a mask is clear in the register.
/// ///
/// This is equivalent to `(r & mask) == 0`. /// This is equivalent to `(r & mask) == 0`.
#[inline(always)] #[inline(always)]
fn is_clear(mask: T) -> bool { fn is_clear_raw(mask: T) -> bool {
unsafe { unsafe {
(*Self::ADDR & mask) == T::from(0) (*Self::ADDR & mask) == T::from(0)
} }
@ -95,10 +115,14 @@ pub trait Register<T: RegisterValue> : Sized {
} }
} }
fn wait_until_set(mask: Mask<T, Self>) {
Self::wait_until_set_raw(mask.mask);
}
/// Waits until a mask is set. /// Waits until a mask is set.
#[inline(always)] #[inline(always)]
fn wait_until_set(mask: T) { fn wait_until_set_raw(mask: T) {
Self::wait_until(|| Self::is_set(mask)) Self::wait_until(|| Self::is_set_raw(mask))
} }
} }
@ -127,28 +151,28 @@ impl<T,R> Bitset<T,R>
/// ///
/// This is equivalent to `r |= mask`. /// This is equivalent to `r |= mask`.
pub fn set_all(self) { pub fn set_all(self) {
R::set(self.mask); R::set_raw(self.mask);
} }
/// Clears the mask from the register. /// Clears the mask from the register.
/// ///
/// This is equivalent to `r &= !mask`. /// This is equivalent to `r &= !mask`.
pub fn unset_all(self) { pub fn unset_all(self) {
R::unset(self.mask); R::unset_raw(self.mask);
} }
/// Toggles the masked bits in the register. /// Toggles the masked bits in the register.
/// ///
/// This is equivalent to `r ^= mask`. /// This is equivalent to `r ^= mask`.
pub fn toggle_all(self) { pub fn toggle_all(self) {
R::toggle(self.mask); R::toggle_raw(self.mask);
} }
/// Checks if the mask is clear. /// Checks if the mask is clear.
/// ///
/// This is equivalent to `(r & mask) == 0`. /// This is equivalent to `(r & mask) == 0`.
pub fn is_clear(self) -> bool { pub fn is_clear(self) -> bool {
R::is_clear(self.mask) R::is_clear_raw(self.mask)
} }
} }

View File

@ -53,87 +53,87 @@ pub trait HardwareSpi {
/// Sets the clock speed. /// Sets the clock speed.
fn set_clock(clock: u32) { fn set_clock(clock: u32) {
let mask = clock::ClockMask::with_clock(clock); let mask = clock::ClockMask::with_clock(clock);
Self::ControlRegister::set(mask.control_register_mask()); Self::ControlRegister::set_raw(mask.control_register_mask());
Self::StatusRegister::set(mask.status_register_mask()); Self::StatusRegister::set_raw(mask.status_register_mask());
} }
/// Enables interrupts for the spi module. /// Enables interrupts for the spi module.
#[inline(always)] #[inline(always)]
fn enable_interrupt() { fn enable_interrupt() {
Self::ControlRegister::set(control_register::INTERRUPT_ENABLE); Self::ControlRegister::set_raw(control_register::INTERRUPT_ENABLE);
} }
/// Disables interrupts for the spi module. /// Disables interrupts for the spi module.
#[inline(always)] #[inline(always)]
fn disable_interrupt() { fn disable_interrupt() {
Self::ControlRegister::unset(control_register::INTERRUPT_ENABLE); Self::ControlRegister::unset_raw(control_register::INTERRUPT_ENABLE);
} }
/// Enables the SPI. /// Enables the SPI.
#[inline(always)] #[inline(always)]
fn enable() { fn enable() {
Self::ControlRegister::set(control_register::ENABLE); Self::ControlRegister::set_raw(control_register::ENABLE);
} }
/// Disables the SPI. /// Disables the SPI.
#[inline(always)] #[inline(always)]
fn disable() { fn disable() {
Self::ControlRegister::unset(control_register::ENABLE); Self::ControlRegister::unset_raw(control_register::ENABLE);
} }
/// Enables least-significant-bit first. /// Enables least-significant-bit first.
#[inline(always)] #[inline(always)]
fn set_lsb() { fn set_lsb() {
Self::ControlRegister::set(control_register::DATA_ORDER_LSB); Self::ControlRegister::set_raw(control_register::DATA_ORDER_LSB);
} }
/// Enables most-significant-bit first. /// Enables most-significant-bit first.
#[inline(always)] #[inline(always)]
fn set_msb() { fn set_msb() {
Self::ControlRegister::unset(control_register::DATA_ORDER_LSB); Self::ControlRegister::unset_raw(control_register::DATA_ORDER_LSB);
} }
/// Enables master mode. /// Enables master mode.
#[inline(always)] #[inline(always)]
fn set_master() { fn set_master() {
Self::ControlRegister::set(control_register::MASTER); Self::ControlRegister::set_raw(control_register::MASTER);
} }
/// Enables slave mode. /// Enables slave mode.
#[inline(always)] #[inline(always)]
fn set_slave() { fn set_slave() {
Self::ControlRegister::unset(control_register::MASTER); Self::ControlRegister::unset_raw(control_register::MASTER);
} }
/// Enables double speed mode. /// Enables double speed mode.
#[inline(always)] #[inline(always)]
fn enable_double_speed() { fn enable_double_speed() {
Self::StatusRegister::set(status_register::SPI2X); Self::StatusRegister::set_raw(status_register::SPI2X);
} }
/// Disables double speed mode. /// Disables double speed mode.
#[inline(always)] #[inline(always)]
fn disable_double_speed() { fn disable_double_speed() {
Self::StatusRegister::unset(status_register::SPI2X); Self::StatusRegister::unset_raw(status_register::SPI2X);
} }
/// Checks if there is a write collision. /// Checks if there is a write collision.
#[inline(always)] #[inline(always)]
fn is_write_collision() -> bool { fn is_write_collision() -> bool {
Self::StatusRegister::is_set(status_register::WCOL) Self::StatusRegister::is_set_raw(status_register::WCOL)
} }
/// Sends a byte through the serial. /// Sends a byte through the serial.
#[inline(always)] #[inline(always)]
fn send_byte(byte: u8) { fn send_byte(byte: u8) {
Self::DataRegister::write(byte); Self::DataRegister::write(byte);
Self::StatusRegister::wait_until_set(status_register::SPIF); Self::StatusRegister::wait_until_set_raw(status_register::SPIF);
} }
/// Reads a byte from the serial. /// Reads a byte from the serial.
#[inline(always)] #[inline(always)]
fn receive_byte() -> u8 { fn receive_byte() -> u8 {
Self::StatusRegister::wait_until_set(status_register::SPIF); Self::StatusRegister::wait_until_set_raw(status_register::SPIF);
Self::DataRegister::read() Self::DataRegister::read()
} }
@ -141,7 +141,7 @@ pub trait HardwareSpi {
#[inline(always)] #[inline(always)]
fn send_receive(byte: u8) -> u8 { fn send_receive(byte: u8) -> u8 {
Self::DataRegister::write(byte); Self::DataRegister::write(byte);
Self::StatusRegister::wait_until_set(status_register::SPIF); Self::StatusRegister::wait_until_set_raw(status_register::SPIF);
Self::DataRegister::read() Self::DataRegister::read()
} }
} }