1: uhs_status_t Usbh_Cdc_Open(
void* pContext)
2: {
3:
PCDC_DEVICE pCdcDevice;
4: uhs_status_t nRetvalResorce;
5: CDC_FUNC_STATUS nRetval;
6: uhs_ubit8_t u8CntDeviceId;
7: uhs_status_t nRetStatus;
8:
9:
10:
11:
12: DIAPI_CDC_REPORT_MILESTONE( USBCDC_CHKPOINTS_API_OPEN );
13:
14:
15:
16:
17:
if( pContext == NULL) {
18: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_SYS_PARAM_ERROR );
19:
return(
USBCDC_API_PARAM_ERROR );
20: }
21:
22:
23:
24:
25:
if( g_pCdcDriver == NULL ) {
26: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_NOT_INIT );
27:
return(
USBCDC_API_SYS_SYSTEM_ERROR );
28: }
29:
30:
31:
32:
33:
34: nRetStatus = Usbh_Cdc_CheckDeviceStatus(pContext, &pCdcDevice, &u8CntDeviceId, ID_API_DET);
35:
if(nRetStatus !=
USBCDC_API_SUCCESS){
36: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_SYS_SYSTEM_ERROR );
37:
return(nRetStatus);
38: }
39:
40:
41:
42:
43: nRetvalResorce = CdcUtils_AcquisitionSemaphore(pCdcDevice->pDataInExecuteLock, WAITFOREVER);
44:
if( nRetvalResorce != TRUE ){
45:
46:
47:
48: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
49: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_SYS_OUT_OF_RESOURCE );
50:
return(
USBCDC_API_SYS_OUT_OF_RESOURCE );
51: }
52:
53:
54:
55:
56:
if( (pCdcDevice->nDeviceStat == CDC_DEVICE_STAT_CONNECTING) ||
57: (pCdcDevice->nDeviceStat == CDC_DEVICE_STAT_REGIST) ) {
58:
59:
60:
61: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pDataInExecuteLock );
62: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
63: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_NOT_USE );
64:
return(
USBCDC_API_NOT_READY );
65: }
66:
else if( pCdcDevice->nDeviceStat == CDC_DEVICE_STAT_NO_SUPPORT ) {
67:
68:
69:
70: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pDataInExecuteLock );
71: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
72: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_NO_SUPPORT );
73:
return(
USBCDC_API_NO_SUPPORT );
74: }
75:
else if( pCdcDevice->nDeviceStat == CDC_DEVICE_STAT_OPEN ) {
76:
77:
78:
79: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pDataInExecuteLock );
80: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
81: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_ALREADY_OPEN );
82:
return(
USBCDC_API_ALREADY_OPEN );
83: }
84:
else {
85: ;
86: }
87:
88:
89:
90:
91:
if( (pCdcDevice->pBulkInBuff->pu8StartBuff = (uhs_ubit8_t*)CdcUtils_BuffMalloc((uhs_size_t) (pCdcDevice->pBulkInBuff->u8TotalBuffSize * 1024))) == NULL ) {
92:
93:
94:
95: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pDataInExecuteLock );
96: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
97:
98:
99: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_SYS_OUT_OF_RESOURCE );
100:
return(
USBCDC_API_SYS_OUT_OF_RESOURCE );
101: }
102: pCdcDevice->pBulkInBuff->pu8EndBuff = (pCdcDevice->pBulkInBuff->pu8StartBuff + (pCdcDevice->pBulkInBuff->u8TotalBuffSize * 1024));
103: pCdcDevice->pBulkInBuff->pu8ReadPos = pCdcDevice->pBulkInBuff->pu8StartBuff;
104: pCdcDevice->pBulkInBuff->pu8WritePos = pCdcDevice->pBulkInBuff->pu8StartBuff;
105: pCdcDevice->pBulkInBuff->u32RemainBuffSize = (pCdcDevice->pBulkInBuff->u8TotalBuffSize * 1024);
106:
107:
108:
109:
110:
if( (pCdcDevice->pBulkInBuff->pu8TempBuff = (uhs_ubit8_t*)CdcUtils_BuffMalloc((uhs_size_t) (CDC_BULKIN_TEMP_BUFF_SIZE))) == NULL ) {
111:
112:
113: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8StartBuff );
114: pCdcDevice->pBulkInBuff->pu8StartBuff = NULL;
115: pCdcDevice->pBulkInBuff->pu8EndBuff = NULL;
116: pCdcDevice->pBulkInBuff->pu8ReadPos = NULL;
117: pCdcDevice->pBulkInBuff->pu8WritePos = NULL;
118: pCdcDevice->pBulkInBuff->u32RemainBuffSize = 0;
119:
120:
121:
122:
123: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pDataInExecuteLock );
124: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
125:
126:
127: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_SYS_OUT_OF_RESOURCE );
128:
return(
USBCDC_API_SYS_OUT_OF_RESOURCE );
129: }
130:
131:
132:
133:
134: nRetvalResorce = CdcUtils_AcquisitionSemaphore(pCdcDevice->pBulkINBuffAccessLock, WAITFOREVER);
135:
if( nRetvalResorce != TRUE ){
136:
137:
138: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8TempBuff );
139: pCdcDevice->pBulkInBuff->pu8TempBuff = NULL;
140:
141:
142:
143: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8StartBuff );
144: pCdcDevice->pBulkInBuff->pu8StartBuff = NULL;
145: pCdcDevice->pBulkInBuff->pu8EndBuff = NULL;
146: pCdcDevice->pBulkInBuff->pu8ReadPos = NULL;
147: pCdcDevice->pBulkInBuff->pu8WritePos = NULL;
148: pCdcDevice->pBulkInBuff->u32RemainBuffSize = 0;
149:
150:
151:
152:
153: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pDataInExecuteLock );
154: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
155:
156:
157: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_SYS_OUT_OF_RESOURCE );
158:
return(
USBCDC_API_SYS_OUT_OF_RESOURCE );
159: }
160:
161:
162:
163:
164: nRetval = Usbh_Cdc_IssueBulkINMsg(pCdcDevice);
165:
if(nRetval != CDC_FUNC_STATUS_SUCCESS ) {
166:
167:
168: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8TempBuff );
169: pCdcDevice->pBulkInBuff->pu8TempBuff = NULL;
170:
171:
172:
173: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8StartBuff );
174: pCdcDevice->pBulkInBuff->pu8StartBuff = NULL;
175: pCdcDevice->pBulkInBuff->pu8EndBuff = NULL;
176: pCdcDevice->pBulkInBuff->pu8ReadPos = NULL;
177: pCdcDevice->pBulkInBuff->pu8WritePos = NULL;
178: pCdcDevice->pBulkInBuff->u32RemainBuffSize = 0;
179:
180:
181:
182: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pBulkINBuffAccessLock );
183:
184:
185:
186:
187: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pDataInExecuteLock );
188: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
189:
190:
191: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_FAILED_BULK );
192:
return(
USBCDC_API_TRANS_DATA_FAILED );
193: }
194:
195:
196:
197:
198: pCdcDevice->nDeviceStat = CDC_DEVICE_STAT_OPEN;
199:
200:
201:
202: pCdcDevice->pBulkInBuff->isBulkINFlag = TRUE;
203:
204:
205:
206: pCdcDevice->pBulkInBuff->isBulkINUserFlag = TRUE;
207:
208:
209:
210:
211: nRetvalResorce = CdcUtils_ReleaseSemaphore( pCdcDevice->pBulkINBuffAccessLock );
212:
if(nRetvalResorce != TRUE){
213:
214:
215: (
void)CdcUtils_AcquisitionSemaphore(pCdcDevice->pBulkINBuffAccessLock, WAITFOREVER);
216:
217:
218:
219: (
void)Usbh_Cdc_StopBulkINMsg(pCdcDevice);
220:
221: pCdcDevice->nDeviceStat = CDC_DEVICE_STAT_CLOSE;
222: pCdcDevice->pBulkInBuff->isBulkINFlag = FALSE;
223: pCdcDevice->pBulkInBuff->isBulkINUserFlag = FALSE;
224:
225:
226:
227: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pBulkINBuffAccessLock );
228:
229:
230:
231: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8TempBuff );
232: pCdcDevice->pBulkInBuff->pu8TempBuff = NULL;
233:
234:
235:
236: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8StartBuff );
237: pCdcDevice->pBulkInBuff->pu8StartBuff = NULL;
238: pCdcDevice->pBulkInBuff->pu8EndBuff = NULL;
239: pCdcDevice->pBulkInBuff->pu8ReadPos = NULL;
240: pCdcDevice->pBulkInBuff->pu8WritePos = NULL;
241: pCdcDevice->pBulkInBuff->u32RemainBuffSize = 0;
242:
243:
244:
245:
246: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pDataInExecuteLock );
247: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
248:
249:
250: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_SYS_OUT_OF_RESOURCE );
251:
return(
USBCDC_API_SYS_OUT_OF_RESOURCE );
252: }
253:
254:
255:
256:
257: nRetvalResorce = CdcUtils_ReleaseSemaphore( pCdcDevice->pDataInExecuteLock );
258:
if(nRetvalResorce != TRUE){
259:
260:
261: (
void)CdcUtils_AcquisitionSemaphore(pCdcDevice->pBulkINBuffAccessLock, WAITFOREVER);
262:
263:
264:
265: (
void)Usbh_Cdc_StopBulkINMsg(pCdcDevice);
266:
267: pCdcDevice->nDeviceStat = CDC_DEVICE_STAT_CLOSE;
268: pCdcDevice->pBulkInBuff->isBulkINFlag = FALSE;
269: pCdcDevice->pBulkInBuff->isBulkINUserFlag = FALSE;
270:
271:
272:
273: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pBulkINBuffAccessLock );
274:
275:
276:
277: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8TempBuff );
278: pCdcDevice->pBulkInBuff->pu8TempBuff = NULL;
279:
280:
281:
282: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8StartBuff );
283: pCdcDevice->pBulkInBuff->pu8StartBuff = NULL;
284: pCdcDevice->pBulkInBuff->pu8EndBuff = NULL;
285: pCdcDevice->pBulkInBuff->pu8ReadPos = NULL;
286: pCdcDevice->pBulkInBuff->pu8WritePos = NULL;
287: pCdcDevice->pBulkInBuff->u32RemainBuffSize = 0;
288:
289:
290:
291: (
void)CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
292:
293:
294: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_SYS_OUT_OF_RESOURCE );
295:
return(
USBCDC_API_SYS_OUT_OF_RESOURCE );
296: }
297:
298:
299:
300:
301: nRetvalResorce = CdcUtils_ReleaseSemaphore( g_pCdcDriver->pApiDetAccessLock[u8CntDeviceId] );
302:
if(nRetvalResorce != TRUE){
303:
304:
305: (
void)CdcUtils_AcquisitionSemaphore(pCdcDevice->pBulkINBuffAccessLock, WAITFOREVER);
306:
307:
308:
309: (
void)Usbh_Cdc_StopBulkINMsg(pCdcDevice);
310:
311: pCdcDevice->nDeviceStat = CDC_DEVICE_STAT_CLOSE;
312: pCdcDevice->pBulkInBuff->isBulkINFlag = FALSE;
313: pCdcDevice->pBulkInBuff->isBulkINUserFlag = FALSE;
314:
315:
316:
317: (
void)CdcUtils_ReleaseSemaphore( pCdcDevice->pBulkINBuffAccessLock );
318:
319:
320:
321: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8TempBuff );
322: pCdcDevice->pBulkInBuff->pu8TempBuff = NULL;
323:
324:
325:
326: (
void)CdcUtils_BuffFree( pCdcDevice->pBulkInBuff->pu8StartBuff );
327: pCdcDevice->pBulkInBuff->pu8StartBuff = NULL;
328: pCdcDevice->pBulkInBuff->pu8EndBuff = NULL;
329: pCdcDevice->pBulkInBuff->pu8ReadPos = NULL;
330: pCdcDevice->pBulkInBuff->pu8WritePos = NULL;
331: pCdcDevice->pBulkInBuff->u32RemainBuffSize = 0;
332:
333:
334: DIAPI_CDC_REPORT_SUMMARY( USBCDC_LOG_SYS_OUT_OF_RESOURCE );
335:
return(
USBCDC_API_SYS_OUT_OF_RESOURCE );
336: }
337:
338:
339:
340:
341: DIAPI_CDC_REPORT_MILESTONE( USBCDC_CHKPOINTS_API_OPEN_FINISH );
342:
343:
return(
USBCDC_API_SUCCESS );
344: }