背景:
贴片试产出现Meta工具连不上
排查问题:
通过查看上一个版本能连上,查看git log 查看一个修改导致连接失败
meta 工具失败原因是usb port超时报错,meta工具连接主要是通过不断获取usb的类型去匹配
从这我们就可以得出是否usb的类型读取异常
查看log:
发现异常失败进入meta工具的log只打印了一次中断插入
同是打印成功与失败的usb类型发现失败的usb类型获取失败
POWER_SUPPLY_PROP_USB_TYPE val->intval = 0
正常的是
POWER_SUPPLY_PROP_USB_TYPE val->intval = 1
并且失败的是不会跑usb_in_work
static irqreturn_t sgm41513d_irq_handler_thread(int irq, void *private) { struct sgm41513d_device *sgm = private; struct sgm41513d_state state; bool prev_pg; int ret; //lock wakelock pr_err("%s entry\n",__func__); prev_pg = sgm->state.online; ret = sgm41513d_get_charger_online(sgm, &state); mutex_lock(&sgm->lock); sgm->state = state; mutex_unlock(&sgm->lock); if(!prev_pg && state.online){ type_C_in = 1; CPS2011_encomp_en(1); queue_delayed_work(sgm->usb_in_wq, &sgm->usb_in_work, 100); //power_supply_changed(sgm->charger); }else if(prev_pg && !state.online) { pr_err("%s\n",__func__); //power_supply_changed(sgm->charger); } return IRQ_HANDLED; }发现进入的这个!prev_pg && state.online条件是这个
时间线:
────────────────────────────────────────────────────────────
get_property: IRQ handler:
────────────────────────────────────────────────────────────
mutex_lock(&sgm->lock);
ret = sgm41513d_get_state(); // I2C读取,online=1
sgm->state = state; // sgm->state.online = 1
mutex_unlock(&sgm->lock);
prev_pg = sgm->state.online; // 读到1!
sgm41513d_get_charger_online(); // online=1
mutex_lock(&sgm->lock);
sgm->state = state;
mutex_unlock(&sgm->lock);
if(!prev_pg && state.online)
// if(!1 && 1) = false
// queue_delayed_work() 不执行!
────────────────────────────────────────────────────────────
这里的meta在init前一直读取了这个get_state导致这里的prev_pg的状态检测被打破了
最后在init前不要读取做一个标志位就解决了