Linux下的regulator调试

2023-05-16

先看regulator使用的小demo,如

i2c8{
    touchscreen@28 {
           vddcama-supply = <&xxxxx>;
    };
}
int ret;
struct regulator *power;
static int ts_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
    power=regulator_get(&client->dev,"vddcama");
    if (IS_ERR(power)) {
        ret = PTR_ERR(power);
        dev_err(dev, "Failed to request vddcama: %d\n", ret);
  }
    ret=regulator_set_voltage(power, 1800000, 1800000);//mV
    ret=regulator_enable(power);
    ret=regulator_disable(power);
}
/**
 * regulator_get - lookup and obtain a reference to a regulator.
 * @dev: device for regulator "consumer"
 * @id: Supply name or regulator ID.
 *
 * Returns a struct regulator corresponding to the regulator producer,
 * or IS_ERR() condition containing errno.
 *
 * Use of supply names configured via regulator_set_device_supply() is
 * strongly encouraged.  It is recommended that the supply name used
 * should match the name used for the supply and/or the relevant
 * device pins in the datasheet.
 */
struct regulator *regulator_get(struct device *dev, const char *id)
{
    return _regulator_get(dev, id, false, true);
}
EXPORT_SYMBOL_GPL(regulator_get);
regulator_get如果找不到该电源,换返回一个无效的电源,该结果不是我们想要的,可使用regulator_get_exclusive代替。

static struct regulator *_regulator_get(struct device *dev, const char *id,
                    bool exclusive, bool allow_dummy)
{
    if (have_full_constraints() && allow_dummy) {
        pr_warn("%s supply %s not found, using dummy regulator\n",
            devname, id);
 
        rdev = dummy_regulator_rdev;
        get_device(&rdev->dev);
        goto found;
    /* Don't log an error when called from regulator_get_optional() */
    } else if (!have_full_constraints() || exclusive) {
        dev_warn(dev, "dummy supplies not allowed\n");
    }

struct regulator *regulator_get_exclusive(struct device *dev, const char *id)
{
    return _regulator_get(dev, id, true, false);
}
EXPORT_SYMBOL_GPL(regulator_get_exclusive);
如果是共享电源,其他使用者没有关闭电源,调用regulator_disable不能关闭电源。

int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)
{
    int ret = 0;
 
    regulator_lock_supply(regulator->rdev);
 
    ret = regulator_set_voltage_unlocked(regulator, min_uV, max_uV);
 
    regulator_unlock_supply(regulator->rdev);
 
    return ret;
}
EXPORT_SYMBOL_GPL(regulator_set_voltage);
 
int regulator_disable(struct regulator *regulator)
{
    struct regulator_dev *rdev = regulator->rdev;
    int ret = 0;
 
    if (regulator->always_on)
        return 0;
 
    mutex_lock(&rdev->mutex);
    ret = _regulator_disable(rdev);
    mutex_unlock(&rdev->mutex);
 
    if (ret == 0 && rdev->supply)
        regulator_disable(rdev->supply);
 
    return ret;
}
 
/**
 * regulator_enable - enable regulator output
 * @regulator: regulator source
 *
 * Request that the regulator be enabled with the regulator output at
 * the predefined voltage or current value.  Calls to regulator_enable()
 * must be balanced with calls to regulator_disable().
 *
 * NOTE: the output value can be set by other drivers, boot loader or may be
 * hardwired in the regulator.
 */
int regulator_enable(struct regulator *regulator)
{
    struct regulator_dev *rdev = regulator->rdev;
    int ret = 0;
 
    if (regulator->always_on)
        return 0;
 
    if (rdev->supply) {
        ret = regulator_enable(rdev->supply);
        if (ret != 0)
            return ret;
    }
 
    mutex_lock(&rdev->mutex);
    ret = _regulator_enable(rdev);
    mutex_unlock(&rdev->mutex);
 
    if (ret != 0 && rdev->supply)
        regulator_disable(rdev->supply);
 
    return ret;
}
EXPORT_SYMBOL_GPL(regulator_enable);
/sys/class/regulator下有所有的regular,如

