Qcom 平台 pmic adc读取代码实现

article/2025/8/22 16:27:13

Qcom 平台读取pmic上 adc电压值的方法

如下图,可以通过平台提供的节点(参考高通文档将mpp配置为adc功能) cat对应的节点获取结果;
也可以通过自行实现的驱动中调用相关接口并转化结果;
image-20210802204655444

Kernel demo 参考代码:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/consumer.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/list.h>
#include <linux/errno.h>
#include <linux/mutex.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/qpnp/qpnp-adc.h>
#include <linux/time.h>static struct workqueue_struct *init_mpp2_adc_wq;
static struct delayed_work init_work;static struct mpp2_adc_data
{char name;int major;struct class *class;struct platform_device *pdev;struct qpnp_vadc_chip *vadc_dev;
}qm215_mpp2_adc;ssize_t mpp2_adc_read (struct file *file, char __user *buf, size_t size, loff_t * loft)
{   int ret;int adc_val = 0;int i = 0;char adc[16];char count = 0;struct qpnp_vadc_result result;if(*loft)return 0;printk("qm215 mpp2_adc read adc\n");ret = qpnp_vadc_read(qm215_mpp2_adc.vadc_dev,P_MUX2_1_1,&result);if(ret < 0){printk("qm215 mpp2_adc qpnp_vadc_read fail\n");return size;}printk("qm215 mpp2_adc read adc end\n");adc_val = (int)result.physical;
//  adc_val = adc_val / 1000;printk("qm215 mpp2_adc read adc_val: %d uv\n",adc_val);memset(adc,0,sizeof(adc));count = sprintf(adc,"%d", adc_val);do{adc_val = adc_val / 10;i++;}while(adc_val);ret = copy_to_user(buf, adc, i+1);*loft += (i+1);return i+1;
}static struct file_operations mpp2_adc_ops =
{.owner          =  THIS_MODULE,.read           =  mpp2_adc_read,
};
static void mpp2_adc_init_work(struct work_struct *work)
{printk("qm215 mpp2_adc init work\n");qm215_mpp2_adc.vadc_dev = qpnp_get_vadc(&qm215_mpp2_adc.pdev->dev,"test");if(qm215_mpp2_adc.vadc_dev == NULL)printk("qm215 qpnp_get_vadc fail \n ");if( IS_ERR(qm215_mpp2_adc.vadc_dev))printk("qm215 qpnp_get_vadc fail errno is  %d\n", (int)PTR_ERR(qm215_mpp2_adc.vadc_dev));
}static int mpp2_adc_platform_probe(struct platform_device *pdev)
{int ret;
//  struct device_node *np = pdev->dev.of_node;printk("qm215 mpp2_adc_read probe \n");qm215_mpp2_adc.pdev = pdev;qm215_mpp2_adc.major = register_chrdev(0, "mpp2_adc", &mpp2_adc_ops);qm215_mpp2_adc.class = class_create(THIS_MODULE, "mpp2_adc");device_create(qm215_mpp2_adc.class, NULL, MKDEV(qm215_mpp2_adc.major, 0), NULL, "mpp2_adc");INIT_DELAYED_WORK(&init_work, mpp2_adc_init_work);init_mpp2_adc_wq = create_singlethread_workqueue("init_mpp2_adc_wq");if (!init_mpp2_adc_wq) {ret = -EINVAL;}queue_delayed_work(init_mpp2_adc_wq, &init_work, 10*HZ);return 0;
}static int mpp2_adc_platform_remove(struct platform_device *pdev)
{device_destroy(qm215_mpp2_adc.class, MKDEV(qm215_mpp2_adc.major, 0));class_destroy(qm215_mpp2_adc.class);unregister_chrdev(qm215_mpp2_adc.major, "mpp2_adc");return 0;
}static struct of_device_id mpp2_adc_of_match[] = {{ .compatible = "qm215,mpp2_adc", },{},
};static struct platform_driver mpp2_adc_platform_driver = {.probe      = mpp2_adc_platform_probe,.remove     = mpp2_adc_platform_remove,.driver     = {.owner  = THIS_MODULE,.name   = "qm215,mpp2_adc",.of_match_table = of_match_ptr(mpp2_adc_of_match),}
};static int __init mpp2_adc_init(void)
{int ret = 0;printk("qm215 mpp2_adc init\n");ret = platform_driver_register(&mpp2_adc_platform_driver);if(ret< 0){printk("qm215 mpp2_adc platform driver register fail\n");return -1;}printk("qm215 mpp2_adc  end\n");return 0;
}
static void __exit mpp2_adc_exit(void)
{platform_driver_unregister(&mpp2_adc_platform_driver);
}module_init(mpp2_adc_init);
module_exit(mpp2_adc_exit);MODULE_AUTHOR("xxx");
MODULE_DESCRIPTION("mpp2_adc");
MODULE_LICENSE("GPL");

