花生壳
花生壳

关于ite和nct温控驱动的一点东西

威联通 QNAP  / 教程分享  / 倒序浏览   © 著作权归作者本人所有

#楼主# 2021-6-19 00:55

跳转到指定楼层
主要解决以下几个问题
主帖涉及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版本直接使用链接:
游客,如果您要查看本帖隐藏内容请回复












楼主热帖
那是云论坛 - 国内最开放NAS交流平台
http://www.nasyun.com
分享淘帖
回复

使用道具

0

精华

107

帖子

1236

积分

发烧玩家

Rank: 2

云币
0
贡献
49
活跃
937
精华
0
mikeee146 发表于 2021-6-19 06:48 来自 中国福建福州
太牛了,不知所云……
回复 支持 反对

使用道具 举报

0

精华

64

帖子

1851

积分

发烧玩家

Rank: 2

云币
0
贡献
2
活跃
1809
精华
0
menstry 发表于 2021-6-19 10:21 来自 中国河北廊坊
看看多谢分享{:3_54:}
回复 支持 反对

使用道具 举报

0

精华

45

帖子

1155

积分

发烧玩家

Rank: 2

云币
0
贡献
0
活跃
1132
精华
0
xajh20058 发表于 2021-6-19 13:35 来自 中国广东深圳
先顶后下载,感谢大神的分享
回复 支持 反对

使用道具 举报

2

精华

54

帖子

4024

积分

技术达人

Rank: 6Rank: 6

云币
301
贡献
319
活跃
2202
精华
2
r-MT 发表于 2021-6-20 11:18 来自 中国江苏无锡
本帖最后由 r-MT 于 2021-7-6 23:09 编辑

关于it87.c驱动源码的一些修正过程

第一:
  如果直接用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目录下的温控数据

回复 支持 反对

使用道具 举报

0

精华

58

帖子

613

积分

入门用户

Rank: 1

云币
0
贡献
0
活跃
584
精华
0
qyxk 发表于 2021-6-20 13:33 来自 中国广西
大佬能不能帮编译nct6796d的驱动呢,qnap4.14.24的6775.c只支持到6795d,

点评

首先可以到patchwork.kernel.org上去查一下有没有nct6796的补丁 可以看到 https://patchwork.kernel.org/project/linux-hwmon/list/?series=&submitter=&state=*&q=nct6796&archive=both&delegate= 可以看到 htt  详情 回复 发表于 2021-6-20 16:24
回复 支持 反对

使用道具 举报

2

精华

54

帖子

4024

积分

技术达人

Rank: 6Rank: 6

云币
301
贡献
319
活跃
2202
精华
2
r-MT 发表于 2021-6-20 16:24 来自 中国江苏无锡
本帖最后由 r-MT 于 2021-7-6 23:05 编辑
qyxk 发表于 2021-6-20 13:33
大佬能不能帮编译nct6796d的驱动呢,qnap4.14.24的6775.c只支持到6795d,

首先可以到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



nct6775.c

132.33 KB, 下载次数: 136

修正后的nct6775

回复 支持 1 反对 0

使用道具 举报

0

精华

58

帖子

613

积分

入门用户

Rank: 1

云币
0
贡献
0
活跃
584
精华
0
qyxk 发表于 2021-6-20 19:37 来自 中国广西
谢谢大佬的帮助                             
回复 支持 反对

使用道具 举报

0

精华

63

帖子

447

积分

入门用户

Rank: 1

云币
0
贡献
11
活跃
360
精华
0
gujiangjiang 发表于 2021-6-20 22:29 来自 中国江苏镇江
很久没看到技术贴了,绝对支持!!!
回复 支持 反对

使用道具 举报

0

精华

22

帖子

486

积分

入门用户

Rank: 1

云币
0
贡献
58
活跃
185
精华
0
benbeng 发表于 2021-6-21 09:35 来自 中国福建福州
大佬
威联通Virtualization Station虚拟机工作站补丁 分享链接失效了,能补个么

点评

破解的东西 我不会再发了 关于qnap的虚拟机,提示一下思路 qnap的虚拟机用的kvm,可以用virsh等命令[/backcolor] 我的判断是qnap做了些限制。 qnap用的是Python2.7写的,[/backcolor]反编译一下,再花点  详情 回复 发表于 2021-6-22 16:41
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 搜索 官方QQ群
懒人地图| 手机版|小黑屋| 智能生活 , 上那是云 |闽ICP备2020018196号-1 |网站地图