MCPcopy Index your code
hub / github.com/FrameworkComputer/framework-system / send_command

Function send_command

framework_lib/src/chromium_ec/windows.rs:124–177  ·  view source on GitHub ↗
(command: u16, command_version: u8, data: &[u8])

Source from the content-addressed store, hash-verified

122}
123
124pub fn send_command(command: u16, command_version: u8, data: &[u8]) -> EcResult<Vec<u8>> {
125 init();
126
127 let mut cmd = CrosEcCommand {
128 version: command_version as u32,
129 command: command as u32,
130 outsize: data.len() as u32,
131 insize: (CROSEC_CMD_MAX_REQUEST - HEADER_LEN) as u32,
132 result: 0xFF,
133 buffer: [0_u8; CROSEC_CMD_MAX_REQUEST],
134 };
135 cmd.buffer[0..data.len()].clone_from_slice(data);
136
137 let buf_size = std::mem::size_of::<CrosEcCommand>();
138 // Must keep 8 bytes of space for the EC command request/response headers
139 let cmd_len = buf_size - HEADER_LEN;
140 let out_len = buf_size - HEADER_LEN;
141 let const_ptr = &mut cmd as *const _ as *const ::core::ffi::c_void;
142 let mut_ptr = &mut cmd as *mut _ as *mut ::core::ffi::c_void;
143
144 let mut returned: u32 = 0;
145
146 unsafe {
147 let device = DEVICE.lock().unwrap();
148 let device = if let Some(device) = *device {
149 device
150 } else {
151 return EcResult::Err(EcError::DeviceError("No EC device".to_string()));
152 };
153 DeviceIoControl(
154 device.0,
155 IOCTL_CROSEC_XCMD,
156 Some(const_ptr),
157 cmd_len.try_into().unwrap(),
158 Some(mut_ptr),
159 out_len.try_into().unwrap(),
160 Some(&mut returned as *mut u32),
161 None,
162 )
163 .unwrap();
164 }
165
166 match FromPrimitive::from_u32(cmd.result) {
167 None => return Err(EcError::UnknownResponseCode(cmd.result)),
168 Some(EcResponseStatus::Success) => {}
169 Some(status) => return Err(EcError::Response(status)),
170 }
171
172 // TODO: Figure out why that's sometimes bigger
173 let end = std::cmp::min(returned, CROSEC_CMD_MAX_REQUEST as u32);
174
175 let out_buffer = &cmd.buffer[..(end as usize)];
176 Ok(out_buffer.to_vec())
177}
178
179const CROSEC_CMD_MAX_REQUEST: usize = 0x100;
180

Callers

nothing calls this directly

Calls 1

initFunction · 0.70

Tested by

no test coverage detected