Skip to content

Commit 053abf3

Browse files
Merge pull request #71 from FrameworkComputer/crosecbus
windows: Fix host commands with crosecbus driver
2 parents 270cac9 + 4a56bfa commit 053abf3

File tree

3 files changed

+13
-9
lines changed

3 files changed

+13
-9
lines changed

framework_lib/src/chromium_ec/portio.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ struct EcHostResponse {
126126
/// Reserved byte in protocol v3. Must be 0
127127
pub reserved: u16,
128128
}
129-
const _HEADER_LEN: usize = std::mem::size_of::<EcHostResponse>();
129+
#[allow(dead_code)]
130+
pub const HEADER_LEN: usize = std::mem::size_of::<EcHostResponse>();
130131

131132
fn transfer_write(buffer: &[u8]) {
132133
if has_mec() {

framework_lib/src/chromium_ec/windows.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use windows::{
1111
},
1212
};
1313

14+
use crate::chromium_ec::portio::HEADER_LEN;
1415
use crate::chromium_ec::EC_MEMMAP_SIZE;
1516
use crate::chromium_ec::{EcError, EcResponseStatus, EcResult};
1617

@@ -89,16 +90,18 @@ pub fn send_command(command: u16, command_version: u8, data: &[u8]) -> EcResult<
8990
version: command_version as u32,
9091
command: command as u32,
9192
outsize: data.len() as u32,
92-
insize: CROSEC_CMD_MAX_REQUEST as u32,
93+
insize: (CROSEC_CMD_MAX_REQUEST - HEADER_LEN) as u32,
9394
result: 0xFF,
94-
buffer: [0_u8; 256],
95+
buffer: [0_u8; CROSEC_CMD_MAX_REQUEST],
9596
};
9697
cmd.buffer[0..data.len()].clone_from_slice(data);
9798

98-
let size = std::mem::size_of::<CrosEcCommand>();
99+
let buf_size = std::mem::size_of::<CrosEcCommand>();
100+
// Must keep 8 bytes of space for the EC command request/response headers
101+
let cmd_len = buf_size - HEADER_LEN;
102+
let out_len = buf_size - HEADER_LEN;
99103
let const_ptr = &mut cmd as *const _ as *const ::core::ffi::c_void;
100104
let mut_ptr = &mut cmd as *mut _ as *mut ::core::ffi::c_void;
101-
let _ptr_size = std::mem::size_of::<CrosEcCommand>() as u32;
102105

103106
let mut returned: u32 = 0;
104107

@@ -113,9 +116,9 @@ pub fn send_command(command: u16, command_version: u8, data: &[u8]) -> EcResult<
113116
device.0,
114117
IOCTL_CROSEC_XCMD,
115118
Some(const_ptr),
116-
size.try_into().unwrap(),
119+
cmd_len.try_into().unwrap(),
117120
Some(mut_ptr),
118-
size.try_into().unwrap(),
121+
out_len.try_into().unwrap(),
119122
Some(&mut returned as *mut u32),
120123
None,
121124
)
@@ -129,7 +132,7 @@ pub fn send_command(command: u16, command_version: u8, data: &[u8]) -> EcResult<
129132
}
130133

131134
// TODO: Figure out why that's sometimes bigger
132-
let end = std::cmp::min(returned, 256);
135+
let end = std::cmp::min(returned, CROSEC_CMD_MAX_REQUEST as u32);
133136

134137
let out_buffer = &cmd.buffer[..(end as usize)];
135138
Ok(out_buffer.to_vec())

framework_lib/src/esrt/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,12 +348,12 @@ pub fn get_esrt() -> Option<Esrt> {
348348
debug!("Querying WMI");
349349
let results: Vec<HashMap<String, Variant>> = wmi_con.raw_query("SELECT HardwareID, Name FROM Win32_PnPEntity WHERE ClassGUID = '{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}'").unwrap();
350350

351+
let re = regex::Regex::new(r"([\-a-h0-9]+)\}&REV_([A-F0-9]+)").expect("Bad regex");
351352
for (i, val) in results.iter().enumerate() {
352353
let hwid = &val["HardwareID"];
353354
if let Variant::Array(strs) = hwid {
354355
if let Variant::String(s) = &strs[0] {
355356
// Sample "UEFI\\RES_{c57fd615-2ac9-4154-bf34-4dc715344408}&REV_CF"
356-
let re = regex::Regex::new(r"([\-a-h0-9]+)\}&REV_([A-F0-9]+)").expect("Bad regex");
357357
let caps = re.captures(s).expect("No caps");
358358
let guid_str = caps.get(1).unwrap().as_str().to_string();
359359
let ver_str = caps.get(2).unwrap().as_str().to_string();

0 commit comments

Comments
 (0)