|
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目录下的温控数据
|
|