高通android充电常用问题,高通平台android9.0充电电量,充电指示灯以及充电图标读取分析...
第一部分 qpnq-qg.c
static int qpnp_qg_probe(struct platform_device *pdev)
{
.......
INIT_WORK(&chip->udata_work, process_udata_work);--------------------------------- INIT_WORK会在你定义的udata_work工作队列里面增加一个工作任务,该任务就是process_udata_work
......
}
备注:调用工作队列,添加struct work_struct udata_work;
static void process_udata_work(struct work_struct *work)
{
......
if (chip->udata.param[QG_SYS_SOC].valid) {
chip->sys_soc = chip->udata.param[QG_SYS_SOC].data;
chip->catch_up_so(chip);------------------------------------PMI会根据电量换算获取当前电池电量-->chip->catch_up_soc
} else {
chip->catch_up_soc = chip->udata.param[QG_SOC].data;
}
qg_scale_soc(chip, false);
......
}
static ssize_t qg_device_write(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
{
......
schedule_work(&chip->udata_work);---------------------------------------------------将工作结构体变量添加入系统的共享工作队列,添加入队列的工作完成后会自动从队列中删除 (schedule_delayed_work(&my_work,tick); //延时tick个滴答后再提交工作)
......
}
第二部分 qg-soc.c
int qg_scale_soc(struct qpnp_qg *chip, bool force_soc)
{
......
update_msoc(chip);----------------------------------------------------------------------更新soc值
if (is_scaling_required(chip)) {-----------------------------------------------------------is_scaling_required主要处理usb不存在但充电电量增长问题
get_next_update_time(chip);
alarm_start_relative(&chip->alarm_timer,
ms_to_ktime(chip->next_wakeup_ms));
} else {
scale_soc_stop(chip);
goto done_psy;
}
......
}
static bool is_scaling_required(struct qpnp_qg *chip)
{
......
if (chip->catch_up_soc > chip->msoc && !is_usb_present(chip) && gpio_get_value(gpio_back_charger_irq) == 1 && gpio_get_value(gpio_side_charger_irq) == 1)
/* USB is not present and SOC has increased */
return false;
......
}
static void update_msoc(struct qpnp_qg *chip)
{
......
if (chip->catch_up_soc > chip->msoc) {
/* SOC increased */
if (usb_present || gpio_get_value(gpio_back_charger_irq) == 0 || gpio_get_value(gpio_side_charger_irq) == 0) /* Increment if USB is present */
chip->msoc += chip->dt.delta_soc;----------------------------------------------电量增长,获取当前增长chip->msoc值
} else if (chip->catch_up_soc < chip->msoc) {
/* SOC dropped */
chip->msoc -= chip->dt.delta_soc;-------------------------------------------------电量减少,获取当前减少chip->msoc值
}
......
}
第三部分 qpnq-qg.c
static const struct power_supply_desc qg_psy_desc = {---------------------------------创建power_supply子系统下的bms节点
.name = "bms",
.type = POWER_SUPPLY_TYPE_BMS,
.properties = qg_psy_props,
.num_properties = ARRAY_SIZE(qg_psy_props),
.get_property = qg_psy_get_property,
.set_property = qg_psy_set_property,
.property_is_writeable = qg_property_is_writeable,
};
static int qg_psy_get_property(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *pval)
{
......
switch (psp) {
case POWER_SUPPLY_PROP_CAPACITY:
rc = qg_get_battery_capacity(chip, &pval->intval);
break;
case POWER_SUPPLY_PROP_REAL_CAPACITY:
rc = qg_get_battery_capacity_real(chip, &pval->intval);
break;
......
}
static int qg_get_battery_capacity(struct qpnp_qg *chip, int *soc)
{
......
if (chip->dt.linearize_soc && chip->maint_soc > 0)
*soc = chip->maint_soc;
else
*soc = chip->msoc;-----------------------------------------------------------------获取soc值,进而bms部分prop_capacity得到当前电量值
......
}
第四部分 qpnp-smb5.c
static const struct power_supply_desc batt_psy_desc = {-------------------创建power_supply子系统下的battery节点
.name = "battery",
.type = POWER_SUPPLY_TYPE_BATTERY,
.properties = smb5_batt_props,
.num_properties = ARRAY_SIZE(smb5_batt_props),
.get_property = smb5_batt_get_prop,
.set_property = smb5_batt_set_prop,
.property_is_writeable = smb5_batt_prop_is_writeable,
};
static int smb5_batt_get_prop(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{
......
case POWER_SUPPLY_PROP_STATUS:------------------------------------------------获取电池状态,充电指示灯根据此状态显示
rc = smblib_get_prop_batt_status(chg, val);
break;
......
case POWER_SUPPLY_PROP_CAPACITY:---------------------------------------------获取电池电量
rc = smblib_get_prop_batt_capacity(chg, val);
break;
......
}
static const struct power_supply_desc usb_psy_desc = {------------------------------创建power_supply子系统下的usb节点
.name = "usb",
.type = POWER_SUPPLY_TYPE_USB_PD,
.properties = smb5_usb_props,
.num_properties = ARRAY_SIZE(smb5_usb_props),
.get_property = smb5_usb_get_prop,
.set_property = smb5_usb_set_prop,
.property_is_writeable = smb5_usb_prop_is_writeable,
};
static int smb5_usb_get_prop(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{
......
case POWER_SUPPLY_PROP_ONLINE:--------------------------------------------------------此属性用来判断充电图标显示
rc = smblib_get_prop_usb_online(chg, val);
if (!val->intval)
break;
if (((chg->typec_mode == POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) ||
(chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB))
&& (chg->real_charger_type == POWER_SUPPLY_TYPE_USB))
val->intval = 0;
else
val->intval = 1;
if (chg->real_charger_type == POWER_SUPPLY_TYPE_UNKNOWN)
val->intval = 0;
break;
......
}
第五部分 smb5-lib.c
int smblib_get_prop_batt_capacity(struct smb_charger *chg,
union power_supply_propval *val)
{
......
rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CAPACITY, val);----------------从bms节点下的POWER_SUPPLY_PROP_CAPACITY获取当前电量
......
}
int smblib_get_prop_batt_status(struct smb_charger *chg,
union power_supply_propval *val)
{
......
rc = smblib_get_prop_usb_online(chg, &pval);-------------------------------------------------判断usb是否在位
if (rc < 0) {
smblib_err(chg, "Couldn't get usb online property rc=%d\n",
rc);
return rc;
}
usb_online = (bool)pval.intval;
rc = smblib_get_prop_dc_online(chg, &pval);--------------------------------------------------判断DC是否在位
if (rc < 0) {
smblib_err(chg, "Couldn't get dc online property rc=%d\n",
rc);
return rc;
}
dc_online = (bool)pval.intval;
......
switch (stat) {
case TRICKLE_CHARGE:
case PRE_CHARGE:
case FULLON_CHARGE:
case TAPER_CHARGE:
val->intval = POWER_SUPPLY_STATUS_CHARGING;
break;
case TERMINATE_CHARGE:
case INHIBIT_CHARGE:
val->intval = POWER_SUPPLY_STATUS_FULL;
break;
case DISABLE_CHARGE:
case PAUSE_CHARGE:
val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
break;
default:
val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
break;
}
.....
}
个人总结:
当调用power_supply_changed函数,就会遍历power_supply子系统下所有节点(bms,battery,pc_port,usb等)下的所有属性(status,online,capacity等)是否有改变,改变时,就会通过设置共用结构体的val->intval更改当前属性下的数值。
usb->online(1 | 0):与充电图标显示有关
battery->status(POWER_SUPPLY_STATUS_CHARGING | POWER_SUPPLY_STATUS_FULL | POWER_SUPPLY_STATUS_NOT_CHARGING):与充电指示灯有关
bms->capacity : 与电量显示有关
高通android充电常用问题,高通平台android9.0充电电量,充电指示灯以及充电图标读取分析...相关推荐
- 高通android开源代码下载,高通平台开源代码下载
1.进入codeaurora主页,https://www.codeaurora.org/ 2.选择[Projects] -> [Active Projects(Gerrit Repo)] 3.进 ...
- android serialport new 软件退出_基于Android9.0,了解Android启动流程
先记住四个进程和三种方式. **四个进程** 1.Launcher进程 2.system_server进程 3.App进程 4.Zygote进程 **三种方式** 1.Binder方式 2.Socke ...
- 高通android开源代码下载,高通平台Android源码bootloader分析之sbl1(三)
前两篇博文分析了启动流程.代码流程.cdt,接下来就分析另外几个需要格外关注的部分. ##log系统 sbl1中的log系统也是sbl1部分调试会经常接触得部分高通平台在sbl中做的log系统并不是很 ...
- Android指纹识别ui显示,Android9.0指纹识别BiometricPrompt的简单使用
谷歌在Android 9.0 API版本28,发布了生物信息综合验证的基础 API android.hardware.biometrics.BiometricPrompt.BiometricPromp ...
- 高通Android智能平台环境搭建_编译流程分析
高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...
- 高通Android智能平台开发总结
高通Android智能平台开发总结 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境. 7 1.2 搭建高通平台环境开发环境. 7 1.2.1 高通android智能平台概 ...
- 高通android开发摘要
一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...
- android加载efi分区,高通Android UEFI XBL 代码流程分析
高通Android UEFI XBL 代码流程分析 背景 之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构. 所以需要对这块比较新的技术进行学习.在学 ...
- 高通Android手机软件开发培训
为期两天的高通Android手机软件开发培训结束了.这次高通针对QSC7x27/7x25/QSD8x50的基带芯片进行了两天的Android手机软件开发培训.参加人员都是我这样的各个OEM厂商的软件开 ...
最新文章
- 软件BT是硬盘杀手?
- Linux查看进程和终止进程的技巧
- 如何在一小时内更新100篇文章?-Evernote Sync插件介绍
- 将JINQ与JPA和H2一起使用
- 设计模式解密(12)- 桥接模式
- web监听器监听mysql_JavaWEB开发15——ListenerListener
- Flask render_template
- VS2013解决error LNK2019: 无法解析的外部符号 mfcs120ud.lib
- flash 绘图API:绘制秀曲线图形
- 【 2015-2016 XVI Open Cup, Grand Prix of Bashkortostan, SKB Kontur Cup Stage 2】题目总结
- 人工智能python营_AI人工智能训练营
- Frsky X9D Plus遥控器和 Frisky R8 Pro接收机对频
- ThingJS结合图表实现数据展示
- 二级C语言office公共基础知识点
- H.264压缩算法详解
- 《程序员防近视指南》学习笔记全
- 业务和商业才是技术的驱动力
- 借鉴FCoin商业模式,写了一份白皮书去参赛
- 热电阻 热电偶 测量电路_热控宝典之热电偶、热电阻原理及常见故障处理
- workflow 添加html,为alfred编写workflow