http://chatgpt.dhexx.cn/article/AHlgm2HQ.shtml

相关文章

浅谈Linux PMIC驱动(一)

转眼间&#xff0c;从事PMIC驱动开发已将近4年&#xff0c;前后参与两款PMIC芯片研发&#xff0c;一款自研&#xff0c;一款Q公司PMIC&#xff0c;对PMIC有了一定的理解&#xff0c;将其总结归纳&#xff0c;算是这几年工作的收获吧&#xff1f; 读者对象&#xff1a;对PMIC感…

PMIC/SBC/PMU 电源管理芯片工作原理

目录 PMIC/SBC作用 &#xff24;&#xff23;转换的方式 PMIC 与ASIL PMIC 工作逻辑 PMIC与DDR的关系 PMIC与CPU PMIC/SBC&#xff0f;&#xff30;&#xff2d;&#xff35;作用 PMIC&#xff1a;power management IC的缩写&#xff0c;中文是电源管理集成电路。 SBC:…

PMIC 工作原理

1. PMIC芯片每个电压的输出可以通过外部EEPROM定制&#xff0c;若无EEPROM&#xff0c;使用默认的配置&#xff1b; 2. PMIC需要外部给一个使能信号开始工作 3. PMIC支持多种工作模式&#xff1a;BACKUP、ACTIVE、STANDBY 参考PMCI数据手册&#xff1a; BD9574MWF-M Power …

信号与系统--幅度谱和相位谱

周期信号的频谱 为了能既方便又明白地表示一个信号在不同频率下的幅值和相位&#xff0c;可以采用成为频谱图的表示方法。 在傅里叶分析中&#xff0c;把各个分量的幅度|Fn|或 Cn 随着频率nω1的变化称为信号的幅度谱。 而把各个分量的相位 φn 随角频率 nω1 变化称为信号的…

关于信号相位、信号阶段的解释

相位阶段&#xff08;stage):  是根据交叉口通行权在一个周期内的更迭次数来划分的&#xff0c;一个信号周期内"通行权"的交接几次&#xff0c;就是几个信号阶段。也就是说只要信号灯色有变化&#xff08;红、黄除外&#xff09;&#xff0c;相位阶段就发生了变化。…

基于stm32的两路正弦波相位差测量

利用stm32测量两路正弦波相位差&#xff0c;有四种主要思路&#xff1a; 1. 两路直接捕获信号直接得到时间差 即将正弦波过比较器变成方波&#xff08;stm32直接测量正弦波也可以的&#xff0c;频率较大时误差基本上在忍受范围的&#xff09;&#xff0c;开启两路捕获得到上升…

信号控制基本概念(相位和阶段)

本科上课时都上过这些&#xff0c;但是后来做科研没做这个方向&#xff0c;时间一长就都忘了&#xff0c;最近实习做信号控制相关&#xff0c;得拾起来&#xff0c;要不然被人嘲笑了。内容主要参考这篇文章&#xff0c;写的挺好的&#xff0c;也很全面&#xff0c;接下来概括下…

相位调制

一天一个信号处理小知识 1.相位调制 引言 在通信系统中&#xff0c;当通信设备产生了需要发送的数据&#xff0c;这个数据为一长串比特流&#xff0c;如果使用示波器画出来&#xff0c;那么就是一连串的方波。要想进行通信&#xff0c;就必须得想办法通过空气将这串比特流发送…

求解一个序列的最小相位序列

