diff --git a/completions/bash/framework_tool b/completions/bash/framework_tool index ade3813..5981fd7 100755 --- a/completions/bash/framework_tool +++ b/completions/bash/framework_tool @@ -23,7 +23,7 @@ _framework_tool() { case "${cmd}" in framework_tool) - 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 --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-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 --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" + 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 --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-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 --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" if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -129,6 +129,10 @@ _framework_tool() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; + --set-gpio) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --fp-led-level) COMPREPLY=($(compgen -W "high medium low ultra-low auto" -- "${cur}")) return 0 diff --git a/completions/fish/framework_tool.fish b/completions/fish/framework_tool.fish index 00a70a9..c00de30 100644 --- a/completions/fish/framework_tool.fish +++ b/completions/fish/framework_tool.fish @@ -32,6 +32,7 @@ complete -c framework_tool -l charge-limit -d 'Get or set max charge limit' -r complete -c framework_tool -l charge-current-limit -d 'Set max charge current limit' -r complete -c framework_tool -l charge-rate-limit -d 'Set max charge current limit' -r complete -c framework_tool -l get-gpio -d 'Get GPIO value by name or all, if no name provided' -r +complete -c framework_tool -l set-gpio -d 'Set GPIO value by name. Args: <0|1> (Dangerous, requires --force)' -r complete -c framework_tool -l fp-led-level -d 'Get or set fingerprint LED brightness level' -r -f -a "high\t'' medium\t'' low\t'' diff --git a/completions/zsh/_framework_tool b/completions/zsh/_framework_tool index 3b80dcd..87c1a2f 100644 --- a/completions/zsh/_framework_tool +++ b/completions/zsh/_framework_tool @@ -40,6 +40,7 @@ _framework_tool() { '*--charge-current-limit=[Set max charge current limit]:CHARGE_CURRENT_LIMIT:_default' \ '*--charge-rate-limit=[Set max charge current limit]:CHARGE_RATE_LIMIT:_default' \ '--get-gpio=[Get GPIO value by name or all, if no name provided]::GET_GPIO:_default' \ +'*--set-gpio=[Set GPIO value by name. Args\: <0|1> (Dangerous, requires --force)]:NAME:_default:NAME:_default' \ '--fp-led-level=[Get or set fingerprint LED brightness level]::FP_LED_LEVEL:(high medium low ultra-low auto)' \ '--fp-brightness=[Get or set fingerprint LED brightness percentage]::FP_BRIGHTNESS:_default' \ '--kblight=[Set keyboard backlight percentage or get, if no value provided]::KBLIGHT:_default' \ diff --git a/framework_lib/src/commandline/clap_std.rs b/framework_lib/src/commandline/clap_std.rs index ba1cc43..db35099 100644 --- a/framework_lib/src/commandline/clap_std.rs +++ b/framework_lib/src/commandline/clap_std.rs @@ -189,6 +189,11 @@ struct ClapCli { #[arg(long)] get_gpio: Option>, + /// Set GPIO value by name. Args: <0|1> (Dangerous, requires --force) + #[arg(long, value_names(["NAME", "VALUE"]))] + #[clap(num_args = 2)] + set_gpio: Vec, + /// Get or set fingerprint LED brightness level #[arg(long)] fp_led_level: Option>, @@ -424,6 +429,10 @@ pub fn parse(args: &[String]) -> Cli { )), _ => None, }; + let set_gpio = match args.set_gpio.len() { + 2 => Some((args.set_gpio[0].clone(), args.set_gpio[1].clone())), + _ => None, + }; let host_command = if args.host_command.len() >= 2 { let cmd_ver = if let Ok(cmd_ver) = u8::try_from(args.host_command[1]) { cmd_ver @@ -514,6 +523,7 @@ pub fn parse(args: &[String]) -> Cli { charge_current_limit, charge_rate_limit, get_gpio: args.get_gpio, + set_gpio, fp_led_level: args.fp_led_level, fp_brightness: args.fp_brightness, kblight: args.kblight, diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index e006d27..108ce79 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -202,6 +202,7 @@ pub struct Cli { pub charge_current_limit: Option<(u32, Option)>, pub charge_rate_limit: Option<(f32, Option)>, pub get_gpio: Option>, + pub set_gpio: Option<(String, String)>, pub fp_led_level: Option>, pub fp_brightness: Option>, pub kblight: Option>, @@ -290,6 +291,7 @@ pub fn parse(args: &[String]) -> Cli { // charge_current_limit // charge_rate_limit get_gpio: cli.get_gpio, + // set_gpio fp_led_level: cli.fp_led_level, fp_brightness: cli.fp_brightness, kblight: cli.kblight, @@ -1413,6 +1415,20 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 { } else { print_err(ec.get_all_gpios()); } + } else if let Some((gpio_name, gpio_value)) = &args.set_gpio { + if args.force { + let value = match gpio_value.as_str() { + "0" => false, + "1" => true, + _ => { + error!("GPIO value must be 0 or 1"); + return 1; + } + }; + print_err(ec.set_gpio(gpio_name, value)); + } else { + error!("--set-gpio is a dangerous command that can brick or burn your system. Not supported without --force"); + } } else if let Some(maybe_led_level) = &args.fp_led_level { print_err(handle_fp_led_level(&ec, *maybe_led_level)); } else if let Some(maybe_brightness) = &args.fp_brightness { @@ -1854,6 +1870,7 @@ Options: --charge-current-limit [] Get or set battery current charge limit (Percentage number as arg, e.g. '100') --charge-rate-limit [] Set max charge rate limit --get-gpio Get GPIO value by name or all, if no name provided + --set-gpio <0|1> Set GPIO value by name (Dangerous, requires --force) --fp-led-level [] Get or set fingerprint LED brightness level [possible values: high, medium, low] --fp-brightness []Get or set fingerprint LED brightness percentage --kblight [] Set keyboard backlight percentage or get, if no value provided diff --git a/framework_lib/src/commandline/uefi.rs b/framework_lib/src/commandline/uefi.rs index faf34b1..77d6394 100644 --- a/framework_lib/src/commandline/uefi.rs +++ b/framework_lib/src/commandline/uefi.rs @@ -71,6 +71,7 @@ pub fn parse(args: &[String]) -> Cli { charge_current_limit: None, charge_rate_limit: None, get_gpio: None, + set_gpio: None, fp_led_level: None, fp_brightness: None, kblight: None, @@ -348,6 +349,13 @@ pub fn parse(args: &[String]) -> Cli { Some(None) }; found_an_option = true; + } else if arg == "--set-gpio" { + if args.len() > i + 2 { + cli.set_gpio = Some((args[i + 1].clone(), args[i + 2].clone())); + } else { + println!("--set-gpio requires two arguments: <0|1>"); + } + found_an_option = true; } else if arg == "--kblight" { cli.kblight = if args.len() > i + 1 { if let Ok(percent) = args[i + 1].parse::() {