SN32F24xB: Add remote wakeup and examples of suspend handling

This commit is contained in:
stdvar 2021-04-11 00:49:02 -04:00 committed by Dimitris Mantzouranis
parent 8f693258a3
commit 52acdb5527
4 changed files with 39 additions and 1 deletions

View File

@ -213,6 +213,12 @@ static void usb_lld_serve_interrupt(USBDriver *usbp)
/* Suspend */
__USB_CLRINSTS(mskBUS_SUSPEND);
_usb_suspend(usbp);
//USB suspend will put MCU in sleep mode with lower clock
//and disable execution of user code allowing only interrupt to execute
//keeping it here just for reference on how to could be done
//not necessary for remote wakeup to work
//uncomment if want to experiment with suspend mode
//USB_SuspendEvent();
}
else if(iwIntFlag & mskBUS_RESUME)
{

View File

@ -28,6 +28,7 @@
#if (HAL_USE_USB == TRUE) || defined(__DOXYGEN__)
#include "sn32_usb.h"
#include "usbhw.h"
/*===========================================================================*/
/* Driver constants. */
@ -362,7 +363,9 @@ struct USBDriver {
*
* @notapi
*/
#define usb_lld_wakeup_host(usbp)
#define usb_lld_wakeup_host(usbp) { \
USB_RemoteWakeUp(); \
}
/*===========================================================================*/
/* External declarations. */

View File

@ -362,3 +362,31 @@ void USB_WakeupEvent(void)
__USB_CLRINSTS(mskBUS_WAKEUP); //** Clear BUS_WAKEUP
}
/*****************************************************************************
* Function : USB_SuspendEvent
* Description : puts MCU in sleep mode
* Input : None
* Output : None
* Return : None
* Note : None
*****************************************************************************/
void USB_SuspendEvent(void)
{
__USB_PHY_DISABLE;
SN_USB->INTEN = 0;
//** switch ILRC
SN_SYS0->CLKCFG = 0x01;
//** check ILRC status
while((SN_SYS0->CLKCFG & 0x10) != 0x10);
//** switch SYSCLK / 4 DO NOT set SYSCLK / 1 or SYSCLK / 2!!!!
SN_SYS0->AHBCP = 2;
//** disable IHRC
SN_SYS0->ANBCTRL = 0;
SN_USB->INTEN = (mskBUS_IE|mskUSB_IE|mskEPnACK_EN|mskBUSWK_IE);
SN_USB->INTEN |= mskEP1_NAK_EN;
SN_USB->INTEN |= mskEP2_NAK_EN;
SN_USB->INTEN |= mskEP3_NAK_EN;
SN_USB->INTEN |= mskEP4_NAK_EN;
SN_USB->INTEN |= mskUSB_SOF_IE;
SN_PMU->CTRL = 0x04;
}

View File

@ -222,5 +222,6 @@ extern void USB_EPnBufferOffset(uint32_t wEPNum, uint32_t wAddr);
extern void USB_ReturntoNormal(void);
extern void USB_ResetEvent(void);
extern void USB_WakeupEvent(void);
extern void USB_SuspendEvent(void);
#endif /* __USBHW_H__ */