Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package framework_tool for openSUSE:Factory 
checked in at 2026-06-09 14:30:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/framework_tool (Old)
 and      /work/SRC/openSUSE:Factory/.framework_tool.new.2375 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "framework_tool"

Tue Jun  9 14:30:49 2026 rev:12 rq:1358148 version:0.6.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/framework_tool/framework_tool.changes    
2026-05-11 17:08:27.068215825 +0200
+++ /work/SRC/openSUSE:Factory/.framework_tool.new.2375/framework_tool.changes  
2026-06-09 14:32:42.715414185 +0200
@@ -1,0 +2,12 @@
+Tue Jun  9 08:58:13 UTC 2026 - Nico Krapp <[email protected]>
+
+- Update to 0.6.4
+  * README: Document how to install on Solus by @clintre in #336
+  * smbios: Update Laptop 13 Pro naming by @JohnAZoidberg in #338
+  * Haptic touchpad updates by @JohnAZoidberg in #337
+  * fw16: fix invalid GPU read lengths by @kiram9 in #339
+  * README: fix apt install package name by @alextwl in #340
+  * Fix a bunch of issues on desktop by @JohnAZoidberg in #343
+  * Prepare 064 by @JohnAZoidberg in #344 
+
+-------------------------------------------------------------------

Old:
----
  framework_tool-0.6.3.tar.gz

New:
----
  framework_tool-0.6.4.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ framework_tool.spec ++++++
--- /var/tmp/diff_new_pack.DUj6bW/_old  2026-06-09 14:32:48.183640826 +0200
+++ /var/tmp/diff_new_pack.DUj6bW/_new  2026-06-09 14:32:48.183640826 +0200
@@ -20,7 +20,7 @@
 %define completion_dir_bash %{_datadir}/bash-completion/completions
 %define completion_dir_zsh %{_datadir}/zsh/functions/Completion
 Name:           framework_tool
-Version:        0.6.3
+Version:        0.6.4
 Release:        0
 Summary:        Rust tools to interact with the Framework Computer systems
 License:        BSD-3-Clause

++++++ framework_tool-0.6.3.tar.gz -> framework_tool-0.6.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/Cargo.lock 
new/framework-system-0.6.4/Cargo.lock
--- old/framework-system-0.6.3/Cargo.lock       2026-05-06 01:41:22.000000000 
+0200
+++ new/framework-system-0.6.4/Cargo.lock       2026-06-02 18:21:24.000000000 
+0200
@@ -380,7 +380,7 @@
 
 [[package]]
 name = "framework_lib"
