用于Acer的Windows粉丝控制工具,作为内核模块移植到linux

时间:2014-09-05 12:09:13

标签: c linux hardware kernel-module

所以我有一台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

0 个答案:

没有答案