充电器一直绿灯风扇不转变绿灯了但温度不降风扇不停怎么办

知道合伙人生活技巧行家 推荐于
知道合伙人生活技巧行家

因工作性质一直爱好无线电,所以从事家电维修行业30多年近十年一直与计算机硬件打交道。

电动车充电器一矗绿灯风扇不转亮绿灯了充电器一直绿灯风扇不转风扇还在转着,是给里面的大功率元器件降温等到风扇停了才拔掉,这样是最好的

你对这个回答的评价是?

当然可以此功能可用于电磁炉类电器,电磁炉也会在关闭电源时风扇还转

绿灯亮时,风扇还转着是不是还沒充满在缓充?
不存在还在缓冲延时风扇只是为了保护充电电路,充满马上关闭风扇移动充电器一直绿灯风扇不转,有可能造成:焊点松动导致接触不良、温度持续升高损坏充电器一直绿灯风扇不转。
哦哦等到风扇停会不会对电池有影响?

你对这个回答的评价是

大约2周以前我开始接手bugzilla上的一系列跟风扇控制相关的故障。总结起来就是两类故障:

1)在系统经历过一次Suspend/Resume (S3或者S4)之后,风扇就不再转动直到温度升高到危险程度,风扇才被激发

2)在系统启动之后风扇就一直以最高速度运行,就算温度降下来风扇也不会停止。

这两类故障其实都已经被Kernel developer定位了並且patch也已经有现成的,我主要负责把这两个补丁upstream

内核是精妙的东西,稍有不慎就导致regression我们需要对内核保持敬畏之心。因此为

保险起見,我把这两故障的排查过程和patch都走查了一遍其实更重要的是通过回放故障排查的过程,

首先reporter抱怨说,风扇在不做Suspend前都是正常工作嘚:温度升高一级,风扇转速就升高一级

反之亦然。但当他做了Suspend到S4恢复之后发现这个风扇不转了,并且就算当前温度比较高风扇也無动于衷,

直到温度继续升高到一个比较危险的程度风扇才开始转动。

好吧排查这种问题的两招就是:一是查看各个风扇此时的状态,二是让reporter打开thermal management模块

再尝试做一下suspend/resume获取到调试信息,这里截取从S4 resume回来的最早的一段信息:

这么一大块调试信息容易看晕比较好的方法是先看代码,理清思路再来分析这些log对应着什么流程。

首先我们来说明风扇控制是由什么因素决定的。一句话温度。温度比较低时風扇处于静止状态;当温度升高时,到达某个临界点1(trip 2)

触发一个中断,在中断处理函数里通知风扇以速度1来开始运转;如果workload比较高,温喥继续上升到达临界点2(trip 2),

再次触发一个中断通知风扇以速度2运转,依次类推直到到达一个温度上限,将会触发系统紧急关闭以保护硬件

上面提到的这个风扇,就是cooling device另外,系统中可能不止存在一个风扇还可能有多个风扇,于是就有

状态(也就是设置风扇转速)的簡化后代码在:

上面的代码逻辑就是每次系统到了一个采样点,需要根据温度变化趋势来设置各个散热器的工作速度

接着根据寄存器徝更新thermal zone的当前温度,这两个值主要用来判断thermal zone的温度是上升还是下降了

从而为下一步调整cooling device的状态做准备,代码可以抽象为:

注意这里的mutex锁在文章末尾我们要讨论这把锁的合理性。

在更新完thermal zone的温度后进入实际的调整逻辑代码。我们先来想一下

如果是你来设计,你会怎么實现这个功能:随着温度的变化动态的调整风扇的转速?
之前我们已经介绍过在比较好的硬件系统里,每个风扇都支持多种转速在溫度达到越来越高

的临界点时,就触发更高的转速因此,我们会想到每个thermal_zone应该有一系列从低到高的

trip point如何与state联系起来呢, 我们需要一个結构来表达如下意思:但thermal zone的温度

就开启这个trip point对应的设备状态,也就是激活对应的thermal_instance(你觉得有没有更好的算法?)

先继续看针对每个trip point的邏辑判断:

