Android Qcom USB Driver学习(八)

news2024/11/18 7:51:47

该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零)

因为要看usb charging的问题,所以需要补充一下battery的相关知识,算是入门吧

BAT SCH

在这里插入图片描述
(1)VBATT_VSNS_P (2)BAT_THERM (3)I2C_SDA (4)I2C_SCL (5)VBATT_VSNS_M
在这里插入图片描述
(1)BATT_ID 没接在电池上,外部下拉的100k电阻,如果电池电压不同还是能做区分的,当然battery-id不一定非得使用adc去读取,既然battery是基于i2c的设备,就一定能做到区分,通过power_supply_desc的get_property的方式同样可以客制化获取电池区分信息包含id。

BAT_THERM

玩转移远SC60 Android开发板------(5)充电和电池管理
VBAT_THERM 引脚若不连接,则会导致不开机、电池不能充电、电池电量显示错误等故障。
如果客户使用的电池没有热敏电阻,或者客户使用电源适配器对模块进行供电,则只需连接VBAT 和GND。
此时为防止系统误判电池不存在而导致无法开机,客户应该将VBAT_THERM 引脚通过一个47KΩ的电阻连接到GND。
可充电电池在不断的循环充电和放电过程中可能会导致电池温度的过高,导致电池原始性能下降,所以需要监控电池温度保持电池性能。

QPNP: Qualcomm Plug and Play(The input can be supplied to the device via either a DC or USB path. Output paths are
the VPH_PWR rail via the buck and a reverse boost feature on VCHG.)

Kernel

power/supply/qcom/qpnp-qg.c  -> iio/inkern.c -> (batt-therm - chip->batt_therm_chan)
&pmi632_qg{
	io-channels = <&pmi632_vadc ADC_BAT_THERM_PU1>, //SCALE_HW_CALIB_BATT_THERM_30K
					<&pmi632_vadc ADC_BAT_ID_PU2>;
	io-channel-names = "batt-therm", "batt-id"; 
}	

&pmi632_charger{
	qcom,connector-internal-pull-kohm = <30>;  //write register BATIF_ADC_INTERNAL_PULL_UP_REG 电池ntc电阻
}
power/supply/qcom/qg-util.c  -> iio/inkern.c -> qcom-spmi-adc5.c(pmi632) -> qpnp-vadc-common.c 
qg_get_battery_temp(batt-therm_chan)  -> read_raw -> adc_read_raw(based on kernel iio/iio_info) -> lux_table_30(vadc_map_pt)
依据电池spec去修改30k对应的lux_table_30的vadc_map_pt表

XBL

DalVAdc.c -> VAdc_DeviceInit -> VADC_BSP 获取vadcbsptype = VAdcBspPMI455(vadc_props.xml)

VAdcSettings.c -> gVAdcChannelsPMI455 (vadc channel)
/* BATT_THERM_PU_30K (BAT_THERM pin) */
{
    .pszName                   = ADC_INPUT_BATT_THERM_PU_30K,
    .uAdcHardwareChannel       = 0x2a,
    .eSettlingDelay            = VADC_SETTLING_DELAY_100_US,
    .eAverageMode              = VADC_AVERAGE_1_SAMPLE,
    .eDecimationRatio          = VADC_DECIMATION_RATIO_1024,
    .eCalMethod                = VADC_CAL_METHOD_RATIOMETRIC,
    .scalingFactor             = {1, 1},  /* {num, den} */
    .eScalingMethod            = VADC_SCALE_THERMISTOR,
    .uPullUp                   = 30000,
    .pIntTable                 = &gVAdcSysThermTable, //vadc map表
},

pm_get_adc_code_of_battery_temp + ADC_INPUT_BATT_THERM_PU_30K 获取电池温度

BAT_ID

Kernel

&pmi632_qg {
	qcom,battery-data = <&mtp_batterydata>;
}

power/supply/qcom/qpnp-qg.c -> iio/inkern.c -> (batt-id - chip->batt_id_chan)
                            -> get_batt_id_ohm(batt_id_chan) -> qg_load_battery_profile(qcom,battery-data)
					                                                    -> of_batterydata_get_best_profile

通过iio读取adc的值获得battery-id,可用于区分battery-data(可以是大容量小容量区分),battery-id可误差率(qcom,batt-id-range-pct)
电池ID引脚内部的阻值qcom,batt-id-kohm = <100>,另外可通过qcom,battery-type来寻找最佳的profile

XBL

pm_sbl_get_batt_id + PM_BATT_ID_PU_30K + adc_read 同样通过adc对应的阻值通道读取值 
battery id在XBL阶段中不一定能用到,所以有可能就是fake batteryid

JEITA

