int pd_custom_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload) { int rsize; if (PD_VDO_VID(payload[0]) != USB_VID_GOOGLE || !alt_mode[PD_AMODE_GOOGLE]) return 0; *rpayload = payload; rsize = pd_custom_flash_vdm(port, cnt, payload); if (!rsize) { int cmd = PD_VDO_CMD(payload[0]); switch (cmd) { case VDO_CMD_GET_LOG: rsize = pd_vdm_get_log_entry(payload); break; default: /* Unknown : do not answer */ return 0; } } /* respond (positively) to the request */ payload[0] |= VDO_SRC_RESPONDER; return rsize; }
int pd_custom_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload) { int cmd = PD_VDO_CMD(payload[0]); int rsize; if (PD_VDO_VID(payload[0]) != USB_VID_GOOGLE || !gfu_mode) return 0; debug_printf("%T] VDM/%d [%d] %08x\n", cnt, cmd, payload[0]); *rpayload = payload; rsize = pd_custom_flash_vdm(port, cnt, payload); if (!rsize) { switch (cmd) { case VDO_CMD_PING_ENABLE: pd_ping_enable(0, payload[1]); rsize = 1; break; case VDO_CMD_CURRENT: /* return last measured current */ payload[1] = ADC_TO_CURR_MA(vbus_amp); rsize = 2; break; case VDO_CMD_GET_LOG: rsize = pd_vdm_get_log_entry(payload); break; default: /* Unknown : do not answer */ return 0; } } /* respond (positively) to the request */ payload[0] |= VDO_SRC_RESPONDER; return rsize; }