Merge PCB updates
[SCSI2SD.git] / software / SCSI2SD / v4 / SCSI2SD.cydsn / Generated_Source / PSoC5 / USBFS_boot.c
1 /*******************************************************************************
2 * File Name: USBFS_boot.c
3 * Version 2.60
4 *
5 * Description:
6 *  Boot loader API for USBFS Component.
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 "USBFS.h"
18
19 #if defined(CYDEV_BOOTLOADER_IO_COMP) && ((CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS) || \
20                                           (CYDEV_BOOTLOADER_IO_COMP == CyBtldr_Custom_Interface))
21
22
23 /***************************************
24 *    Bootloader defines
25 ***************************************/
26
27 #define USBFS_CyBtLdrStarttimer(X, T)         {USBFS_universalTime = T * 10; X = 0u;}
28 #define USBFS_CyBtLdrChecktimer(X)            ((X++ < USBFS_universalTime) ? 1u : 0u)
29
30 #define USBFS_BTLDR_OUT_EP      (0x01u)
31 #define USBFS_BTLDR_IN_EP       (0x02u)
32
33
34 /***************************************
35 *    Bootloader Variables
36 ***************************************/
37
38 static uint16 USBFS_universalTime;
39 static uint8 USBFS_started = 0u;
40
41
42 /*******************************************************************************
43 * Function Name: USBFS_CyBtldrCommStart
44 ********************************************************************************
45 *
46 * Summary:
47 *  Starts the component and enables the interrupt.
48 *
49 * Parameters:
50 *  None.
51 *
52 * Return:
53 *  None.
54 *
55 * Side Effects:
56 *  This function starts the USB with 3V or 5V operation.
57 *
58 * Reentrant:
59 *  No.
60 *
61 *******************************************************************************/
62 void USBFS_CyBtldrCommStart(void) 
63 {
64     CyGlobalIntEnable;      /* Enable Global Interrupts */
65
66     /*Start USBFS Operation/device 0 and with 5V or 3V operation depend on Voltage Configuration in DWR */
67     USBFS_Start(0u, USBFS_DWR_VDDD_OPERATION);
68
69     /* USB component started, the correct enumeration will be checked in first Read operation */
70     USBFS_started = 1u;
71
72 }
73
74
75 /*******************************************************************************
76 * Function Name: USBFS_CyBtldrCommStop.
77 ********************************************************************************
78 *
79 * Summary:
80 *  Disable the component and disable the interrupt.
81 *
82 * Parameters:
83 *  None.
84 *
85 * Return:
86 *  None.
87 *
88 *******************************************************************************/
89 void USBFS_CyBtldrCommStop(void) 
90 {
91     USBFS_Stop();
92 }
93
94
95 /*******************************************************************************
96 * Function Name: USBFS_CyBtldrCommReset.
97 ********************************************************************************
98 *
99 * Summary:
100 *  Resets the receive and transmit communication Buffers.
101 *
102 * Parameters:
103 *  None.
104 *
105 * Return:
106 *  None.
107 *
108 * Reentrant:
109 *  No.
110 *
111 *******************************************************************************/
112 void USBFS_CyBtldrCommReset(void) 
113 {
114     USBFS_EnableOutEP(USBFS_BTLDR_OUT_EP);  /* Enable the OUT endpoint */
115 }
116
117
118 /*******************************************************************************
119 * Function Name: USBFS_CyBtldrCommWrite.
120 ********************************************************************************
121 *
122 * Summary:
123 *  Allows the caller to write data to the boot loader host. The function will
124 *  handle polling to allow a block of data to be completely sent to the host
125 *  device.
126 *
127 * Parameters:
128 *  pData:    A pointer to the block of data to send to the device
129 *  size:     The number of bytes to write.
130 *  count:    Pointer to an unsigned short variable to write the number of
131 *             bytes actually written.
132 *  timeOut:  Number of units to wait before returning because of a timeout.
133 *
134 * Return:
135 *  Returns the value that best describes the problem.
136 *
137 * Reentrant:
138 *  No.
139 *
140 *******************************************************************************/
141 cystatus USBFS_CyBtldrCommWrite(uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL
142                                                             
143 {
144     uint16 time;
145     cystatus status;
146
147     /* Enable IN transfer */
148     USBFS_LoadInEP(USBFS_BTLDR_IN_EP, pData, USBFS_BTLDR_SIZEOF_READ_BUFFER);
149
150     /* Start a timer to wait on. */
151     USBFS_CyBtLdrStarttimer(time, timeOut);
152
153     /* Wait for the master to read it. */
154     while((USBFS_GetEPState(USBFS_BTLDR_IN_EP) == USBFS_IN_BUFFER_FULL) && \
155            USBFS_CyBtLdrChecktimer(time))
156     {
157         CyDelay(1u); /* 1ms delay */
158     }
159
160     if (USBFS_GetEPState(USBFS_BTLDR_IN_EP) == USBFS_IN_BUFFER_FULL)
161     {
162         status = CYRET_TIMEOUT;
163     }
164     else
165     {
166         *count = size;
167         status = CYRET_SUCCESS;
168     }
169
170     return(status);
171 }
172
173
174 /*******************************************************************************
175 * Function Name: USBFS_CyBtldrCommRead.
176 ********************************************************************************
177 *
178 * Summary:
179 *  Allows the caller to read data from the boot loader host. The function will
180 *  handle polling to allow a block of data to be completely received from the
181 *  host device.
182 *
183 * Parameters:
184 *  pData:    A pointer to the area to store the block of data received
185 *             from the device.
186 *  size:     The number of bytes to read.
187 *  count:    Pointer to an unsigned short variable to write the number
188 *             of bytes actually read.
189 *  timeOut:  Number of units to wait before returning because of a timeOut.
190 *            Timeout is measured in 10s of ms.
191 *
192 * Return:
193 *  Returns the value that best describes the problem.
194 *
195 * Reentrant:
196 *  No.
197 *
198 *******************************************************************************/
199 cystatus USBFS_CyBtldrCommRead(uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL
200                                                             
201 {
202     cystatus status;
203     uint16 time;
204
205     if(size > USBFS_BTLDR_SIZEOF_WRITE_BUFFER)
206     {
207         size = USBFS_BTLDR_SIZEOF_WRITE_BUFFER;
208     }
209     /* Start a timer to wait on. */
210     USBFS_CyBtLdrStarttimer(time, timeOut);
211
212     /* Wait on enumeration in first time */
213     if(USBFS_started)
214     {
215         /* Wait for Device to enumerate */
216         while(!USBFS_GetConfiguration() && USBFS_CyBtLdrChecktimer(time))
217         {
218             CyDelay(1u); /* 1ms delay */
219         }
220         /* Enable first OUT, if enumeration complete */
221         if(USBFS_GetConfiguration())
222         {
223             USBFS_IsConfigurationChanged();  /* Clear configuration changes state status */
224             USBFS_CyBtldrCommReset();
225             USBFS_started = 0u;
226         }
227     }
228     else /* Check for configuration changes, has been done by Host */
229     {
230         if(USBFS_IsConfigurationChanged() != 0u) /* Host could send double SET_INTERFACE request or RESET */
231         {
232             if(USBFS_GetConfiguration() != 0u)   /* Init OUT endpoints when device reconfigured */
233             {
234                 USBFS_CyBtldrCommReset();
235             }
236         }
237     }
238     /* Wait on next packet */
239     while((USBFS_GetEPState(USBFS_BTLDR_OUT_EP) != USBFS_OUT_BUFFER_FULL) && \
240            USBFS_CyBtLdrChecktimer(time))
241     {
242         CyDelay(1u); /* 1ms delay */
243     }
244
245     /* OUT EP has completed */
246     if (USBFS_GetEPState(USBFS_BTLDR_OUT_EP) == USBFS_OUT_BUFFER_FULL)
247     {
248         *count = USBFS_ReadOutEP(USBFS_BTLDR_OUT_EP, pData, size);
249         status = CYRET_SUCCESS;
250     }
251     else
252     {
253         *count = 0u;
254         status = CYRET_TIMEOUT;
255     }
256     return(status);
257 }
258
259 #endif /* End CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS */
260
261
262 /* [] END OF FILE */