[РЕШЕНО] Принудительное включение кулеров

Всем привет!
Хочу сделать сделать скрипт, который при запуске включает кулеры включает кулеры на максимум, а при повторном запуске отдает управление кулерами обратно системе. А то лето, жарко, ноут теплый, сидеть неприятно (но температурные показатели процессора и видеокарты в норме, просто очень жарко).
Но не могу понять, можно ли как-то просто принудительно включить кулеры, не меняя настройки температур? На ArchWiki описано как сделать, изменяя настройки, что мне кажется не очень желательным...
Так же pwmconfig выдает, что "There are no pwm-capable sensor modules installed".
А sensors ничего связанного с fan не показывает:
coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +56.0°C  (high = +84.0°C, crit = +100.0°C)
Core 1:       +55.0°C  (high = +84.0°C, crit = +100.0°C)
Core 2:       +55.0°C  (high = +84.0°C, crit = +100.0°C)
Core 3:       +59.0°C  (high = +84.0°C, crit = +100.0°C)
В некоторых статьях предлагается включать вот так, отключив сервис fancontrol:
root $ echo 255 >> /sys/class/hwmon/hwmon[цифра]/device/pwm[цифра]
Но у меня в папке /sys/class/hwmon/hwmon0/device нет ни одного pwm файла, а других папок, кроме hwmon0 нет.
Еще находил, про /proc/acpi/fan/FAN/state :
Shows if the fan is currently active. The fan can be activated and deactivated manually by writing 0 (on) or 3 (off) into this file. However, both the ACPI code in the kernel and the hardware (or the BIOS) overwrite this setting when it gets too warm.
Но у меня в acpi такого нет:
ls /proc/acpi
button(папка)  wakeup
Подскажите, пожалуйста, можно ли как-то аккуратно включить кулеры, не трогая настройки температур?
Что значит:
Shatur
отдает управление кулерами обратно системе
?
Если кулера не управляются програмно, а лишь на уровне BIOS - забудьте эту идею.
Если управляются - ищите регуляторы. Если их нет - ищите как включить, возможно мамка с дефолтными параметрами ядра не позволяет это сделать.
Тут писал как когда-то делал.
There are no pwm-capable sensor modules installed
- это значит, что кулер не управляется ШИМ. Скорость меняется ступенчато и управляется, как уже выше сказали биосом. Можно забить.
Shatur
можно ли как-то просто принудительно включить кулеры, не меняя настройки температур?
Скорее всего можно, но нужно смотреть и разбираться - если есть желание, почитай это, там же найдешь ссылки на дополнительные источники, которые помогут написать и скрипты, используя готовые для конкретного железа.
Ошибки не исчезают с опытом - они просто умнеют
Извиняюсь, что не по существу.
vasek, perl-скрипт из твоей статьи не работает, пишет, что нужно установить какой-то модуль Sys::PortIO, строка 30 скрипта. Что нужно? Было б хорошо завести у себя, т.к.
Switching off wifi: acer_ec.pl := 0x71 0x00 Manual fan speed setting: acer_ec.pl := 0x93 0x14 and then set the speed at 0x94 : 0x00 full, 0xff off acer_ec.pl := 0x94 0xbb <-- very low fan speed
Можно повесить на хоткеи и в xmobar))
Aivar
Если кулера не управляются програмно, а лишь на уровне BIOS - забудьте эту идею.
Morisson
- это значит, что кулер не управляется ШИМ. Скорость меняется ступенчато и управляется, как уже выше сказали биосом. Можно забить.
Походу, да, через BIOS(
Покопался в нем, там настройки температур через него выставляются в специальном меню:(
Еще там есть вот какая опция в одном из подменю термальных настроек:

Я так понимаю, это влияет только на получение температурных показателей?

vasek
Скорее всего можно, но нужно смотреть и разбираться - если есть желание, почитай это, там же найдешь ссылки на дополнительные источники, которые помогут написать и скрипты, используя готовые для конкретного железа.
Спасибо, буду смотреть:)
Morisson
perl-скрипт из твоей статьи не работает, пишет, что нужно установить какой-то модуль Sys::PortIO, строка 30 скрипта.
Похоже не создается /dev/port. Проще привести мой скрипт, чем разбираться с твоим скаченным - может я в нем что то и менял, уже не помню.
Сейчас проверил sudo perl acer_ec.pl regs - все работает
Мой acer_ec.pl
#!/usr/bin/perl -w

# Copyright (C) 2007  Michael Kurz     michi.kurz (at) googlemail.com
# Copyright (C) 2007  Petr Tomasek     tomasek (#) etf,cuni,cz
# Copyright (C) 2007  Carlos Corbacho  cathectic (at) gmail.com
#
# Version 0.6.1 (2007-11-08)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
require 5.004;

use strict;
use Fcntl;
use POSIX;
use File::Basename;

sub initialize_ioports
{
  sysopen (IOPORTS, "/dev/port", O_RDWR)
    or die "/dev/port: $!\n";
  binmode IOPORTS;
}

sub close_ioports
{
  close (IOPORTS)
    or print "Warning: $!\n";
}
sub inb
{
  my ($res,$nrchars);
  sysseek IOPORTS, $_[0], 0 or return -1;
  $nrchars = sysread IOPORTS, $res, 1;
  return -1 if not defined $nrchars or $nrchars != 1;
  $res = unpack "C",$res ;
  return $res;
}

# $_[0]: value to write
# $_[1]: port to write
# Returns: -1 on failure, 0 on success.
sub outb
{
  if ($_[0] > 0xff)
  {
    my ($package, $filename, $line, $sub) = caller(1);
    print "\n*** Called outb with value=$_[1] from line $line\n",
          "*** (in $sub). PLEASE REPORT!\n",
          "*** Terminating.\n";
    exit(-1);
  }
  my $towrite = pack "C", $_[0];
  sysseek IOPORTS, $_[1], 0 or return -1;
  my $nrchars = syswrite IOPORTS, $towrite, 1;
  return -1 if not defined $nrchars or $nrchars != 1;
  return 0;
}

sub wait_write
{
	my $i = 0;
	while ((inb($_[0]) & 0x02) && ($i < 10000)) {
		sleep(0.01);
		$i++;
	}
	return -($i == 10000);
}

sub wait_read
{
	my $i = 0;
	while (!(inb($_[0]) & 0x01) && ($i < 10000)) {
		sleep(0.01);
		$i++;
	}
	return -($i == 10000);
}

sub wait_write_ec
{
	wait_write(0x66);
}

sub wait_read_ec
{
	wait_read(0x66);
}

sub send_ec
{
	if (!wait_write_ec()) { outb($_[0], 0x66); }
	if (!wait_write_ec()) { outb($_[1], 0x62); }
}

sub write_ec
{
	if (!wait_write_ec()) { outb(0x81, 0x66 ); }
	if (!wait_write_ec()) { outb($_[0], 0x62); }
	if (!wait_write_ec()) { outb($_[1], 0x62); }
}

sub read_ec
{
	if (!wait_write_ec()) { outb(0x80, 0x66 ); }
	if (!wait_write_ec()) { outb($_[0], 0x62); }
	if (!wait_read_ec())  { inb(0x62); }
}

sub write_kc
{
	if (!wait_write(0x64)) { outb($_[0], 0x64); }
	if (!wait_write(0x64)) { outb($_[1], 0x60); }
}

sub print_regs
{
	initialize_ioports();

	my @arr = ("00","10","20","30","40","50","60","70","80","90","A0","B0","C0","D0","E0","F0", "");

	my $i = 0;
	my $t = 0;
	print "\n  \t00\t01\t02\t03\t04\t05\t06\t07\t|\t08\t09\t0A\t0B\t0C\t0D\t0E\t0F\n";
	print "  \t__\t__\t__\t__\t__\t__\t__\t__\t|\t__\t__\t__\t__\t__\t__\t__\t__\n";
	print "00 |\t";
	for ($i = 0; $i < 256; $i++)
	{
		$t = read_ec($i);
		print $t;
		print "\t";
		if ((($i + 1) % 8) == 0){
			if ((($i + 1) % 16) == 0) {
				if ($i != 255) { print "\n$arr[(($i-(($i + 1) % 16)) / 16) + 1] |\t"; }
			} else {
				print "|\t";
			}
		}
	}

	print "\n";

	close_ioports();
}

sub write_temp
{
	initialize_ioports();
	write_ec($_[0],$_[1]);
	close_ioports();
}

sub testnum
{
	my $i;
	for ($i = 0; $i<256;$i++) {
		if ($_[0] eq "$i") { return 1 };
	}
	return 0;
}

my $ii;

if (!$ARGV[0]){
        print "wrong arguments!\n";
	print "usage:\n";
	print "\'acer_ec regs\' \t\t\t\tdumps all ec registers\n";
	print "\'acer_ec ledon\' \t\t\t\tswitch on 'mail LED' (WMID)\n";
	print "\'acer_ec ledoff\' \t\t\t\tswitch off 'mail LED' (WMID)\n";
	print "\'acer_ec getled\' \t\t\t\tget 'mail LED' status (WMID)\n";
	print "\'acer_ec getled2\' \t\t\t\tget 'mail LED' status(AMW0)\n";
	print "\'acer_ec getwireless\' \t\t\t\tget 'wireless' status (AMW0)\n";
	print "\'acer_ec gettouch\' \t\t\t\tis the touchpad disabled?\n";
	print "\'acer_ec setfanthresh <temp>\' \t\t\t\tset temperature threshhold to <temp>, DANGEROUS!\n";
	print "\'acer_ec getfanthresh\' \t\t\t\tget temperature threshhold\n";
	print "\'acer_ec <temp-number> <temperature>\' \tfor setting a temperature\n";
	print "where <temp-number> is from 0-7, and <temperture> is from 0-255\n";
	print "\'acer_ec ?= <reg>\' \t\tQuery register's value\n";
	print "\'acer_ec := <reg> <val>\' \tSet register's value\n";
	print "\'acer_ec +f <reg> <val>\' \tOr register's value with val (to set flags)\n";
	print "\'acer_ec -f <reg> <val>\' \tAnd register's value with ~val (to clear flags)\n";
	print "\'forcekc\' \tTry all possible values on writeable RAM of keyboard controller\n";
	print "\'kcw <cmd> <val>\' \tWrite a command and a value to the keyboard controller\n";
} elsif ($ARGV[0] eq "regs") {
	print_regs();
} elsif ($ARGV[0] eq "getled") {
	# TM2490 only (WMID)
	initialize_ioports();
	if (read_ec(0x9f)&0x01) {
		print "Mail LED on\n";
	} else {
		print "Mail LED off\n"; }
	close_ioports();
} elsif ($ARGV[0] eq "getled2") {
	# Aspire 5020 only (AMW0)
	initialize_ioports();
	if (read_ec(0x0A)&0x80) {
		print "Mail LED on\n";
	} else {
		print "Mail LED off\n"; }
	close_ioports();
} elsif ($ARGV[0] eq "getwireless") {
	# Aspire 5020 only (AMW0)
	initialize_ioports();
	if (read_ec(0x0A)&0x4) {
		print "Wireless on\n";
	} else {
		print "Wireless off\n"; }
	close_ioports();
} elsif ($ARGV[0] eq "gettouch") {
	# TM2490 only - needs testing
	initialize_ioports();
	if (read_ec(0x9e)&0x08) {
		print "touchpad disabled\n";
	} else {
		print "touchpad enabled\n"; }
	close_ioports();
} elsif ($ARGV[0] eq "?=") {
	initialize_ioports();
	my $r = hex($ARGV[1]);
	printf("REG[0x%02x] == 0x%02x\n", $r, read_ec($r));
	close_ioports();
} elsif ($ARGV[0] eq ":=") {
	initialize_ioports();
	my $r = hex($ARGV[1]);
	my $f = hex($ARGV[2]);
	my $val = read_ec($r);
	printf("REG[0x%02x] == 0x%02x\n", $r, $val);
	printf("REG[0x%02x] := 0x%02x\n", $r, $f);
        write_ec( $r, $f);
	printf("REG[0x%02x] == 0x%02x\n", $r, read_ec($r));
	close_ioports();
} elsif ($ARGV[0] eq "+f") {
	initialize_ioports();
	my $r = hex($ARGV[1]);
	my $f = hex($ARGV[2]);
	my $val = read_ec($r);
	printf("REG[0x%02x] == 0x%02x\n", $r, $val);
	printf("REG[0x%02x] := 0x%02x\n", $r, $val | $f);
        write_ec( $r, $val | $f);
	printf("REG[0x%02x] == 0x%02x\n", $r, read_ec($r));
	close_ioports();
} elsif ($ARGV[0] eq "-f") {
	initialize_ioports();
	my $r = hex($ARGV[1]);
	my $f = hex($ARGV[2]);
	my $val = read_ec($r);
	printf("REG[0x%02x] == 0x%02x\n", $r, $val);
	printf("REG[0x%02x] := 0x%02x\n", $r, $val & ~$f);
        write_ec( $r, $val & ~$f);
	printf("REG[0x%02x] == 0x%02x\n", $r, read_ec($r));
	close_ioports();
} elsif ($ARGV[0] eq "ledon") {
	# TM2490 only - needs testing
	initialize_ioports();
	if (!wait_write(0x64)) { outb(0x59, 0x64); }
	if (!wait_write(0x64)) { outb(0x92,   0x60); }
	close_ioports();
} elsif ($ARGV[0] eq "ledoff") {
	# TM2490 only - needs testing
	initialize_ioports();
	if (!wait_write(0x64)) { outb(0x59, 0x64); }
	if (!wait_write(0x64)) { outb(0x93,   0x60); }
	close_ioports();
} elsif ($ARGV[0] eq "getfanthresh") {
	initialize_ioports();
	$ii=read_ec(0xa9);
	close_ioports();
        print "Temperature threshhold: $ii (celsius)\n";
} elsif (($ARGV[0] eq "setfanthresh") && testnum($ARGV[1])) {
	write_temp(0xA9,$ARGV[1]);
} elsif ($ARGV[0] eq "setbright") {
	# Aspire 5020 only (AMW0)
	if ($ARGV[1] >= 0 && $ARGV[1] <= 15) {
		write_temp(0x83, $ARGV[1]);
	} else {
		print "second argument must be a number between 0 and 15\n";
	}
} elsif ($ARGV[0] eq "forcekc") {
	# Be smart - we only send the commands for writing to keyboard RAM
	initialize_ioports();
	my ($kbdata, $cont, $kbreg);
	for ($kbreg = 0x40; $kbreg <= 0x5f; $kbreg++) {
		for ($kbdata = 0; $kbdata < 256; $kbdata++) {
			write_kc($kbreg, $kbdata);

			print sprintf("%0#4x", $kbreg), ", ", sprintf("%0#4x", $kbdata), "\n";
			print "Continue? y/n: ";
			$cont = <STDIN>;
			if ($cont eq "n") {
				last;
			}
		}
	}
	close_ioports();
} elsif ($ARGV[0] eq "kcw") {
	initialize_ioports();
	write_kc($ARGV[1], $ARGV[2]);
	close_ioports();
} else {
	print "wrong arguments!\n";
}

Ради интереса проверь - совпадает или нет.
Ошибки не исчезают с опытом - они просто умнеют
Shatur
Я так понимаю, это влияет только на получение температурных показателей?
Это снижает частоту процессора при повышенных температурах, чтоб не было перегрева.
vasek, твой работает)) Спасибо.
vasek, боюсь накосячить. После перезагрузки значения, записанные в таблицу сохраняются?
 
Зарегистрироваться или войдите чтобы оставить сообщение.