diff --git a/framework_lib/src/chromium_ec/i2c_passthrough.rs b/framework_lib/src/chromium_ec/i2c_passthrough.rs index 323b490..3649ac2 100644 --- a/framework_lib/src/chromium_ec/i2c_passthrough.rs +++ b/framework_lib/src/chromium_ec/i2c_passthrough.rs @@ -177,8 +177,15 @@ pub fn i2c_read_16bit_addr( let data = ec.send_command(EcCommands::I2cPassthrough as u16, 0, &buffer)?; let res: _EcI2cPassthruResponse = unsafe { std::ptr::read(data.as_ptr() as *const _) }; - let res_data = &data[size_of::<_EcI2cPassthruResponse>()..]; + let header_len: usize = size_of::<_EcI2cPassthruResponse>(); + /* Note on windows, you can get extra bytes back, so truncate this to the requested size */ + let res_data = &data[header_len..(len as usize + header_len)]; debug_assert!(res.messages as usize == messages.len() || res.messages == 0); + trace!( + " i2c_read_16bit_addr response (len: {}, data: {:#04X?})", + res_data.len(), + res_data.to_vec() + ); Ok(EcI2cPassthruResponse { i2c_status: res.i2c_status, data: res_data.to_vec(), diff --git a/framework_lib/src/chromium_ec/mod.rs b/framework_lib/src/chromium_ec/mod.rs index c538c75..f6fe27e 100644 --- a/framework_lib/src/chromium_ec/mod.rs +++ b/framework_lib/src/chromium_ec/mod.rs @@ -1551,7 +1551,7 @@ impl CrosEc { "Invalid descriptor hdr magic".to_string(), )); } - self.read_ec_gpu_chunk(0x00, header.descriptor_length as u16) + self.read_ec_gpu_chunk(0x00, (header.descriptor_length + header.length) as u16) } pub fn read_gpu_desc_header(&self) -> EcResult {