mod data_transfer;
mod optional;
mod pin_drive;
mod power;
mod string_descriptor;
use std::ptr::addr_of_mut;
use crate::{ffi, try_d3xx, Result};
pub use data_transfer::*;
pub use optional::*;
pub use pin_drive::*;
pub use power::*;
pub use string_descriptor::*;
pub struct ChipConfiguration {
vid: u16,
pid: u16,
string_descriptor: StringDescriptor,
power_config: PowerConfig,
pin_drive_strength: PinDriveStrengths,
interrupt_latency: u8,
data_transfer: DataTransferConfig,
optional_features: OptionalFeatures,
}
impl ChipConfiguration {
pub(crate) fn new(handle: ffi::FT_HANDLE) -> Result<Self> {
let mut config: ffi::FT_60XCONFIGURATION = unsafe { std::mem::zeroed() };
try_d3xx!(unsafe { ffi::FT_GetChipConfiguration(handle, addr_of_mut!(config).cast()) })?;
Ok(Self {
vid: config.VendorID,
pid: config.ProductID,
string_descriptor: StringDescriptor::new(config.StringDescriptors),
power_config: PowerConfig::new(config.PowerAttributes, config.PowerConsumption),
pin_drive_strength: PinDriveStrengths::new(config.MSIO_Control, config.GPIO_Control)?,
interrupt_latency: config.bInterval,
data_transfer: DataTransferConfig::new(
config.FIFOClock,
config.FIFOMode,
config.ChannelConfig,
)?,
optional_features: OptionalFeatures::new(
config.OptionalFeatureSupport,
config.BatteryChargingGPIOConfig,
),
})
}
#[must_use]
pub fn vendor_id(&self) -> u16 {
self.vid
}
#[must_use]
pub fn product_id(&self) -> u16 {
self.pid
}
#[must_use]
pub fn string_descriptor(&self) -> &StringDescriptor {
&self.string_descriptor
}
#[must_use]
pub fn string_descriptor_mut(&mut self) -> &mut StringDescriptor {
&mut self.string_descriptor
}
#[must_use]
pub fn power_config(&self) -> &PowerConfig {
&self.power_config
}
#[must_use]
pub fn power_config_mut(&mut self) -> &mut PowerConfig {
&mut self.power_config
}
#[must_use]
pub fn pin_drive_strengths(&self) -> &PinDriveStrengths {
&self.pin_drive_strength
}
#[must_use]
pub fn pin_drive_strengths_mut(&mut self) -> &mut PinDriveStrengths {
&mut self.pin_drive_strength
}
#[must_use]
pub fn interrupt_latency(&self) -> u8 {
self.interrupt_latency
}
pub fn set_interrupt_latency(&mut self, latency: u8) {
assert!((1..17).contains(&latency));
self.interrupt_latency = latency;
}
#[must_use]
pub fn data_transfer(&self) -> &DataTransferConfig {
&self.data_transfer
}
#[must_use]
pub fn data_transfer_mut(&mut self) -> &mut DataTransferConfig {
&mut self.data_transfer
}
#[must_use]
pub fn optional_features(&self) -> &OptionalFeatures {
&self.optional_features
}
#[must_use]
pub fn optional_features_mut(&mut self) -> &mut OptionalFeatures {
&mut self.optional_features
}
}