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; }
static int dp_altmode_vdm(struct typec_altmode *alt, const u32 hdr, const u32 *vdo, int count) { struct dp_altmode *dp = typec_altmode_get_drvdata(alt); int cmd_type = PD_VDO_CMDT(hdr); int cmd = PD_VDO_CMD(hdr); int ret = 0; mutex_lock(&dp->lock); if (dp->state != DP_STATE_IDLE) { ret = -EBUSY; goto err_unlock; } switch (cmd_type) { case CMDT_RSP_ACK: switch (cmd) { case CMD_ENTER_MODE: dp->state = DP_STATE_UPDATE; break; case CMD_EXIT_MODE: dp->data.status = 0; dp->data.conf = 0; break; case DP_CMD_STATUS_UPDATE: dp->data.status = *vdo; ret = dp_altmode_status_update(dp); break; case DP_CMD_CONFIGURE: ret = dp_altmode_configured(dp); break; default: break; } break; case CMDT_RSP_NAK: switch (cmd) { case DP_CMD_CONFIGURE: dp->data.conf = 0; ret = dp_altmode_configured(dp); break; default: break; } break; default: break; } if (dp->state != DP_STATE_IDLE) schedule_work(&dp->work); err_unlock: mutex_unlock(&dp->lock); return ret; }
int pd_custom_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload) { int cmd = PD_VDO_CMD(payload[0]); uint16_t dev_id = 0; int is_rw; /* make sure we have some payload */ if (cnt == 0) return 0; switch (cmd) { case VDO_CMD_VERSION: /* guarantee last byte of payload is null character */ *(payload + cnt - 1) = 0; CPRINTF("version: %s\n", (char *)(payload+1)); break; case VDO_CMD_READ_INFO: case VDO_CMD_SEND_INFO: /* copy hash */ if (cnt == 7) { dev_id = VDO_INFO_HW_DEV_ID(payload[6]); is_rw = VDO_INFO_IS_RW(payload[6]); CPRINTF("DevId:%d.%d SW:%d RW:%d\n", HW_DEV_ID_MAJ(dev_id), HW_DEV_ID_MIN(dev_id), VDO_INFO_SW_DBG_VER(payload[6]), is_rw); } else if (cnt == 6) { /* really old devices don't have last byte */ pd_dev_store_rw_hash(port, dev_id, payload + 1, SYSTEM_IMAGE_UNKNOWN); } break; case VDO_CMD_CURRENT: CPRINTF("Current: %dmA\n", payload[1]); break; case VDO_CMD_FLIP: usb_mux_flip(port); break; #ifdef CONFIG_USB_PD_LOGGING case VDO_CMD_GET_LOG: pd_log_recv_vdm(port, cnt, payload); break; #endif /* CONFIG_USB_PD_LOGGING */ } return 0; }
static int pd_custom_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload) { int cmd = PD_VDO_CMD(payload[0]); uint16_t dev_id = 0; CPRINTF("VDM/%d [%d] %08x\n", cnt, cmd, payload[0]); /* make sure we have some payload */ if (cnt == 0) return 0; switch (cmd) { case VDO_CMD_VERSION: /* guarantee last byte of payload is null character */ *(payload + cnt - 1) = 0; CPRINTF("version: %s\n", (char *)(payload+1)); break; case VDO_CMD_READ_INFO: case VDO_CMD_SEND_INFO: /* copy hash */ if (cnt == 7) { dev_id = VDO_INFO_HW_DEV_ID(payload[6]); pd_dev_store_rw_hash(port, dev_id, payload + 1); pd_send_host_event(PD_EVENT_UPDATE_DEVICE); CPRINTF("Dev:0x%04x SW:%d RW:%d\n", dev_id, VDO_INFO_SW_DBG_VER(payload[6]), VDO_INFO_IS_RW(payload[6])); } else if (cnt == 6) { /* really old devices don't have last byte */ pd_dev_store_rw_hash(port, dev_id, payload + 1); } break; case VDO_CMD_CURRENT: CPRINTF("Current: %dmA\n", payload[1]); break; case VDO_CMD_FLIP: board_flip_usb_mux(port); break; } return 0; }
int pd_custom_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload) { int cmd = PD_VDO_CMD(payload[0]); int rsize = 1; CPRINTF("VDM/%d [%d] %08x\n", cnt, cmd, payload[0]); *rpayload = payload; switch (cmd) { case VDO_CMD_VERSION: memcpy(payload + 1, &version_data.version, 24); rsize = 7; break; default: rsize = 0; } CPRINTS("DONE"); /* 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; }
int pd_custom_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload) { int cmd = PD_VDO_CMD(payload[0]); uint16_t dev_id = 0; int is_rw, is_latest; /* make sure we have some payload */ if (cnt == 0) return 0; switch (cmd) { case VDO_CMD_VERSION: /* guarantee last byte of payload is null character */ *(payload + cnt - 1) = 0; CPRINTF("version: %s\n", (char *)(payload+1)); break; case VDO_CMD_READ_INFO: case VDO_CMD_SEND_INFO: /* copy hash */ if (cnt == 7) { dev_id = VDO_INFO_HW_DEV_ID(payload[6]); is_rw = VDO_INFO_IS_RW(payload[6]); is_latest = pd_dev_store_rw_hash(port, dev_id, payload + 1, is_rw ? SYSTEM_IMAGE_RW : SYSTEM_IMAGE_RO); /* * Send update host event unless our RW hash is * already known to be the latest update RW. */ if (!is_rw || !is_latest) pd_send_host_event(PD_EVENT_UPDATE_DEVICE); CPRINTF("DevId:%d.%d SW:%d RW:%d\n", HW_DEV_ID_MAJ(dev_id), HW_DEV_ID_MIN(dev_id), VDO_INFO_SW_DBG_VER(payload[6]), is_rw); } else if (cnt == 6) { /* really old devices don't have last byte */ pd_dev_store_rw_hash(port, dev_id, payload + 1, SYSTEM_IMAGE_UNKNOWN); } break; case VDO_CMD_CURRENT: CPRINTF("Current: %dmA\n", payload[1]); break; case VDO_CMD_FLIP: usb_mux_flip(port); break; #ifdef CONFIG_USB_PD_LOGGING case VDO_CMD_GET_LOG: pd_log_recv_vdm(port, cnt, payload); break; #endif /* CONFIG_USB_PD_LOGGING */ #ifdef CONFIG_CASE_CLOSED_DEBUG case VDO_CMD_CCD_EN: ccd_set_mode(system_is_locked() ? CCD_MODE_PARTIAL : CCD_MODE_ENABLED); break; #endif } return 0; }