#!/usr/bin/perl -w use strict; sub ctl_state { open FAN, "/proc/eee/fan_manual" or die "Cannot get fan state: $!"; my $state = ; chomp $state; close FAN; if ($state == 0) { return "Automatic"; } else { return "Manual"; } } sub fan_stats { my $mode = ctl_state(); open FAN, "/proc/eee/fan_speed" or die "Cannot get fan speed: $!"; chomp(my $speed = ); close FAN; open FAN, "/proc/eee/fan_rpm" or die "Cannot get fan rpm: $!"; chomp(my $rpm = ); close FAN; open TEMP, "/proc/eee/temperature" or die "Can't get temp: $!"; chomp(my $temp = ); close TEMP; print "$mode: $speed%, $rpm rpms, $temp C.\n" } sub set_fan { open FAN, "> /proc/eee/fan_manual" or die "Cannon set fan state: $!"; print "Setting fan control mode...\n"; print FAN $_[0]; close FAN; sleep 1; if ($_[1]) { open SPEED, "> /proc/eee/fan_speed" or die "Can't set fan speed: $!"; print "Setting fan speed...\n"; print SPEED $_[1]; close SPEED; } # give hardware a chance to catch up. sleep 3; } sub module_ck { if ( -e '/proc/eee' ) { return 1; } else { return 0; } } #================================================================ my($fan_ctrl, $fan_spd); if ( ! module_ck() ) { if ( system "modprobe eee &>/dev/null" ) { print "Unable to load module. No root access, maybe?\n"; exit 1; } sleep 1; } if ( ! @ARGV ) { fan_stats(); exit 0; } else { foreach ( @ARGV ) { if ( m/^-a/ ) { $fan_ctrl = 0; $fan_spd = 0; if (ctl_state() eq "Automatic") { print "Already in auto-mode.\n"; exit 0; } set_fan( $fan_ctrl, $fan_spd ); fan_stats(); exit 0; } if ( m/^-m/ ) { $fan_ctrl = 1; m/^-m(\d{1,3})/; $fan_spd = $1; set_fan( $fan_ctrl, $fan_spd ); fan_stats(); exit 0; } if ( m/^-h/ ) { print "Fanspeed utility for eee.ko module.\n"; print "Usage: fanspeed [-a] [-m##[#]] [-h]\n"; print " -a Set fan mode to automatic\n"; print " -m##[#] Set fan mode to manual, with specified speed:\n"; print " -m30 sets fan to 30%\n"; print " -m100 sets fan to 100%\n"; print " -h This message\n"; print " no options prints fan status.\n"; exit 0; } } }