Skip to content

Commit 0a29444

Browse files
committed
Add case revision command, add thelio-io ID to tool, and normalize commands with QMK
1 parent c028136 commit 0a29444

4 files changed

Lines changed: 115 additions & 7 deletions

File tree

src/app/main/smfi.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,24 @@ static enum Result cmd_fan_set_pwm(void) {
161161
return RES_ERR;
162162
}
163163

164+
static enum Result cmd_fan_get_rpm(void) {
165+
switch (smfi_cmd[SMFI_CMD_DATA]) {
166+
case 1:
167+
smfi_cmd[SMFI_CMD_DATA + 1] = (uint8_t)fan1_rpm;
168+
smfi_cmd[SMFI_CMD_DATA + 2] = (uint8_t)(fan1_rpm >> 8);
169+
return RES_OK;
170+
#ifdef FAN2_PWM
171+
case 2:
172+
smfi_cmd[SMFI_CMD_DATA + 1] = (uint8_t)fan2_rpm;
173+
smfi_cmd[SMFI_CMD_DATA + 2] = (uint8_t)(fan2_rpm >> 8);
174+
return RES_OK;
175+
#endif
176+
}
177+
178+
// Failed if fan not found
179+
return RES_ERR;
180+
}
181+
164182
static enum Result cmd_fan_get_mode(void) {
165183
smfi_cmd[SMFI_CMD_DATA] = fan_get_mode();
166184
return RES_OK;
@@ -443,6 +461,9 @@ void smfi_event(void) {
443461
break;
444462
#endif // CONFIG_SECURITY
445463

464+
case CMD_FAN_GET_RPM:
465+
smfi_cmd[SMFI_CMD_RES] = cmd_fan_get_rpm();
466+
break;
446467
case CMD_FAN_GET_MODE:
447468
smfi_cmd[SMFI_CMD_RES] = cmd_fan_get_mode();
448469
break;

src/common/include/common/command.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,16 @@ enum Command {
5050
CMD_SECURITY_GET = 20,
5151
// Set security state
5252
CMD_SECURITY_SET = 21,
53+
// Get fan RPM
54+
CMD_FAN_GET_RPM = 22,
5355
// Get fan control mode
54-
CMD_FAN_GET_MODE = 22,
56+
CMD_FAN_GET_MODE = 23,
5557
// Set fan control mode
56-
CMD_FAN_SET_MODE = 23,
58+
CMD_FAN_SET_MODE = 24,
59+
// Get case revision
60+
CMD_CASE_REV_GET = 25,
61+
// Set case revision
62+
CMD_CASE_REV_SET = 26,
5763
};
5864

5965
enum Result {

tools/system76_ectool/src/ec.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ enum Cmd {
3333
SetNoInput = 19,
3434
SecurityGet = 20,
3535
SecuritySet = 21,
36-
FanGetMode = 22,
37-
FanSetMode = 23,
36+
FanGetRpm = 22,
37+
FanGetMode = 23,
38+
FanSetMode = 24,
39+
CaseRevGet = 25,
40+
CaseRevSet = 26,
3841
}
3942

4043
const CMD_SPI_FLAG_READ: u8 = 1 << 0;
@@ -318,6 +321,14 @@ impl<A: Access> Ec<A> {
318321
unsafe { self.command(Cmd::SecuritySet, &mut data) }
319322
}
320323

324+
/// Get fan tachometer.
325+
pub unsafe fn fan_get_rpm(&mut self, index: u8) -> Result<u16, Error> {
326+
let mut data = [index, 0, 0];
327+
data[0] = index;
328+
unsafe { self.command(Cmd::FanGetRpm, &mut data)? };
329+
Ok((data[1] as u16) | ((data[2] as u16) << 8))
330+
}
331+
321332
/// Get fan control mode.
322333
pub unsafe fn fan_get_mode(&mut self) -> Result<FanMode, Error> {
323334
let mut data = [0];
@@ -331,6 +342,19 @@ impl<A: Access> Ec<A> {
331342
unsafe { self.command(Cmd::FanSetMode, &mut data) }
332343
}
333344

345+
/// Get case revision
346+
pub unsafe fn case_rev_get(&mut self) -> Result<u32, Error> {
347+
let mut data = [0; 4];
348+
unsafe { self.command(Cmd::CaseRevGet, &mut data)? };
349+
Ok(u32::from_le_bytes(data))
350+
}
351+
352+
/// Set case revision
353+
pub unsafe fn case_rev_set(&mut self, rev: u32) -> Result<(), Error> {
354+
let mut data = rev.to_le_bytes();
355+
unsafe { self.command(Cmd::CaseRevSet, &mut data) }
356+
}
357+
334358
pub fn into_dyn(self) -> Ec<Box<dyn Access>>
335359
where
336360
A: 'static,

tools/system76_ectool/src/main.rs

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,13 @@ unsafe fn fan_set_pwm(ec: &mut Ec<Box<dyn Access>>, index: u8, duty: u8) -> Resu
274274
unsafe { ec.fan_set_pwm(index, duty) }
275275
}
276276

277+
unsafe fn fan_get_rpm(ec: &mut Ec<Box<dyn Access>>, index: u8) -> Result<(), Error> {
278+
let rpm = unsafe { ec.fan_get_rpm(index)? };
279+
println!("{}", rpm);
280+
281+
Ok(())
282+
}
283+
277284
unsafe fn fan_get_mode(ec: &mut Ec<Box<dyn Access>>) -> Result<(), Error> {
278285
let mode = unsafe { ec.fan_get_mode()? };
279286
println!("{}", mode);
@@ -285,6 +292,17 @@ unsafe fn fan_set_mode(ec: &mut Ec<Box<dyn Access>>, mode: ectool::FanMode) -> R
285292
unsafe { ec.fan_set_mode(mode) }
286293
}
287294

295+
unsafe fn case_rev_get(ec: &mut Ec<Box<dyn Access>>) -> Result<(), Error> {
296+
let rev = unsafe { ec.case_rev_get()? };
297+
println!("{}", rev);
298+
299+
Ok(())
300+
}
301+
302+
unsafe fn case_rev_set(ec: &mut Ec<Box<dyn Access>>, rev: u32) -> Result<(), Error> {
303+
unsafe { ec.case_rev_set(rev) }
304+
}
305+
288306
unsafe fn keymap_get(
289307
ec: &mut Ec<Box<dyn Access>>,
290308
layer: u8,
@@ -333,13 +351,19 @@ fn parse_color(s: &str) -> Result<(u8, u8, u8), String> {
333351
#[derive(Parser)]
334352
#[clap(rename_all = "snake_case")]
335353
enum SubCommand {
354+
CaseRev {
355+
rev: Option<u32>,
356+
},
336357
Console,
358+
FanMode {
359+
mode: Option<ectool::FanMode>,
360+
},
337361
FanPwm {
338362
index: u8,
339363
duty: Option<u8>,
340364
},
341-
FanMode {
342-
mode: Option<ectool::FanMode>,
365+
FanRpm {
366+
index: u8,
343367
},
344368
Flash {
345369
path: String,
@@ -426,7 +450,13 @@ fn main() {
426450
// System76 launch_2
427451
(0x3384, 0x0006, 1) |
428452
// System76 launch_heavy_1
429-
(0x3384, 0x0007, 1) => {
453+
(0x3384, 0x0007, 1) |
454+
// System76 launch_3
455+
(0x3384, 0x0009, 1) |
456+
// System76 launch_heavy_3
457+
(0x3384, 0x000A, 1) |
458+
// System76 thelio_io_2
459+
(0x3384, 0x000B, 1) => {
430460
let device = info.open_device(&api)?;
431461
let access = AccessHid::new(device, 10, 100)?;
432462
return Ok(Ec::new(access)?.into_dyn());
@@ -448,6 +478,24 @@ fn main() {
448478
};
449479

450480
match args.subcommand {
481+
SubCommand::CaseRev {
482+
rev,
483+
} => match rev {
484+
Some(rev) => match unsafe { case_rev_set(&mut ec, rev) } {
485+
Ok(()) => (),
486+
Err(err) => {
487+
eprintln!("failed to set case revision {}: {:X?}", rev, err);
488+
process::exit(1);
489+
}
490+
},
491+
None => match unsafe { case_rev_get(&mut ec) } {
492+
Ok(()) => (),
493+
Err(err) => {
494+
eprintln!("failed to get case revision: {:X?}", err);
495+
process::exit(1);
496+
}
497+
},
498+
},
451499
SubCommand::Console => match unsafe { console(&mut ec) } {
452500
Ok(()) => (),
453501
Err(err) => {
@@ -492,6 +540,15 @@ fn main() {
492540
}
493541
},
494542
},
543+
SubCommand::FanRpm {
544+
index,
545+
} => match unsafe { fan_get_rpm(&mut ec, index) } {
546+
Ok(()) => (),
547+
Err(err) => {
548+
eprintln!("failed to get fan rpm {}: {:X?}", index, err);
549+
process::exit(1);
550+
}
551+
},
495552
SubCommand::Flash {
496553
path,
497554
} => match unsafe { flash(&mut ec, &path, SpiTarget::Main) } {

0 commit comments

Comments
 (0)