Linux kernel 使用 regulator 框架来管理电源,比如 PMIC 芯片上常见的LDO。使用 regulator 的常规流程如以下代码所示:

void set_vbus_voltage(struct device *dev)
{
struct regulator *vbus;

vbus = regulator_get(dev, "vbus");
if (IS_ERR(vbus)) {
ret = PTR_ERR(vbus);
goto reg_put;
}

regulator_set_voltage(vbus, 5000000, 5000000);
regulator_enable(vbus); reg_put:
regulator_put(vbus);
}

IS_ERR宏用来判断 regulator_get 的返回值是否有错误,如果没有错误,表示成功 get 到这个 regulator,那么就可以进行后续的 set 和 enable 操作了。这个设计符合我们的思维习惯。

那么对于上例,当 IS_ERR(vbus) 返回假时,也就是成功 get 到了名为 vbus 的 regulator,是否代表 vbus 这个 regulator 一定会起作用,输出 5V 呢?答案是不一定。

假设我们并没有在设备树中定义或者代码中创建“vbus”这个 regulator,比如我们一不小心搞错了regulator的名字,这个 regulator 的正确名字应该是 “vusbhost”,而不是 “vbus”,那么IS_ERR宏能判定出来吗?按我们的思维习惯应该是会返回真,也就是判定 get regulator 出错了;但是实际情况恰恰相反,IS_ERR宏仍然返回假,也就是判定 get regulator 成功。为什么会发生这种情况呢,这就需要看一下 regulator_get 函数的具体实现。

如上图,regulator_get 最终会调用到 _regulator_get。结合红色箭头1和2所指向的代码,可以看出代码逻辑是:如果找不到对应名字的 regulator,那么就返回 dummy regulator,并且在 kernel log 中输出相关 warning 信息。比如上例中如果找不到 “vbus”,则会输出如下 warning:

supply vbus not found, using dummy regulator

同时作者还在注释中给出了理由:“假设某个 regulator 是物理硬件上存在并已经使能了的,如果软件中找不到,那么就提供一个 dummy regulator 设备”。

所以当我们在调试驱动时,如果发现某个 regulator 没有按预期输出,且跟踪代码流程也没有发现中途出错返回,那么不妨考虑一下上述情况,仔细看看 kernel log 中有没有相关的 warning。


作者:bigfish99

博客:https://www.cnblogs.com/bigfish0506/

公众号:大鱼嵌入式

使用regulator_get时的一个小注意事项的更多相关文章

  1. QT:窗口最小化时显示一个小浮标

    有些窗口在自身最小化时要在桌面上显示一个小浮标,让用户利用这个小浮标进行各种操作(例如迅雷的悬浮窗一样),我试着用QT实现一下这个功能. PS:本来以为这个功能很简单,却搞了我两个晚上,泪奔... 思 ...

  2. Python list遍历remove()时的一个小BUG

    有这样一个列表: s=list('abcdefg') 现在因为某种原因我们需要从s中踢出一些不需要的元素,方便起见这里直接以踢出所有元素的循环代替: for e in s: s.remove(e) 结 ...

  3. Java中用Scanner扫描控制台输入时的一个小问题

    package com.hxl; import java.util.Scanner; public class Test { public static void main(String[] args ...

  4. 两个宝藏|关于我在github上冲浪时的一个小技巧。

    你好呀,我是歪歪. 前几天在 github 上冲浪的时候,发现了两个宝藏东西. 我也不藏着掖着了,拿出来给大家分享一下. 这两个宝藏是关于 arthas 和 SOFARegistry 的,这两个东西都 ...

  5. Ubuntu格式化分区时的一个小错误

    admin@gpc:/$ sudo  mkfs -t ext3 -c /dev/sdb1 mkfs.ext3: inode_size (128) * inodes_count (0) too big ...

  6. activiti设置customSessionFactories时的一个小坑

    现象:activiti设置customSessionFactories不起作用,流程还是走原来的查询方法原因:新实现的XXXEntityManagerFactory的getSessionType方法返 ...

  7. 关于一个小bug的修正

    python初学者,非常喜欢虫师的文章. 练习时发现一个小bug,http://www.cnblogs.com/fnng/p/3782515.html 验证邮箱格式一题中,第三个x不允许有数字,但是测 ...

  8. autium designer smart pdf一个小问题

    今天在使用ad的smart  pdf时遇到一个小问题  就是 使用的是AD17,生成PDF,PDF没有把芯片的引脚标号显示出来(还有其它的芯片也是一样的,但是奇怪的是:只有在原理图元器件右边的没有显示 ...

  9. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

随机推荐

  1. 在进程空间使用虚拟内存(Windows 核心编程)

    虚拟内存空间 如今的 Windows 操作系统不仅可以运行多个应用程序,还可以让每一个应用程序享受到约 4 GB 的虚拟内存空间(包括系统占用),假如内存为 4 GB 的话.那为什么 Window 可 ...

  2. Windows核心编程 第25章 未处理异常和C ++异常(下)

    这一节东西比较少,本应该归并在上一节里,但是昨天太晚了.就先把那些东西分为上了.这节里面就一个问题,C++异常与结构性异常的对比(try和__try的区别): C++异常与结构性异常的对比 S E H ...

  3. 记一次CTF的签到题

    开篇 打开题目网站 首先看到的是一个人博客,功能点非常少,功能较多的页面就是留言板了 一开始没啥思路,就想着抓包能不能找到SQL注入无果,在这个地方卡了很久 柳暗花明 在乱点的时候,无意中发现题目中的 ...

  4. calc 用法以及原理

    CSS3 的 calc() 函数允许我们在属性值中执行数学计算操作.例如,我们可以使用 calc() 指定一个元素宽的固定像素值为多个数值的和. 它是CSS预处理器 .foo { width: 100 ...

  5. java之Collection

    java中的Collection可分为List.Set.Queue三种类型. 1.List. List会按照插入的顺序保存对象,较为常用的实现类有ArrayList,LinkedList和Vector ...

  6. 解决移动端300ms延迟fastclick

    为什么要使用fastclick 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件,才有了fastclick. f ...

  7. 安装MySQL后,需要调整的10个性能配置项

    本文翻译自 Percona 官方博客,适用于 MySQL 5.6 及 5.7 版本. 作者:Stephane Combaudon 原文: https://www.percona.com/blog/20 ...

  8. [刷题] 77 Combinations

    要求 给出两个整数n和k,在n个数字中选出k个数字的所有组合 示例 n=4 , k=2 [ [ 1, 2 ] , [ 1, 3 ] , [ 1, 4 ] , [ 2, 3 ] , [ 2, 4 ] , ...

  9. QT相关书籍

    文章转载自:http://www.cctry.com/thread-290005-1-1.html 最近一段时间,陆陆续续给大家更新了不少基于Qt开发的不错的书籍,可以说每本都不错.不过放在这一堆大家 ...

  10. ltp循环跑

    e]# cat r3.sh#!/bin/bashi=1for ((; i<=1000; i++))do/opt/ltp/runltp -s fmtmsg01 -p -l -t -l /home/ ...