if (chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB) { cancel_delayed_work_sync(&chg->uusb_otg_work); vote(chg->awake_votable, OTG_DELAY_VOTER, true, 0); smblib_dbg(chg, PR_INTERRUPT, "Scheduling OTG work\n"); schedule_delayed_work(&chg->uusb_otg_work, msecs_to_jiffies(chg->otg_delay_ms)); return IRQ_HANDLED; }代码解析
时间: 2023-08-06 16:07:54 浏览: 126
这段代码是在处理 USB Type-C 接口插拔事件时,如果检测到当前连接的是 Micro USB 接口,则会执行以下操作:
1. 取消之前已经注册的 uusb_otg_work 延迟工作,以便重新调度新的 uusb_otg_work 延迟工作。
2. 向 awake_votable 投票,以避免系统进入睡眠状态。
3. 输出调试信息,表示即将调度新的 OTG 延迟工作。
4. 调度新的 uusb_otg_work 延迟工作,延迟时间为 `chg->otg_delay_ms`,也就是 OTG 延迟工作的执行时间。
5. 返回 IRQ_HANDLED,表示中断已经被处理。
需要注意的是,`chg` 是指向 `struct smb_charger` 结构体的指针,其中包含了电池驱动的一些信息和状态,如 connector_type 表示当前连接的 USB 接口类型,otg_delay_ms 表示 OTG 延迟工作的执行时间等。另外,uusb_otg_work 是一个延迟工作,用于在 Micro USB 接口插入一段时间后,判断是否需要进入 OTG 模式。
相关问题
if (chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB) { cancel_delayed_work_sync(&chg->uusb_otg_work); vote(chg->awake_votable, OTG_DELAY_VOTER, true, 0); smblib_dbg(chg, PR_INTERRUPT, "Scheduling OTG work\n"); schedule_delayed_work(&chg->uusb_otg_work, msecs_to_jiffies(chg->otg_delay_ms)); return IRQ_HANDLED; }为什么Micro USB类型要配置otg
Micro USB 接口一般被用于手机等移动设备的数据传输和充电。而在一些特殊的情况下,比如需要在手机上连接外部 USB 设备进行数据传输时,就需要使用 USB On-The-Go(OTG)模式。
OTG 模式是指一种可以在 USB 设备之间直接传输数据的标准,它可以让手机等移动设备充当 USB 主机,直接连接外部 USB 设备进行数据传输和控制。在 OTG 模式下,手机等移动设备可以连接 USB 存储设备、USB 小键盘、USB 鼠标等外部 USB 设备,实现数据传输和控制。
因此,当检测到 Micro USB 接口插入时,如果需要使用 OTG 模式,就需要在一定时间内判断是否需要进入 OTG 模式,否则就会按照普通的数据传输和充电模式进行处理。而这段代码的作用就是在 Micro USB 接口插入时配置 OTG 模式,并在一定时间后执行 OTG 相关的操作。
case PM660_SUBTYPE: chip->chg.chg_param.smb_version = PM660_SUBTYPE; chip->chg.wa_flags |= BOOST_BACK_WA | OTG_WA | OV_IRQ_WA_BIT | TYPEC_PBS_WA_BIT; chg->param.freq_buck = pm660_params.freq_buck; chg->param.freq_boost = pm660_params.freq_boost; chg->chg_freq.freq_5V = 650; chg->chg_freq.freq_6V_8V = 850; chg->chg_freq.freq_9V = 1050; chg->chg_freq.freq_12V = 1200; chg->chg_freq.freq_removal = 1050; chg->chg_freq.freq_below_otg_threshold = 1600; chg->chg_freq.freq_above_otg_threshold = 800; break;代码分析
这段代码是在处理 PM660 芯片类型的充电参数。具体来说,它完成了以下操作:
1. 将 SMB 版本号设置为 PM660_SUBTYPE。
2. 开启一些工作模式和异常保护标志,包括 BOOST_BACK_WA、OTG_WA、OV_IRQ_WA_BIT 和 TYPEC_PBS_WA_BIT。
3. 设置一些频率参数,包括充电时的不同电压下的频率(chg_freq.freq_5V、chg_freq.freq_6V_8V、chg_freq.freq_9V、chg_freq.freq_12V),以及移除充电器时的频率(chg_freq.freq_removal)等。
4. 设置 chg_param.freq_buck 和 chg_param.freq_boost 参数,这些参数在 PM660 芯片类型中都是固定的。
这些参数的设置将影响 PM660 芯片的充电行为,从而保证充电的效率和安全性。
阅读全文