Qcom LK阶段如何使用ADC介绍

摘要

本文叙述了在高通平台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
  1. void adc_test_selc_lcm()  
  2. {  
  3.          uint32_t vadc_chan3;  
  4.    
  5.          uint16_t mpp2_chan = 33;  
  6.          /* 
  7.           * TEST: Read the voltage on batt_id & vbat_sns channels 
  8.           */  
  9.           
  10.          pm8x41_enable_mpp_as_adc_for_mpp2(1);  
  11.           
  12.          vadc_chan3 = pm8x41_adc_channel_read(mpp2_chan);  
  13.          dprintf(INFO, "The channel [%d] voltage is :%d\n",mpp2_chan, vadc_chan3);  
  14.    
  15. }  
  16.    
  17. void aboot_init(const struct app_descriptor *app)  
  18. {  
  19. ……  
  20. adc_test_selc_lcm();  
  21. ……  
  22. }  
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)
 
  1. /* 
  2.  * This is the predefined adc configuration values for the supported 
  3.  * channels 
  4.  */  
  5. static struct adc_conf adc_data[] = {  
  6.          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),  
  7.          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),  
  8.          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),  
  9.          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),  
  10.    
  11. };  
  12.    
  13. void pm8x41_enable_mpp_as_adc_for_mpp2(uint16_t mpp_num)  
  14. {  
  15.          uint32_t val;  
  16.          if(mpp_num >MPP_MAX_NUM)  
  17.          {dprintf(CRITICAL,"Error: The MPP pin number is unavailable\n");  
  18.          return;}  
  19.          /* set the MPP mode as AIN */  
  20.          val =(MPP_MODE_AIN <<Q_REG_MODE_SEL_SHIFT)\  
  21.                    |(0x1<<Q_REG_OUT_INVERT_SHIFT)\  
  22.                    |(0x0<<Q_REG_SRC_SEL_SHIFT);  
  23.          REG_WRITE((MPP_REG_BASE +mpp_num *MPP_REG_RANGE +Q_REG_MODE_CTL),val);  
  24.          /* Enable the MPP */  
  25.          val =(MPP_MASTER_ENABLE <<Q_REG_MASTER_EN_SHIFT);  
  26.          REG_WRITE((MPP_REG_BASE +mpp_num *MPP_REG_RANGE +Q_REG_EN_CTL),val);  
  27.          /* AIN route to AMUX8 */  
  28.          val =(0x1<<Q_REG_AIN_ROUTE_SHIFT);//AMUX1  
  29.          REG_WRITE((MPP_REG_BASE +mpp_num *MPP_REG_RANGE +Q_REG_AIN_CTL),val);  
  30. }  
/*
 * 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)
  1. #define MPP_2_CHAN_ID                   33  
#define MPP_2_CHAN_ID                   33



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QCOM V1.6是一种软件工具,用于开发和调试嵌入式系统。下面是使用QCOM V1.6的主要步骤: 1. 安装QCOM V1.6:首先,您需要从官方网站下载QCOM V1.6的安装包,并按照安装向导的指示进行安装。 2. 创建一个新项目:打开QCOM V1.6,并选择创建一个新项目。在新项目对话框中,您可以选择项目的名称和保存位置。 3. 配置项目设置:在项目设置中,您需要指定目标设备的类型和连接方式。您可以选择USB连接或通过网络连接到目标设备。 4. 导入源代码:将您的源代码导入到QCOM V1.6项目中。您可以直接将源代码文件拖放到项目窗口中,或使用文件菜单中的导入选项。 5. 编译项目:在QCOM V1.6的工具栏中,点击编译按钮,以编译您的项目。QCOM V1.6将自动检查并解决任何编译错误。 6. 调试项目:通过QCOM V1.6的调试器功能,您可以在目标设备上调试您的代码。您可以设置断点、单步执行代码、查看变量值等。 7. 分析和优化:QCOM V1.6还提供了性能分析工具,可以帮助您检测和优化代码中的性能瓶颈。 8. 生成最终输出:一旦您完成了开发和调试,您可以通过QCOM V1.6生成最终的可执行文件或固件。 总而言之,QCOM V1.6通过提供项目管理、编译、调试和性能分析功能来帮助您开发和调试嵌入式系统。通过按照以上步骤进行操作,您可以充分利用QCOM V1.6来实现您的嵌入式系统开发目标。 ### 回答2: QCOM v1.6是一款软件,主要用于编程和调试嵌入式系统中的通信模块。以下是关于如何使用QCOM v1.6的简要说明: 首先,确保你的计算机已经安装了QCOM v1.6软件,并且通信模块已正确连接到计算机。 打开QCOM v1.6软件,你会看到一个用户界面,其中包含几个主要选项和功能。 第一步是设置通信模块参数。在软件的设置选项中,你需要选择正确的通信端口和波特率,以便与通信模块进行通信。这些参数通常可以在通信模块的文档或规格中找到。 接下来,你需要选择你想进行的操作。QCOM v1.6提供了多种功能,包括发送AT指令、读取通信模块状态等。选择你需要的功能后,你可以在命令框中输入相应的指令,然后点击发送按钮来执行命令。 QCOM v1.6还提供了一系列的调试工具和功能,用于帮助你诊断和修复通信模块的问题。你可以通过调试选项来查看通信模块的调试日志、分析数据流量等。 完成操作后,你可以保存并导出你的配置和数据。QCOM v1.6支持将数据保存为文本文件或其他格式,以便后续分析和处理。 需要注意的是,QCOM v1.6的具体使用方法可能会因为通信模块的不同而有所差异。在使用之前,建议查阅软件的用户手册或相关文档,以了解更多详细的操作步骤和功能说明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值