static void kpoc_power_off_check(struct mtk_charger *info) { unsigned int boot_mode = info->bootmode; int vbus = 0; int counter = 0; /* 8 = KERNEL_POWER_OFF_CHARGING_BOOT */ /* 9 = LOW_POWER_OFF_CHARGING_BOOT */ if (boot_mode == 8 || boot_mode == 9) { vbus = get_vbus(info); if ((vbus >= 0 && vbus < 2500 && !mtk_is_charger_on(info) && !info->pd_reset) || (vbus >= 0 && vbus < 2500 && get_charger_type(info) == POWER_SUPPLY_TYPE_WIRELESS)) { chr_err("Unplug Charger/USB in KPOC mode, vbus=%d, shutdown\n", vbus); while (1) { if (counter >= 20000) { chr_err("%s, wait too long\n", __func__); kernel_power_off(); break; } if (info->is_suspend == false) { chr_err("%s, not in suspend, shutdown\n", __func__); kernel_power_off(); } else { chr_err("%s, suspend! cannot shutdown\n", __func__); msleep(20); } counter++; } } charger_send_kpoc_uevent(info); } }请详细分析一下这段函数
时间: 2024-04-21 16:25:23 浏览: 172
这段函数是用于检测充电器状态并在特定情况下自动关机的函数。该函数接受一个指向 mtk_charger 结构体的指针作为参数。
函数首先获取当前设备的启动模式,如果启动模式为8或9,则表示当前设备处于KERNEL_POWER_OFF_CHARGING_BOOT或LOW_POWER_OFF_CHARGING_BOOT模式下。
如果设备处于这两种模式之一,则检查当前USB的电压值和充电器类型。如果USB电压小于2500,且充电器未插入或处于无线充电状态,则需要自动关机。
在此之后,函数会进入一个无限循环,检查设备是否在挂起状态。如果设备不在挂起状态,则直接关机。如果设备在挂起状态,则等待20毫秒,然后再次检查是否在挂起状态。如果等待时间超过20000,函数会输出错误信息并执行关机操作。
最后,函数会发送一个uevent事件通知,以通知其他组件设备已经进入了KPOC模式。
阅读全文