bb.rs 562 B

12345678910111213141516171819202122
  1. //! Bit banding
  2. use core::ptr;
  3. pub unsafe fn clear<T>(register: *const T, bit: u8) {
  4. write(register, bit, false);
  5. }
  6. pub unsafe fn set<T>(register: *const T, bit: u8) {
  7. write(register, bit, true);
  8. }
  9. pub unsafe fn write<T>(register: *const T, bit: u8, set: bool) {
  10. let addr = register as usize;
  11. assert!(addr >= 0x4000_0000 && addr <= 0x4010_0000);
  12. assert!(bit < 32);
  13. let bit = bit as usize;
  14. let bb_addr = (0x4200_0000 + (addr - 0x4000_0000) * 32) + 4 * bit;
  15. ptr::write_volatile(bb_addr as *mut u32, if set { 1 } else { 0 })
  16. }