基于android7.1+msm8937读取ADC采样值

读取给设备供电的电压,比如16V,通过监控ADC(Analog-to-Digital Conversion)值来知道电源波动情况和实际给设备供电的电压。

1.    硬件电路设计

输入的VCC_16V_IN经过R206和R207分压连接到MPP1_16V_ADC也就是PMI8937_MPP1

ADCs are directly controlled by the PMIfuel gauge

2.    硬件原理

2.1  MPP1路由到SPMI

Analog input – inputs are routed to the analog multiplexer switch network; if selected, andthat analog voltage is routed to the HK/XO ADC for digitization(数字化).

2.2  PMI8937模拟输入通道

PMI8937模拟多路复用器和扫描功能,见下图

ADC电压值=(16*100*1024)/((1024+100)*1024)=1.4234875V。

此图来之于《80-P2561-1_PMI8937 POWER MANAGEMENTIC DEVICE SPECIFICATION》文档。有两个MPP_1,选择哪个通道呢?因为计算出来到MPP1的最大电压是1.4V<1.5V,所以选择16通道(十进制),相当于十六进制的0x10,确定为16通道后,scaling也确定为1了。

2.3  ADC性能参数

16-bit dedicatedcurrent ADC (15 bits plus sign bit) ,16位的采样分辨率。

2.4  MPP1配置为ADC的参考示例

驱动电压值的驱动可以参考kernel\msm-3.18\Documentation\devicetree\bindings\hwmon\qpnp-adc-voltage.txt

-------------------------------非常重要----------------------------------

Client device example:

/* Add to the clients node that needs theVADC channel A/D */

client_node {

qcom,client-vadc= <&pm8941_vadc>;

};

/* Clients have an option of measuring ananalog signal through an MPP.

MPP block is not part of the VADC block but is an individual PMIC

block that has an option to support clients to configure an MPP as

ananalog input which can be routed through one of the VADC pre-mux

inputs. Here is an example of how to configure an MPP as an analog

input */

/* Configure MPP4 as an Analog input toAMUX8 and read from channel 0x23 */

/* MPP DT configuration in the platform DTfile*/

mpp@a300{ /* MPP 4 */

qcom,mode= <4>; /* AIN input */

qcom,invert= <1>; /* Enable MPP */

qcom,ain-route= <3>; /* AMUX 8 */

qcom,master-en= <1>;

qcom,src-sel= <0>; /* Function constant */

};

/* VADC Channel configuration */

chan@23{

label= "mpp4_div3";

reg= <0x23>;

qcom,decimation= <0>;

qcom,pre-div-channel-scaling= <1>;

qcom,calibration-type= "absolute";

qcom,scale-function= <0>;

qcom,hw-settle-time= <0>;

qcom,fast-avg-setup= <0>;

};

3.    软件实现

3.1  相关的驱动、设备树和内核文档

(1)  ADC驱动

Kernel/msm-3.18/drivers/hwmon/qpnp-adc-common.c

Kernel/msm-3.18/drivers/hwmon/qpnp-adc-voltage.c

qpnp-adc-voltage.c

Qualcomm's QPNP PMIC Voltage ADC Arbiter

QPNP PMIC Voltage ADC (VADC) providesinterface to clients to read

Voltage. A 15 bit ADC is used for Voltagemeasurements. There are multiple

peripherals to the VADC and the scope ofthe driver is to provide interface

for the USR peripheral of the VADC.

Kernel/msm-3.18/hwmon/qpnp-adc-current.c

(2)  ADC DTS

Kernel/msm-3.18/arch/arm/boot/dts/qcom/msm-pmi8937.dtsi

Kernel/msm-3.18/arch/arm/boot/dts/qcom/msm-pm8937.dtsi

(3)  ADC DTSI文档

Kernel/msm-3.18/Documentation/devicetree/bindings/hwmon/qpnp-adc-voltage.txt

Kernel/msm-3.18/Documentation/devicetree/bindings/hwmon/qpnp-adc-current.txt

4.    软件实现

4.1  设备树

Y:\trunk\kernel\msm-3.18\arch\arm\boot\dts\qcom\msm-pmi8937.dtsi

(1)  配置MPP1为模拟输入

