aboutsummaryrefslogtreecommitdiffhomepage
path: root/source/Core/Drivers/FUSB302/protocol_tx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Core/Drivers/FUSB302/protocol_tx.cpp')
-rw-r--r--source/Core/Drivers/FUSB302/protocol_tx.cpp276
1 files changed, 0 insertions, 276 deletions
diff --git a/source/Core/Drivers/FUSB302/protocol_tx.cpp b/source/Core/Drivers/FUSB302/protocol_tx.cpp
deleted file mode 100644
index ca9410b5..00000000
--- a/source/Core/Drivers/FUSB302/protocol_tx.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * PD Buddy Firmware Library - USB Power Delivery for everyone
- * Copyright 2017-2018 Clayton G. Hobbs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "protocol_tx.h"
-#include "Defines.h"
-#include "fusb302b.h"
-#include "fusbpd.h"
-#include "policy_engine.h"
-#include <pd.h>
-
-osThreadId ProtocolTransmit::TaskHandle = NULL;
-uint32_t ProtocolTransmit::TaskBuffer[ProtocolTransmit::TaskStackSize];
-osStaticThreadDef_t ProtocolTransmit::TaskControlBlock;
-StaticQueue_t ProtocolTransmit::xStaticQueue;
-bool ProtocolTransmit::messageSending = false;
-uint8_t ProtocolTransmit::ucQueueStorageArea[PDB_MSG_POOL_SIZE * sizeof(union pd_msg)];
-QueueHandle_t ProtocolTransmit::messagesWaiting = NULL;
-uint8_t ProtocolTransmit::_tx_messageidcounter;
-union pd_msg ProtocolTransmit::temp_msg;
-EventGroupHandle_t ProtocolTransmit::xEventGroupHandle = NULL;
-StaticEventGroup_t ProtocolTransmit::xCreatedEventGroup;
-/*
- * PRL_Tx_PHY_Layer_Reset state
- */
-ProtocolTransmit::protocol_tx_state ProtocolTransmit::protocol_tx_phy_reset() {
- /* Reset the PHY */
- fusb_reset();
-
- /* If a message was pending when we got here, tell the policy engine that
- * we failed to send it */
- if (messagePending()) {
- /* Tell the policy engine that we failed */
- PolicyEngine::notify(PolicyEngine::Notifications::PDB_EVT_PE_TX_ERR);
- /* Finish failing to send the message */
- while (messagePending()) {
- getMessage(); // Discard
- }
- }
-
- /* Wait for a message request */
- return PRLTxWaitMessage;
-}
-
-/*
- * PRL_Tx_Wait_for_Message_Request state
- */
-ProtocolTransmit::protocol_tx_state ProtocolTransmit::protocol_tx_wait_message() {
- /* Wait for an event */
- ProtocolTransmit::Notifications evt = waitForEvent((uint32_t)Notifications::PDB_EVT_PRLTX_RESET | (uint32_t)Notifications::PDB_EVT_PRLTX_DISCARD | (uint32_t)Notifications::PDB_EVT_PRLTX_MSG_TX);
-
- if ((uint32_t)evt & (uint32_t)Notifications::PDB_EVT_PRLTX_RESET) {
- return PRLTxPHYReset;
- }
-
- /* If the policy engine is trying to send a message */
- if ((uint32_t)evt & (uint32_t)Notifications::PDB_EVT_PRLTX_MSG_TX) {
- /* Get the message */
- getMessage();
-
- /* If it's a Soft_Reset, reset the TX layer first */
- if (PD_MSGTYPE_GET(&temp_msg) == PD_MSGTYPE_SOFT_RESET && PD_NUMOBJ_GET(&(temp_msg)) == 0) {
- return PRLTxReset;
- /* Otherwise, just send the message */
- } else {
- return PRLTxConstructMessage;
- }
- }
-
- /* Silence the compiler warning */
- return PRLTxWaitMessage;
-}
-
-ProtocolTransmit::protocol_tx_state ProtocolTransmit::protocol_tx_reset() {
- /* Clear MessageIDCounter */
- _tx_messageidcounter = 0;
-
- return PRLTxConstructMessage;
-}
-
-/*
- * PRL_Tx_Construct_Message state
- */
-ProtocolTransmit::protocol_tx_state ProtocolTransmit::protocol_tx_construct_message() {
- /* Set the correct MessageID in the message */
- temp_msg.hdr &= ~PD_HDR_MESSAGEID;
- temp_msg.hdr |= (_tx_messageidcounter % 8) << PD_HDR_MESSAGEID_SHIFT;
-
- /* PD 3.0 collision avoidance */
- if (PolicyEngine::isPD3_0()) {
- /* If we're starting an AMS, wait for permission to transmit */
- while (fusb_get_typec_current() != fusb_sink_tx_ok) {
- vTaskDelay(TICKS_10MS);
- }
- }
- messageSending = true;
- /* Send the message to the PHY */
- fusb_send_message(&temp_msg);
-
- return PRLTxWaitResponse;
-}
-
-/*
- * PRL_Tx_Wait_for_PHY_Response state
- */
-ProtocolTransmit::protocol_tx_state ProtocolTransmit::protocol_tx_wait_response() {
- /* Wait for an event. There is no need to run CRCReceiveTimer, since the
- * FUSB302B handles that as part of its retry mechanism. */
- ProtocolTransmit::Notifications evt = waitForEvent((uint32_t)Notifications::PDB_EVT_PRLTX_RESET | (uint32_t)Notifications::PDB_EVT_PRLTX_DISCARD | (uint32_t)Notifications::PDB_EVT_PRLTX_I_TXSENT
- | (uint32_t)Notifications::PDB_EVT_PRLTX_I_RETRYFAIL);
-
- if ((uint32_t)evt & (uint32_t)Notifications::PDB_EVT_PRLTX_RESET) {
- return PRLTxPHYReset;
- }
- if ((uint32_t)evt & (uint32_t)Notifications::PDB_EVT_PRLTX_DISCARD) {
- return PRLTxDiscardMessage;
- }
-
- /* If the message was sent successfully */
- if ((uint32_t)evt & (uint32_t)Notifications::PDB_EVT_PRLTX_I_TXSENT) {
- return PRLTxMatchMessageID;
- }
- /* If the message failed to be sent */
- if ((uint32_t)evt & (uint32_t)Notifications::PDB_EVT_PRLTX_I_RETRYFAIL) {
- return PRLTxTransmissionError;
- }
-
- /* Silence the compiler warning */
- return PRLTxDiscardMessage;
-}
-
-/*
- * PRL_Tx_Match_MessageID state
- */
-ProtocolTransmit::protocol_tx_state ProtocolTransmit::protocol_tx_match_messageid() {
- union pd_msg goodcrc;
-
- /* Read the GoodCRC */
- fusb_read_message(&goodcrc);
-
- /* Check that the message is correct */
- if (PD_MSGTYPE_GET(&goodcrc) == PD_MSGTYPE_GOODCRC && PD_NUMOBJ_GET(&goodcrc) == 0 && PD_MESSAGEID_GET(&goodcrc) == _tx_messageidcounter) {
- return PRLTxMessageSent;
- } else {
- return PRLTxTransmissionError;
- }
-}
-
-ProtocolTransmit::protocol_tx_state ProtocolTransmit::protocol_tx_transmission_error() {
- /* Increment MessageIDCounter */
- _tx_messageidcounter = (_tx_messageidcounter + 1) % 8;
-
- /* Tell the policy engine that we failed */
- PolicyEngine::notify(PolicyEngine::Notifications::PDB_EVT_PE_TX_ERR);
-
- return PRLTxWaitMessage;
-}
-
-ProtocolTransmit::protocol_tx_state ProtocolTransmit::protocol_tx_message_sent() {
- messageSending = false;
- /* Increment MessageIDCounter */
- _tx_messageidcounter = (_tx_messageidcounter + 1) % 8;
-
- /* Tell the policy engine that we succeeded */
- PolicyEngine::notify(PolicyEngine::Notifications::PDB_EVT_PE_TX_DONE);
-
- return PRLTxWaitMessage;
-}
-
-ProtocolTransmit::protocol_tx_state ProtocolTransmit::protocol_tx_discard_message() {
- /* If we were working on sending a message, increment MessageIDCounter */
- if (messageSending) {
- _tx_messageidcounter = (_tx_messageidcounter + 1) % 8;
-
- return PRLTxPHYReset;
- } else {
- return PRLTxWaitMessage;
- }
-}
-void ProtocolTransmit::thread(const void *args) {
- (void)args;
- ProtocolTransmit::protocol_tx_state state = PRLTxPHYReset;
-
- // Init the incoming message queue
-
- while (true) {
- switch (state) {
- case PRLTxPHYReset:
- state = protocol_tx_phy_reset();
- break;
- case PRLTxWaitMessage:
- state = protocol_tx_wait_message();
- break;
- case PRLTxReset:
- state = protocol_tx_reset();
- break;
- case PRLTxConstructMessage:
- state = protocol_tx_construct_message();
- break;
- case PRLTxWaitResponse:
- state = protocol_tx_wait_response();
- break;
- case PRLTxMatchMessageID:
- state = protocol_tx_match_messageid();
- break;
- case PRLTxTransmissionError:
- state = protocol_tx_transmission_error();
- break;
- case PRLTxMessageSent:
- state = protocol_tx_message_sent();
- break;
- case PRLTxDiscardMessage:
- state = protocol_tx_discard_message();
- break;
- default:
- state = PRLTxPHYReset;
- break;
- }
- }
-}
-
-void ProtocolTransmit::notify(ProtocolTransmit::Notifications notification) {
- if (xEventGroupHandle != NULL) {
- xEventGroupSetBits(xEventGroupHandle, (uint32_t)notification);
- }
-}
-
-void ProtocolTransmit::init() {
- messagesWaiting = xQueueCreateStatic(PDB_MSG_POOL_SIZE, sizeof(union pd_msg), ucQueueStorageArea, &xStaticQueue);
-
- osThreadStaticDef(pd_txTask, thread, PDB_PRIO_PRL, 0, TaskStackSize, TaskBuffer, &TaskControlBlock);
- TaskHandle = osThreadCreate(osThread(pd_txTask), NULL);
- xEventGroupHandle = xEventGroupCreateStatic(&xCreatedEventGroup);
-}
-
-void ProtocolTransmit::pushMessage(union pd_msg *msg) {
- if (messagesWaiting) {
- if (xQueueSend(messagesWaiting, msg, 100) == pdTRUE) {
- notify(ProtocolTransmit::Notifications::PDB_EVT_PRLTX_MSG_TX);
- }
- }
-}
-
-bool ProtocolTransmit::messagePending() {
- if (messagesWaiting) {
- return uxQueueMessagesWaiting(messagesWaiting) > 0;
- }
- return false;
-}
-
-void ProtocolTransmit::getMessage() {
- // Loads the pending message into the buffer
- if (messagesWaiting) {
- xQueueReceive(messagesWaiting, &temp_msg, 1);
- }
-}
-
-ProtocolTransmit::Notifications ProtocolTransmit::waitForEvent(uint32_t mask, TickType_t ticksToWait) {
- if (xEventGroupHandle) {
- return (Notifications)xEventGroupWaitBits(xEventGroupHandle, mask, mask, pdFALSE, ticksToWait);
- }
- return (Notifications)0;
-}