Skip to content

Commit df3d444

Browse files
committed
Add --set-gpio
Signed-off-by: Daniel Schaefer <dhs@frame.work>
1 parent 82a9544 commit df3d444

6 files changed

Lines changed: 42 additions & 1 deletion

File tree

framework_lib/src/commandline/clap_std.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,11 @@ struct ClapCli {
198198
#[arg(long)]
199199
get_gpio: Option<Option<String>>,
200200

201+
/// Set GPIO value by name. Args: <NAME> <0|1> (Dangerous, requires --force)
202+
#[arg(long, value_names(["NAME", "VALUE"]))]
203+
#[clap(num_args = 2)]
204+
set_gpio: Vec<String>,
205+
201206
/// Get or set fingerprint LED brightness level
202207
#[arg(long)]
203208
fp_led_level: Option<Option<FpBrightnessArg>>,
@@ -450,6 +455,10 @@ pub fn parse(args: &[String]) -> Cli {
450455
)),
451456
_ => None,
452457
};
458+
let set_gpio = match args.set_gpio.len() {
459+
2 => Some((args.set_gpio[0].clone(), args.set_gpio[1].clone())),
460+
_ => None,
461+
};
453462
let host_command = if args.host_command.len() >= 2 {
454463
let cmd_ver = if let Ok(cmd_ver) = u8::try_from(args.host_command[1]) {
455464
cmd_ver
@@ -544,6 +553,7 @@ pub fn parse(args: &[String]) -> Cli {
544553
charge_current_limit,
545554
charge_rate_limit,
546555
get_gpio: args.get_gpio,
556+
set_gpio,
547557
fp_led_level: args.fp_led_level,
548558
fp_brightness: args.fp_brightness,
549559
kblight: args.kblight,

framework_lib/src/commandline/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ pub struct Cli {
225225
pub charge_current_limit: Option<(u32, Option<u32>)>,
226226
pub charge_rate_limit: Option<(f32, Option<f32>)>,
227227
pub get_gpio: Option<Option<String>>,
228+
pub set_gpio: Option<(String, String)>,
228229
pub fp_led_level: Option<Option<FpBrightnessArg>>,
229230
pub fp_brightness: Option<Option<u8>>,
230231
pub kblight: Option<Option<u8>>,
@@ -317,6 +318,7 @@ pub fn parse(args: &[String]) -> Cli {
317318
// charge_current_limit
318319
// charge_rate_limit
319320
get_gpio: cli.get_gpio,
321+
// set_gpio
320322
fp_led_level: cli.fp_led_level,
321323
fp_brightness: cli.fp_brightness,
322324
kblight: cli.kblight,
@@ -1459,6 +1461,20 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 {
14591461
} else {
14601462
print_err(ec.get_all_gpios());
14611463
}
1464+
} else if let Some((gpio_name, gpio_value)) = &args.set_gpio {
1465+
if args.force {
1466+
let value = match gpio_value.as_str() {
1467+
"0" => false,
1468+
"1" => true,
1469+
_ => {
1470+
error!("GPIO value must be 0 or 1");
1471+
return 1;
1472+
}
1473+
};
1474+
print_err(ec.set_gpio(gpio_name, value));
1475+
} else {
1476+
error!("--set-gpio is a dangerous command that can brick or burn your system. Not supported without --force");
1477+
}
14621478
} else if let Some(maybe_led_level) = &args.fp_led_level {
14631479
print_err(handle_fp_led_level(&ec, *maybe_led_level));
14641480
} else if let Some(maybe_brightness) = &args.fp_brightness {
@@ -1926,6 +1942,7 @@ Options:
19261942
--charge-current-limit [<VAL>] Get or set battery current charge limit (Percentage number as arg, e.g. '100')
19271943
--charge-rate-limit [<VAL>] Set max charge rate limit
19281944
--get-gpio <GET_GPIO> Get GPIO value by name or all, if no name provided
1945+
--set-gpio <NAME> <0|1> Set GPIO value by name (Dangerous, requires --force)
19291946
--fp-led-level [<VAL>] Get or set fingerprint LED brightness level [possible values: high, medium, low]
19301947
--fp-brightness [<VAL>]Get or set fingerprint LED brightness percentage
19311948
--kblight [<KBLIGHT>] Set keyboard backlight percentage or get, if no value provided

framework_lib/src/commandline/uefi.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ pub fn parse(args: &[String]) -> Cli {
7373
charge_current_limit: None,
7474
charge_rate_limit: None,
7575
get_gpio: None,
76+
set_gpio: None,
7677
fp_led_level: None,
7778
fp_brightness: None,
7879
kblight: None,
@@ -357,6 +358,13 @@ pub fn parse(args: &[String]) -> Cli {
357358
Some(None)
358359
};
359360
found_an_option = true;
361+
} else if arg == "--set-gpio" {
362+
if args.len() > i + 2 {
363+
cli.set_gpio = Some((args[i + 1].clone(), args[i + 2].clone()));
364+
} else {
365+
println!("--set-gpio requires two arguments: <NAME> <0|1>");
366+
}
367+
found_an_option = true;
360368
} else if arg == "--kblight" {
361369
cli.kblight = if args.len() > i + 1 {
362370
if let Ok(percent) = args[i + 1].parse::<u8>() {

framework_tool/completions/bash/framework_tool

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ _framework_tool() {
2323

2424
case "${cmd}" in
2525
framework_tool)
26-
opts="-v -q -t -f -h --flash-gpu-descriptor --verbose --quiet --versions --version --features --esrt --device --compare-version --power --thermal --sensors --fansetduty --fansetrpm --autofanctrl --pdports --pdports-chromebook --info --meinfo --pd-info --pd-reset --pd-disable --pd-enable --dp-hdmi-info --dp-hdmi-update --audio-card-info --privacy --pd-bin --ec-bin --capsule --dump --h2o-capsule --dump-ec-flash --flash-full-ec --flash-ec --flash-ro-ec --flash-rw-ec --intrusion --inputdeck --inputdeck-mode --expansion-bay --charge-limit --charge-current-limit --charge-rate-limit --get-gpio --fp-led-level --fp-brightness --kblight --remap-key --rgbkbd --ps2-enable --tablet-mode --touchscreen-enable --haptic-intensity --click-force --stylus-battery --console --reboot-ec --ec-hib-delay --uptimeinfo --s0ix-counter --hash --driver --pd-addrs --pd-ports --test --test-retimer --boardid --force --dry-run --flash-gpu-descriptor-file --dump-gpu-descriptor-file --nvidia --host-command --generate-completions --help"
26+
opts="-v -q -t -f -h --flash-gpu-descriptor --verbose --quiet --versions --version --features --esrt --device --compare-version --power --thermal --sensors --fansetduty --fansetrpm --autofanctrl --pdports --pdports-chromebook --info --meinfo --pd-info --pd-reset --pd-disable --pd-enable --dp-hdmi-info --dp-hdmi-update --audio-card-info --privacy --pd-bin --ec-bin --capsule --dump --h2o-capsule --dump-ec-flash --flash-full-ec --flash-ec --flash-ro-ec --flash-rw-ec --intrusion --inputdeck --inputdeck-mode --expansion-bay --charge-limit --charge-current-limit --charge-rate-limit --get-gpio --set-gpio --fp-led-level --fp-brightness --kblight --remap-key --rgbkbd --ps2-enable --tablet-mode --touchscreen-enable --haptic-intensity --click-force --stylus-battery --console --reboot-ec --ec-hib-delay --uptimeinfo --s0ix-counter --hash --driver --pd-addrs --pd-ports --test --test-retimer --boardid --force --dry-run --flash-gpu-descriptor-file --dump-gpu-descriptor-file --nvidia --host-command --generate-completions --help"
2727
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
2828
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2929
return 0
@@ -133,6 +133,10 @@ _framework_tool() {
133133
COMPREPLY=($(compgen -f "${cur}"))
134134
return 0
135135
;;
136+
--set-gpio)
137+
COMPREPLY=($(compgen -f "${cur}"))
138+
return 0
139+
;;
136140
--fp-led-level)
137141
COMPREPLY=($(compgen -W "high medium low ultra-low auto" -- "${cur}"))
138142
return 0

framework_tool/completions/fish/framework_tool.fish

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ complete -c framework_tool -l charge-limit -d 'Get or set max charge limit' -r
3434
complete -c framework_tool -l charge-current-limit -d 'Set max charge current limit' -r
3535
complete -c framework_tool -l charge-rate-limit -d 'Set max charge current limit' -r
3636
complete -c framework_tool -l get-gpio -d 'Get GPIO value by name or all, if no name provided' -r
37+
complete -c framework_tool -l set-gpio -d 'Set GPIO value by name. Args: <NAME> <0|1> (Dangerous, requires --force)' -r
3738
complete -c framework_tool -l fp-led-level -d 'Get or set fingerprint LED brightness level' -r -f -a "high\t''
3839
medium\t''
3940
low\t''

framework_tool/completions/zsh/_framework_tool

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ _framework_tool() {
4141
'*--charge-current-limit=[Set max charge current limit]:CHARGE_CURRENT_LIMIT:_default' \
4242
'*--charge-rate-limit=[Set max charge current limit]:CHARGE_RATE_LIMIT:_default' \
4343
'--get-gpio=[Get GPIO value by name or all, if no name provided]::GET_GPIO:_default' \
44+
'*--set-gpio=[Set GPIO value by name. Args\: <NAME> <0|1> (Dangerous, requires --force)]:NAME:_default:NAME:_default' \
4445
'--fp-led-level=[Get or set fingerprint LED brightness level]::FP_LED_LEVEL:(high medium low ultra-low auto)' \
4546
'--fp-brightness=[Get or set fingerprint LED brightness percentage]::FP_BRIGHTNESS:_default' \
4647
'--kblight=[Set keyboard backlight percentage or get, if no value provided]::KBLIGHT:_default' \

0 commit comments

Comments
 (0)