第一部分 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-&g