Qcom LK阶段如何使用ADC介绍
来源:互联网 发布:android 仿淘宝首页 编辑:程序博客网 时间:2024/06/03 09:26
摘要
本文叙述了在高通平台LK阶段读取mpp2引脚电平的实现过程,附上实现代码。主要实现过程包括配置引脚功能,读取引脚电压。需要特别注意配置mpp2通道和AIN route的选择。
需要修改的文件:
bootable\bootloader\lk\app\aboot\aboot.c
Pm8x41_adc.c (dev\pmic\pm8x41)
Pm8x41_adc.h (dev\pmic\pm8x41\include)
PM8916 MPP2引脚说明
可以看出MPP2引脚具有ADC输入的功能。
修改过程及例子
在使用mpp2引脚之前需要配置这个引脚为ADC功能,在LK阶段提供了一个操作函数,在Pm8x41_adc.c (dev\pmic\pm8x41)中实现。
/*
* API: pm8x41_enable_mpp_as_adc
* Configurate the MPP pin as the ADC feature.
*/
void pm8x41_enable_mpp_as_adc(uint16_t mpp_num)
注意:mpp2的mpp_num值为0x01!
使用pm8x41_adc_channel_read(mpp2_chan);读取该引脚ADC采样得到的电压值
另外mpp2_chan的值是33(0x21)!这个通道号是根据这个寄存器VADC1_LC_USR_ADC_CH_SEL_CTL来的:
在配置引脚的地方有一个
选择ADC输入路线选择的地方,根据寄存器信息可知道这里可以选择AMUX5-8!
下面是需要修改的代码:
\bootable\bootloader\lk\app\aboot\aboot.c
void adc_test_selc_lcm(){ uint32_t vadc_chan3; uint16_t mpp2_chan = 33; /* * TEST: Read the voltage on batt_id & vbat_sns channels */ pm8x41_enable_mpp_as_adc_for_mpp2(1); vadc_chan3 = pm8x41_adc_channel_read(mpp2_chan); dprintf(INFO, "The channel [%d] voltage is :%d\n",mpp2_chan, vadc_chan3); } void aboot_init(const struct app_descriptor *app){……adc_test_selc_lcm();……}
Pm8x41_adc.c (dev\pmic\pm8x41)
/* * This is the predefined adc configuration values for the supported * channels */static struct adc_conf adc_data[] = { CHAN_INIT(VADC_USR1_BASE, VADC_BAT_CHAN_ID, VADC_MODE_NORMAL, VADC_DECIM_RATIO_VAL, HW_SET_DELAY_100US, FAST_AVG_SAMP_1, CALIB_RATIO), CHAN_INIT(VADC_USR1_BASE, VADC_BAT_VOL_CHAN_ID, VADC_MODE_NORMAL, VADC_DECIM_RATIO_VAL, HW_SET_DELAY_100US, FAST_AVG_SAMP_1, CALIB_ABS), CHAN_INIT(VADC_USR1_BASE, MPP_8_CHAN_ID, VADC_MODE_NORMAL, VADC_DECIM_RATIO_VAL, HW_SET_DELAY_100US, FAST_AVG_SAMP_1, CALIB_ABS), CHAN_INIT(VADC_USR1_BASE, MPP_2_CHAN_ID, VADC_MODE_NORMAL, VADC_DECIM_RATIO_VAL, HW_SET_DELAY_100US, FAST_AVG_SAMP_1, CALIB_ABS), }; void pm8x41_enable_mpp_as_adc_for_mpp2(uint16_t mpp_num){ uint32_t val; if(mpp_num >MPP_MAX_NUM) {dprintf(CRITICAL,"Error: The MPP pin number is unavailable\n"); return;} /* set the MPP mode as AIN */ val =(MPP_MODE_AIN <<Q_REG_MODE_SEL_SHIFT)\ |(0x1<<Q_REG_OUT_INVERT_SHIFT)\ |(0x0<<Q_REG_SRC_SEL_SHIFT); REG_WRITE((MPP_REG_BASE +mpp_num *MPP_REG_RANGE +Q_REG_MODE_CTL),val); /* Enable the MPP */ val =(MPP_MASTER_ENABLE <<Q_REG_MASTER_EN_SHIFT); REG_WRITE((MPP_REG_BASE +mpp_num *MPP_REG_RANGE +Q_REG_EN_CTL),val); /* AIN route to AMUX8 */ val =(0x1<<Q_REG_AIN_ROUTE_SHIFT);//AMUX1 REG_WRITE((MPP_REG_BASE +mpp_num *MPP_REG_RANGE +Q_REG_AIN_CTL),val);}
Pm8x41_adc.h (dev\pmic\pm8x41\include)
#define MPP_2_CHAN_ID 33
1 0
- Qcom LK阶段如何使用ADC介绍
- Qcom LK阶段如何使用ADC介绍
- Qcom LK阶段如何使用ADC介绍
- Qcom LK阶段如何使用I2C介绍
- mms8916 lk阶段ADC
- [Vibrator]LK阶段如何实现开机震动
- 高通msm8916 LK阶段配置使用i2c5
- [MTK软件原创] [I2C]如何在lk和preloader阶段进行i2c通讯
- 高通LK阶段使用模拟i2c--附i2c子协议smbus-protocol
- android lk机制介绍
- Qualcomm LK机制介绍
- ADC使用
- ADC的介绍
- 展讯平台如何使用adc来兼容多LCD
- MTK lk源码解析1( lk 阶段汇编代码crt0.S解析)
- MTK lk源码解析2( lk 阶段main.c中的kmain.c函数解析)
- MTK lk源码解析3( lk 阶段thread.c解析)
- MTK lk源码解析4( lk 阶段main.c解析)
- 我的vim配置
- win7 下安装 redhat6.4双系统
- Android线程前奏
- 字典树的增、删、查、找前缀个数
- iconv
- Qcom LK阶段如何使用ADC介绍
- (三) 总线_设备_驱动注册
- c++ 模板类 声明和定义都放在.h文件的原因
- 首次参加工作,第一期迭代任务
- Linux安装1T磁盘划分
- Java中禁止的包名(Prohibited package name)
- 中南大学急诊医学专业2008-2016年考研报录比【汇总】
- Android事件传递的三个方法
- Android 之requestFocus