static int svdm_enter_mode(int port, uint32_t *payload) { int rv = 0; /* will generate a NAK */ /* SID & mode request is valid */ if ((PD_VDO_VID(payload[0]) == USB_SID_DISPLAYPORT) && (PD_VDO_OPOS(payload[0]) == OPOS_DP)) { alt_mode[PD_AMODE_DISPLAYPORT] = OPOS_DP; rv = 1; pd_log_event(PD_EVENT_VIDEO_DP_MODE, 0, 1, NULL); } else if ((PD_VDO_VID(payload[0]) == USB_VID_GOOGLE) && (PD_VDO_OPOS(payload[0]) == OPOS_GFU)) { alt_mode[PD_AMODE_GOOGLE] = OPOS_GFU; rv = 1; } if (rv) /* * If we failed initial mode entry we'll have enumerated the USB * Billboard class. If so we should disconnect. */ usb_disconnect(); return rv; }
static int svdm_enter_mode(int port, uint32_t *payload) { /* SID & mode request is valid */ if ((PD_VDO_VID(payload[0]) != USB_VID_GOOGLE) || (PD_VDO_OPOS(payload[0]) != OPOS)) return 0; /* will generate NAK */ gfu_mode = 1; debug_printf("GFU\n"); return 1; }
static int dp_status(int port, uint32_t *payload) { int opos = PD_VDO_OPOS(payload[0]); int hpd = gpio_get_level(GPIO_DP_HPD); if (opos != OPOS_DP) return 0; /* nak */ payload[1] = VDO_DP_STATUS(0, /* IRQ_HPD */ (hpd == 1), /* HPD_HI|LOW */ 0, /* request exit DP */ 0, /* request exit USB */ 0, /* MF pref */ gpio_get_level(GPIO_PD_SBU_ENABLE), 0, /* power low */ 0x2); return 2; }
static int svdm_enter_mode(int port, uint32_t *payload) { int usb_mode = gpio_get_level(GPIO_USBC_SS_USB_MODE); /* SID & mode request is valid */ if ((PD_VDO_VID(payload[0]) != USB_SID_DISPLAYPORT) || (PD_VDO_OPOS(payload[0]) != OPOS)) return 0; /* will generate NAK */ if (usb_mode) { CPRINTS("Toggle USB_MODE if you want DP & re-connect"); return 0; } alt_mode = OPOS; return 1; }