Added support for v4.2 boards
[SCSI2SD.git] / software / SCSI2SD / v4 / SCSI2SD.cydsn / Generated_Source / PSoC5 / USBFS_pm.c
1 /*******************************************************************************
2 * File Name: USBFS_pm.c
3 * Version 2.60
4 *
5 * Description:
6 *  This file provides Suspend/Resume APIs functionality.
7 *
8 * Note:
9 *
10 ********************************************************************************
11 * Copyright 2008-2013, Cypress Semiconductor Corporation.  All rights reserved.
12 * You may use this file only in accordance with the license, terms, conditions,
13 * disclaimers, and limitations in the end user license agreement accompanying
14 * the software package with which this file was provided.
15 *******************************************************************************/
16
17 #include "project.h"
18 #include "USBFS.h"
19 #include "USBFS_pvt.h"
20
21
22 /***************************************
23 * Custom Declarations
24 ***************************************/
25 /* `#START PM_CUSTOM_DECLARATIONS` Place your declaration here */
26
27 /* `#END` */
28
29
30 /***************************************
31 * Local data allocation
32 ***************************************/
33
34 static USBFS_BACKUP_STRUCT  USBFS_backup;
35
36
37 #if(USBFS_DP_ISR_REMOVE == 0u)
38
39
40     /*******************************************************************************
41     * Function Name: USBFS_DP_Interrupt
42     ********************************************************************************
43     *
44     * Summary:
45     *  This Interrupt Service Routine handles DP pin changes for wake-up from
46     *  the sleep mode.
47     *
48     * Parameters:
49     *  None.
50     *
51     * Return:
52     *  None.
53     *
54     *******************************************************************************/
55     CY_ISR(USBFS_DP_ISR)
56     {
57         /* `#START DP_USER_CODE` Place your code here */
58
59         /* `#END` */
60
61         /* Clears active interrupt */
62         CY_GET_REG8(USBFS_DP_INTSTAT_PTR);
63     }
64
65 #endif /* (USBFS_DP_ISR_REMOVE == 0u) */
66
67
68 /*******************************************************************************
69 * Function Name: USBFS_SaveConfig
70 ********************************************************************************
71 *
72 * Summary:
73 *  Saves the current user configuration.
74 *
75 * Parameters:
76 *  None.
77 *
78 * Return:
79 *  None.
80 *
81 * Reentrant:
82 *  No.
83 *
84 *******************************************************************************/
85 void USBFS_SaveConfig(void) 
86 {
87
88 }
89
90
91 /*******************************************************************************
92 * Function Name: USBFS_RestoreConfig
93 ********************************************************************************
94 *
95 * Summary:
96 *  Restores the current user configuration.
97 *
98 * Parameters:
99 *  None.
100 *
101 * Return:
102 *  None.
103 *
104 * Reentrant:
105 *  No.
106 *
107 *******************************************************************************/
108 void USBFS_RestoreConfig(void) 
109 {
110     if(USBFS_configuration != 0u)
111     {
112         USBFS_ConfigReg();
113     }
114 }
115
116
117 /*******************************************************************************
118 * Function Name: USBFS_Suspend
119 ********************************************************************************
120 *
121 * Summary:
122 *  This function disables the USBFS block and prepares for power donwn mode.
123 *
124 * Parameters:
125 *  None.
126 *
127 * Return:
128 *   None.
129 *
130 * Global variables:
131 *  USBFS_backup.enable:  modified.
132 *
133 * Reentrant:
134 *  No.
135 *
136 *******************************************************************************/
137 void USBFS_Suspend(void) 
138 {
139     uint8 enableInterrupts;
140     enableInterrupts = CyEnterCriticalSection();
141
142     if((CY_GET_REG8(USBFS_CR0_PTR) & USBFS_CR0_ENABLE) != 0u)
143     {   /* USB block is enabled */
144         USBFS_backup.enableState = 1u;
145
146         #if(USBFS_EP_MM != USBFS__EP_MANUAL)
147             USBFS_Stop_DMA(USBFS_MAX_EP);     /* Stop all DMAs */
148         #endif   /* End USBFS_EP_MM != USBFS__EP_MANUAL */
149
150         /* Ensure USB transmit enable is low (USB_USBIO_CR0.ten). - Manual Transmission - Disabled */
151         USBFS_USBIO_CR0_REG &= (uint8)~USBFS_USBIO_CR0_TEN;
152         CyDelayUs(0u);  /*~50ns delay */
153
154         /* Disable the USBIO by asserting PM.USB_CR0.fsusbio_pd_n(Inverted) and pd_pullup_hv(Inverted) high. */
155         USBFS_PM_USB_CR0_REG &=
156                                 (uint8)~(USBFS_PM_USB_CR0_PD_N | USBFS_PM_USB_CR0_PD_PULLUP_N);
157
158         /* Disable the SIE */
159         USBFS_CR0_REG &= (uint8)~USBFS_CR0_ENABLE;
160
161         CyDelayUs(0u);  /*~50ns delay */
162         /* Store mode and Disable VRegulator*/
163         USBFS_backup.mode = USBFS_CR1_REG & USBFS_CR1_REG_ENABLE;
164         USBFS_CR1_REG &= (uint8)~USBFS_CR1_REG_ENABLE;
165
166         CyDelayUs(1u);  /* 0.5 us min delay */
167         /* Disable the USBIO reference by setting PM.USB_CR0.fsusbio_ref_en.*/
168         USBFS_PM_USB_CR0_REG &= (uint8)~USBFS_PM_USB_CR0_REF_EN;
169
170         /* Switch DP and DM terminals to GPIO mode and disconnect 1.5k pullup*/
171         USBFS_USBIO_CR1_REG |= USBFS_USBIO_CR1_IOMODE;
172
173         /* Disable USB in ACT PM */
174         USBFS_PM_ACT_CFG_REG &= (uint8)~USBFS_PM_ACT_EN_FSUSB;
175         /* Disable USB block for Standby Power Mode */
176         USBFS_PM_STBY_CFG_REG &= (uint8)~USBFS_PM_STBY_EN_FSUSB;
177         CyDelayUs(1u); /* min  0.5us delay required */
178
179     }
180     else
181     {
182         USBFS_backup.enableState = 0u;
183     }
184     CyExitCriticalSection(enableInterrupts);
185
186     /* Set the DP Interrupt for wake-up from sleep mode. */
187     #if(USBFS_DP_ISR_REMOVE == 0u)
188         (void) CyIntSetVector(USBFS_DP_INTC_VECT_NUM,   &USBFS_DP_ISR);
189         CyIntSetPriority(USBFS_DP_INTC_VECT_NUM, USBFS_DP_INTC_PRIOR);
190         CyIntClearPending(USBFS_DP_INTC_VECT_NUM);
191         CyIntEnable(USBFS_DP_INTC_VECT_NUM);
192     #endif /* (USBFS_DP_ISR_REMOVE == 0u) */
193
194 }
195
196
197 /*******************************************************************************
198 * Function Name: USBFS_Resume
199 ********************************************************************************
200 *
201 * Summary:
202 *  This function enables the USBFS block after power down mode.
203 *
204 * Parameters:
205 *  None.
206 *
207 * Return:
208 *  None.
209 *
210 * Global variables:
211 *  USBFS_backup - checked.
212 *
213 * Reentrant:
214 *  No.
215 *
216 *******************************************************************************/
217 void USBFS_Resume(void) 
218 {
219     uint8 enableInterrupts;
220     enableInterrupts = CyEnterCriticalSection();
221
222     if(USBFS_backup.enableState != 0u)
223     {
224         #if(USBFS_DP_ISR_REMOVE == 0u)
225             CyIntDisable(USBFS_DP_INTC_VECT_NUM);
226         #endif /* End USBFS_DP_ISR_REMOVE */
227
228         /* Enable USB block */
229         USBFS_PM_ACT_CFG_REG |= USBFS_PM_ACT_EN_FSUSB;
230         /* Enable USB block for Standby Power Mode */
231         USBFS_PM_STBY_CFG_REG |= USBFS_PM_STBY_EN_FSUSB;
232         /* Enable core clock */
233         USBFS_USB_CLK_EN_REG |= USBFS_USB_CLK_ENABLE;
234
235         /* Enable the USBIO reference by setting PM.USB_CR0.fsusbio_ref_en.*/
236         USBFS_PM_USB_CR0_REG |= USBFS_PM_USB_CR0_REF_EN;
237         /* The reference will be available ~40us after power restored */
238         CyDelayUs(40u);
239         /* Return VRegulator*/
240         USBFS_CR1_REG |= USBFS_backup.mode;
241         CyDelayUs(0u);  /*~50ns delay */
242         /* Enable USBIO */
243         USBFS_PM_USB_CR0_REG |= USBFS_PM_USB_CR0_PD_N;
244         CyDelayUs(2u);
245         /* Set the USBIO pull-up enable */
246         USBFS_PM_USB_CR0_REG |= USBFS_PM_USB_CR0_PD_PULLUP_N;
247
248         /* Reinit Arbiter configuration for DMA transfers */
249         #if(USBFS_EP_MM != USBFS__EP_MANUAL)
250             /* usb arb interrupt enable */
251             USBFS_ARB_INT_EN_REG = USBFS_ARB_INT_MASK;
252             #if(USBFS_EP_MM == USBFS__EP_DMAMANUAL)
253                 USBFS_ARB_CFG_REG = USBFS_ARB_CFG_MANUAL_DMA;
254             #endif   /* End USBFS_EP_MM == USBFS__EP_DMAMANUAL */
255             #if(USBFS_EP_MM == USBFS__EP_DMAAUTO)
256                 /*Set cfg cmplt this rises DMA request when the full configuration is done */
257                 USBFS_ARB_CFG_REG = USBFS_ARB_CFG_AUTO_DMA | USBFS_ARB_CFG_AUTO_MEM;
258             #endif   /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */
259         #endif   /* End USBFS_EP_MM != USBFS__EP_MANUAL */
260
261         /* STALL_IN_OUT */
262         CY_SET_REG8(USBFS_EP0_CR_PTR, USBFS_MODE_STALL_IN_OUT);
263         /* Enable the SIE with a last address */
264         USBFS_CR0_REG |= USBFS_CR0_ENABLE;
265         CyDelayCycles(1u);
266         /* Finally, Enable d+ pullup and select iomode to USB mode*/
267         CY_SET_REG8(USBFS_USBIO_CR1_PTR, USBFS_USBIO_CR1_USBPUEN);
268
269         /* Restore USB register settings */
270         USBFS_RestoreConfig();
271
272     }
273     CyExitCriticalSection(enableInterrupts);
274 }
275
276
277 /* [] END OF FILE */