qnap温控的一些东西
qnap默认读取
/sys/class/hwmon/hwmon0/device/这个目录下的温控数据,注意是hwmon0
所以要保证it87.ko或者nct6775.ko在coretemp.ko前加载,也就是第一个加载温控驱动
同时读取的是/sys/class/hwmon/hwmon0/device/这目录
/sys/class/hwmon/hwmon0/device/temp1_input温度
/sys/class/hwmon/hwmon0/device/fan1_input转速
/sys/class/hwmon/hwmon0/device/pwm1_enable 为0是自动,qnap控制的话 要=1
如果是ITE温控芯片
model里面SIO_DEVICE = IT87
如果是nct6775的话用
SIO_DEVICE = F71869A
不一定完全兼容
SYSTEM_TEMP_UNIT=SIO:1 第一个温度,类似这样
[System FAN]
FAN_UNIT = SIO
FAN_1=I2
系统风扇读取是第二个转速
第二 温控数据路径修正。
由于4.14的it87.c内核弃用了hwmon_device_register,
启用了devm_hwmon_device_register_with_groups
,
hwmon_device_register生成的温控数据全部在比如
/sys/class/hwmon/hwmon0/device/fan1_input
devm_hwmon_device_register_with_groups生成的温控数据全部在比如
/sys/class/hwmon/hwmon0/fan1_input
而qnap默认读取的是/sys/class/hwmon/hwmon0/device/下面的温控数据
很久以前我是修正so二进制文件,感觉总归有点问题
然后我想了2个办法解决
1.看一下qnap的内核源码4.2路径里面的it87.c,如果包含你的温控芯片,直接复制到4.14里面进行交叉编译,也可以解决,不过加载驱动的时候会提示警告提示函数已经弃用,无视也可以。
2.因为4.2内核里面it87.c比较老,不一定包含最新的温控芯片,那么把4.14里面的it87.c的devm_hwmon_device_register_with_groups自动生成的数据为空,然后手动生成指定目录的数据,也能解决。
当然nct6775温控也能类似一样解决
第三 由于我的技嘉主板Z370温控芯片是it8686e的,在4.14的内核里面也没有,最新的内核都没有
到这个连接
https://github.com/gamanakis/it87/tree/master 下载看了下还有8688e分支,里面包含最新的it温控芯片了
我决定用8688e分支做模版,git clone后切换到8688e分支,以8688e作为模版
依照qnap的方式进行了修改,patch文件我放在压缩包里面的it87-8686-qnap.patch
中间有几个麻烦的地方,其中主要是
it8686温控芯片比较麻烦,qnap会把初始寄存器全部清零,会造成it8686的pwm数值反转,控制风量大小反转了,所以patch里面做了修正.
第四 几个参数说明
it87 qnap默认是前3风扇接受qnap控制,前提是
cat /sys/class/hwmon/hwmon0/device/pwm1_enable为1,qnap驱动里面默认是3个也就是1-3
所以尽量接在前3个接口,所以我在驱动里面加了参数Manual_Fans默认是3,可以加载驱动的时候Manual_Fans=4这样也行
qnap默认加载初始的时候pwm是100,我的cpu的低功耗,完全不需要风扇转这么快,因此驱动加了Ispeed_Model参数,默认pwm是100,不等于0就是70。如Ispeed_Model=1
最后下载附件,解压
在qnap编译环境下 进入目录 直接make,生成一个单独it87.ko,只要加载it87.ko就行了
如果没有qnap编译环境 需要交叉编译的话,把目录里面compat.h和it87.c拷贝到qnap源码目录
/GPL_QTS/src/linux-4.14/drivers/hwmon/下,注意备份原来文件it87.c,
生成hwmon-vid.ko和it87.ko,注意先加载hwmon-vid.ko,再加载it87.ko
这样的话 就不需要修正二进制so库文件了
如果直接用https://github.com/gamanakis/it87/tree/master里面的it87.c编译后qnap加载,qnap的界面能显示温度和转速,但是不能控制转速,想了下去linux下载官方内核4.14.24,用里面的it87.c放入qnap的源码目录进行交叉编译后加载,qnap的界面一样能显示温度和转速,也不能控制转速,那么看看qnap究竟做了啥,比较一下linux官方和qnap的it87.c代码,分析一下差异,主要是这段
#ifdef CONFIG_MACH_QNAPTS
for (i = 0; i < 3; i++) {
u8 val= 0x64;
data->pwm_duty = pwm_to_reg(data, val);
if (has_newer_autopwm(data)) {
it87_write_value(data,IT87_REG_PWM,0);
it87_write_value(data, IT87_REG_PWM_DUTY, data->pwm_duty);
} else {
it87_write_value(data, IT87_REG_PWM, data->pwm_duty);
}
}
#endif
其他的差异大部分都是关于gpio的
本人也刚刚学习c,以下分析修正的可能不是正确的
it87_write_value(data,IT87_REG_PWM,0)
对IT87_REG_PWM清零,对应到pwm_mode return 1及Manual mode,也就是pwm*_enable=1
以及对初始pwm值设置为100。
而我的it8686温控芯片又比较特殊,IT87_REG_PWM如果全部清零的话,会造成pwm反转,
看了下IT87_REG_PWM第一位是判断pwm_mode的,那么把他设置为0就行了
第二:
生成指定目录的温控数据
hwmon_dev = devm_hwmon_device_register_with_groups(dev,
it87_devices[sio_data->type].name,
data, data->groups);
我把它修改为
hwmon_dev = devm_hwmon_device_register_with_groups(dev,
it87_devices[sio_data->type].name,
data, NULL);
然后用sysfs_create_group(&dev->kobj, &it87_group)
以及&it87_group_in &it87_group_temp &it87_group_fan等等手动生成温控数据到
/sys/class/hwmon/hwmon0/device/目录
nct6775也可以用上述方法手动生成device目录下的温控数据
首先可以到patchwork.kernel.org上去查一下有没有nct6796的补丁
可以看到
https://patchwork.kernel.org/pro ... =&submitter=&state=*&q=nct6796&archive=both&delegate=
可以看到
https://patchwork.kernel.org/pro ...linux@roeck-us.net/
按照那么你可以手动把nct6796d添加进去,不过比较繁琐
其次
看到最新的5.2内核也支持6796d 6797 6798等等
下载下来 复制进qnap的4.14.24的内核 进行交叉编译,好像有2个错误
可能内核升级过大,然后尽量找内核版本比较接近的
看了下4.20.17内核的nct6775.c也包含了这些芯片驱动
那么就简单多了 去Linux内核下载4.20.17源码,把其中的nct6775.c解压复制出来,拷贝进qnap源码目录进行交叉编译
这样就只出现一个错误
drivers/hwmon//nct6775.c:1260:2: error: implicit declaration of function 'array3_size' [-Werror=implicit-function-declaration]
su = devm_kzalloc(dev, array3_size(repeat, count, sizeof(*su)),
大概意思是array3_size函数没定义,搜一下qnap4.14.24源码里面的array3_size,发现在overflow.h里面
那么加上#include <linux/overflow.h>
再次交叉编译通过。
再进行温控数据路径的修正
1.在static int nct6775_probe里面把
hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name,
data, data->groups);
return PTR_ERR_OR_ZERO(hwmon_dev);
修改为
hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name,
data, NULL);
return PTR_ERR_OR_ZERO(hwmon_dev);
新增一个
err = sysfs_create_group(&dev->kobj, &nct6775_group_other);
if (err)
return ERR_PTR(-ENOMEM);
2.在nct6775_create_attr_group里面添加
err = sysfs_create_group(&dev->kobj, group);
if (err)
return ERR_PTR(-ENOMEM);
再次编译通过,然后在qnap里面加载完全ok
http://www.nasyun.com/forum.php?mod=attachment&aid=NTQxMTZ8Zjk1YjIwNzh8MTY1NjkzMzc2MHwxMzM1ODV8NzczODQ%3D
压缩包里面的it87.ko是针对X72机型4.3-4.5版本直接使用链接:
本文由来源 那是云,由 强哥 整理编辑!