本帖最后由 r-MT 于 2023-5-9 15:59 编辑
主要解决以下几个问题
主帖涉及ite系列以it87为例,nct系列以nct6775为例的驱动源码修改见7楼
第一 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库文件了
压缩包里面的it87.ko是针对X72机型4.3-4.5版本直接使用链接:
PS:
有人在问,如果8688的pwm反转,该如何解决
我当时在里面留了一个接口
大概在4013行,添加一行
case it8686:
case it8689:
case it8688:
data->write(data,IT87_REG_PWM,ctrl & 0x7f); /* only set pwm_mode Manual mode */
break;
default:
|
|