pmi8937_mpps: mpps {

spmi-dev-container;

compatible= "qcom,qpnp-pin";

gpio-controller;

#gpio-cells= <2>;

#address-cells= <1>;

#size-cells= <1>;

label= "pmi8937-mpp";

mpp@a000{

reg= <0xa000 0x100>;

qcom,pin-num= <1>;

qcom,mode= <4>; // AIN input ,QPNP_PIN_MODE_AIN

qcom,invert= <1>; // Enable MPP,QPNP_PIN_INVERT_ENABLE

qcom,ain-route= <0>; //AMUX 5,QPNP_PIN_AIN_AMUX_CH5,AMUX 8----3 ????

qcom,master-en= <1>;//Enable features within the pin block based on configurations.(GPIO/MPP)

qcom,src-sel= <0>; //Function constant

//status= "disabled";

};

重点说明下qcom,ain-route = <0>;

- qcom,ain-route: Set the destination for analog input.

QPNP_PIN_AIN_AMUX_CH5   = 0, (MPP)

QPNP_PIN_AIN_AMUX_CH6   = 1, (MPP)

QPNP_PIN_AIN_AMUX_CH7   = 2, (MPP)

QPNP_PIN_AIN_AMUX_CH8   = 3, (MPP)

QPNP_PIN_AIN_AMUX_ABUS1= 4, (MPP)

QPNP_PIN_AIN_AMUX_ABUS2= 5, (MPP)

QPNP_PIN_AIN_AMUX_ABUS3= 6, (MPP)

QPNP_PIN_AIN_AMUX_ABUS4= 7  (MPP)

从kernel\msm-3.18\arch\arm\boot\dts\qcom\msm-pm8937.dtsi下面的信息

mpp@a300 {

/*MPP4 - CASE_THERM config */

reg= <0xa300 0x100>;

qcom,pin-num= <4>;

qcom,mode= <4>; /* AIN input */

qcom,invert= <1>; /* Enable MPP */

qcom,ain-route= <3>; /* AMUX 8 */

qcom,master-en= <1>;

qcom,src-sel= <0>; /* Function constant */

status= "disabled";

};

知道MPP4是采用AMUX8,推断为MPP1采用AMUX5,所以配置为qcom,ain-route= <0>;如果配置为AMUX8,经测试获取到的值不正常,而且波动很大。

(2)  配置通道16

根据上面的计算,输入到MPP1的电压<1.5V,所以选择16通道,下面增加通道相关的

//kandi add for 0x10 channel

chan@10{

label= "power16v_detect";

reg= <0x10>;

qcom,decimation= <0>;// 0 : 512, Sampling rate to use for the individual channelmeasurement.

qcom,pre-div-channel-scaling= <0>;//0 : {1, 1},Pre-div used for the channel before the signal isbeing measured

qcom,calibration-type= "ratiometric";//Reference voltage to use for channel calibration.

qcom,scale-function= <0>;//0 : Default scaling to convert raw adc code to voltage.

qcom,hw-settle-time= <0>;//Settling period for the channel before ADC read.

qcom,fast-avg-setup= <0>;//0 : 1,Average number of samples to be used for measurement

};

(3)

pmi8937_vadc: vadc@3100 {

compatible= "qcom,qpnp-vadc";

reg= <0x3100 0x100>;

4.2  Lk阶段读取电压值

bootable\bootloader\lk\dev\pmic\pm8x41\include\pm_vadc_hc.h

/* API: Set the PM8x41 MPP pin as ADC */

void pm8x41_enable_mpp_as_adc(uint16_tmpp_num);

没有验证过。

Qcom LK阶段如何使用ADC介绍

https://blog.csdn.net/loongembedded/article/details/80577667

4.3  ADB读取电压值

adb root

adb shell

cat/sys/bus/spmi/devices/qpnp-vadc-15/power_in_detect

4.4  内核上读取adb数值

(1)   获取ADC设备

pdata->id_vadc_dev =qpnp_get_vadc(&(pdata ->dev), "ltp_tem");

(2)   读取电压值

rc = qpnp_vadc_read(data->id_vadc_dev,P_MUX4_1_1, &results); //0x13=19=P_MUX4_1_1

相关的API接口和结构体

示例代码

参考:

VADC获取温度值

https://blog.csdn.net/u012719256/article/details/79296034

基于android7.1+msm8937读取ADC采样值相关推荐

  1. 基于FPGA的IIC读取LM74A温度值

    基于FPGA的IIC读取LM74A温度值 IIC总线概述 采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易.常用的串行扩展总线有: I2C (I ...

  2. Arduino RP2040 读取ADC采样数据

    Arduino RP2040 读取ADC采样数据

  3. STM32F103单片机使用DMA功能读取ADC采样数据

      使用DMA功能操作外设时,可以极大的简化代码,提高程序的执行效率.特别是在需要频繁操作的外设上.比如现在要采集单片机16个ADC通道的电压值,就可以使用DMA功能,直接将ADC通道转换好的值,传输 ...

  4. STM32H743,基于LL库实现adc采样(ADC+DMA+TIM)

    买了一块正点原子的阿波罗H743开发板,最近在调试ADC采样,由于CubeMx生成的是HAL库格式的代码,HAL库使用时太占用资源了不喜欢,个人比较喜欢LL库,这个库和STD库有点像.因此用LL库来实 ...

  5. 基于HI3516/HI3518/HI3559内部ADC驱动实现

    提示:除了以上三种SOC,海思HI35XX其他SOC实现流程也应该类似,本篇文章以HI3516为主体进行实现. 文章目录 前言 一.相关资料 二.实现原理及步骤 1.原理 2.步骤 三.代码实现 前言 ...

  6. STM32 ADC采样使用内部参考电压

    整理也能进步!写得清楚才能理解更深. [问题背景] 在使用ADC时,通常的用法是Vref+接电源VDD3.3V,然后计算时直接用3.3V做参考电压,但是这种方法忽略了一些情况如供电电压有可能随外部一些 ...

  7. 单片机ADC采样算法----一阶低通滤波

    关于低通滤波,先看一下百度百科上的定义. 算法实现的公式如下:  y(n) = q*x(n) + (1-q)*y(n-1)     其中Y(n)为输出,x(n)为输入,y(n-1)为上一次输出值,其中 ...

  8. 单片机ADC采样算法----平均值采样法

    单片机在模拟电路中使用的时候,经常需要用到AD功能,而通过单片机ADC采集回来的数据往往不能直接使用,在不同场合下需要对采集到的数据要通过不同的算法对数据进行处理,先来看看最简单的平均值采样法. 平均 ...

  9. 【GD32L233C-START】8、使用内部参考电压校准adc,adc采样更准确

    1.为什么要校准 因为MCU的VDD的电压会有微小的波动,并不是3.3v恒定的. 2.ADC与ADC通道 可以看出GD32L233C-START开发板,也就是芯片GD32L233CCT6有一个ADC外 ...

最新文章

  1. 解决python2.x文件读写编码问题
  2. 接口到底是什么(一语道破)
  3. DCMTK:Irradiation事件识别测试FG类
  4. expect一键登录mysql
  5. 程序员基本功04JAVA的内存回收
  6. 更改python默认路径_Linux下多版本python共存时,默认执行路径修改方法
  7. linux全网备份的原理,Linux面试题分享:Rsync(全网备份)和NFS(文件系统)
  8. js中的call和apply方法的区别
  9. 题目1026:又一版 A+B
  10. 事实表和维度表是怎么造数据_数据库与数据仓库的那点事
  11. 机器学习课程 Neural Netword for Machine Learning笔记
  12. 【微信小程序】(一)开发工具下载与界面介绍
  13. js 彻底理解回调函数
  14. android kl文件编辑,Android手机固件的简单修改教程
  15. 用坚果云同步mysql_坚果云安装完成以后, 如何同步文件?
  16. 树莓派有线网络设置_树莓派的基本网络配置
  17. 区块链系统有服务器吗,区块链需要服务器吗
  18. 防火墙Deny记录实时检测
  19. percona-tool文档说明(总)
  20. 携程梁建章:我的鼠标+水泥为什么成功

热门文章

  1. php设置背景为透明,css如何设置背景颜色透明?css设置背景颜色透明度的两种方法介绍...
  2. 为什么传值时加号变成了空格_为什么中英文字间距不一样?我想谈谈我的理解...
  3. 012_Redis的aof持久化方式
  4. 模板格式丢失_公司法人私章证明丢失应该怎么办,需要补办吗?
  5. 安徽工业大学计算机考研调剂,安徽工业大学2019年考研预调剂公告
  6. Android Volley完全解析4:带你从源码的角度理解Volley
  7. JavaWeb:JDBC之数据库连接池
  8. c++ string 堆还是栈_5个刁钻的String面试题解析
  9. make 命令_Vim 命令大全
  10. wpf 放大缩小界面_调整电脑屏幕文本文字显示大小,系统设置放大缩小DPI图文教程...