凡是涉及到策略的地方Linux就喜欢用governor来完成,具体的策略thermal_core的框架不应该参与

而应该让各个驱动来填充和实现,这也是Linux内核的开發原则 这里的governor我们来考察常用的

暗含流量过大(温度过高)的意思。

标识表示温度变化范围刚好跨过了该thermal_instance代表的临界点,然后下一步哽新

是的逻辑就是这样,不过有稍微一点改动调整thermal_instance应该是找到多个被“跨越”的

实际的代码实现中,并没有考虑flag这个因素而是针对烸个thermal_instance,都无差别的更新了他们本次

thermal_instance要设置到的状态target就在这个范围中选取选取的依据是温度变化的趋势,与上次温度相比是增加还是减尐,

以及是否达到本thermal_instance表示的临界点趋势用trend变量表示,而临界点是否达到用throttle变量表示

我们先来看趋势的计算:

这个趋势是跟thermal_zone相关的,也僦是每个thermal_zone会提供一套计算趋势的方法比如在

我们把这个函数抄过来:

首先,我们得判断这个trip是属于哪个属性代表的是ACTIVE还是PASSIVE温度,

各个trip嘚属性是这样设计的:

我们根据温度历史变化来判断当前变化趋势是升温还是降温,从上面给出的thermal_zone0

判断流程这个流程判断的是,当前thermal_zone嘚温度和trip对应的温度,如果达到了这说明

是温度上升趋势,如果没有达到怎么判断是上升还是下降了呢?我们就可以判断thermal_zone的last_temperature

和本次thermal_zone嘚temperature的大小来估算趋势好吧,我承认这里的逻辑有点奇怪为什么不直接

判断last_temperature和本次temperature来估算趋势呢。其实代码想达到一个功能就是如果當前温度超过了

trip点,就算你在降温我也让你返回升温的趋势给thermal的governor,这样就可以让温度调节器governor继续保持降温的动作

直到温度降低到trip以下財算安全。

针对该trip对应的thermal_instance做更新了我们会用到之前计算出来的升温趋势,和是否达到trip

}首先获取该thermal_zone对应的cooling device的当前状态接着根据趋势是上升还是下降,

以及是否到达了trip来设置下一个状态。这个函数前面的注释也说明了设置的策略是:

说明很可能温度刚刚跨过这个trip或者之湔的散热力度不够,那么target+1这个没有意见;

如果本身已经在降温了,那么就把thermal_instance的target状态稍微设置低一点减去1,

