475 lines
18 KiB
C
475 lines
18 KiB
C
/* USER CODE BEGIN Header */
|
|
/**
|
|
******************************************************************************
|
|
* @file usbpd_vdm_user.c
|
|
* @author MCD Application Team
|
|
* @brief USBPD provider demo file
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
|
|
* All rights reserved.</center></h2>
|
|
*
|
|
* This software component is licensed by ST under Ultimate Liberty license
|
|
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at:
|
|
* www.st.com/SLA0044
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
/* USER CODE END Header */
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "usbpd_core.h"
|
|
#include "usbpd_dpm_conf.h"
|
|
#include "usbpd_vdm_user.h"
|
|
#include "usbpd_dpm_user.h"
|
|
/* USER CODE BEGIN Includes */
|
|
|
|
/* USER CODE END Includes */
|
|
|
|
/** @addtogroup STM32_USBPD_APPLICATION
|
|
* @{
|
|
*/
|
|
|
|
/** @addtogroup STM32_USBPD_APPLICATION_VDM_USER
|
|
* @{
|
|
*/
|
|
|
|
/* Private define ------------------------------------------------------------*/
|
|
/* USER CODE BEGIN Private_define */
|
|
|
|
/* USER CODE END Private_define */
|
|
|
|
/* Private typedef -----------------------------------------------------------*/
|
|
/* USER CODE BEGIN Private_typedef */
|
|
|
|
/* USER CODE END Private_typedef */
|
|
|
|
/* Private macro -------------------------------------------------------------*/
|
|
/* USER CODE BEGIN Private_macro */
|
|
|
|
/* USER CODE END Private_macro */
|
|
|
|
/* Private function prototypes -----------------------------------------------*/
|
|
static USBPD_StatusTypeDef USBPD_VDM_DiscoverIdentity(uint8_t PortNum, USBPD_DiscoveryIdentity_TypeDef *pIdentity);
|
|
static USBPD_StatusTypeDef USBPD_VDM_DiscoverSVIDs(uint8_t PortNum, uint16_t **p_SVID_Info, uint8_t *nb);
|
|
static USBPD_StatusTypeDef USBPD_VDM_DiscoverModes(uint8_t PortNum, uint16_t SVID, uint32_t **p_ModeInfo, uint8_t *nbMode);
|
|
static USBPD_StatusTypeDef USBPD_VDM_ModeEnter(uint8_t PortNum, uint16_t SVID, uint32_t ModeIndex);
|
|
static USBPD_StatusTypeDef USBPD_VDM_ModeExit(uint8_t PortNum, uint16_t SVID, uint32_t ModeIndex);
|
|
static void USBPD_VDM_SendAttention(uint8_t PortNum, uint8_t *NbData, uint32_t *VDO);
|
|
static void USBPD_VDM_ReceiveAttention(uint8_t PortNum, uint8_t NbData, uint32_t VDO);
|
|
static USBPD_StatusTypeDef USBPD_VDM_ReceiveSpecific(uint8_t PortNum, USBPD_VDM_Command_Typedef VDMCommand, uint8_t *NbData, uint32_t *VDO);
|
|
static void USBPD_VDM_InformIdentity(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, USBPD_DiscoveryIdentity_TypeDef *pIdentity);
|
|
static void USBPD_VDM_InformSVID(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, USBPD_SVIDInfo_TypeDef *pListSVID);
|
|
static void USBPD_VDM_InformMode(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, USBPD_ModeInfo_TypeDef *pModesInfo);
|
|
static void USBPD_VDM_InformModeEnter(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, uint16_t SVID, uint32_t ModeIndex);
|
|
static void USBPD_VDM_InformModeExit(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, uint16_t SVID, uint32_t ModeIndex);
|
|
static void USBPD_VDM_InformSpecific(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_Command_Typedef VDMCommand, uint8_t *NbData, uint32_t *VDO);
|
|
static void USBPD_VDM_SendSpecific(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_Command_Typedef VDMCommand, uint8_t *NbData, uint32_t *VDO);
|
|
static void USBPD_VDM_SendUVDM(uint8_t PortNum, USBPD_UVDMHeader_TypeDef *pUVDM_Header, uint8_t *pNbData, uint32_t *pVDO);
|
|
static USBPD_StatusTypeDef USBPD_VDM_ReceiveUVDM(uint8_t PortNum, USBPD_UVDMHeader_TypeDef UVDM_Header, uint8_t *pNbData, uint32_t *pVDO);
|
|
|
|
/* USER CODE BEGIN Private_prototypes */
|
|
|
|
/* USER CODE END Private_prototypes */
|
|
|
|
/* Private variables ---------------------------------------------------------*/
|
|
|
|
/* USER CODE BEGIN Private_variables */
|
|
const USBPD_VDM_Callbacks vdmCallbacks =
|
|
{
|
|
USBPD_VDM_DiscoverIdentity,
|
|
USBPD_VDM_DiscoverSVIDs,
|
|
USBPD_VDM_DiscoverModes,
|
|
USBPD_VDM_ModeEnter,
|
|
USBPD_VDM_ModeExit,
|
|
USBPD_VDM_InformIdentity,
|
|
USBPD_VDM_InformSVID,
|
|
USBPD_VDM_InformMode,
|
|
USBPD_VDM_InformModeEnter,
|
|
USBPD_VDM_InformModeExit,
|
|
USBPD_VDM_SendAttention,
|
|
USBPD_VDM_ReceiveAttention,
|
|
USBPD_VDM_SendSpecific,
|
|
USBPD_VDM_ReceiveSpecific,
|
|
USBPD_VDM_InformSpecific,
|
|
USBPD_VDM_SendUVDM,
|
|
USBPD_VDM_ReceiveUVDM,
|
|
};
|
|
/* USER CODE END Private_variables */
|
|
|
|
/* Private functions ---------------------------------------------------------*/
|
|
/**
|
|
* @brief VDM Discovery identity callback
|
|
* @note Function is called to get Discovery identity information linked to the device and answer
|
|
* to SVDM Discovery identity init message sent by port partner
|
|
* @param PortNum current port number
|
|
* @param pIdentity Pointer on @ref USBPD_DiscoveryIdentity_TypeDef structure
|
|
* @retval USBPD status: @ref USBPD_ACK or @ref USBPD_BUSY
|
|
*/
|
|
static USBPD_StatusTypeDef USBPD_VDM_DiscoverIdentity(uint8_t PortNum, USBPD_DiscoveryIdentity_TypeDef *pIdentity)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_DiscoverIdentity */
|
|
return USBPD_NAK;
|
|
/* USER CODE END USBPD_VDM_DiscoverIdentity */
|
|
}
|
|
|
|
/**
|
|
* @brief VDM Discover SVID callback
|
|
* @note Function is called to retrieve SVID supported by device and answer
|
|
* to SVDM Discovery SVID init message sent by port partner
|
|
* @param PortNum current port number
|
|
* @param p_SVID_Info Pointer on @ref USBPD_SVIDInfo_TypeDef structure
|
|
* @param pNbSVID Pointer on number of SVID
|
|
* @retval USBPD status @ref USBPD_BUSY or @ref USBPD_ACK or @ref USBPD_NAK
|
|
*/
|
|
static USBPD_StatusTypeDef USBPD_VDM_DiscoverSVIDs(uint8_t PortNum, uint16_t **p_SVID_Info, uint8_t *pNbSVID)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_DiscoverSVIDs */
|
|
return USBPD_NAK;
|
|
/* USER CODE END USBPD_VDM_DiscoverSVIDs */
|
|
}
|
|
|
|
/**
|
|
* @brief VDM Discover Mode callback (report all the modes supported by SVID)
|
|
* @note Function is called to report all the modes supported by selected SVID and answer
|
|
* to SVDM Discovery Mode init message sent by port partner
|
|
* @param PortNum current port number
|
|
* @param SVID SVID value
|
|
* @param p_ModeTab Pointer on the mode value
|
|
* @param NumberOfMode Number of mode available
|
|
* @retval USBPD status
|
|
*/
|
|
static USBPD_StatusTypeDef USBPD_VDM_DiscoverModes(uint8_t PortNum, uint16_t SVID, uint32_t **p_ModeTab, uint8_t *NumberOfMode)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_DiscoverModes */
|
|
return USBPD_NAK;
|
|
/* USER CODE END USBPD_VDM_DiscoverModes */
|
|
}
|
|
|
|
/**
|
|
* @brief VDM Mode enter callback
|
|
* @note Function is called to check if device can enter in the mode received for the selected SVID in the
|
|
* SVDM enter mode init message sent by port partner
|
|
* @param PortNum current port number
|
|
* @param SVID SVID value
|
|
* @param ModeIndex Index of the mode to be entered
|
|
* @retval USBPD status @ref USBPD_ACK/@ref USBPD_NAK
|
|
*/
|
|
static USBPD_StatusTypeDef USBPD_VDM_ModeEnter(uint8_t PortNum, uint16_t SVID, uint32_t ModeIndex)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_ModeEnter */
|
|
return USBPD_NAK;
|
|
/* USER CODE END USBPD_VDM_ModeEnter */
|
|
}
|
|
|
|
/**
|
|
* @brief VDM Mode exit callback
|
|
* @note Function is called to check if device can exit from the mode received for the selected SVID in the
|
|
* SVDM exit mode init message sent by port partner
|
|
* @param PortNum current port number
|
|
* @param SVID SVID value
|
|
* @param ModeIndex Index of the mode to be exited
|
|
* @retval USBPD status @ref USBPD_ACK/@ref USBPD_NAK
|
|
*/
|
|
static USBPD_StatusTypeDef USBPD_VDM_ModeExit(uint8_t PortNum, uint16_t SVID, uint32_t ModeIndex)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_ModeExit */
|
|
return USBPD_NAK;
|
|
/* USER CODE END USBPD_VDM_ModeExit */
|
|
}
|
|
|
|
/**
|
|
* @brief Send VDM Attention message callback
|
|
* @note Function is called when device wants to send a SVDM attention message to port partner
|
|
* (for instance DP status can be filled through this function)
|
|
* @param PortNum current port number
|
|
* @param pNbData Pointer of number of VDO to send
|
|
* @param pVDO Pointer of VDO to send
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_SendAttention(uint8_t PortNum, uint8_t *pNbData, uint32_t *pVDO)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_SendAttention */
|
|
|
|
/* USER CODE END USBPD_VDM_SendAttention */
|
|
}
|
|
|
|
/**
|
|
* @brief Receive VDM Attention callback
|
|
* @note Function is called when a SVDM attention init message has been received from port partner
|
|
* (for instance, save DP status data through this function)
|
|
* @param PortNum current port number
|
|
* @param NbData Number of received VDO
|
|
* @param VDO Received VDO
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_ReceiveAttention(uint8_t PortNum, uint8_t NbData, uint32_t VDO)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_ReceiveAttention */
|
|
|
|
/* USER CODE END USBPD_VDM_ReceiveAttention */
|
|
}
|
|
|
|
/**
|
|
* @brief VDM Receive Specific message callback
|
|
* @note Function is called to answer to a SVDM specific init message received by port partner.
|
|
* (for instance, retrieve DP status or DP configure data through this function)
|
|
* @param PortNum Current port number
|
|
* @param VDMCommand VDM command based on @ref USBPD_VDM_Command_Typedef
|
|
* @param pNbData Pointer of number of received VDO and used for the answer
|
|
* @param pVDO Pointer of received VDO and use for the answer
|
|
* @retval USBPD Status
|
|
*/
|
|
static USBPD_StatusTypeDef USBPD_VDM_ReceiveSpecific(uint8_t PortNum, USBPD_VDM_Command_Typedef VDMCommand, uint8_t *pNbData, uint32_t *pVDO)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_ReceiveSpecific */
|
|
return USBPD_NAK;
|
|
/* USER CODE END USBPD_VDM_ReceiveSpecific */
|
|
}
|
|
|
|
/**
|
|
* @brief Inform identity callback
|
|
* @note Function is called to save Identity information received in Discovery identity from port partner
|
|
(answer to SVDM discovery identity sent by device)
|
|
* @param PortNum current port number
|
|
* @param SOPType SOP type
|
|
* @param CommandStatus Command status based on @ref USBPD_VDM_CommandType_Typedef
|
|
* @param pIdentity Pointer on the discovery identity information based on @ref USBPD_DiscoveryIdentity_TypeDef
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_InformIdentity(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, USBPD_DiscoveryIdentity_TypeDef *pIdentity)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_InformIdentity */
|
|
switch(CommandStatus)
|
|
{
|
|
case SVDM_RESPONDER_ACK :
|
|
break;
|
|
case SVDM_RESPONDER_NAK :
|
|
break;
|
|
case SVDM_RESPONDER_BUSY :
|
|
break;
|
|
default :
|
|
break;
|
|
}
|
|
/* USER CODE END USBPD_VDM_InformIdentity */
|
|
}
|
|
|
|
/**
|
|
* @brief Inform SVID callback
|
|
* @note Function is called to save list of SVID received in Discovery SVID from port partner
|
|
(answer to SVDM discovery SVID sent by device)
|
|
* @param PortNum current port number
|
|
* @param SOPType SOP type
|
|
* @param CommandStatus Command status based on @ref USBPD_VDM_CommandType_Typedef
|
|
* @param pListSVID Pointer of list of SVID based on @ref USBPD_SVIDInfo_TypeDef
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_InformSVID(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, USBPD_SVIDInfo_TypeDef *pListSVID)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_InformSVID */
|
|
switch(CommandStatus)
|
|
{
|
|
case SVDM_RESPONDER_ACK :
|
|
break;
|
|
case SVDM_RESPONDER_NAK :
|
|
break;
|
|
case SVDM_RESPONDER_BUSY :
|
|
break;
|
|
default :
|
|
break;
|
|
}
|
|
/* USER CODE END USBPD_VDM_InformSVID */
|
|
}
|
|
|
|
/**
|
|
* @brief Inform Mode callback ( received in Discovery Modes ACK)
|
|
* @note Function is called to save list of modes linked to SVID received in Discovery mode from port partner
|
|
(answer to SVDM discovery mode sent by device)
|
|
* @param PortNum current port number
|
|
* @param SOPType SOP type
|
|
* @param CommandStatus Command status based on @ref USBPD_VDM_CommandType_Typedef
|
|
* @param pModesInfo Pointer of Modes info based on @ref USBPD_ModeInfo_TypeDef
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_InformMode(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, USBPD_ModeInfo_TypeDef *pModesInfo)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_InformMode */
|
|
switch(CommandStatus)
|
|
{
|
|
case SVDM_RESPONDER_ACK :
|
|
break;
|
|
case SVDM_RESPONDER_NAK :
|
|
break;
|
|
case SVDM_RESPONDER_BUSY :
|
|
break;
|
|
default :
|
|
break;
|
|
}
|
|
/* USER CODE END USBPD_VDM_InformMode */
|
|
}
|
|
|
|
/**
|
|
* @brief Inform Mode enter callback
|
|
* @note Function is called to inform if port partner accepted or not to enter in the mode
|
|
* specified in the SVDM enter mode sent by the device
|
|
* @param PortNum current port number
|
|
* @param SOPType SOP type
|
|
* @param CommandStatus Command status based on @ref USBPD_VDM_CommandType_Typedef
|
|
* @param SVID SVID ID
|
|
* @param ModeIndex Index of the mode to be entered
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_InformModeEnter(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, uint16_t SVID, uint32_t ModeIndex)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_InformModeEnter */
|
|
switch(CommandStatus)
|
|
{
|
|
case SVDM_RESPONDER_ACK :
|
|
break;
|
|
case SVDM_RESPONDER_NAK :
|
|
break;
|
|
case SVDM_RESPONDER_BUSY :
|
|
/* retry in 50ms */
|
|
break;
|
|
default :
|
|
break;
|
|
}
|
|
/* USER CODE END USBPD_VDM_InformModeEnter */
|
|
}
|
|
|
|
/**
|
|
* @brief Inform Exit enter callback
|
|
* @param PortNum current port number
|
|
* @param SVID SVID ID
|
|
* @param ModeIndex Index of the mode to be entered
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_InformModeExit(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_CommandType_Typedef CommandStatus, uint16_t SVID, uint32_t ModeIndex)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_InformModeExit */
|
|
switch(CommandStatus)
|
|
{
|
|
case SVDM_RESPONDER_ACK :
|
|
break;
|
|
case SVDM_RESPONDER_NAK :
|
|
break;
|
|
case SVDM_RESPONDER_BUSY :
|
|
/* retry in 50ms */
|
|
break;
|
|
default :
|
|
break;
|
|
}
|
|
/* USER CODE END USBPD_VDM_InformModeExit */
|
|
}
|
|
|
|
/**
|
|
* @brief VDM Send Specific message callback
|
|
* @note Function is called when device wants to send a SVDM specific init message to port partner
|
|
* (for instance DP status or DP configure can be filled through this function)
|
|
* @param PortNum current port number
|
|
* @param SOPType SOP type
|
|
* @param VDMCommand VDM command based on @ref USBPD_VDM_Command_Typedef
|
|
* @param pNbData Pointer of number of VDO to send
|
|
* @param pVDO Pointer of VDO to send
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_SendSpecific(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_Command_Typedef VDMCommand, uint8_t *pNbData, uint32_t *pVDO)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_SendSpecific */
|
|
|
|
/* USER CODE END USBPD_VDM_SendSpecific */
|
|
}
|
|
|
|
/**
|
|
* @brief VDM Specific message callback to inform user of reception of VDM specific message
|
|
* @note Function is called when answer from SVDM specific init message has been received by the device
|
|
* (for instance, save DP status and DP configure data through this function)
|
|
* @param PortNum current port number
|
|
* @param SOPType SOP type
|
|
* @param VDMCommand VDM command based on @ref USBPD_VDM_Command_Typedef
|
|
* @param pNbData Pointer of number of received VDO
|
|
* @param pVDO Pointer of received VDO
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_InformSpecific(uint8_t PortNum, USBPD_SOPType_TypeDef SOPType, USBPD_VDM_Command_Typedef VDMCommand, uint8_t *pNbData, uint32_t *pVDO)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_InformSpecific */
|
|
|
|
/* USER CODE END USBPD_VDM_InformSpecific */
|
|
}
|
|
|
|
/**
|
|
* @brief VDM Send Unstructured message callback
|
|
* @param PortNum current port number
|
|
* @param pUVDM_Header Pointer on UVDM header based on @ref USBPD_UVDMHeader_TypeDef
|
|
* @param pNbData Pointer of number of VDO to send
|
|
* @param pVDO Pointer of VDO to send
|
|
* @retval None
|
|
*/
|
|
static void USBPD_VDM_SendUVDM(uint8_t PortNum, USBPD_UVDMHeader_TypeDef *pUVDM_Header, uint8_t *pNbData, uint32_t *pVDO)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_SendUVDM */
|
|
|
|
/* USER CODE END USBPD_VDM_SendUVDM */
|
|
}
|
|
|
|
/**
|
|
* @brief Unstructured VDM message callback to inform user of reception of UVDM message
|
|
* @param PortNum current port number
|
|
* @param UVDM_Header UVDM header based on @ref USBPD_UVDMHeader_TypeDef
|
|
* @param pNbData Pointer of number of received VDO
|
|
* @param pVDO Pointer of received VDO
|
|
* @retval USBPD Status
|
|
*/
|
|
static USBPD_StatusTypeDef USBPD_VDM_ReceiveUVDM(uint8_t PortNum, USBPD_UVDMHeader_TypeDef UVDM_Header, uint8_t *pNbData, uint32_t *pVDO)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_ReceiveUVDM */
|
|
return USBPD_ERROR;
|
|
/* USER CODE END USBPD_VDM_ReceiveUVDM */
|
|
}
|
|
|
|
/* USER CODE BEGIN Private_functions */
|
|
|
|
/* USER CODE END Private_functions */
|
|
|
|
/* Exported functions ---------------------------------------------------------*/
|
|
/**
|
|
* @brief VDM Initialization function
|
|
* @param PortNum Index of current used port
|
|
* @retval status
|
|
*/
|
|
USBPD_StatusTypeDef USBPD_VDM_UserInit(uint8_t PortNum)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_UserInit */
|
|
return USBPD_OK;
|
|
/* USER CODE END USBPD_VDM_UserInit */
|
|
}
|
|
|
|
/**
|
|
* @brief VDM Reset function
|
|
* @param PortNum Index of current used port
|
|
* @retval status
|
|
*/
|
|
void USBPD_VDM_UserReset(uint8_t PortNum)
|
|
{
|
|
/* USER CODE BEGIN USBPD_VDM_UserReset */
|
|
|
|
/* USER CODE END USBPD_VDM_UserReset */
|
|
}
|
|
|
|
/* USER CODE BEGIN Exported_functions */
|
|
|
|
/* USER CODE END Exported_functions */
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
|