mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Remove reset handler
This commit is contained in:
@@ -15,12 +15,10 @@
|
|||||||
#include "protocol_rx.h"
|
#include "protocol_rx.h"
|
||||||
#include "protocol_tx.h"
|
#include "protocol_tx.h"
|
||||||
#include "int_n.h"
|
#include "int_n.h"
|
||||||
#include "hard_reset.h"
|
|
||||||
|
|
||||||
void fusb302_start_processing() {
|
void fusb302_start_processing() {
|
||||||
/* Initialize the FUSB302B */
|
/* Initialize the FUSB302B */
|
||||||
fusb_setup();
|
fusb_setup();
|
||||||
ResetHandler::init();
|
|
||||||
PolicyEngine::init();
|
PolicyEngine::init();
|
||||||
ProtocolTransmit::init();
|
ProtocolTransmit::init();
|
||||||
ProtocolReceive::init();
|
ProtocolReceive::init();
|
||||||
|
|||||||
@@ -1,152 +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 "hard_reset.h"
|
|
||||||
#include "fusbpd.h"
|
|
||||||
#include <pd.h>
|
|
||||||
#include "policy_engine.h"
|
|
||||||
#include "protocol_rx.h"
|
|
||||||
#include "protocol_tx.h"
|
|
||||||
#include "fusb302b.h"
|
|
||||||
|
|
||||||
osThreadId ResetHandler::TaskHandle = NULL;
|
|
||||||
uint32_t ResetHandler::TaskBuffer[ResetHandler::TaskStackSize];
|
|
||||||
osStaticThreadDef_t ResetHandler::TaskControlBlock;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PRL_HR_Reset_Layer state
|
|
||||||
*/
|
|
||||||
ResetHandler::hardrst_state ResetHandler::hardrst_reset_layer() {
|
|
||||||
/* First, wait for the signal to run a hard reset. */
|
|
||||||
eventmask_t evt = waitForEvent(
|
|
||||||
PDB_EVT_HARDRST_RESET | PDB_EVT_HARDRST_I_HARDRST);
|
|
||||||
if (evt & (PDB_EVT_HARDRST_RESET | PDB_EVT_HARDRST_I_HARDRST)) {
|
|
||||||
/* Reset the Protocol RX machine */
|
|
||||||
ProtocolReceive::notify( PDB_EVT_PRLRX_RESET);
|
|
||||||
taskYIELD();
|
|
||||||
/* Reset the Protocol TX machine */
|
|
||||||
ProtocolTransmit::notify(
|
|
||||||
ProtocolTransmit::Notifications::PDB_EVT_PRLTX_RESET);
|
|
||||||
taskYIELD();
|
|
||||||
/* Continue the process based on what event started the reset. */
|
|
||||||
if (evt & PDB_EVT_HARDRST_RESET) {
|
|
||||||
/* Policy Engine started the reset. */
|
|
||||||
return PRLHRRequestHardReset;
|
|
||||||
} else {
|
|
||||||
/* PHY started the reset */
|
|
||||||
return PRLHRIndicateHardReset;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return PRLHRResetLayer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ResetHandler::hardrst_state ResetHandler::hardrst_indicate_hard_reset() {
|
|
||||||
/* Tell the PE that we're doing a hard reset */
|
|
||||||
PolicyEngine::notify( PDB_EVT_PE_RESET);
|
|
||||||
|
|
||||||
return PRLHRWaitPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResetHandler::hardrst_state ResetHandler::hardrst_request_hard_reset() {
|
|
||||||
/* Tell the PHY to send a hard reset */
|
|
||||||
fusb_send_hardrst();
|
|
||||||
|
|
||||||
return PRLHRWaitPHY;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResetHandler::hardrst_state ResetHandler::hardrst_wait_phy() {
|
|
||||||
/* Wait for the PHY to tell us that it's done sending the hard reset */
|
|
||||||
waitForEvent(PDB_EVT_HARDRST_I_HARDSENT, PD_T_HARD_RESET_COMPLETE);
|
|
||||||
|
|
||||||
/* Move on no matter what made us stop waiting. */
|
|
||||||
return PRLHRHardResetRequested;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResetHandler::hardrst_state ResetHandler::hardrst_hard_reset_requested() {
|
|
||||||
/* Tell the PE that the hard reset was sent */
|
|
||||||
PolicyEngine::notify( PDB_EVT_PE_HARD_SENT);
|
|
||||||
|
|
||||||
return PRLHRWaitPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResetHandler::hardrst_state ResetHandler::hardrst_wait_pe() {
|
|
||||||
/* Wait for the PE to tell us that it's done */
|
|
||||||
waitForEvent(PDB_EVT_HARDRST_DONE);
|
|
||||||
|
|
||||||
return PRLHRComplete;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResetHandler::hardrst_state ResetHandler::hardrst_complete() {
|
|
||||||
/* I'm not aware of anything we have to tell the FUSB302B, so just finish
|
|
||||||
* the reset routine. */
|
|
||||||
return PRLHRResetLayer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResetHandler::init() {
|
|
||||||
osThreadStaticDef(rstHand, Thread, PDB_PRIO_PRL, 0, TaskStackSize,
|
|
||||||
TaskBuffer, &TaskControlBlock);
|
|
||||||
TaskHandle = osThreadCreate(osThread(rstHand), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResetHandler::notify(uint32_t notification) {
|
|
||||||
if (TaskHandle != NULL) {
|
|
||||||
xTaskNotify(TaskHandle, notification, eNotifyAction::eSetBits);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResetHandler::Thread(const void *arg) {
|
|
||||||
(void) arg;
|
|
||||||
ResetHandler::hardrst_state state = PRLHRResetLayer;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
switch (state) {
|
|
||||||
case PRLHRResetLayer:
|
|
||||||
state = hardrst_reset_layer();
|
|
||||||
break;
|
|
||||||
case PRLHRIndicateHardReset:
|
|
||||||
state = hardrst_indicate_hard_reset();
|
|
||||||
break;
|
|
||||||
case PRLHRRequestHardReset:
|
|
||||||
state = hardrst_request_hard_reset();
|
|
||||||
break;
|
|
||||||
case PRLHRWaitPHY:
|
|
||||||
state = hardrst_wait_phy();
|
|
||||||
break;
|
|
||||||
case PRLHRHardResetRequested:
|
|
||||||
state = hardrst_hard_reset_requested();
|
|
||||||
break;
|
|
||||||
case PRLHRWaitPE:
|
|
||||||
state = hardrst_wait_pe();
|
|
||||||
break;
|
|
||||||
case PRLHRComplete:
|
|
||||||
state = hardrst_complete();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* This is an error. It really shouldn't happen. We might
|
|
||||||
* want to handle it anyway, though. */
|
|
||||||
state = PRLHRResetLayer;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t ResetHandler::waitForEvent(uint32_t mask, uint32_t ticksToWait) {
|
|
||||||
uint32_t pulNotificationValue;
|
|
||||||
xTaskNotifyWait(0x00, mask, &pulNotificationValue, ticksToWait);
|
|
||||||
return pulNotificationValue;
|
|
||||||
}
|
|
||||||
@@ -1,63 +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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef PDB_HARD_RESET_H
|
|
||||||
#define PDB_HARD_RESET_H
|
|
||||||
|
|
||||||
#include <pd.h>
|
|
||||||
|
|
||||||
/* Events for the Hard Reset thread */
|
|
||||||
#define PDB_EVT_HARDRST_RESET EVENT_MASK(0)
|
|
||||||
#define PDB_EVT_HARDRST_I_HARDRST EVENT_MASK(1)
|
|
||||||
#define PDB_EVT_HARDRST_I_HARDSENT EVENT_MASK(2)
|
|
||||||
#define PDB_EVT_HARDRST_DONE EVENT_MASK(3)
|
|
||||||
|
|
||||||
class ResetHandler {
|
|
||||||
public:
|
|
||||||
static void init();
|
|
||||||
static void notify(uint32_t notification);
|
|
||||||
private:
|
|
||||||
static void Thread(const void *arg);
|
|
||||||
static osThreadId TaskHandle;
|
|
||||||
static const size_t TaskStackSize = 1536 / 2;
|
|
||||||
static uint32_t TaskBuffer[TaskStackSize];
|
|
||||||
static osStaticThreadDef_t TaskControlBlock;
|
|
||||||
static uint32_t waitForEvent(uint32_t mask, uint32_t ticksToWait =
|
|
||||||
portMAX_DELAY);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hard Reset machine states
|
|
||||||
*/
|
|
||||||
enum hardrst_state {
|
|
||||||
PRLHRResetLayer,
|
|
||||||
PRLHRIndicateHardReset,
|
|
||||||
PRLHRRequestHardReset,
|
|
||||||
PRLHRWaitPHY,
|
|
||||||
PRLHRHardResetRequested,
|
|
||||||
PRLHRWaitPE,
|
|
||||||
PRLHRComplete
|
|
||||||
};
|
|
||||||
static hardrst_state hardrst_reset_layer();
|
|
||||||
static hardrst_state hardrst_indicate_hard_reset();
|
|
||||||
static hardrst_state hardrst_request_hard_reset();
|
|
||||||
static hardrst_state hardrst_wait_phy();
|
|
||||||
static hardrst_state hardrst_hard_reset_requested();
|
|
||||||
static hardrst_state hardrst_wait_pe();
|
|
||||||
static hardrst_state hardrst_complete();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* PDB_HARD_RESET_H */
|
|
||||||
@@ -21,7 +21,6 @@
|
|||||||
#include "fusb302b.h"
|
#include "fusb302b.h"
|
||||||
#include "protocol_rx.h"
|
#include "protocol_rx.h"
|
||||||
#include "protocol_tx.h"
|
#include "protocol_tx.h"
|
||||||
#include "hard_reset.h"
|
|
||||||
#include "policy_engine.h"
|
#include "policy_engine.h"
|
||||||
#include "protocol_rx.h"
|
#include "protocol_rx.h"
|
||||||
#include "protocol_tx.h"
|
#include "protocol_tx.h"
|
||||||
@@ -73,22 +72,6 @@ void InterruptHandler::Thread(const void *arg) {
|
|||||||
notifSent = true;
|
notifSent = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the I_HARDRST or I_HARDSENT flag is set, tell the Hard Reset
|
|
||||||
* thread */
|
|
||||||
|
|
||||||
if (notifSent == false) {
|
|
||||||
events = 0;
|
|
||||||
if (status.interrupta & FUSB_INTERRUPTA_I_HARDRST) {
|
|
||||||
events |= PDB_EVT_HARDRST_I_HARDRST;
|
|
||||||
notifSent = true;
|
|
||||||
} else if (status.interrupta & FUSB_INTERRUPTA_I_HARDSENT) {
|
|
||||||
events |= PDB_EVT_HARDRST_I_HARDSENT;
|
|
||||||
notifSent = true;
|
|
||||||
}
|
|
||||||
if (events) {
|
|
||||||
ResetHandler::notify(events);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* If the I_OCP_TEMP and OVRTEMP flags are set, tell the Policy
|
/* If the I_OCP_TEMP and OVRTEMP flags are set, tell the Policy
|
||||||
* Engine thread */
|
* Engine thread */
|
||||||
if (status.interrupta & FUSB_INTERRUPTA_I_OCP_TEMP
|
if (status.interrupta & FUSB_INTERRUPTA_I_OCP_TEMP
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
#include "int_n.h"
|
#include "int_n.h"
|
||||||
#include <pd.h>
|
#include <pd.h>
|
||||||
#include "protocol_tx.h"
|
#include "protocol_tx.h"
|
||||||
#include "hard_reset.h"
|
|
||||||
#include "fusb302b.h"
|
#include "fusb302b.h"
|
||||||
bool PolicyEngine::pdNegotiationComplete;
|
bool PolicyEngine::pdNegotiationComplete;
|
||||||
int PolicyEngine::current_voltage_mv;
|
int PolicyEngine::current_voltage_mv;
|
||||||
@@ -516,11 +515,8 @@ PolicyEngine::policy_engine_state PolicyEngine::pe_sink_hard_reset() {
|
|||||||
if (_hard_reset_counter > PD_N_HARD_RESET_COUNT) {
|
if (_hard_reset_counter > PD_N_HARD_RESET_COUNT) {
|
||||||
return PESinkSourceUnresponsive;
|
return PESinkSourceUnresponsive;
|
||||||
}
|
}
|
||||||
|
//So, we could send a hardreset here; however that will cause a power cycle on the PSU end.. Which will then reset this MCU
|
||||||
/* Generate a hard reset signal */
|
//So therefore we went get anywhere :)
|
||||||
ResetHandler::notify(PDB_EVT_HARDRST_RESET);
|
|
||||||
waitForEvent(PDB_EVT_PE_HARD_SENT);
|
|
||||||
|
|
||||||
/* Increment HardResetCounter */
|
/* Increment HardResetCounter */
|
||||||
_hard_reset_counter++;
|
_hard_reset_counter++;
|
||||||
|
|
||||||
@@ -537,9 +533,6 @@ PolicyEngine::policy_engine_state PolicyEngine::pe_sink_transition_default() {
|
|||||||
/* Since we never change our data role from UFP, there is no reason to set
|
/* Since we never change our data role from UFP, there is no reason to set
|
||||||
* it here. */
|
* it here. */
|
||||||
|
|
||||||
/* Tell the protocol layer we're done with the reset */
|
|
||||||
ResetHandler::notify( PDB_EVT_HARDRST_DONE);
|
|
||||||
|
|
||||||
return PESinkStartup;
|
return PESinkStartup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user