"more proper" data address offset

This commit is contained in:
J / Jacob Babich
2022-04-14 18:49:58 -04:00
parent 87cd68d12b
commit 231301b9cf
3 changed files with 18 additions and 6 deletions

View File

@@ -210,7 +210,7 @@ pub fn setup_readable_pins<const N: usize>(
_ => todo!(),
}
let data_address = port.data();
let data_address = port.data(&pins);
let pins: [ReadablePin; N] = pins.map(|bit| ReadablePin { data_address, bit });
@@ -296,9 +296,9 @@ pub fn setup_writable_pins<const N: usize>(
_ => todo!(),
}
let data_address = port.data();
let data_address = port.data(&pins);
let pins: [WritablePin; N] = pins.map(|bit| WritablePin { data_address, bit });
let pins: [WritablePin; N] = pins.map(|pin| WritablePin { data_address, bit: pin });
WritablePins { data_address, pins }
}

View File

@@ -58,9 +58,19 @@ impl Port {
/// The memory address of the data (DATA) register for this port
///
/// Page 662 of data sheet
pub(super) fn data(&self) -> *mut u32 {
const OFFSET: u32 = 0x3FC;
(self.base() + OFFSET) as *mut u32
pub(super) fn data(&self, pins: &[Pin]) -> *mut u32 {
// Extra guidance provided by
// http://shukra.cedt.iisc.ernet.in/edwiki/EmSys:TM4C123GXL_GPIO_-_Read_Write_Data_Register
// because the data sheet was a bit hard to understand when thinking about why
// the C code I was referencing used an offset of 0x3FC
let mut offset = 0;
for pin in pins {
let bit = (*pin as u32) + 2;
offset |= 1 << bit;
}
(self.base() + offset) as *mut u32
}
/// The memory address of the digital enable (DEN) register for this port

View File

@@ -12,3 +12,5 @@ pub mod system {
// TODO: page 340
pub const RCGCGPIO: *mut u32 = (BASE + 0x608) as *mut u32;
}
// TODO: delete this file