use serde::{Deserialize, Serialize}; pub use syscall; #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum I2cTransferOp { Write(Vec), Read(usize), } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct I2cTransferSegment { pub address: u16, pub ten_bit_address: bool, pub op: I2cTransferOp, } impl I2cTransferSegment { pub fn write(address: u16, payload: impl Into>) -> Self { Self { address, ten_bit_address: false, op: I2cTransferOp::Write(payload.into()), } } pub fn read(address: u16, len: usize) -> Self { Self { address, ten_bit_address: false, op: I2cTransferOp::Read(len), } } } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct I2cTransferRequest { pub adapter: String, pub segments: Vec, pub stop: bool, } #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct I2cTransferResponse { pub ok: bool, pub read_data: Vec>, pub error: Option, } #[derive(Clone, Debug, Default, Serialize, Deserialize)] pub struct I2cAdapterRegistration { pub name: String, pub description: String, pub acpi_companion: Option, pub slave_address_override: Option, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct I2cAdapterInfo { pub id: u32, pub name: String, pub max_transaction_size: usize, pub supports_10bit_addr: bool, } #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum I2cTransferStatus { Ok, Nack, Timeout, Error, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum I2cControlRequest { RegisterAdapter { info: I2cAdapterInfo }, OpenAdapter { id: u32 }, Transfer { adapter_id: u32, request: I2cTransferRequest, }, ListAdapters, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum I2cControlResponse { AdapterRegistered { id: u32 }, AdapterOpened, TransferResult(I2cTransferResponse), AdapterList(Vec), Error(String), }