一个gpio 不受控制的bug

前几天调试一个flash灯的驱动程序,这可ic 有两个控制pin, 一个叫en1 一个叫en2, 根据spec的说明,不同的组合将产生不同的输出电流。
但我发现,那个en1 这个pin 死活是拉不高的,于是开始拼命的查看我的代码是不是有什么逻辑上的错误,但是很不幸,没有找到,于是一直跟代码直到查到控制gpio的最底层的写那几个控制gpio寄存器的代码,把数据读了出来,结果是正确的。寄存器告诉我,我的配置是完全正确的,没有任何问题,同时他也给了我一个矛盾,一个寄存器告诉我我已经把他拉高了,但另一个寄存器说,这个pin仍然是低的,确实如此,这个pin确实是低的。事情就比较神奇了,难道是硬件有问题,于是我把连接这个gpio的所有外部电路全部拿掉,问题仍然存在。还是通过原理图来看一下。

图片2.png

上面的所有描述都是在check Q的状态,我们写了正确的寄存器,也就是说Q的状态是正确的。然而我们忽略了一个非常重要的信息,那就是vdd, 如果vdd没有,所有的工作是徒劳的。于是查找cpu的spec, 知道这个vdd是如何供电的,量了一下, 果然是没有的,于是在代码中加了上电,就ok了。

原文地址:https://www.cnblogs.com/soc-linux-driver/p/3600626.html