- /* VDM */
- UINT8C ACK_Disc_Ident[ ] =
- {
- 0xc9,0x1f,0x00,0x6c,
- 0xa8,0x5e,0x02,0x00,
- 0x10,0x01,0x02,0x50,
- 0x39,0x00,0x00,0x11
- };
- UINT8C ACK_Disc_SVID[ ] = {0x00,0x00,0x01,0xff};
- /* 四线,仅支持模式C */
- #if 1
- //VDM 模式列表
- UINT8C ACK_Disc_Mode[ ] = {0x05,0x04,0x00,0x00};
- //VDM DP状态
- UINT8C ACK_DP_Stat_Pos_1[ ] ={0x0a,0x00,0x00,0x00};
- #else
- /* 两线,支持C D模式,prefer D模式 */
- UINT8C ACK_Disc_Mode[ ] = {0x05,0x0C,0x00,0x00};
- UINT8C ACK_DP_Stat_Pos_1[ ] = {0x1a,0x00,0x00,0x00};
- #endif
- UINT8C DPAttention_Table[ ] = //VDM DP拔插状态
- {
- 0x06,0x81,0x01,0xff,
- 0x8a,0x00,0x00,0x00
- };
- UINT8C DPAttention_Table_1[ ] = //VDM DP拔插状态
- {
- 0x06,0x81,0x01,0xff,
- 0x0a,0x00,0x00,0x00
- };
接下来严格按照VDM的协商流程(参考VDM协商流程图),完成相关通讯。软件如下:- switch(Union_Header->HeaderStruct.MsgType)
- {
- case SourceCap:
- PD_PHY_STAT.SendingRequest = 1;
- break;
- case Accept:
- break;
- case Reject:
- break;
- case PS_RDY:
- break;
- case GetSinkCap:
- MsgID++;
- PD_PHY_STAT.SendingSinkCap = 1;
- break;
- case SourceCap_VDM:
- Union_VDM_Hdr = (_Union_VDM_Hdr *)&PD_RX_BUF[2];
- switch(Union_VDM_Hdr->VDMHdrStruct.Command)
- {
- case 1:
- MsgID++;
- PD_PHY_STAT.SendingACK_Disc_Ident = 1;
- break;
- case 2:
- MsgID++;
- PD_PHY_STAT.SendingACK_Disc_SVID = 1;
- break;
- case 3:
- MsgID++;
- PD_PHY_STAT.SendingACK_Disc_Mode = 1;
- break;
- case 4:
- MsgID++;
- PD_PHY_STAT.SendingACK_Enter_Mode = 1;
- break;
- case 16:
- PD_PHY_STAT.SendingACK_DP_Stat_Pos_1 = 1;
- MsgID++;
- break;
- case 17:
- PD_PHY_STAT.SendingACK_DP_Configure_Pos_1 = 1;
- MsgID++;
- break;
- }
- break;
- default :
- break;
至此CH543D的VDM操作就结束了,通过以上操作便可以实现单口Type-C转Display Port口和USB 2.0口,感兴趣的小伙伴可以在此基础上继续升级改造(例如USB 3.0、U盘、SD卡、TF卡、投影仪等)。附件是硬件、软件资料,小伙伴们可以按需下载。