求解一个序列的最小相位序列 什么是最小相位序列hmin(z)一个例子总结例子说明求解思路零点搬移规律由非最小相位系统构造全通系统和最小相位系统的过程原型 什么是最小相位序列hmin(z) 最小相位系统Hmin(z)是零、极点都在单位圆内的因果稳定系统。 最小相位系统Hmin(z)的逆z变…

1.7 全通滤波器与最小相位系统

1.7 全通滤波器与最小相位系统

最小相位图

概述 在实际的3D成像中&#xff0c;由于投影仪和摄像机的位置必然不同&#xff0c;这会使得打在被测物上的条纹宽度与投影仪投出来的条纹宽度不同&#xff0c;从而导致测量深度与实际深度不符。&#xff08;例如当我们要测量x轴所在与纸面垂直平面的深度时&#xff0c;测量出的…

数字滤波器(二)--最小相位延时系统和全通系统

最小相位延时系统和全通系统 引1. 系统相位2. 最小相位延时系统2.1 最小相位延时系统2.2 最小相位延时系统的性质 3. 全通系统3.1 定义与系统函数3.2 全通系统的零极点关系3.3 全通系统的应用 引 数字滤波器(一)–IIR与FIR的基本结构与MATLAB实现 1. 系统相位 当输入信号经过…

非最小相位

非最小相位系统&#xff08;nonminimum phase systems&#xff09;&#xff0c;若控制系统有位于s右半开平面上的极点或零点&#xff0c;则称它为非最小相位系统。 与此同时&#xff0c;相对立的是&#xff1a;最小相位系统 最小相位系统的第一个特征&#xff1a;对同样的输入…

非最小相位系统;频率特性的对称性

非最小相位系统 非最小相位系统是相对最小相位系统来说的。它把最小相位系统的频率特性的实部或虚部取反了。 虚部取反 对实部取反 整体取反 各种非最小相位系统 比例环节 积分环节 微分环节 惯性环节 比例微分环节 二阶欠阻尼环节 实部取反、虚部取反对奈奎斯特曲线的影响 幅…

零点和极点到底影响了什么?什么是最小相位系统?

零点和极点到底影响了什么&#xff1f;什么是最小相位系统&#xff1f; 零点、极点、稳定、因果、最小相位是信号系统中经常听到名词&#xff0c;也许有的同学对这些概念有所了解&#xff0c;但对它们之间的关系却不甚了解&#xff0c;这篇文章我们就来看一下&#xff0c;它们之…

《离散时间信号处理学习笔记》—线性时不变系统的变换分析(二)

注&#xff1a;本博客是基于奥本海姆《离散时间信号处理》第三版编写&#xff0c;主要是为了自己学习的复习与加深。 一、最小相位系统 一&#xff09;、最小相位和全通系统 1、任何有理系统函数都能表示成 式5.1 式中是最小相位系统&#xff0c;是全通系统。 1&#xff0…

CSkin相当优秀的C#/.Net Winform界面库

CSkin相当优秀的C#/.Net Winform界面库 cskin官网&#xff1a;http://www.cskin.net/ 分享两个不错的Demo 【CSkin_Demo】360安全卫士DEMO(去闪烁)-12.8更新 http://bbs.cskin.net/forum.php?modviewthread&tid93&fromuid2 【CSkin界面库】2015-1-28更新&#xf…

VS引用第三方插件CSkin

前言 机房重构断断续续经过一个星期终于实现了&#xff0c;登陆后更具不同的Level我们会进入不同的页面&#xff0c;我想首先页面一定要看起来让人舒适&#xff0c;在我的第一重构页面主题上我下了下功夫&#xff0c;发现CSkin非常的不错&#xff0c;引用这个第三方的组件可以…

CTF-Crypto

目录 Quoted-printable Rabbit 栅栏加密 RSA 凯撒加密 猪圈密码 uuencode Morse(莫尔斯电码) 异或 MD5爆破 RSA 近期又开始接触到了CTF中的Crypto方向&#xff0c;然后整理一下自己遇到的各种的加密的方式。 Quoted-printable quoted-printable编码方法适合所传输数…

CTF工具-seccomp-tools

seccomp-tools可以分析程序的seccomp状态&#xff0c;哪些被系统被禁用了安装 安装流程&#xff1a; sudo apt install gcc ruby-dev gem install seccomp-tools 之后便可直接分析程序的seccomp状态