JEITA(Japan Electronics and Information Technology Industries Association)旨在低温和高温下提高锂离子电池充电的安全性
锂电池充电领域大多遵循了JEITA标准,JEITA成为了充电规范的一个代名词。
在这里插入图片描述

XBL Loader(SBL1)

Dead battery recovery takes place in two stages – XBL and UEFI
Dead Battery -> Weak Battery ->  Good Battery
   SBL1           XBL Core         HLOS

在DRR init之前必需PMIC init,DDR初始化之后通过(PIL peripheral image loading)加载各subsystem的镜像例如modem_a(ADSP CDSP…)

sbl1_hw_pre_ddr_init: (1)pm_device_init (2)pm_driver_init (3) pm_sbl_chg_init 

(1)
pm_device_init没有研究过,也是一些初始化
(2)
pm_sbl_boot_oem.c -> pm_driver_post_init  (通过write register的方法来配置jeita)
	err_flag |= pm_comm_write_byte(0x2 , 0x1094, 0x0F, 0x0); //warm 45
	err_flag |= pm_comm_write_byte(0x2 , 0x1095, 0xDC, 0x0); //warm 45
依据各项目ic pmic的datasheet找到对应寄存器进行修改
(3)
pm_config_target.c -> strcut sbl_schg_specific_data  (charger parameters chg_param_ptr)
包括usb输出电流(USBIN Input Current Limit),开机电压(bootup_battery_theshold_mv),jeita限制(Enable/Disable JEITA Hard Temp Limit Check in SBL)等等
pm_sbl_schg_specific_data_type
  sbl_schg_specific_data[1] =
  {
     {
        //Configuration Value,                             Enable config
        {PM_SCHG_BATIF_LOW_BATTERY_THRESH_3P2,             PM_DISABLE_CONFIG },  //Vlowbatt Threshold
        {PM_SCHG_BATIF_LOW_BATTERY_THRESH_2P8,             PM_ENABLE_CONFIG  },  //APSD rerun Vlowbatt Threshold
        {70,                                               PM_ENABLE_CONFIG  },  //Fg skin hot threshold: valid range is -30 to 97 degree C
        {80,                                               PM_ENABLE_CONFIG  },  //Fg skin too hot threshold: valid range is -30 to 97 degree C
        {80,                                               PM_ENABLE_CONFIG  },  //Fg charge hot threshold: valid range is -30 to 97 degree C
        {90,                                               PM_ENABLE_CONFIG  },  //Fg charge too hot threshold: valid range is -30 to 97 degree C
        {TRUE,                                             PM_DISABLE_CONFIG },  //Use BATID and/or THERM pin for battery missing detection
        {{TRUE, PM_SCHG_MISC_SNARL_WDOG_TMOUT_62P5MS, PM_SCHG_MISC_BARK_WDOG_TMOUT_128S, PM_SCHG_MISC_BITE_WDOG_TMOUT_8S}, PM_ENABLE_CONFIG },  //Enable/Disable and Timeout WDog Config
        {2000,                                             PM_ENABLE_CONFIG },  //FAST Charging Current
        {300,                                              PM_ENABLE_CONFIG },  //PRE Charge Current
        {4400,                                             PM_ENABLE_CONFIG },  //Float Voltage
        {2500,                                             PM_ENABLE_CONFIG  },  //USBIN Input Current Limit
        {1000,                                             PM_DISABLE_CONFIG },  //DCIN Input Current Limit
        {6750, 8250,                                       PM_ENABLE_CONFIG  },  //Fake battery detection range: Battery will be detected as fake battery if BATT ID in this range. unit: Ohms
        {2000, 14000},                                                           //Debug Board detect: BATT_ID PD Resistor ADC Min/Max Read Value range; unit: Ohms
        PM_BATT_ID_PU_30K,                                                       //battery ID pull up resistor value
        3300,                                                                    //bootup_battery_theshold_mv
        3300,                                                                    //wipowr bootup battery thesholdmv
        2800,                                                                    //apsd_reset_threshold_mv:  APSD reset only applicable if initial Vbatt level is less than this threshold
        2800,                                                                    //apsd_reset_theshold_no_uvlo_mv: Used if last reset reason is NOT UVLO
        3200,                                                                    //apsd_reset_theshold_uvlo_mv: Used if last reset reason is UVLO
        TRUE,                                                                    //Enable/Disable JEITA Hard Temp Limit Check in SBL
        TRUE,                                                                    //dbc_usb_500_mode
        TRUE,                                                                   //Verbose SBL CHG UART logging
  	  1,																	   //Pmic index of charger
     }
  };


pm_sbl_boot.c  -> pm_app_chgr.c -> pm_sbl_config_chg_parameters ↓↓↓
pm_sbl_boot.c  -> pm_app_chgr.c -> pm_sbl_chg_check_weak_battery_status
应用上述的chg_param_ptr, 在weak battery的状态下不会开机(即SBL Charging in progress....) + 闪红灯(Toggle Red LED)

