typec_mode = smblib_get_prop_typec_mode(chg); if (chg->typec_present && (typec_mode != chg->typec_mode)) smblib_handle_rp_change(chg, typec_mode);代码分析
时间: 2023-09-13 10:09:50 浏览: 105
这段代码是针对 Android 系统中的充电管理模块的代码。其中,变量 `chg` 是一个指向充电管理器的指针。该代码段的作用是检测 Type-C 口的模式,并根据检测结果进行相应的处理。
首先,通过 `smblib_get_prop_typec_mode` 函数获取 Type-C 口的模式,并将结果存储在变量 `typec_mode` 中。然后,该代码段会判断 Type-C 口是否存在,如果存在且当前模式与之前的模式不同,则调用 `smblib_handle_rp_change` 函数进行相应的处理。`smblib_handle_rp_change` 函数的作用是根据新的 Type-C 模式更新充电管理器的配置。
需要注意的是,该代码段只是一个片段,无法确定整个程序的具体作用。如果需要进一步了解程序的作用,需要查看整个程序的代码。
相关问题
if (ptr != pd->usb_psy || evt != PSY_EVENT_PROP_CHANGED) return 0; ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_TYPEC_MODE, &val); if (ret) { usbpd_err(&pd->dev, "Unable to read USB TYPEC_MODE: %d\n", ret); return ret; } typec_mode = val.intval; ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_PE_START, &val); if (ret) { usbpd_err(&pd->dev, "Unable to read USB PROP_PE_START: %d\n", ret); return ret; } /* Don't proceed if PE_START=0; start USB directly if needed */ if (!val.intval && !pd->pd_connected && typec_mode >= POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) { ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_REAL_TYPE, &val); if (ret) { usbpd_err(&pd->dev, "Unable to read USB TYPE: %d\n", ret); return ret; } if (val.intval == POWER_SUPPLY_TYPE_USB || val.intval == POWER_SUPPLY_TYPE_USB_CDP || val.intval == POWER_SUPPLY_TYPE_USB_FLOAT) { usbpd_dbg(&pd->dev, "typec mode:%d type:%d\n", typec_mode, val.intval); pd->typec_mode = typec_mode; queue_work(pd->wq, &pd->start_periph_work); printk("psy_change:start_periph_work\n");/////////////////////////////////////////////////////////////// } return 0; } ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_PRESENT, &val); if (ret) { usbpd_err(&pd->dev, "Unable to read USB PRESENT: %d\n", ret); return ret; } pd->vbus_present = val.intval; /* * For sink hard reset, state machine needs to know when VBUS changes * - when in PE_SNK_TRANSITION_TO_DEFAULT, notify when VBUS falls * - when in PE_SNK_DISCOVERY, notify when VBUS rises */ if (typec_mode && ((!pd->vbus_present && pd->current_state == PE_SNK_TRANSITION_TO_DEFAULT) || (pd->vbus_present && pd->current_state == PE_SNK_DISCOVERY))) { usbpd_dbg(&pd->dev, "hard reset: typec mode:%d present:%d\n", typec_mode, pd->vbus_present); pd->typec_mode = typec_mode; if (!work_busy(&pd->sm_work)) kick_sm(pd, 0); else usbpd_dbg(&pd->dev, "usbpd_sm already running\n"); return 0; } if (pd->typec_mode == typec_mode) return 0; pd->typec_mode = typec_mode; usbpd_dbg(&pd->dev, "typec mode:%d present:%d orientation:%d\n", typec_mode, pd->vbus_present, usbpd_get_plug_orientation(pd));代码分析
这段代码是一个 USB Power Delivery 设备的驱动程序,主要是对 USB Type-C 模式和电源状态的监测和控制。具体来说,这段代码的作用是:当 USB 电源的属性发生变化时,首先获取 USB Type-C 模式和 PE_START 属性的值,如果 PE_START=0,说明 USB 设备已经连接,直接启动设备;否则,获取 USB 的类型,如果是 USB 或 USB_CDP 或 USB_FLOAT,则将 Type-C 模式和 USB 设备类型保存在设备上下文中,并在工作队列中启动一个工作项 start_periph_work;如果 VBUS 发生变化,需要进行硬复位操作,通知状态机进行相关处理。代码中有一些调试信息打印,用于调试程序。
usbpd_info(&pd->dev, "Type-C Source (%s) connected\n", src_current(typec_mode)); /* if waiting for SinkTxOk to start an AMS */ if (pd->spec_rev == USBPD_REV_30 && typec_mode == POWER_SUPPLY_TYPEC_SOURCE_HIGH && (pd->send_pr_swap || pd->send_dr_swap || pd->vdm_tx)) break; if (pd->current_pr == PR_SINK) return 0; /* * Unexpected if not in PR swap; need to force disconnect from * source so we can turn off VBUS, Vconn, PD PHY etc. */ if (pd->current_pr == PR_SRC) { usbpd_info(&pd->dev, "Forcing disconnect from source mode\n"); pd->current_pr = PR_NONE; break; } pd->current_pr = PR_SINK; eval.intval = typec_mode > POWER_SUPPLY_TYPEC_SOURCE_DEFAULT ? 1 : 0; extcon_set_property(pd->extcon, EXTCON_USB, EXTCON_PROP_USB_TYPEC_MED_HIGH_CURRENT, eval); break;代码分析
这段代码是在USB Type-C协议中进行电源角色协商时使用的。它的作用是在设备检测到Type-C源设备连接时,根据当前的协议状态进行相应的操作。
首先,代码使用usbpd_info函数输出Type-C源设备连接的消息。然后,它根据当前的协议状态进行判断。如果当前状态是USB-PD 3.0协议且Type-C模式是高电流源模式,并且等待SinkTxOk去开始一个AMS,则跳过该代码块。
如果当前状态是PR_SINK(电源角色是Sink),则直接返回。如果当前状态是PR_SRC(电源角色是Source),则输出日志信息,强制从源模式断开连接,并将当前状态设置为PR_NONE(无电源角色)。最后,将当前状态设置为PR_SINK,并根据Type-C模式设置EXTCON_USB的属性EXTCON_PROP_USB_TYPEC_MED_HIGH_CURRENT。
这段代码的目的是确保设备在进行电源角色协商时,能够正确地处理各种状态,并根据当前状态进行相应的操作。
阅读全文