每个节点有如下的属性

cpu0-cpu                   使用者名字
device
max_microvolts       最大电压
microvolts
min_microvolts       最小电压
name                            电源名字
num_users               当前的使用者数量(use_count)
of_node                     dts配置信息        
power
state                           当前状态(打开或关闭)
subsystem
suspend_disk_state
suspend_mem_state
suspend_standby_state   
type                        电源类型(电压或电流)
uevent

查看/d/regulator/regulator_summary有所有电源的信息,如

use 同上面的num_users(use_count)  (_regulator_enable+1   _regulator_disable-1)该参数可表明当前ldo的开光状态

open当前打开次数(open_count)(_regulator_get+1    _regulator_put-1)
 

static int _regulator_disable(struct regulator_dev *rdev)
{
...
    rdev->use_count--;
...
}
 
static int _regulator_enable(struct regulator_dev *rdev)
{
...
    rdev->use_count++;
...
}
 
struct regulator *_regulator_get(struct device *dev, const char *id,enum regulator_get_type get_type)
{
...
    rdev->open_count++;
...
}
 
static void _regulator_put(struct regulator *regulator)
{
...
    rdev->open_count--;
...
}
如果无法确认电源被异常关闭的情况 ,可以在平台的电源开关中加入如下函数,来追踪电源的开关状态。

static int mt6357_regulator_disable(struct regulator_dev *rdev)
{
    int ret = 0;
    pr_info("QQQQQQQQQQQQQQQQQQQQQQQQQQ==%s\n",rdev_get_name(rdev));
    if(strncmp(rdev_get_name(rdev),"vldo28",strlen("vldo28"))==0)
        WARN(1,"mt6370_ldo_disable\n");
}
文章知识点与官方知识档案匹配,可进一
————————————————
版权声明:本文为CSDN博主「那颗流星」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mike8825/article/details/88768889

内核设计的基本内容:

https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-regulator

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下的regulator调试 的相关文章

  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific

