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]); 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; }