pub struct PinScanner { /* private fields */ }Expand description
Basic structure for doing boundary scanning. Expects a fixed chain of devices.
Implementations§
Source§impl PinScanner
impl PinScanner
Sourcepub fn get_tap_info(&self, i: usize) -> Result<TapInfo, Error>
pub fn get_tap_info(&self, i: usize) -> Result<TapInfo, Error>
TapInfo of a TAP; the index is of Self::tap_infos.
Sourcepub fn get_tap_state(&self, i: usize) -> Result<TapState, Error>
pub fn get_tap_state(&self, i: usize) -> Result<TapState, Error>
Current state of a TAP; the index is of Self::tap_infos.
Sourcepub fn set_tap_state(
&mut self,
i: usize,
new_state: TapState,
) -> Result<(), Error>
pub fn set_tap_state( &mut self, i: usize, new_state: TapState, ) -> Result<(), Error>
Switches the state of a TAP with index i; the index can be determined by
finding in Self::tap_infos.
Sourcepub fn pin_ids_for_tap(&self, i_tap: usize) -> Result<PinIdIter, Error>
pub fn pin_ids_for_tap(&self, i_tap: usize) -> Result<PinIdIter, Error>
Iterates through all PinIds for a TAP in the chain.
i_tap can be determined by finding in Self::tap_infos.
Sourcepub fn get_pin_id(&self, i_tap: usize, pin_name: &str) -> Result<PinId, Error>
pub fn get_pin_id(&self, i_tap: usize, pin_name: &str) -> Result<PinId, Error>
Gets a pin identifier by its port name in the BSDL file.
i_tap can be determined by finding in Self::tap_infos.
For a pin in a bus port, pin_name should be “PORT_NAME(i)”.
Sourcepub fn get_pin_state(&self, pin_id: &PinId) -> Result<PinState, Error>
pub fn get_pin_state(&self, pin_id: &PinId) -> Result<PinState, Error>
Gets the pin state at the timepoint before the last Self::update call applied newly set pin states.
Sourcepub fn set_pin_state(
&mut self,
pin_id: &PinId,
new_state: Option<bool>,
) -> Result<(), Error>
pub fn set_pin_state( &mut self, pin_id: &PinId, new_state: Option<bool>, ) -> Result<(), Error>
Sets the new pin state that will be applyed on the next Self::update call. Only for setting pins with output cell in EXTEST mode.
If new_state is Some(state), state will be set in the output cell,
and true will be set in the output enable cell if the pin is tristated.
If new_state is None, false will be set in the output enable cell
if the pin is tristated, otherwise an error is returned.
Sourcepub fn update(&mut self) -> Result<(), Error>
pub fn update(&mut self) -> Result<(), Error>
Applies Self::set_pin_state calls since last Self::update and refreshes the capture buffer for later Self::get_pin_state calls with the values before setting new pin states.
Sourcepub fn write_update(&mut self) -> Result<(), Error>
pub fn write_update(&mut self) -> Result<(), Error>
Applies Self::set_pin_state calls and then does Self::update, so that later Self::get_pin_state calls will be influenced by the newly set values. This makes no sense if no TAP is in EXTEST mode.
Source§impl PinScanner
impl PinScanner
Sourcepub fn batch(
&mut self,
count: usize,
writer: impl FnMut(usize, &mut BsrEdit<'_, '_>) -> Result<(), Error>,
reader: impl FnMut(usize, &BsrView<'_, '_>) -> Result<(), Error>,
) -> Result<(), Error>
pub fn batch( &mut self, count: usize, writer: impl FnMut(usize, &mut BsrEdit<'_, '_>) -> Result<(), Error>, reader: impl FnMut(usize, &BsrView<'_, '_>) -> Result<(), Error>, ) -> Result<(), Error>
Executes queued read + write operations for count times.
This can be used to speed up a group of transfers if each item in the group does not depend on the result of the previous item.
writer and reader will both be called for count times.
The cycle counter counts towards count starting from 0.
On startup, the current BSR output buffer is copied as the
buffer for writer.
At the beginning of each cycle, writer is called with the output
buffer and the cycle counter value; any change to the buffer made by
writer will be captured and queued for writing to the device, and
preserved for the next writer call. When it is actually executed,
the captured states before this write is passed to the corresponding
call to reader, along with the same cycle counter value.
Returns successfully when the last write is finished; before returning,
the output buffer (possibly modified by the last writer call) is
applied back to self, and Self::update is called.
let pins = [
"PB0", "PB1", "PB5", "PB6", "PB7", "PB8", "PB9", "PB10", "PB11", "PB12", "PB13", "PB14",
"PB15", "PC13", "PC14", "PC15",
];
let pins: Vec<_> = pins
.iter()
.map(|n| scanner.get_pin_id(i_c6t6, *n).unwrap())
.collect();
scanner.set_tap_state(i_c6t6, TapState::Extest)?;
scanner.batch(
65536,
|i, edit| {
// sets value `i` to the 16-bit "bus".
for (i_pin, pin) in pins.iter().enumerate() {
let val = ((i >> i_pin) & 1) == 1;
edit.set(pin, Some(val))?;
}
Ok(())
},
|i, view| {
let i_prev = if i > 0 {
i - 1
} else {
return Ok(());
};
// `view` provides pin states before the `i`th edit is applied,
// which equals the values set in `i - 1`th edit.
let mut val = 0;
for (i_pin, pin) in pins.iter().enumerate() {
if view.get(pin)?.input().unwrap() {
val |= 1 << i_pin;
}
}
assert_eq!(val, i_prev);
Ok(())
},
)?;Trait Implementations§
Source§impl Drop for PinScanner
impl Drop for PinScanner
Auto Trait Implementations§
impl !RefUnwindSafe for PinScanner
impl !Send for PinScanner
impl !Sync for PinScanner
impl !UnwindSafe for PinScanner
impl Freeze for PinScanner
impl Unpin for PinScanner
impl UnsafeUnpin for PinScanner
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.