XBL Core

QcomChargerConfig_VbattTh.cfg	
BootToHLOSThresholdInMv = 3300 
JeitaHardColdLimit = 0
JeitaSoftColdLimit = 10
JeitaSoftHotLimit  = 45
JeitaHardHotLimit  = 60


QcomChargerPlatform.c -> ChargerPlatform_ReadCfgParams -> ChargerPlatform_Init
if (CurrentBatteryStatus.BatteryVoltage >= gThresholdVbatt)
     *pActionType = EFI_QCOM_CHARGER_ACTION_GOOD_TO_BOOT;

Kernel

qcom,fastchg-current-ma = <2000>;          //最大快充电流
/* COOL = 10 degc, WARM = 40 degC*/        //jeita配置
qcom,jeita-soft-thresholds = <0x2ed8 0x1045>; <SOFT_COLD_ADC_CODE, SOFT_HOT_ADC_CODE>
/* COLD = 0 degC, HOT = 45 degC*/
qcom,jeita-hard-thresholds = <0x3e3d 0x0D85>; <HARD_COLD_ADC_CODE, HARD_HOT_ADC_CODE>
qcom,jeita-fcc-ranges = <                  //各jeita范围内电流
                        0 100 800000
                        101 400 2000000
                        401 450 2000000>;
qcom,jeita-fv-ranges = <                   //各jeita范围内电压
                        0 100 4180000
                        101 400 4350000
                        401 450 4350000>;

Charging phases

在这里插入图片描述

(1) Trickle-charge  < 2.1V 45mA
(2) Preconditioning(precharge) > 2.1V + PRE Charge Current
(3) Constant current(fast charge) < Float Voltage + Fast Charging Current
(4) Constatnt voltage(taper charge) = Float Voltage
Chargint phase的配置还是发生在SBL1/XBL阶段,在高通平台上除了(1)Trigckle_charge都是可配置的,配置可见上述sbl_schg_specific_data

pm_sbl_boot.c  -> pm_app_chgr.c -> pm_sbl_config_chg_parameters
                                       -> pm_schg_chgr_set_charge_current(PRE Charge Current(2))
									   -> pm_schg_chgr_set_charge_current(FAST Charging Current(3))
									   -> pm_schg_chgr_set_float_volt(Float Voltage(4))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【问题分析】解决java中epoll依赖缺失问题

【问题分析】解决java中epoll依赖缺失问题一、前言二、问题描述三、问题分析四、解决方法五、总结一、前言 在学习使用lettuce框架实现UNIX域套接字unix domain socket连接redis时&#xff0c;遇到了一个问题&#xff0c;提示java.lang.IllegalStateException: A unix domain …

Java Stream后续来了,汇总一些项目开发中高频使用的 Stream操作

不过讲解这些操作时用的都是非常简单的例子&#xff0c;流操作的数据也都是简单类型的&#xff0c;主要的目的是让大家能更快速地理解 Stream 的各种操作应用在数据上后&#xff0c;都有什么效果。 在现实场景中实际做项目的时候&#xff0c;我们使用Stream操作的数据大多数情…

OpenCV颜色识别

颜色分辨 单个颜色识别 代码 import cv2 import numpy as npdef color(lower, upper, name):Img cv2.imread(image/origin/all.png) # 读入一幅图像kernel_3 np.ones((3, 3), np.uint8) # 3x3的卷积核if Img is not None: # 判断图片是否读入HSV cv2.cvtColor(Img, cv2…

maven中profiles使用详解,多环境开发配置文件(开发,测试,生产)+ pom中resources部分标签介绍

一.maven中profiles使用详解&#xff08;仅供参考&#xff09; 使用的场景 常常遇到一些项目中多环境切换的问题。比如在开发过程中用到开发环境&#xff0c;在测试中使用测试环境&#xff0c;在生产中用生产环境的情况。springboot中提供了 spring.profile.active的方式来实…

以mariadb为例介绍如何使用systemctl命令集设置服务开机自启动

以mariadb为例介绍如何使用systemctl命令集设置服务开机自启动一、systemd简介二、systemctl命令集常用命令三、以mariadb自启动为例四、更多说明一、systemd简介 systemd即为system daemon,是linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许…

[思维模式-13]:《复盘》-1- “知”篇 - 认识复盘

目录 前言 一、什么是复盘 二、复盘的三个关键词 三、复盘&#xff0c;而非总结 四、复盘的优势与局限 五、复盘与行动学习、培训、绩效改进的区别与联系 六、关于复盘的几个常见误解 误解1&#xff1a;可否对他人之事进行复盘 误解2&#xff1a;“项目后评估”是复盘吗…

细粒度图像分类模型(含实战代码)

