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. web php wrong nginx config

    web php wrong nginx config 目录 web php wrong nginx config 题目描述 解题过程 信息收集 robots.txt hint.php Hack.php ...

  2. Http协议有什么特点,能说说这些特点体现在哪些方面吗?

    Http协议有什么特点,能说说这些特点体现在哪些方面吗? Http协议是我们最常用的接口,那它有什么特点呢? 无连接 无状态 还有呢? 灵活,简单快速 还有它的这些特点体现在哪些方面?你也要能说一说. ...

  3. Webpack5构建速度提升令人惊叹,早升级早受益

    为什么要升级? webpack4用的好好的,运行稳定,为什么要升级到webpack5, 每次升级,都要经历一场地震,处理许多loader和plugin API的破坏性改变. 请给我们一个充分的升级理由 ...

  4. Dom树,什么是dom树?

    相信很多初学前端的小伙伴,学了html,css,js之后,欣喜之余还有一丝小傲娇,没有想到那些大佬们口中又 提到了DOM树.你两眼一抹黑,年轻人总是要接受社会的爱(du)护(da). DOM 是 Do ...

  5. Windows 程序自动更新方案: Squirrel.Windows

    Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...

  6. C#读写内置类型的数据时是否原子操作

    Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uin ...

  7. Python正则表达式的七个使用范例

    本文由 伯乐在线 - 左手的灵魂 翻译.未经许可,禁止转载!英文出处:thegeekstuff.欢迎加入翻译组.http://blog.jobbole.com/74844/ 作为一个概念而言,正则表达 ...

  8. 3D高清电商购物小图标图片_在线商城三维icon图标素材大全

    3D高清电商购物小图标图片_在线商城三维icon图标素材大全

  9. 11.13 ethtool:查询网卡参数

    ethtool命令用于查询或设置网卡参数. ethtool [devname] [root@linuxprobe ~]# ethtool eth0 Settings for eth0:  Suppor ...

  10. 7.10-11 visudo、sudo

    7.10 visudo:编辑 sudoers文件     visudo命令是专门用来编辑/etc/sudoers这个文件的,同时提供语法检查等功能./etc/sudoers文件是sudo命令的配置文件 ...