随机推荐

  • UCOS开发手册中关于OSQPend()函数讲

    转自 xff1a http www openedv com thread 44168 1 1 html UCOS开发手册中 第十章 UCOSIII消息传递 章节中关于等待消息队列的函数OSQPend 讲解有误 xff0c OSQPend 函
  • ucos-ii学习笔记——信号量集(事件标志组)的原理及使用

    xfeff xfeff ucos ii学习笔记 信号量集 事件标志组 的原理及使用 Created on 2012 10 8 Author zhang bin 学习笔记 for ucos ii PC redesigned by zhang
  • 低速容错CAN:ISO 11898-3 与ISO 11519-2标准两者关系

    xfeff xfeff 有关 低速容错CAN xff1a ISO 11898 3 与ISO 11519 2标准两者关系 最近有几个客户问到这个问题 xff0c 对应的产品是否兼容 于是上ISO官网查看发现并无两者的关系 xff0c 不过在网
  • CAN总线仲裁机制--对于多个节点同时发送相同ID的报文

    最近在学习CAN总线 xff0c 原先一直不太明白 xff0c 若有A xff0c B 2个节点同一时刻一起向总线上发送数据 xff0c CAN总线是怎么仲裁的 xff0c 来让A xff0c B其中一个节点退出 xff0c 保证高优先级的
  • roslaunch mavros px4.launch fcu_url=xxxx到底做了什么

    roslaunch mavros px4 launch fcu url 61 xxxx到底做了什么 一言以蔽之 xff0c roslaunch mavros px4 launch fcu url span class token opera
  • PX4,ROS,gazebo仿真

    https gitee com bingobinlw some tree master Overview Simulation Px4 command Slam map image process planning P200 AmovCar
  • 飞行控制PID算法——无人机飞控

    PID控制应该算是应用非常广泛的控制算法了 小到控制一个元件的温度 xff0c 大到控制无人机的飞行姿态和飞行速度等等 xff0c 都可以使用PID控制 这里我们从原理上来理解PID控制 PID proportion integration
  • Ubuntu20.04桌面版图文安装(超详细)

    Ubuntu20 04桌面版图文安装 xff08 超详细 xff09 一 准备工具 VMWare Workstation15 Pro xff1b ubuntu 20 04 desktop amd64 iso xff1b 二 虚拟机初始配置
  • 嵌入式芯片概念梳理 - CPU、MCU、MP、DSP、FPGA、ASIC

    CPU中央处理单元包含基本的运算单元AUL xff0c 存储单元cache等基本资源 xff0c 实现硬件设备的基本控制功能 中央处理器作为一个普世概念 xff0c 实际根据具体数据处理功能方向不同 xff0c 细分位DSP MCU和MP
  • UART、I2C、USB、SPI、CAN、Jtag、PCI/PCIE协议汇总

    协议通信方式UART串行全双工I2C SPI是串行外设接口 xff08 Serial Peripheral Interface xff09 的缩写 SPI是一种高速的 全双工 同步的通信总线 xff0c 并且在芯片的管脚上只占用四根线 xf
  • busybox概述

    busybox是什么 xff1f xff08 1 xff09 busybox是Linux上的一个应用程序 application xff0c 即只有一个ELF文件头 xff08 2 xff09 它整合了许多Linux上常用的工具和命令 xf
  • SR-IOV

    SSR IOV是Single Root I O Virtualization的缩写 在虚拟机中 xff0c 一切皆虚拟 比如网卡 xff0c 虚拟机看来好像有一个真实网卡 xff0c 但是这个网卡是宿主机虚拟出来的硬件 xff0c 也就是一
  • 希尔排序算法

    本章介绍排序算法中的希尔排序 内容包括 xff1a 1 希尔排序介绍 2 希尔排序图文说明 3 希尔排序的时间复杂度和稳定性 4 希尔排序实现 4 1 希尔排序C实现 4 2 希尔排序C 43 43 实现 4 3 希尔排序Java实现 转载
  • 归并排序算法

    概要 本章介绍排序算法中的归并排序 内容包括 xff1a 1 归并排序介绍 2 归并排序图文说明 3 归并排序的时间复杂度和稳定性 4 归并排序实现 4 1 归并排序C实现 4 2 归并排序C 43 43 实现 4 3 归并排序Java实现
  • 拓扑排序算法

    拓扑排序介绍 拓扑排序 Topological Order 是指 xff0c 将一个有向无环图 Directed Acyclic Graph简称DAG 进行排序进而得到一个有序的线性序列 这样说 xff0c 可能理解起来比较抽象 下面通过简
  • 线性时不变系统输出调节问题

    线性时不变系统输出调节问题 最近在学习 Nonlinear output regulation 中的linear output regulation时 xff0c 对于linear robust output regulation的问题时
  • MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本

    MinGW w64安装教程 著名C C 43 43 编译器GCC的Windows版本 MinGW w64安装教程 著名C C 43 43 编译器GCC的Windows版本 本文主要讲述如何安装 C语言 编译器 MinGW w64 xff0c
  • RT-Thread实时操作系统简介

    目录 一 概述 二 架构 三 版本选择 四 内核启动流程 五 自动初始化机制 六 内核对象模型 七 I O设备模型 1 框架 2 设备驱动使用序列图 3 设备类型 八 FinSH控制台 九 ENV工具 1 menuconfig 2 Scon
  • PCIe RAS

    对于Linux系统针对RAS的AER错误处理机制完成 PCIe RAS简单来讲就是PCIe的错误检测 纠正以及汇报的机制 它可以方便我们准确的定位 xff0c 纠正和分析错误增强系统的健壮性和可靠性 PCIe错误的分类 PCIe错误分为可校
  • Linux下的regulator调试

    先看regulator使用的小demo 如 i2c8 touchscreen 64 28 vddcama supply 61 lt amp xxxxx gt int ret struct regulator power static int