来源&#xff1a;投稿 作者&#xff1a;lsc 编辑&#xff1a;学姐 理论部分 01细粒度图片分类问题 1.1细粒度图片分类特点 可判别区域往往只是在图像中很小的一块区域内。 1.2细粒度图像分类数据集 1.3细粒度图像分类竞赛 1.4细粒度图像分类模型分类: (1)强监督模型: 需要…

Java之AQS

AQS是什么 是用来实现锁或者其它同步器组件的公共基础部分的抽象实现&#xff0c;整体就是一个抽象的FIFO队列来完成资源获取线程的安排工作&#xff0c;并通过一个int类变量表示持有锁的状态。 使用到AQS的一些类 ReentranLock: CountDownLatch ReentrantReadWriteLock:…

Go语言开发小技巧易错点100例(四)

往期回顾&#xff1a; Go语言开发小技巧&易错点100例&#xff08;一&#xff09;Go语言开发小技巧&易错点100例&#xff08;二&#xff09;Go语言开发小技巧&易错点100例&#xff08;三&#xff09; 本期看点&#xff08;技巧类用【技】表示&#xff0c;易错点用…

_14LeetCode代码随想录算法训练营第十四天-C++二叉树

_14LeetCode代码随想录算法训练营第十四天-C二叉树 题目列表 104.二叉树的最大深度559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 题目 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长…

RabbitMQ 第一天 基础 3 RabbitMQ 快速入门 3.1 入门程序【生产者】

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础3 RabbitMQ 快速入门3.1 入门程序3.1.1 生产者第一天 基础 3 RabbitMQ 快速入门 3.1 入门程序 3.1.1 生产者 看下文档 点进去 先就来做一个 这个简单模式 P&…

vector

目录vector的介绍和使用vector的介绍vector的使用vector 空间增长问题vector 迭代器失效问题。&#xff08;重点&#xff09;vector与erase迭代器失效的代码vector深度剖析及模拟实现vector模拟实现代码使用memcpy拷贝问题动态二维数组理解vector反向迭代器reverse_iteratorvec…

Android开发进阶——Coil对比Glide分析

Coil概述 Coil是Android上的一个全新的图片加载框架&#xff0c;它的全名叫做coroutine image loader,即协程图片加载库。 与传统的图片加载库Glide&#xff0c;Picasso或Fresco等相比。该具有轻量&#xff08;只有大约1500个方法&#xff09;、快、易于使用、更现代的API等优…

【Vue项目搭建】vue-admin-template修改(2)

接上文、、 --------------------------------------------------------- 优化登录 单独封装路由守卫 &#xff0c;设置白名单&#xff0c;permission.js&#xff0c;鉴权 跳转动画优化&#xff08;使用NProgress插件&#xff09; 显示logo svg 改填充颜色 stroke //画线颜色…

小题 错题总结

要是对象具有序列化&#xff0c;应该实现的接口是 Java.IO.Serializable在 JVM 内存划分中 &#xff0c;方法通常存储在 方法区多态的3种表现形式&#xff1a; 继承重写 重载 向上转型Java 中继承可以间接继承&#xff0c;即便中间跨过一个类&#xff0c;栗子&#xff1a;所有…

一文读懂Linux内核中的Device mapper映射机制

本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍。Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制&#xff0c;在该机制下&#xff0c;用户可以很方便的根据自己的需要制定实现存储资源的管理策略&#xff0c;当前比较流…

基于PHP的动漫电影信息管理系统

有需要请私信或看评论链接哦 可远程调试 基于PHP的动漫电影管理系统一 介绍 此动漫电影信息管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员&#xff0c;用户注册登录后可观看/下载/收藏/留言/评分动漫电影等&#xff0c…

Multi-Channel PCe QDMARDMA Subsystem

可交付资料&#xff1a; 1. 详细的用户手册 2. Design File&#xff1a;Post-synthesis EDIF netlist or RTL Source 3. Timing and layout constraints&#xff0c;Test or Design Example Project 4. 技术支持&#xff1a;邮件&#xff0c;电话&#xff0c;现场&…

隐私计算概述

1. 基本概念 隐私计算是指在保证数据提供方不泄露原始数据的前提下,对数据进行分析计算的一些列信息技术,保障数据在流通和融合过程中的“可用不可见”。 从技术交付出发,隐私计算是众多学科的交叉融合技术,目前主流的隐私计算技术分为三大方向:第一类是多方安全计算为代…

linux内核中断

目录 硬中断特点 中断API 线程中断 系统标准的优先级顺序 中断信息查看 中断上半部与下半部 软中断与并发 硬中断特点 优先级最高中断函数在中断上下文中&#xff0c;不能阻塞不要间接或直接调用shedule() 在申请内存空间时&#xff0c;使用GFP_ATOMIC 标志&#xff08…