This kernel module permit to recognize the chipset Nuvoton NCT6687-R in lm-sensors package. This sensor is present on some B550 motherboard such as MSI or ASUS.
The implementation is minimalist and was done by reverse coding of Windows 10 source code from LibreHardwareMonitor
- Clone this repository
~$ git clone https://github.com/Fred78290/nct6687d
~$ cd nct6687d
- Build package
~$ make deb
- Install package
~$ dpkg -i ../nct6687d-dkms_*.deb
- Clone this repository
~$ git clone https://github.com/Fred78290/nct6687d
~$ cd nct6687d
- Build & install package
~$ make akmod
- Ubuntu/Debian:
apt-get install build-essential linux-headers-$(uname -r) dkms dh-dkms
- Fedora/CentOS/RHEL:
yum install make automake gcc gcc-c++ kernel-devel kernel-headers dkms
- ArchLinux:
pacman -S make automake linux-firmware linux-headers dkms base-devel
- openSUSE:
zypper in git make gcc dkms
~$ git clone https://github.com/Fred78290/nct6687d
~$ cd nct6687d
~$ make dkms/install
~$ git clone (this-repo)
~$ cd nct6687d
~$ make install
By running the command sensors, you got this output
nct6687-isa-0a20
Adapter: ISA adapter
+12V: 12.17 V (min = +12.17 V, max = +12.19 V)
+5V: 5.14 V (min = +5.14 V, max = +5.14 V)
+3.3V: 3.38 V (min = +3.38 V, max = +3.38 V)
CPU Soc: 1.11 V (min = +1.11 V, max = +1.11 V)
CPU Vcore: 1.05 V (min = +0.97 V, max = +1.05 V)
CPU 1P8: 1.84 V (min = +1.84 V, max = +1.84 V)
CPU VDDP: 0.00 V (min = +0.00 V, max = +0.00 V)
DRAM: 1.34 V (min = +1.34 V, max = +1.35 V)
Chipset: 890.00 mV (min = +0.89 V, max = +0.89 V)
CPU Fan: 1192 RPM (min = 1192 RPM, max = 1202 RPM)
Pump Fan: 1538 RPM (min = 1526 RPM, max = 1538 RPM)
System Fan #1: 922 RPM (min = 920 RPM, max = 922 RPM)
System Fan #2: 953 RPM (min = 953 RPM, max = 953 RPM)
System Fan #3: 1393 RPM (min = 1393 RPM, max = 1393 RPM)
System Fan #4: 0 RPM (min = 0 RPM, max = 0 RPM)
System Fan #5: 1007 RPM (min = 1007 RPM, max = 1007 RPM)
System Fan #6: 0 RPM (min = 0 RPM, max = 0 RPM)
CPU: +59.0°C (low = +52.0°C, high = +59.0°C)
System: +34.0°C (low = +34.0°C, high = +34.0°C)
VRM MOS: +31.0°C (low = +31.0°C, high = +31.0°C)
PCH: +40.0°C (low = +40.0°C, high = +40.0°C)
CPU Socket: +33.0°C (low = +33.0°C, high = +33.0°C)
PCIe x1: +32.0°C (low = +32.0°C, high = +32.0°C)
M2_1: +0.0°C (low = +0.0°C, high = +0.0°C)
To make it loaded after system boots
Just add nct6687 into /etc/modules
sudo sh -c 'echo "nct6687" >> /etc/modules'
sudo sh -c 'echo "nct6687" >> /etc/modules-load.d/nct6687.conf'
This module was tested on Ubuntu 20.04 with all kernel available on motherboard MAG-B550-TOMAHAWK running an AMD 3900X/AMD 5900X, and on RL8(RHEL8) MAG-B550M-MORTAR running an AMD 5700G
- Many people have reported compatibility with MB having Intel H410M & H510M chipset from some manufacturer. See issue report.
- Add support for MSI B460M Bazooka having NCT6687 with another device ID
- Add support to use generic voltage input without multiplier, allows sensors custom conf
- Support giving fan control back to the firmware
Some people report that voltage are wrong. The reason is with some motherboard, voltage sensors are not connected on the same nct6687 register.
As example the VCore sensor is connected on the 5th register for AMD but is connected on the 3rd register for INTEL.
Also the DIMM sensor is connected on the 4th register for AMD but connected to 5th register for INTEL.
To allow customize voltage configuration you must add manual=1 parameter passed to the module at load
sudo sh -c 'echo "nct6687 manual=1" >> /etc/modules'
And use a sensors conf like this /etc/sensors.d/B460M-7C83.conf
# Micro-Star International Co., Ltd.
# MAG B460M BAZOOKA (MS-7C83)
chip "nct6687-*"
label in0 "+12V"
label in1 "+5V"
label in2 "VCore"
label in3 "Voltage #1"
label in4 "DIMM"
label in5 "CPU I/O"
label in6 "CPU SA"
label in7 "Voltage #2"
label in8 "+3.3V"
label in9 "VTT"
label in10 "VRef"
label in11 "VSB"
label in12 "AVSB"
label in13 "VBat"
ignore in3
ignore in7
ignore in9
ignore in10
ignore in13
ignore temp6
ignore temp7
compute in0 (@ * 12), (@ / 12)
compute in1 (@ * 5), (@ / 5)
compute in4 (@ * 2), (@ / 2)
-
force (bool) (default: false) Set to enable support for unknown vendors.
-
manual (bool) (default: false) Set voltage input and voltage label configured with external sensors file. You can use custom labels and ignore inputs without setting this option if you can figure out their names (see which
*_label
contains builtin label).
In order to be able to use this interface you need to know the path as which
it's published. The path isn't fixed and depends on the order in which chips are
registered by the kernel. One way to find it is by device class (hwmon
) via a
simple command like this:
for d in /sys/class/hwmon/*; do echo "$d: $(cat "$d/name")"; done | grep nct6687
Possible output:
/sys/class/hwmon/hwmon5: nct6687
This means that your base path for examples below is /sys/class/hwmon/hwmon5
(note that adding/removing hardware can change the path, drop grep
from the
command above to see all sensors and their relative ordering).
Another way to look it up is by a device (class path actually just points to device path) like in:
cd /sys/devices/platform/nct6687.*/hwmon/hwmon*
The first asterisk will be expanded to an address (2592
which is 0xa20
that
you can see in sensors
output) and the second one to a number like 5
from
above.
Gets/sets PWM duty cycle or DC value that defines fan speed. Which unit is used depends on what was configured by firmware.
Accepted values: 0
-255
(slowest to full speed).
Writing to this file changes fan control to manual mode.
Example:
# slow down a fan as much as possible (will stop it if the fan supports zero RPM mode)
echo 0 > pwm6
# fix a fan at around half its speed (actual behaviour depends on the fan)
echo 128 > pwm6
# full speed
echo 255 > pwm6
Gets/sets controls mode of fan/temperature control.
Accepted values:
1
- manual speed management throughpwm[1-8]
99
- whatever automatic mode was configured by firmware (this is a deliberately weird value to be dropped after adding more modes)
Example:
# fix a fan at current speed (`echo pwm6` will be constant from now on)
echo 1 > pwm6_enable
# switch back to automatic control set up by firmware (`echo pwm6` is again dynamic after this)
echo 99 > pwm6_enable
# switch to ~25% of max speed
echo 64 > pwm6
# automatic
echo 99 > pwm6_enable
# back to ~25% (it seems to be remembered)
echo 1 > pwm6_enable
1. Fan speed control
- Changing fan speed was tested successfully by users, see in reported issues.
loading nct6687 fails. journalctl
shows ACPI: OSL: Resource conflict; ACPI support missing from driver?
:
- add
acpi_enforce_resources=lax
as a kernel parameter
dmesg
/ journalctl
shows
kernel: nct6687: EC base I/O port unconfigured
systemd-modules-load[339]: Failed to insert module 'nct6687': No such device
- add
softdep nct6687 pre: i2c_i801
to e.g./etc/modprobe.d/sensors.conf
.