-version = "0.6.3"
+version = "0.6.4"
 dependencies = [
  "built",
  "clap",
@@ -416,7 +416,7 @@
 
 [[package]]
 name = "framework_tool"
-version = "0.6.3"
+version = "0.6.4"
 dependencies = [
  "embed-resource",
  "framework_lib",
@@ -427,7 +427,7 @@
 
 [[package]]
 name = "framework_uefi"
-version = "0.6.3"
+version = "0.6.4"
 dependencies = [
  "framework_lib",
  "log",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/EXAMPLES.md 
new/framework-system-0.6.4/EXAMPLES.md
--- old/framework-system-0.6.3/EXAMPLES.md      2026-05-06 01:41:22.000000000 
+0200
+++ new/framework-system-0.6.4/EXAMPLES.md      2026-06-02 18:21:24.000000000 
+0200
@@ -439,9 +439,6 @@
 - Sensitivity: How hard you have to press to trigger a click
 - Intensity: How strong the feedback vibration is
 
-Note: Both of these settings are not stored persistently, they are reset when
-the touchpad resets (e.g. on system reboot).
-
 ```
 # Disable haptic feedback
 > framework_tool --haptic-intensity 0
@@ -487,7 +484,7 @@
   F75303_CPU:   44 C
   F75303_DDR:   39 C
   APU:          62 C
-  Fan Speed:       0 RPM
+  API Fan:         0 RPM
 ```
 
 ## Check sensors
@@ -520,7 +517,7 @@
   F75303_CPU:   41 C
   F75303_DDR:   37 C
   APU:          42 C
-  Fan Speed:    7281 RPM
+  APU Fan:      7281 RPM
 
 # Set a target RPM (all or just fan ID=0)
 > sudo framework_tool --fansetrpm 3141
@@ -530,7 +527,7 @@
   F75303_CPU:   42 C
   F75303_DDR:   37 C
   APU:          44 C
-  Fan Speed:    3171 RPM
+  APU Fan:      3171 RPM
 
 # And back to normal
 > sudo framework_tool --autofanctrl
@@ -539,7 +536,7 @@
   F75303_CPU:   40 C
   F75303_DDR:   38 C
   APU:          42 C
-  Fan Speed:       0 RPM
+  APU Fan:         0 RPM
 
 # Or just for a specific fan (e.g. on Framework Desktop)
 > sudo framework_tool --autofanctrl 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/README.md 
new/framework-system-0.6.4/README.md
--- old/framework-system-0.6.3/README.md        2026-05-06 01:41:22.000000000 
+0200
+++ new/framework-system-0.6.4/README.md        2026-06-02 18:21:24.000000000 
+0200
@@ -24,14 +24,16 @@
 - Gentoo [![Gentoo 
package](https://repology.org/badge/version-for-repo/gentoo/framework-tool.svg)](https://repology.org/project/framework-tool/versions)
   - `emerge framework_tool`
 - Debian 14 (Forky) and later 
([rust-framework-lib](https://tracker.debian.org/pkg/rust-framework-lib), 
[rust-framework-tool](https://tracker.debian.org/pkg/rust-framework-tool))
-  - `apt install rust-framework-tool`
+  - `apt install framework-tool`
 - Ubuntu 26.04 (Resolute) and later 
([rust-framework-lib](https://launchpad.net/ubuntu/+source/rust-framework-lib), 
[rust-framework-tool](https://launchpad.net/ubuntu/+source/rust-framework-tool))
-  - `apt install rust-framework-tool`
+  - `apt install framework-tool`
 - Ubuntu (Any Version - [Snap Package](https://snapcraft.io/framework-tool))
   - `snap install --edge framework-tool --classic`
   - Note that this installs the command called `framework-tool` instead of 
`framework_tool`
 - Rhino Linux [![Rhino Linux 
package](https://repology.org/badge/version-for-repo/pacstall/framework-system.svg)](https://repology.org/project/framework-system/versions)
   - `pacstall -I framework-system-bin`
+- Solus [![Solus 
package](https://repology.org/badge/version-for-repo/solus/framework-system.svg)](https://repology.org/project/framework-system/versions)
+  - `eopkg it framework-system`
 - [![Void Linux x86_64 
package](https://repology.org/badge/version-for-repo/void_x86_64/framework-system.svg)](https://repology.org/project/framework-system/versions)
   - `sudo xbps-install -S framework-system`
 - Manjaro
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/contrib/release.md 
new/framework-system-0.6.4/contrib/release.md
--- old/framework-system-0.6.3/contrib/release.md       2026-05-06 
01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/contrib/release.md       2026-06-02 
18:21:24.000000000 +0200
@@ -41,8 +41,8 @@
 ```
 cargo publish -p framework_lib --dry-run
 cargo publish -p framework_tool --dry-run
-cargo package list -p framework_lib
-cargo package list -p framework_tool
+cargo package --list -p framework_lib
+cargo package --list -p framework_tool
 ```
 
 Publish
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/flake.nix 
new/framework-system-0.6.4/flake.nix
--- old/framework-system-0.6.3/flake.nix        2026-05-06 01:41:22.000000000 
+0200
+++ new/framework-system-0.6.4/flake.nix        2026-06-02 18:21:24.000000000 
+0200
@@ -91,7 +91,7 @@
           in
           rustPlatform.buildRustPackage {
             pname = "framework_tool";
-            version = "0.6.3";
+            version = "0.6.4";
 
             src = buildSrc;
 
@@ -144,7 +144,7 @@
           in
           rustPlatformWindows.buildRustPackage {
             pname = "framework_tool";
-            version = "0.6.3";
+            version = "0.6.4";
 
             src = buildSrc;
 
@@ -194,7 +194,7 @@
           in
           rustPlatform.buildRustPackage {
             pname = "framework_uefi";
-            version = "0.6.3";
+            version = "0.6.4";
 
             src = buildSrc;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/framework_lib/Cargo.toml 
new/framework-system-0.6.4/framework_lib/Cargo.toml
--- old/framework-system-0.6.3/framework_lib/Cargo.toml 2026-05-06 
01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/framework_lib/Cargo.toml 2026-06-02 
18:21:24.000000000 +0200
@@ -1,11 +1,12 @@
 [package]
 name = "framework_lib"
-version = "0.6.3"
+version = "0.6.4"
 description = "Library to control Framework Computer systems"
 homepage = "https://github.com/FrameworkComputer/framework-system";
 repository = "https://github.com/FrameworkComputer/framework-system";
 readme = "../README.md"
 license = "BSD-3-Clause"
+license-file = "../LICENSE.md"
 edition = "2021"
 # Minimum Supported Rust Version
 rust-version = "1.81"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/framework-system-0.6.3/framework_lib/src/chromium_ec/i2c_passthrough.rs 
new/framework-system-0.6.4/framework_lib/src/chromium_ec/i2c_passthrough.rs
--- old/framework-system-0.6.3/framework_lib/src/chromium_ec/i2c_passthrough.rs 
2026-05-06 01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/framework_lib/src/chromium_ec/i2c_passthrough.rs 
2026-06-02 18:21:24.000000000 +0200
@@ -177,8 +177,15 @@
 
     let data = ec.send_command(EcCommands::I2cPassthrough as u16, 0, &buffer)?;
     let res: _EcI2cPassthruResponse = unsafe { std::ptr::read(data.as_ptr() as 
*const _) };
-    let res_data = &data[size_of::<_EcI2cPassthruResponse>()..];
+    let header_len: usize = size_of::<_EcI2cPassthruResponse>();
+    /* Note on windows, you can get extra bytes back, so truncate this to the 
requested size */
+    let res_data = &data[header_len..(len as usize + header_len)];
     debug_assert!(res.messages as usize == messages.len() || res.messages == 
0);
+    trace!(
+        "  i2c_read_16bit_addr response (len: {}, data: {:#04X?})",
+        res_data.len(),
+        res_data.to_vec()
+    );
     Ok(EcI2cPassthruResponse {
         i2c_status: res.i2c_status,
         data: res_data.to_vec(),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/framework-system-0.6.3/framework_lib/src/chromium_ec/mod.rs 
new/framework-system-0.6.4/framework_lib/src/chromium_ec/mod.rs
--- old/framework-system-0.6.3/framework_lib/src/chromium_ec/mod.rs     
2026-05-06 01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/framework_lib/src/chromium_ec/mod.rs     
2026-06-02 18:21:24.000000000 +0200
@@ -1551,7 +1551,7 @@
                 "Invalid descriptor hdr magic".to_string(),
             ));
         }
-        self.read_ec_gpu_chunk(0x00, header.descriptor_length as u16)
+        self.read_ec_gpu_chunk(0x00, (header.descriptor_length + 
header.length) as u16)
     }
 
     pub fn read_gpu_desc_header(&self) -> EcResult<GpuCfgDescriptor> {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/framework-system-0.6.3/framework_lib/src/commandline/mod.rs 
new/framework-system-0.6.4/framework_lib/src/commandline/mod.rs
--- old/framework-system-0.6.3/framework_lib/src/commandline/mod.rs     
2026-05-06 01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/framework_lib/src/commandline/mod.rs     
2026-06-02 18:21:24.000000000 +0200
@@ -2063,6 +2063,7 @@
         println!("Specify custom platform parameters with --pd-ports 
--pd-addrs");
         return None;
     };
+    let family = smbios::get_platform().and_then(Platform::which_family);
 
     println!("  Dump EC memory region");
     if let Some(mem) = ec.dump_mem_region() {
@@ -2091,10 +2092,12 @@
     println!(" - OK");
 
     println!("  Getting AC info from EC");
-    // All our laptops have at least 4 PD ports so far
-    if power::get_pd_info(ec, 4).iter().any(|x| x.is_err()) {
-        println!("    Failed to get PD Info from EC");
-        return None;
+    if family != Some(PlatformFamily::FrameworkDesktop) {
+        // All our laptops have at least 4 PD ports so far
+        if power::get_pd_info(ec, 4).iter().any(|x| x.is_err()) {
+            println!("    Failed to get PD Info from EC");
+            return None;
+        }
     }
 
     print!("Reading PD Version from EC");
@@ -2112,16 +2115,28 @@
 
     let pd_01 = PdController::new(PdPort::Right01, ec.clone());
     let pd_23 = PdController::new(PdPort::Left23, ec.clone());
-    print!("  Getting PD01 info through I2C tunnel");
-    print_err(pd_01.get_silicon_id())?;
-    print_err(pd_01.get_device_info())?;
-    print_err(pd_01.get_fw_versions())?;
-    println!(" - OK");
-    print!("  Getting PD23 info through I2C tunnel");
-    print_err(pd_23.get_silicon_id())?;
-    print_err(pd_23.get_device_info())?;
-    print_err(pd_23.get_fw_versions())?;
-    println!(" - OK");
+    let pd_back = PdController::new(PdPort::Back, ec.clone());
+    if family != Some(PlatformFamily::FrameworkDesktop) {
+        print!("  Getting PD01 info through I2C tunnel");
+        print_err(pd_01.get_silicon_id())?;
+        print_err(pd_01.get_device_info())?;
+        print_err(pd_01.get_fw_versions())?;
+        println!(" - OK");
+        print!("  Getting PD23 info through I2C tunnel");
+        print_err(pd_23.get_silicon_id())?;
+        print_err(pd_23.get_device_info())?;
+        print_err(pd_23.get_fw_versions())?;
+        println!(" - OK");
+    } else if matches!(
+        family,
+        Some(PlatformFamily::FrameworkDesktop) | 
Some(PlatformFamily::Framework16)
+    ) {
+        print!("  Getting Back PD info through I2C tunnel");
+        print_err(pd_back.get_silicon_id())?;
+        print_err(pd_back.get_device_info())?;
+        print_err(pd_back.get_fw_versions())?;
+        println!(" - OK");
+    }
 
     Some(())
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/framework_lib/src/power.rs 
new/framework-system-0.6.4/framework_lib/src/power.rs
--- old/framework-system-0.6.3/framework_lib/src/power.rs       2026-05-06 
01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/framework_lib/src/power.rs       2026-06-02 
18:21:24.000000000 +0200
@@ -419,7 +419,8 @@
             println!("  F75303_DDR:   {:>4}", TempSensor::from(temps[1]));
             println!("  F75303_AMB:   {:>4}", TempSensor::from(temps[2]));
             println!("  APU:          {:>4}", TempSensor::from(temps[3]));
-            4
+            println!("  Virtual:      {:>4}", TempSensor::from(temps[4]));
+            3
         }
 
         _ => {
@@ -444,13 +445,25 @@
     }
 
     for i in 0..EC_FAN_SPEED_ENTRIES {
+        let name = match (i, family) {
+            (0, Some(PlatformFamily::Framework12)) => "APU Fan".to_string(),
+            (0, Some(PlatformFamily::Framework13)) => "APU Fan".to_string(),
+            (0, Some(PlatformFamily::Framework16)) => "Left Fan".to_string(),
+            (1, Some(PlatformFamily::Framework16)) => "Right Fan".to_string(),
+            (0, Some(PlatformFamily::FrameworkDesktop)) => "APU 
Fan".to_string(),
+            (1, Some(PlatformFamily::FrameworkDesktop)) => "Front 
Fan".to_string(),
+            (2, Some(PlatformFamily::FrameworkDesktop)) => "Third 
Fan".to_string(),
+            _ => format!("Fan {i}"),
+        };
+        let name = format!("{name}:");
+
         let fan = u16::from_le_bytes([fans[i * 2], fans[1 + i * 2]]);
         if fan == EC_FAN_SPEED_STALLED_DEPRECATED {
-            println!("  Fan Speed:  {:>4} RPM (Stalled)", fan);
+            println!("  {name:<11} {:>4} RPM (Stalled)", fan);
         } else if fan == EC_FAN_SPEED_NOT_PRESENT {
-            info!("  Fan Speed:    Not present");
+            info!("  {name:<11} Not present");
         } else {
-            println!("  Fan Speed:  {:>4} RPM", fan);
+            println!("  {name:<11} {:>4} RPM", fan);
         }
     }
 }
@@ -782,110 +795,116 @@
 }
 
 pub fn get_and_print_cypd_pd_info(ec: &CrosEc) {
+    // All of our systems have a maximum of 4 PD enabled ports
     let ports = 4u8;
 
     for port in 0..ports {
-        println!("USB-C Port {}:", port);
-
         let result = EcRequestGetPdPortState { port }.send_command(ec);
-        match result {
-            Ok(info) => {
-                let c_state = CypdTypeCState::from(info.c_state);
-                let connected = !matches!(c_state, CypdTypeCState::Nothing);
-                let power_role = CypdPdPowerRole::from(info.power_role);
-                let data_role = CypdPdDataRole::from(info.data_role);
-                let voltage = { info.voltage };
-                let current = { info.current };
-                let watts_mw = voltage as u32 * current as u32 / 1000;
-                let has_pd_contract = info.pd_state != 0;
 
-                println!(
-                    "  PD Contract:   {}",
-                    if info.pd_state != 0 { "Yes" } else { "No" }
-                );
-                println!("  Power Role:    {:?}", power_role);
-                println!("  Data Role:     {:?}", data_role);
-                if connected {
-                    println!(
-                        "  VCONN:         {}",
-                        if info.vconn != 0 { "On" } else { "Off" }
-                    );
-                    println!(
-                        "  Negotiated:    {}.{:03} V, {} mA, {}.{} W",
-                        voltage / 1000,
-                        voltage % 1000,
-                        current,
-                        watts_mw / 1000,
-                        watts_mw % 1000,
-                    );
-                    println!(
-                        "  CC Polarity:   {}",
-                        match info.cc_polarity {
-                            0 => "CC1",
-                            1 => "CC2",
-                            2 => "CC1 (Debug)",
-                            3 => "CC2 (Debug)",
-                            _ => "Unknown",
-                        }
-                    );
-                }
-                if has_pd_contract {
-                    println!("  Port Partner:  {:?}", c_state);
-                    println!(
-                        "  EPR:           {}{}",
-                        if info.epr_active != 0 {
-                            "Active"
-                        } else {
-                            "Inactive"
-                        },
-                        if info.epr_support != 0 {
-                            " (Supported)"
-                        } else {
-                            ""
-                        }
-                    );
-                    if power_role == CypdPdPowerRole::Sink {
-                        println!(
-                            "  Sink Active:   {}",
-                            if info.active_port != 0 { "Yes" } else { "No" }
-                        );
-                    }
-                }
-                let alt = info.pd_alt_mode_status;
-                // Bits 0-1 indicate DP alt mode is active (bit 0 = DFP_D/TBT,
-                // bit 1 = UFP_D). Only show when actually in DP alt mode.
-                if connected && (alt & 0x03) != 0 {
-                    let mut modes = vec![];
-                    if alt & 0x01 != 0 {
-                        modes.push("DFP_D Connected");
-                    }
-                    if alt & 0x02 != 0 {
-                        modes.push("UFP_D Connected");
-                    }
-                    if alt & 0x04 != 0 {
-                        modes.push("Power Low");
-                    }
-                    if alt & 0x08 != 0 {
-                        modes.push("Enabled");
-                    }
-                    if alt & 0x10 != 0 {
-                        modes.push("Multi-Function");
-                    }
-                    if alt & 0x20 != 0 {
-                        modes.push("USB Config");
-                    }
-                    if alt & 0x40 != 0 {
-                        modes.push("Exit Request");
-                    }
-                    if alt & 0x80 != 0 {
-                        modes.push("HPD High");
-                    }
-                    println!("  DP Alt Mode:   {} (0x{:02X})", modes.join(", 
"), alt);
-                }
+        let info = match result {
+            Ok(info) => info,
+            Err(EcError::Response(EcResponseStatus::InvalidParameter)) => {
+                debug!("Port {port} does not exist");
+                continue;
             }
             Err(e) => {
                 print_err::<()>(Err(e));
+                continue;
+            }
+        };
+
+        println!("USB-C Port {}:", port);
+        let c_state = CypdTypeCState::from(info.c_state);
+        let connected = !matches!(c_state, CypdTypeCState::Nothing);
+        let power_role = CypdPdPowerRole::from(info.power_role);
+        let data_role = CypdPdDataRole::from(info.data_role);
+        let voltage = { info.voltage };
+        let current = { info.current };
+        let watts_mw = voltage as u32 * current as u32 / 1000;
+        let has_pd_contract = info.pd_state != 0;
+
+        println!(
+            "  PD Contract:   {}",
+            if info.pd_state != 0 { "Yes" } else { "No" }
+        );
+        println!("  Power Role:    {:?}", power_role);
+        println!("  Data Role:     {:?}", data_role);
+        if connected {
+            println!(
+                "  VCONN:         {}",
+                if info.vconn != 0 { "On" } else { "Off" }
+            );
+            println!(
+                "  Negotiated:    {}.{:03} V, {} mA, {}.{} W",
+                voltage / 1000,
+                voltage % 1000,
+                current,
+                watts_mw / 1000,
+                watts_mw % 1000,
+            );
+            println!(
+                "  CC Polarity:   {}",
+                match info.cc_polarity {
+                    0 => "CC1",
+                    1 => "CC2",
+                    2 => "CC1 (Debug)",
+                    3 => "CC2 (Debug)",
+                    _ => "Unknown",
+                }
+            );
+        }
+        if has_pd_contract {
+            println!("  Port Partner:  {:?}", c_state);
+            println!(
+                "  EPR:           {}{}",
+                if info.epr_active != 0 {
+                    "Active"
+                } else {
+                    "Inactive"
+                },
+                if info.epr_support != 0 {
+                    " (Supported)"
+                } else {
+                    ""
+                }
+            );
+            if power_role == CypdPdPowerRole::Sink {
+                println!(
+                    "  Sink Active:   {}",
+                    if info.active_port != 0 { "Yes" } else { "No" }
+                );
+            }
+        }
+        let alt = info.pd_alt_mode_status;
+        // Bits 0-1 indicate DP alt mode is active (bit 0 = DFP_D/TBT,
+        // bit 1 = UFP_D). Only show when actually in DP alt mode.
+        if connected && (alt & 0x03) != 0 {
+            let mut modes = vec![];
+            if alt & 0x01 != 0 {
+                modes.push("DFP_D Connected");
+            }
+            if alt & 0x02 != 0 {
+                modes.push("UFP_D Connected");
+            }
+            if alt & 0x04 != 0 {
+                modes.push("Power Low");
+            }
+            if alt & 0x08 != 0 {
+                modes.push("Enabled");
+            }
+            if alt & 0x10 != 0 {
+                modes.push("Multi-Function");
+            }
+            if alt & 0x20 != 0 {
+                modes.push("USB Config");
+            }
+            if alt & 0x40 != 0 {
+                modes.push("Exit Request");
+            }
+            if alt & 0x80 != 0 {
+                modes.push("HPD High");
             }
+            println!("  DP Alt Mode:   {} (0x{:02X})", modes.join(", "), alt);
         }
     }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/framework_lib/src/smbios.rs 
new/framework-system-0.6.4/framework_lib/src/smbios.rs
--- old/framework-system-0.6.3/framework_lib/src/smbios.rs      2026-05-06 
01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/framework_lib/src/smbios.rs      2026-06-02 
18:21:24.000000000 +0200
@@ -208,7 +208,7 @@
         "Laptop 13 (AMD Ryzen AI 300 Series)" => 
Some(Platform::Framework13AmdAi300),
         "Laptop 12 (13th Gen Intel Core)" => 
Some(Platform::Framework12IntelGen13),
         "Laptop 13 (Intel Core Ultra Series 1)" => 
Some(Platform::IntelCoreUltra1),
-        "Framework Laptop 13 Pro (Intel Core Ultra Series 3)" => 
Some(Platform::IntelCoreUltra3),
+        "Laptop 13 Pro (Intel Core Ultra Series 3)" => 
Some(Platform::IntelCoreUltra3),
         "Laptop 16 (AMD Ryzen 7040 Series)" => 
Some(Platform::Framework16Amd7080),
         "Laptop 16 (AMD Ryzen AI 300 Series)" => 
Some(Platform::Framework16AmdAi300),
         "Desktop (AMD Ryzen AI Max 300 Series)" => 
Some(Platform::FrameworkDesktopAmdAiMax300),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/framework_lib/src/touchpad.rs 
new/framework-system-0.6.4/framework_lib/src/touchpad.rs
--- old/framework-system-0.6.3/framework_lib/src/touchpad.rs    2026-05-06 
01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/framework_lib/src/touchpad.rs    2026-06-02 
18:21:24.000000000 +0200
@@ -17,6 +17,7 @@
 pub const HAPTIC_INTENSITY_LEVELS: [u8; 5] = [0, 25, 50, 75, 100];
 
 // Button press threshold / click force (HID Digitizer page 0x0D, Usage 0xB0).
+// Added in HUTRR11, included in HUT 1.4
 // 2-bit field, firmware accepts 1=Low, 2=Medium, 3=High.
 const CLICK_FORCE_REPORT_ID: u8 = 0x08;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/framework_tool/Cargo.toml 
new/framework-system-0.6.4/framework_tool/Cargo.toml
--- old/framework-system-0.6.3/framework_tool/Cargo.toml        2026-05-06 
01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/framework_tool/Cargo.toml        2026-06-02 
18:21:24.000000000 +0200
@@ -1,11 +1,12 @@
 [package]
 name = "framework_tool"
-version = "0.6.3"
+version = "0.6.4"
 description = "Tool to control Framework Computer systems"
 homepage = "https://github.com/FrameworkComputer/framework-system";
 repository = "https://github.com/FrameworkComputer/framework-system";
 readme = "../README.md"
 license = "BSD-3-Clause"
+license-file = "../LICENSE.md"
 edition = "2021"
 
 [[bin]]
@@ -19,7 +20,7 @@
 
 [dependencies.framework_lib]
 path = "../framework_lib"
-version = "0.6.3"
+version = "0.6.4"
 
 [build-dependencies]
 static_vcruntime = "3.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/framework-system-0.6.3/framework_uefi/Cargo.toml 
new/framework-system-0.6.4/framework_uefi/Cargo.toml
--- old/framework-system-0.6.3/framework_uefi/Cargo.toml        2026-05-06 
01:41:22.000000000 +0200
+++ new/framework-system-0.6.4/framework_uefi/Cargo.toml        2026-06-02 
18:21:24.000000000 +0200
@@ -1,6 +1,6 @@
 [package]
 name = "framework_uefi"
-version = "0.6.3"
+version = "0.6.4"
 description = "UEFI Tool to control Framework Computer systems"
 homepage = "https://github.com/FrameworkComputer/framework-system";
 repository = "https://github.com/FrameworkComputer/framework-system";
@@ -24,6 +24,6 @@
 
 [dependencies.framework_lib]
 path = "../framework_lib"
-version = "0.6.3"
+version = "0.6.4"
 features = ["uefi"]
 default-features = false

++++++ vendor.tar.zst ++++++
/work/SRC/openSUSE:Factory/framework_tool/vendor.tar.zst 
/work/SRC/openSUSE:Factory/.framework_tool.new.2375/vendor.tar.zst differ: char 
7, line 1

Reply via email to