不过还是需要他一直散热(鈈过对于acpi兼容的thermal_zone的某个active trip来说如果趋势是降温,

如果温度没有达到该thermal_zone的trip如果是升温,无所谓我不做操作;如果是降温这很有可能说明峩

之前的散热卓有成效,将温度刚降低到trip以下了稍微把target转速降低一点,继续散热观察后续情况如果

已经是lower底线了,说明这个散热器不鼡转这么快了干脆就把thermal_instance停掉。

upper和lower之间我们可以看出,状态调整的步长是1这就是step_wise温度governor命名的来历。

第一句就是判断本cooling device是否需要更新鈈需要的话就返回。接着又是一把锁这把锁的顺序我们后来会统一分析其合理性。

下一步是对需要更新的cooling device找出他下属的所有thermal_instance里,转速朂快的那个状态设置为最终的状态。

至此为止我们分析完毕一次温度变化调整风扇转速的全过程,再来回到最初的bug现场我们再把调試信息贴过来:

这段截取的这段信息,就是我们刚才分析的函数thermal_zone_device_update执行一次的流程,

根据reporter报告的问题描述但系统从S4回来后,风扇不再转动矗到温度升到很多,才再次转动

对应的cooling_device有5和6,根据最早的log这两个设备是CPU0和CPU1,这里我们不关注

当前实际温度是66度(通过寄存器读出)。请大家想一下这两个数据有没有问题后面会解释出问题的根源之一来自这里。

开启风扇了这到底是怎么一回事呢?我们来套用之前汾析的cooling device获取状态趋势和设置下一次cooling device

状态的流程来看看,以trip4来看tend是1,表示是升温throttle是1,表示是超过了trip那么根据当前状态是0,

下一个应該设置的状态就应该是1那么到底是什么阻止cooling device修改状态呢?原因就在这句:

由于old_target和target是一样的值cooling device不会给更新状态。所以问题根源在于函數使用了

也是1,代码逻辑就不会再设置cooling device的状态了wow, 这就是故障的最初根源

不过再想一下,代码里还有没有其他地方用到了休眠前失效嘚数据呢很明显,还有一个值就是thermal_zone的温度,

由于这个值会被用来算温度变化趋势(但没有达到trip时)所以我们也必须处理一下这个值。

好知道故障原因了,我们应该怎么改呢请读者思考一下。

想好没继续看 Kernel Developer是怎么解决这个问题的。

这里失效的实质就是从休眠恢複回来后,我们认为thermal_zone的温度是非常冷的冷到了绝对零度以下-274,

这样的结果是计算的温度趋势无论如何都是升温,然后把所有thermal_instance的状态都置THERMAL_NO_TARGET

表示从休眠回来后,所有的风扇都没有转动这样改的出发点主要是bug reporter报告说,风扇不转我们要想方设法

这个补丁打上去后,bu reporter报告说不管用!根据log发现,回调重置thermal_instance的位置还比较靠前

的位置延后。于是第二版这么改:

于是第二版修改后,经bug reporter验证成功了

不过正如之湔所说的那样,就算是把reset的时机延后也不能保证没有其他driver在后期更新

于是有了第三版,实现的原理是如果系统已经开始suspend了,那么就置┅个禁止更新thermal_instance

的标志后期无论谁走到更新thermal_instance的流程时发现这个标志就直接返回,然后在resume回来后

再把这个标志恢复,另外也顺便对get_trend趋势函数做一点小手脚(虽然对于acpi兼容的thermal_zone来说是画蛇添足,

因为对于acpitz来说上次温度是-274,本次温度再怎么也比绝对温度高自然返回上升。但對于其他

thermal_zone计算趋势的方法这不一定了,所以还是需要加上这么一句):即当

第一次获取趋势时强行返回温度上升,这样为了安全起见会启动风扇的运转。

打上补丁后reporter报告说,风扇确实是起来了不过随着温度变化,风扇速度不再变化

从log可以看出,休眠回来后温喥是65度,并且系统也确实把cooling_device2,3,4打开了

不过问题是,休眠回来后风扇确实是打开了,但一直以100%的速度狂转

然后bug reporter做了一些修改后风扇正常叻,他把get_trend默认第一次返回升温的趋势改成了降温趋势:

这真是一个简单粗暴的方法。我们来对比不加这个patch前的行为当前温度如果达到trip,

那么如果是升温则加大一级target(转速),如果是降温则降低一级转速;

如果没有达到trip,如果是升温这不管它,如果是降温这说明夲次散热卓有成效,

降低一级转速对于这个patch来说,由于重置了temperature是-274如果不加修正target的

这段代码,则趋势一定是升温就默认了可能是会开啟风扇这件事,因此我们还是应该按照实际

温度的情况来设置下一级状态于是补丁再次修改,成了这个样子:

修改后的log记录如下:

看出為什么风扇关不了的原因了吗既然是想让风扇关闭,我们就来观察log里设置target为-1的这几个操作

为什么没有成功,也就是cooling_devie0和1他们当前的状態是1,然后想让他们被设置到的状态是-1但最后

于是补丁又做了加强,在判断old_target和target时还加了一个判断,如果当前target是初始值则算出来的

target是哆少,就要让他设置成多少:

那么就强行把target设置成关闭也就解决了风扇无法关闭的问题。

这就是休眠回来后风扇out of control解决的全过程。对应嘚最新patch在:

在解决这个问题的过程中他们还遇到另外一个问题,就是系统启动后就算温度很低,风扇也一直转

thermal zone无法自动将其关闭。這个问题其实在刚才我们排查休眠风扇问题的最后一个log里,

已经表现出来了还记得我们最早提出休眠后风扇问题,说的是:休眠恢复後即使温度很高风扇不转动;

而在最后一个log里,我们看到了cooling device0到4状态全部是1,一直转

这其实是在我们解决休眠风扇问题的过程中,内核里引入了一个regression导致的这个regression其实

系统启动,还是休眠恢复时都会显示的开启他下属的platform device的电源,以便后期对这些device

进行操作所以风扇也僦顺带被打开了。但这就有一个问题风扇在启动阶段被打开后,如果温度很低

达不到trip,就不会触发中断来调整风扇转速因此在没有負载时风扇将长期转动,就算温度很低

说到这里,其实我有一丝遗憾因为这个故障我当时也发现了的,只是投入到其他问题去没有深究

风扇转速进行修正。对应的patch在

在打上两个patch后bug reporter说是没问题了。不过在另外一个类似的风扇故障里

bug reporter报告说还是不顶用!他打了上面两個patch后,风扇从S3回来后还是

一直100%的转,没有办法降低转速!于是让他又提供了log信息为了说明问题的根源,

我故意对log做了处理将一些关鍵log多换一行:

首先,在这个bug系统中cooling_device0到7是风扇,既然报告说风扇一直转不受控制,那么我们就看上面

就算target要设置成-1也没成功

当前状态昰1,是因为从休眠恢复后power domain会绕过thermal模块,将下属的

platform device使能(也就是风扇被强行打开了)于是根据计算,需要把target设置成-1

但由于old_target已经是-1了,所以不会修改状态还记得之前我们补丁的最后一次改动,

专门为了解决这种情况会在old_target和target检查之前,加入一句判断如果是第一次设置thermal_instance,

为什么没有强行设置target为-1而是返回呢?我们看cooling_device5本次的温度趋势是0,表示的

进入设置这个流程那为什么cooling_device5的trend不是5而是0呢?我们来看log最早嘚几句记录

照例说,更新每个thermal_zone的时候需要把每个trip都计算完毕,才进入下一个thermal_zone的更新

直接返回了。这就造成cooling_device5不能被设置为关闭导致峩们看到的问题。 问题的根源在于

下一个target后,如果是第一次设置thermal_instance的状态就不管三七二十一,强行设置他的状态为target

问题。我们当然可鉯删除acpi driver的这个work来规避这种情况但是你是删除不完的!因为有很多驱动

函数的互斥和同步是有问题的!比较好的方法是找到让thermal_zone_device_update原子执行的方案。


请问充电器一直绿灯风扇不转插仩充电不亮红灯翻绿灯(风扇不转不充电,电池检测是好的!)是充电器一直绿灯风扇不转输出线断路

其中最有可能是保险管烧坏了。

要保险丝烧坏绿灯怎么亮的?
你不懂充电器一直绿灯风扇不转原理充电器一直绿灯风扇不转正常工作,输出断路或者是输出电压等於电池电池时充电器一直绿灯风扇不转会亮绿灯
输出电压等于电池电压时亮绿灯
噢!经检查输出线没断,那保险管在哪里!
充电是一直绿燈不充电(风扇不转)输出线没断,不知充电器一直绿灯风扇不转那个零件坏了!
哦!请问专家那是充电器一直绿灯风扇不转里那个零件坏了?!要是合成模块坏了那就弄不好了!是吗谢谢?指教!
现在卖电瓶车的店家都只卖,不修充电器一直绿灯风扇不转的.(都不會修应该都不懂吧。)
请问:充电器一直绿灯风扇不转上的保险管在哪个位子有样子吗?烦请指教谢谢?!
我说的是电扇一摇头断電的问题解决了.(采纳了sisi4546先生的建议后换了一个电容就好了!)电瓶车充电器一直绿灯风扇不转至今没有修好!
那个保险管?我看到是呮有玻璃管的保险丝是好的要是这个坏了别说红灯不亮,绿灯与电都不亮断电啦!烦请内行专家指出到底是什么元器件坏了?我想学著自己修理!

你对这个回答的评价是

我要回帖

更多关于 充电器一直绿灯风扇不转 的文章

 

随机推荐