NAS搭建

qnap温控

LensNews

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版本直接使用链接:

(0)

本文由来源 那是云,由 强哥 整理编辑!

LensNews

热评文章

发表回复