mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a811f20f65 | |||
| 0c9c263be6 | |||
| 6571c04bfe | |||
| e48acbb8a2 | |||
| f33496ef68 | |||
| cd3176b565 | |||
| 7595613d7e | |||
| b8d0245e7a | |||
| 54bd2ec800 | |||
| b6c8566565 | |||
| 052c096014 | |||
| 81cbe3c522 | |||
| 09f7492bec | |||
| 6adfb2cf48 |
@@ -70,6 +70,7 @@ release:
|
|||||||
<<: *rust_cache
|
<<: *rust_cache
|
||||||
script:
|
script:
|
||||||
- cargo install cargo-vendor-filterer
|
- cargo install cargo-vendor-filterer
|
||||||
|
- cargo fetch
|
||||||
- make FROZEN=1 && make vendor
|
- make FROZEN=1 && make vendor
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
|
|||||||
@@ -2,6 +2,18 @@
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [6.1.22]
|
||||||
|
- Allow configuration of nv_tgp
|
||||||
|
- Treat dGPU attributes as power profiles
|
||||||
|
- Add EXPERTBOOK DMI match to ensure the service is loaded
|
||||||
|
- Support G815L thanks to @solost !
|
||||||
|
|
||||||
|
## [6.1.21]
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Kill Fedora: screw your cursed cargo bullshit
|
||||||
|
- Restore CI building
|
||||||
|
|
||||||
## [6.1.20]
|
## [6.1.20]
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
Generated
+228
-160
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "6.1.20"
|
version = "6.1.22"
|
||||||
rust-version = "1.82"
|
rust-version = "1.82"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|||||||
@@ -158,6 +158,8 @@ vendor:
|
|||||||
mv .cargo/config ./cargo-config
|
mv .cargo/config ./cargo-config
|
||||||
rm -rf .cargo
|
rm -rf .cargo
|
||||||
rm -rf vendor
|
rm -rf vendor
|
||||||
|
# Ensure cargo-vendor-filterer is installed (CI installs it already)
|
||||||
|
command -v cargo-vendor-filterer >/dev/null 2>&1 || cargo install --locked cargo-vendor-filterer
|
||||||
cargo vendor-filterer --all-features --platform x86_64-unknown-linux-gnu vendor
|
cargo vendor-filterer --all-features --platform x86_64-unknown-linux-gnu vendor
|
||||||
tar pcfJ vendor_asusctl_$(VERSION).tar.xz vendor
|
tar pcfJ vendor_asusctl_$(VERSION).tar.xz vendor
|
||||||
rm -rf vendor
|
rm -rf vendor
|
||||||
|
|||||||
@@ -170,7 +170,9 @@ impl crate::Reloadable for AsusArmouryAttribute {
|
|||||||
info!("Reloading {}", self.attr.name());
|
info!("Reloading {}", self.attr.name());
|
||||||
let name: FirmwareAttribute = self.attr.name().into();
|
let name: FirmwareAttribute = self.attr.name().into();
|
||||||
|
|
||||||
if name.is_ppt() {
|
// Treat dGPU attributes the same as PPT attributes for power-profile
|
||||||
|
// behaviour so they follow AC/DC tuning groups.
|
||||||
|
if name.is_ppt() || name.is_dgpu() {
|
||||||
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
||||||
let power_plugged = self
|
let power_plugged = self
|
||||||
.power
|
.power
|
||||||
@@ -277,7 +279,7 @@ impl AsusArmouryAttribute {
|
|||||||
|
|
||||||
async fn restore_default(&self) -> fdo::Result<()> {
|
async fn restore_default(&self) -> fdo::Result<()> {
|
||||||
self.attr.restore_default()?;
|
self.attr.restore_default()?;
|
||||||
if self.name().is_ppt() {
|
if self.name().is_ppt() || self.name().is_dgpu() {
|
||||||
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
||||||
let power_plugged = self
|
let power_plugged = self
|
||||||
.power
|
.power
|
||||||
@@ -336,7 +338,7 @@ impl AsusArmouryAttribute {
|
|||||||
|
|
||||||
#[zbus(property)]
|
#[zbus(property)]
|
||||||
async fn current_value(&self) -> fdo::Result<i32> {
|
async fn current_value(&self) -> fdo::Result<i32> {
|
||||||
if self.name().is_ppt() {
|
if self.name().is_ppt() || self.name().is_dgpu() {
|
||||||
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
||||||
let power_plugged = self
|
let power_plugged = self
|
||||||
.power
|
.power
|
||||||
@@ -369,86 +371,9 @@ impl AsusArmouryAttribute {
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn stored_value_for_power(&self, on_ac: bool) -> fdo::Result<i32> {
|
|
||||||
if !self.name().is_ppt() {
|
|
||||||
return Err(fdo::Error::NotSupported(
|
|
||||||
"Stored values are only available for PPT attributes".to_string(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
|
||||||
let config = self.config.lock().await;
|
|
||||||
if let Some(tuning) = config.select_tunings_ref(on_ac, profile) {
|
|
||||||
if let Some(tune) = tuning.group.get(&self.name()) {
|
|
||||||
return Ok(*tune);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let AttrValue::Integer(i) = self.attr.default_value() {
|
|
||||||
return Ok(*i);
|
|
||||||
}
|
|
||||||
Err(fdo::Error::Failed(
|
|
||||||
"Could not read stored value".to_string(),
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn set_value_for_power(&mut self, on_ac: bool, value: i32) -> fdo::Result<()> {
|
|
||||||
if !self.name().is_ppt() {
|
|
||||||
return Err(fdo::Error::NotSupported(
|
|
||||||
"Setting stored values is only supported for PPT attributes".to_string(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
|
||||||
let apply_now;
|
|
||||||
|
|
||||||
{
|
|
||||||
let mut config = self.config.lock().await;
|
|
||||||
let tuning = config.select_tunings(on_ac, profile);
|
|
||||||
|
|
||||||
if let Some(tune) = tuning.group.get_mut(&self.name()) {
|
|
||||||
*tune = value;
|
|
||||||
} else {
|
|
||||||
tuning.group.insert(self.name(), value);
|
|
||||||
debug!(
|
|
||||||
"Store {} value for {} power = {}",
|
|
||||||
self.attr.name(),
|
|
||||||
if on_ac { "AC" } else { "DC" },
|
|
||||||
value
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
apply_now = tuning.enabled;
|
|
||||||
config.write();
|
|
||||||
}
|
|
||||||
|
|
||||||
if apply_now {
|
|
||||||
let power_plugged = self
|
|
||||||
.power
|
|
||||||
.get_online()
|
|
||||||
.map_err(|e| {
|
|
||||||
error!("Could not get power status: {e:?}");
|
|
||||||
e
|
|
||||||
})
|
|
||||||
.unwrap_or_default()
|
|
||||||
!= 0;
|
|
||||||
|
|
||||||
if power_plugged == on_ac {
|
|
||||||
self.attr
|
|
||||||
.set_current_value(&AttrValue::Integer(value))
|
|
||||||
.map_err(|e| {
|
|
||||||
error!("Could not set value: {e:?}");
|
|
||||||
e
|
|
||||||
})?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[zbus(property)]
|
#[zbus(property)]
|
||||||
async fn set_current_value(&mut self, value: i32) -> fdo::Result<()> {
|
async fn set_current_value(&mut self, value: i32) -> fdo::Result<()> {
|
||||||
if self.name().is_ppt() {
|
if self.name().is_ppt() || self.name().is_dgpu() {
|
||||||
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
let profile: PlatformProfile = self.platform.get_platform_profile()?.into();
|
||||||
let power_plugged = self
|
let power_plugged = self
|
||||||
.power
|
.power
|
||||||
@@ -538,8 +463,7 @@ pub async fn start_attributes_zbus(
|
|||||||
"Skipping attribute '{}' due to reload error: {e:?}",
|
"Skipping attribute '{}' due to reload error: {e:?}",
|
||||||
attr.attr.name()
|
attr.attr.name()
|
||||||
);
|
);
|
||||||
// continue with others
|
break;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let attr_name = attr.attribute_name();
|
let attr_name = attr.attribute_name();
|
||||||
@@ -577,7 +501,7 @@ pub async fn set_config_or_default(
|
|||||||
) {
|
) {
|
||||||
for attr in attrs.attributes().iter() {
|
for attr in attrs.attributes().iter() {
|
||||||
let name: FirmwareAttribute = attr.name().into();
|
let name: FirmwareAttribute = attr.name().into();
|
||||||
if name.is_ppt() {
|
if name.is_ppt() || name.is_dgpu() {
|
||||||
let tuning = config.select_tunings(power_plugged, profile);
|
let tuning = config.select_tunings(power_plugged, profile);
|
||||||
if !tuning.enabled {
|
if !tuning.enabled {
|
||||||
debug!("Tuning group is not enabled, skipping");
|
debug!("Tuning group is not enabled, skipping");
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ impl DeviceManager {
|
|||||||
if let Some(usb_id) = usb_device.attribute_value("idProduct") {
|
if let Some(usb_id) = usb_device.attribute_value("idProduct") {
|
||||||
if let Some(vendor_id) = usb_device.attribute_value("idVendor") {
|
if let Some(vendor_id) = usb_device.attribute_value("idVendor") {
|
||||||
if vendor_id != "0b05" {
|
if vendor_id != "0b05" {
|
||||||
debug!("Not ASUS vendor ID");
|
debug!("Not ASUS vendor ID: {}", vendor_id.to_string_lossy());
|
||||||
return Ok(devices);
|
return Ok(devices);
|
||||||
}
|
}
|
||||||
// Almost all devices are identified by the productId.
|
// Almost all devices are identified by the productId.
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ ENV{DMI_FAMILY}=="*Zenbook*", GOTO="asusd_start"
|
|||||||
ENV{DMI_FAMILY}=="*ProArt*", GOTO="asusd_start"
|
ENV{DMI_FAMILY}=="*ProArt*", GOTO="asusd_start"
|
||||||
ENV{DMI_FAMILY}=="*TX Air*", GOTO="asusd_start"
|
ENV{DMI_FAMILY}=="*TX Air*", GOTO="asusd_start"
|
||||||
ENV{DMI_FAMILY}=="*TX Gaming*", GOTO="asusd_start"
|
ENV{DMI_FAMILY}=="*TX Gaming*", GOTO="asusd_start"
|
||||||
|
ENV{DMI_FAMILY}=="*EXPERTBOOK*", GOTO="asusd_start"
|
||||||
# No match so
|
# No match so
|
||||||
GOTO="asusd_end"
|
GOTO="asusd_end"
|
||||||
|
|
||||||
|
|||||||
@@ -1,144 +0,0 @@
|
|||||||
#
|
|
||||||
# spec file for package asus-nb-ctrl
|
|
||||||
#
|
|
||||||
# Copyright (c) 2020-2025 Luke Jones <luke@ljones.dev>
|
|
||||||
#
|
|
||||||
# All modifications and additions to the file contributed by third parties
|
|
||||||
# remain the property of their copyright owners, unless otherwise agreed
|
|
||||||
# upon. The license for this file, and modifications and additions to the
|
|
||||||
# file, is the same license as for the pristine package itself (unless the
|
|
||||||
# license for the pristine package is not an Open Source License, in which
|
|
||||||
# case the license is the MIT License). An "Open Source License" is a
|
|
||||||
# license that conforms to the Open Source Definition (Version 1.9)
|
|
||||||
# published by the Open Source Initiative.
|
|
||||||
|
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
%if %{defined fedora}
|
|
||||||
%global debug_package %{nil}
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%define version 6.1.20
|
|
||||||
%define specrelease %{?dist}
|
|
||||||
%define pkg_release 9%{specrelease}
|
|
||||||
|
|
||||||
# Use hardening ldflags.
|
|
||||||
%global rustflags -Clink-arg=-Wl,-z,relro,-z,now
|
|
||||||
Name: asusctl
|
|
||||||
Version: %{version}
|
|
||||||
Release: %{pkg_release}
|
|
||||||
Summary: Control fan speeds, LEDs, graphics modes, and charge levels for ASUS notebooks
|
|
||||||
License: MPLv2
|
|
||||||
|
|
||||||
Group: System Environment/Kernel
|
|
||||||
|
|
||||||
URL: https://gitlab.com/asus-linux/asusctl
|
|
||||||
Source: https://gitlab.com/asus-linux/asusctl/-/archive/%{version}/%{name}-%{version}.tar.gz
|
|
||||||
|
|
||||||
%if %{defined fedora}
|
|
||||||
BuildRequires: rust-packaging
|
|
||||||
BuildRequires: systemd-rpm-macros
|
|
||||||
%else
|
|
||||||
BuildRequires: cargo-packaging
|
|
||||||
%endif
|
|
||||||
BuildRequires: git
|
|
||||||
BuildRequires: clang-devel
|
|
||||||
BuildRequires: cargo
|
|
||||||
BuildRequires: cmake
|
|
||||||
BuildRequires: rust
|
|
||||||
BuildRequires: rust-std-static
|
|
||||||
BuildRequires: pkgconfig(gbm)
|
|
||||||
BuildRequires: pkgconfig(libinput)
|
|
||||||
BuildRequires: pkgconfig(libseat)
|
|
||||||
BuildRequires: pkgconfig(libudev)
|
|
||||||
BuildRequires: pkgconfig(xkbcommon)
|
|
||||||
BuildRequires: pkgconfig(libzstd)
|
|
||||||
BuildRequires: desktop-file-utils
|
|
||||||
|
|
||||||
%description
|
|
||||||
asus-nb-ctrl is a utility for Linux to control many aspects of various
|
|
||||||
ASUS laptops but can also be used with non-Asus laptops with reduced features.
|
|
||||||
|
|
||||||
It provides an interface for rootless control of some system functions such as
|
|
||||||
fan speeds, keyboard LEDs, battery charge level, and graphics modes.
|
|
||||||
asus-nb-ctrl enables third-party apps to use the above with dbus methods.
|
|
||||||
|
|
||||||
%package rog-gui
|
|
||||||
Summary: An experimental GUI for %{name}
|
|
||||||
|
|
||||||
%description rog-gui
|
|
||||||
A one-stop-shop GUI tool for asusd/asusctl. It aims to provide most controls,
|
|
||||||
a notification service, and ability to run in the background.
|
|
||||||
|
|
||||||
%prep
|
|
||||||
%autosetup
|
|
||||||
%if %{defined fedora}
|
|
||||||
%cargo_prep
|
|
||||||
sed -i 's|offline = true|offline = false|' .cargo/config.toml
|
|
||||||
sed -i 's|source.crates-io|source.ignore_this|' .cargo/config.toml
|
|
||||||
%else
|
|
||||||
mkdir -p .cargo
|
|
||||||
cat > .cargo/config.toml << 'EOF'
|
|
||||||
[term]
|
|
||||||
verbose = true
|
|
||||||
[net]
|
|
||||||
offline = false
|
|
||||||
EOF
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%build
|
|
||||||
export RUSTFLAGS="%{rustflags}"
|
|
||||||
%if %{defined fedora}
|
|
||||||
%# Use an explicit cargo invocation for Fedora to avoid the macro adding `--locked`.
|
|
||||||
%# `--locked` breaks Fedora builds because the lockfile may not be appropriate for the distro buildroot.
|
|
||||||
/usr/bin/cargo auditable build --release
|
|
||||||
%else
|
|
||||||
/usr/bin/cargo auditable build --release
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%install
|
|
||||||
export RUSTFLAGS="%{rustflags}"
|
|
||||||
mkdir -p "%{buildroot}/%{_bindir}" "%{buildroot}%{_docdir}"
|
|
||||||
%make_install
|
|
||||||
|
|
||||||
install -D -m 0644 README.md %{buildroot}/%{_docdir}/%{name}/README.md
|
|
||||||
install -D -m 0644 rog-anime/README.md %{buildroot}/%{_docdir}/%{name}/README-anime.md
|
|
||||||
install -D -m 0644 rog-anime/data/diagonal-template.png %{buildroot}/%{_docdir}/%{name}/diagonal-template.png
|
|
||||||
|
|
||||||
desktop-file-validate %{buildroot}/%{_datadir}/applications/rog-control-center.desktop
|
|
||||||
|
|
||||||
%files
|
|
||||||
%license LICENSE
|
|
||||||
%{_bindir}/asusd
|
|
||||||
%{_bindir}/asusd-user
|
|
||||||
%{_bindir}/asusctl
|
|
||||||
%{_unitdir}/asusd.service
|
|
||||||
%{_userunitdir}/asusd-user.service
|
|
||||||
%{_udevrulesdir}/99-asusd.rules
|
|
||||||
#%dir %{_sysconfdir}/asusd/
|
|
||||||
%{_datadir}/asusd/aura_support.ron
|
|
||||||
%{_datadir}/dbus-1/system.d/asusd.conf
|
|
||||||
%{_datadir}/icons/hicolor/512x512/apps/asus_notif_yellow.png
|
|
||||||
%{_datadir}/icons/hicolor/512x512/apps/asus_notif_green.png
|
|
||||||
%{_datadir}/icons/hicolor/512x512/apps/asus_notif_red.png
|
|
||||||
%{_datadir}/icons/hicolor/512x512/apps/asus_notif_blue.png
|
|
||||||
%{_datadir}/icons/hicolor/512x512/apps/asus_notif_orange.png
|
|
||||||
%{_datadir}/icons/hicolor/512x512/apps/asus_notif_white.png
|
|
||||||
%{_datadir}/icons/hicolor/scalable/status/gpu-compute.svg
|
|
||||||
%{_datadir}/icons/hicolor/scalable/status/gpu-hybrid.svg
|
|
||||||
%{_datadir}/icons/hicolor/scalable/status/gpu-integrated.svg
|
|
||||||
%{_datadir}/icons/hicolor/scalable/status/gpu-nvidia.svg
|
|
||||||
%{_datadir}/icons/hicolor/scalable/status/gpu-vfio.svg
|
|
||||||
%{_datadir}/icons/hicolor/scalable/status/notification-reboot.svg
|
|
||||||
%{_docdir}/%{name}/
|
|
||||||
%{_datadir}/asusd/
|
|
||||||
|
|
||||||
%files rog-gui
|
|
||||||
%{_bindir}/rog-control-center
|
|
||||||
%{_datadir}/applications/rog-control-center.desktop
|
|
||||||
%{_datadir}/icons/hicolor/512x512/apps/rog-control-center.png
|
|
||||||
%{_datadir}/rog-gui
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
@@ -512,6 +512,15 @@
|
|||||||
advanced_type: PerKey,
|
advanced_type: PerKey,
|
||||||
power_zones: [Keyboard, Lightbar],
|
power_zones: [Keyboard, Lightbar],
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
device_name: "G815L",
|
||||||
|
product_id: "",
|
||||||
|
layout_name: "g814ji-per-key",
|
||||||
|
basic_modes: [Static, Breathe, RainbowCycle, RainbowWave, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash],
|
||||||
|
basic_zones: [],
|
||||||
|
advanced_type: PerKey,
|
||||||
|
power_zones: [Keyboard, Lightbar],
|
||||||
|
),
|
||||||
(
|
(
|
||||||
device_name: "G834J",
|
device_name: "G834J",
|
||||||
product_id: "",
|
product_id: "",
|
||||||
|
|||||||
@@ -383,7 +383,7 @@ impl From<&str> for FirmwareAttribute {
|
|||||||
"nv_dynamic_boost" => Self::NvDynamicBoost,
|
"nv_dynamic_boost" => Self::NvDynamicBoost,
|
||||||
"nv_temp_target" => Self::NvTempTarget,
|
"nv_temp_target" => Self::NvTempTarget,
|
||||||
"nv_base_tgp" => Self::DgpuBaseTgp,
|
"nv_base_tgp" => Self::DgpuBaseTgp,
|
||||||
"dgpu_tgp" => Self::DgpuTgp,
|
"nv_tgp" => Self::DgpuTgp,
|
||||||
"charge_mode" => Self::ChargeMode,
|
"charge_mode" => Self::ChargeMode,
|
||||||
"boot_sound" => Self::BootSound,
|
"boot_sound" => Self::BootSound,
|
||||||
"mcu_powersave" => Self::McuPowersave,
|
"mcu_powersave" => Self::McuPowersave,
|
||||||
@@ -420,7 +420,7 @@ impl From<FirmwareAttribute> for &str {
|
|||||||
FirmwareAttribute::NvDynamicBoost => "nv_dynamic_boost",
|
FirmwareAttribute::NvDynamicBoost => "nv_dynamic_boost",
|
||||||
FirmwareAttribute::NvTempTarget => "nv_temp_target",
|
FirmwareAttribute::NvTempTarget => "nv_temp_target",
|
||||||
FirmwareAttribute::DgpuBaseTgp => "dgpu_base_tgp",
|
FirmwareAttribute::DgpuBaseTgp => "dgpu_base_tgp",
|
||||||
FirmwareAttribute::DgpuTgp => "dgpu_tgp",
|
FirmwareAttribute::DgpuTgp => "nv_tgp",
|
||||||
FirmwareAttribute::ChargeMode => "charge_mode",
|
FirmwareAttribute::ChargeMode => "charge_mode",
|
||||||
FirmwareAttribute::BootSound => "boot_sound",
|
FirmwareAttribute::BootSound => "boot_sound",
|
||||||
FirmwareAttribute::McuPowersave => "mcu_powersave",
|
FirmwareAttribute::McuPowersave => "mcu_powersave",
|
||||||
|
|||||||
Reference in New Issue
Block a user