所以我有一台Acer 7551g,而且我正在使用这种功能来控制风扇的速度,因为它很糟糕。
https://github.com/Gabriel-LG/Acer7551GFanControl
这非常有效,可防止笔记本电脑过热和关机。但是,我不是Windows的粉丝,让我的笔记本电脑设置为双启动到Arch,并让我所有的开发工作都按我喜欢的方式设置。我决定尝试以内核模块的形式将windows fan control util移植到linux中。我编写了代码,但它没有像我想象的那样工作。
有linux内核chops的人可以查看我下面的代码并将其与上面引用的代码进行比较,看看我错过了什么?完全披露,我不是C程序员,这是基于linux内核模块开发人员指南中的教程。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
#define EC_VAL 0x62
#define EC_CMD 0x66
static void wait_write_ec(void)
{
while((inb(EC_CMD) & 0x02) != 0) {
}
}
static void wait_read_ec(void)
{
while ((inb(EC_CMD) & 0x01) == 0) {
}
}
static void write_ec(short addr, short value)
{
wait_write_ec();
outb(EC_CMD,0x81);
wait_write_ec();
outb(EC_VAL,addr);
wait_write_ec();
outb(EC_VAL,value);
}
static int read_ec(short addr)
{
wait_write_ec();
outb(EC_CMD,0x80);
wait_write_ec();
outb(EC_VAL,addr);
wait_read_ec();
return inb(EC_VAL);
}
static void set_speed(short speed)
{
write_ec(0x94, (255-(speed * 135) / 100));
}
static int __init hello_2_init_module(void)
{
printk(KERN_INFO "Fan control init.\n");
short temp = 0;
temp = read_ec(0xA8);
write_ec(0x93, 0x14); // this should be turning BIOS fan control off
set_speed(100);
printk(KERN_INFO "temp: %d", temp);
return 0;
}
static void __exit hello_2_exit(void)
{
printk(KERN_INFO "Fan control cleanup.\n");
}
module_init(hello_2_init_module);
module_exit(hello_2_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jason Miesionczek");
MODULE_DESCRIPTION("Control fan speed for Acer 7551g Notebooks");
生成文件:
obj-m += hello-1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules