1 /*
2 *********************************************************************************************************
3 * MELIS
4 * the Easy Portable/Player Develop Kits
5 * WEBCAM Driver
6 *
7 * (c) Copyright 2012-2016, Kingvan.Tong China
8 * All Rights Reserved
9 *
10 * File : drv_webcam.h
11 * By : Kingvan
12 * Version : v1.0
13 * Date : 2012-9-27
14 * Descript:
15 * Update : date auther ver notes
16 * 2012-9-27 11:09:13 Kingvan.Tong 2.0 build the file.
17 *********************************************************************************************************
18 */
19
20 #include "dev_webcam_i.h"
21 #include "webcam_dev_i.h"
22 #include "hal_log.h"
23 #include "hal_mem.h"
24 #include "typedef.h"
25 #include "string.h"
26
27 __webcam_dev_t *pWebcamDevNode = NULL;
28
29 static __u32 first_flag=0;
30 static __u32 pts=0;
31 static __u32 valid_mode_idx=0;
32 static __s32 lost_frame_num = 0;
33
translate_frame_id_to_index(__s32 frame_id)34 __s32 translate_frame_id_to_index(__s32 frame_id)
35 {
36 //__s32 index;
37 return (frame_id & 0x0F);
38 }
39
webcam_irq_handle(__u32 * addr0,__u32 * addr1,__u32 * addr2)40 static __s32 webcam_irq_handle(__u32* addr0, __u32* addr1, __u32* addr2 )
41 {
42 __s32 frame_id;//index切切不要用全局变量
43
44 hal_log_info("webcam irq\n");
45 if(first_flag==0)
46 {
47 first_flag=1;
48 hal_log_info("webcam first irq\n");
49 frame_id = pWebcamDevNode->free2->delete_element(pWebcamDevNode->free2);
50 if (frame_id != -1)
51 {//在free中请求buffer成功
52
53 __s32 index = translate_frame_id_to_index(frame_id);
54
55 if( addr0 != NULL ) *addr0 = pWebcamDevNode->webcam_frame[index].addr[0];
56 if( addr1 != NULL ) *addr1 = pWebcamDevNode->webcam_frame[index].addr[1];
57 if( addr2 != NULL ) *addr2 = pWebcamDevNode->webcam_frame[index].addr[2];
58
59 pWebcamDevNode->frame_id_last_b = frame_id;
60
61 }
62 else
63 {
64 hal_log_err("webcam no buffer!\n");
65 }
66
67 goto done;
68 }
69
70 if (pWebcamDevNode->pts_flag==0)
71 {
72 pWebcamDevNode->pts += (__s64)(webcam_mode.frame_period);
73 }
74 else if(pWebcamDevNode->pts_flag == 1)
75 {
76 if(pWebcamDevNode->CB_GetPts)
77 {
78 pWebcamDevNode->CB_GetPts((void*)&pWebcamDevNode->pts);
79 if((__u32)(pWebcamDevNode->pts)-pts>webcam_mode_all.webcam_mode[valid_mode_idx].frame_period*(1.2))
80 {
81 hal_log_err("frame period not match, delta = %d\n",(__u32)(pWebcamDevNode->pts)-pts);
82 }
83 pts = (__u32)(pWebcamDevNode->pts);
84 }
85 else
86 {
87 // //hal_log_err("CB_GetPts callback is not set!\n");
88 pWebcamDevNode->pts = 0;
89 }
90 }
91 else
92 {
93 pWebcamDevNode->pts = 0;
94 }
95
96 hal_log_info("pWebcamDevNode->pts_flag=%d pWebcamDevNode->pts=%d\n",pWebcamDevNode->pts_flag,(pWebcamDevNode->pts&0xffffffff));
97 frame_id = pWebcamDevNode->free2->delete_element(pWebcamDevNode->free2);
98 hal_log_info("frame_id=%x\n",frame_id);
99 if (frame_id != -1)//在free中请求buffer成功
100 {
101 __s32 nTmpIndex = translate_frame_id_to_index(frame_id);
102
103 if( addr0 != NULL ) *addr0 = pWebcamDevNode->webcam_frame[nTmpIndex].addr[0];
104 if( addr1 != NULL ) *addr1 = pWebcamDevNode->webcam_frame[nTmpIndex].addr[1];
105 if( addr2 != NULL ) *addr2 = pWebcamDevNode->webcam_frame[nTmpIndex].addr[2];
106
107 nTmpIndex = translate_frame_id_to_index(pWebcamDevNode->frame_id_last);
108 pWebcamDevNode->webcam_frame[nTmpIndex].uPts = pWebcamDevNode->pts;//
109
110 pWebcamDevNode->full2->insert_element(pWebcamDevNode->full2, pWebcamDevNode->frame_id_last);
111 pWebcamDevNode->frame_id_last = pWebcamDevNode->frame_id_last_b;
112 pWebcamDevNode->frame_id_last_b = frame_id;
113 }
114 else
115 {
116 hal_log_info("****webcam lost frame[%d] ****\n", lost_frame_num++);
117 }
118
119 done:
120
121 return EPDK_OK;
122 }
123
webcam_check_mode_valid(void)124 __s32 webcam_check_mode_valid(void)
125 {
126 __u32 i;
127 for (i=0;i<webcam_mode_all.number;i++)
128 {
129 hal_log_err("mode%d:%dx%d@%d#color_fmt=%d buf_scmode=%d\n",i, webcam_mode_all.webcam_mode[i].size.width, webcam_mode_all.webcam_mode[i].size.height, webcam_mode_all.webcam_mode[i].frame_rate, (__u32)webcam_mode_all.webcam_mode[i].color_format, webcam_mode_all.webcam_mode[i].webcam_buf_scrab_mode);
130 if ((webcam_mode_all.webcam_mode[i].color_format == webcam_mode.color_format)&&
131 (webcam_mode_all.webcam_mode[i].color_space == webcam_mode.color_space)&&
132 (webcam_mode_all.webcam_mode[i].component_seq == webcam_mode.component_seq)&&
133 (webcam_mode_all.webcam_mode[i].frame_rate == webcam_mode.frame_rate)&&
134 (webcam_mode_all.webcam_mode[i].frame_period == webcam_mode.frame_period)&&
135 (webcam_mode_all.webcam_mode[i].store_mode == webcam_mode.store_mode)&&
136 (webcam_mode_all.webcam_mode[i].size.width == webcam_mode.size.width)&&
137 (webcam_mode_all.webcam_mode[i].size.height == webcam_mode.size.height)&&
138 (webcam_mode_all.webcam_mode[i].webcam_buf_scrab_mode == webcam_mode.webcam_buf_scrab_mode) ) {
139 hal_log_err("webcam_check_mode_valid:%d\n",i);
140 //webcam_dev_set_mode(i); //设置模式
141 valid_mode_idx = i;
142 return EPDK_OK;
143 }
144 }
145 return EPDK_FAIL;
146 }
147
WEBCAM_OpLock(void)148 static void WEBCAM_OpLock(void)
149 {
150 __u8 err;
151
152 hal_sem_wait(pWebcamDevNode->webcam_lock);
153 }
154
WEBCAM_OpUnlock(void)155 static void WEBCAM_OpUnlock(void)
156 {
157 hal_sem_post(pWebcamDevNode->webcam_lock);
158 }
159
DEV_WEBCAM_Open(void * open_arg,__u32 mode)160 __hdle DEV_WEBCAM_Open(void * open_arg, __u32 mode)
161 {
162 hal_log_err("DEV_WEBCAM_Open\n");
163 return (__hdle)&(pWebcamDevNode);
164 }
165
DEV_WEBCAM_Close(__hdle hwebcam)166 __s32 DEV_WEBCAM_Close(__hdle hwebcam)
167 {
168 hal_log_err("DEV_WEBCAM_Close\n");
169
170 return EPDK_OK;
171 }
172
DEV_WEBCAM_Read(void * pdata,__u32 size,__u32 n,__hdle hPower)173 __u32 DEV_WEBCAM_Read(void *pdata, __u32 size, __u32 n, __hdle hPower)
174 {
175 return 0;
176 }
177
DEV_WEBCAM_Write(const void * pdata,__u32 size,__u32 n,__hdle hPower)178 __u32 DEV_WEBCAM_Write(const void *pdata, __u32 size, __u32 n, __hdle hPower)
179 {
180 return size * n;
181 }
182
DEV_WEBCAM_Ioctrl(__hdle hWebcam,__u32 cmd,__s32 aux,void * pbuffer)183 __s32 DEV_WEBCAM_Ioctrl(__hdle hWebcam, __u32 cmd, __s32 aux, void *pbuffer)
184 {
185 __s32 ret;
186 __s32 i;
187
188 ret = EPDK_FAIL;
189
190 WEBCAM_OpLock();
191
192 switch(cmd)
193 {
194 case DRV_WEBCAM_CMD_INIT:
195 {
196 hal_log_err("webcam buffer number = %d\n", WEBCAM_BUFFER_NUM);
197 for (i=0; i<WEBCAM_BUFFER_NUM; i++) {
198 pWebcamDevNode->p_webcam_frame[i] = &pWebcamDevNode->webcam_frame[i];\
199 }
200
201 webcam_dev_init();
202 hal_log_err("DRV_WEBCAM_CMD_INIT\n");
203 ret = EPDK_OK;
204 break;
205 }
206 case DRV_WEBCAM_CMD_EXIT:
207 {
208 webcam_dev_exit();
209
210 hal_log_err("DRV_WEBCAM_CMD_EXIT\n");
211 ret = EPDK_OK;
212 break;
213 }
214 case DRV_WEBCAM_CMD_SET_MODE:
215 {
216 __webcam_mode_t *p=pbuffer;
217 webcam_mode = *p;
218
219 hal_log_err("DRV_WEBCAM_CMD_SET_MODE\n");
220 ret = EPDK_OK;
221 break;
222 }
223 case DRV_WEBCAM_CMD_GET_MODE:
224 {
225 __webcam_mode_t *p=pbuffer;
226 *p = webcam_mode;
227
228 hal_log_err("DRV_WEBCAM_CMD_GET_MODE\n");
229 ret = EPDK_OK;
230 break;
231 }
232 case DRV_WEBCAM_CMD_GET_MODE_ALL:
233 {
234 __webcam_mode_all_t *p = pbuffer;
235 *p = webcam_mode_all;
236
237 hal_log_err("DRV_WEBCAM_CMD_GET_MODE_ALL\n");
238 ret = EPDK_OK;
239 break;
240 }
241 case DRV_WEBCAM_CMD_SET_FRAME_QUEUE:
242 {
243 __webcam_frame_queue_t *pFrameQueue = (__webcam_frame_queue_t*)pbuffer;
244
245 hal_log_err("DRV_WEBCAM_CMD_SET_FRAME_QUEUE\n");
246 if (pFrameQueue->num != WEBCAM_BUFFER_NUM)
247 {
248 hal_log_err("careful! num[%d] != WEBCAM_BUFFER_NUM[%d]\n", pFrameQueue->num, WEBCAM_BUFFER_NUM);
249 //return EPDK_FAIL;
250 }
251 else
252 {
253 hal_log_err("webcam_frame_num[%d]\n", pFrameQueue->num);
254 }
255
256 if (pFrameQueue->num > WEBCAM_BUFFER_NUM)
257 {
258 hal_log_err("fatal error, num[%d] > WEBCAM_BUFFER_NUM[%d]\n", pFrameQueue->num, WEBCAM_BUFFER_NUM);
259 return EPDK_FAIL;
260 }
261
262 pWebcamDevNode->webcam_frame_num = pFrameQueue->num;
263 for (i=0; i<pFrameQueue->num; i++) //现在num就等于WEBCAM_BUFFER_NUM,为下一步修改做准备
264 {
265 //WEBCAM_BUFFER_NUM
266 memcpy(&pWebcamDevNode->webcam_frame[i], &pFrameQueue->webcam_frame_array[i], sizeof(__webcam_frame_t));
267 }
268 ret = EPDK_OK;
269 break;
270 }
271 case DRV_WEBCAM_CMD_CAPTURE_ON:
272 {
273 __s32 frame_id;
274 __s32 index;//index切切不要用全局变量
275
276 if (webcam_check_mode_valid() != EPDK_OK)
277 {
278 hal_log_err("webcam mode invalid!\n");
279 break;
280 }
281 else
282 {
283 webcam_dev_set_mode(valid_mode_idx); //设置模式
284 }
285
286 pWebcamDevNode->pts = 0;
287 pWebcamDevNode->full2->initial(pWebcamDevNode->full2, WEBCAM_LISTTYPE_FULL);
288 pWebcamDevNode->free2->initial(pWebcamDevNode->free2, WEBCAM_LISTTYPE_FREE);
289 for (i=0; i<pWebcamDevNode->webcam_frame_num; i++)
290 {
291 pWebcamDevNode->webcam_frame[i].bProgressiveSrc = 1;//bProgressiveSrc;
292 pWebcamDevNode->webcam_frame[i].bTopFieldFirst = 0;//bTopFieldFirst;
293 pWebcamDevNode->webcam_frame[i].eAspectRatio = 1000;//eAspectRatio;
294 pWebcamDevNode->webcam_frame[i].color_format = webcam_mode.color_format;
295 pWebcamDevNode->webcam_frame[i].src_rect.width = pWebcamDevNode->webcam_frame[i].dst_rect.width = webcam_mode.size.width;
296 pWebcamDevNode->webcam_frame[i].src_rect.height = pWebcamDevNode->webcam_frame[i].dst_rect.height = webcam_mode.size.height;
297 pWebcamDevNode->webcam_frame[i].frame_rate = webcam_mode.frame_rate;
298 pWebcamDevNode->webcam_frame[i].uPts = pWebcamDevNode->pts;
299 pWebcamDevNode->webcam_frame[i].bPtsValid = 1;
300 pWebcamDevNode->webcam_frame[i].component_seq = webcam_mode.component_seq;;
301 pWebcamDevNode->webcam_frame[i].store_mode = webcam_mode.store_mode;;
302
303 if(EPDK_OK != pWebcamDevNode->free2->insert_element(pWebcamDevNode->free2, pWebcamDevNode->webcam_frame[i].frame_id))
304 {
305 hal_log_err("impossible free2_insert fail,check code!\n");
306 }
307 }
308 pWebcamDevNode->webcam_mode_last = webcam_mode;
309 first_flag=0;
310
311 if( pWebcamDevNode->tran_cb != NULL )
312 {
313 hal_log_info("DRV_WEBCAM_CMD_CAPTURE_ON: have cb\n");
314 frame_id = pWebcamDevNode->free2->delete_element(pWebcamDevNode->free2);
315 if (frame_id != -1)
316 {//在free中请求buffer成功
317 index = translate_frame_id_to_index(frame_id);
318 pWebcamDevNode->tran_cb(pWebcamDevNode->webcam_frame[index].addr[0], (__u32)NULL, (__u32)NULL);
319 pWebcamDevNode->frame_id_last = frame_id;
320 pWebcamDevNode->capture = CAPTURE_ON_AND_CALLBACK;
321 }
322 else
323 {
324 hal_log_info("ERROR:webcam no buffer! ???? \n");
325 }
326 }
327 else
328 {
329 hal_log_info("DRV_WEBCAM_CMD_CAPTURE_ON: haven't cb\n");
330 pWebcamDevNode->capture = CAPTURE_ON;
331 }
332 //WEBCAM_capture_video_start();
333 hal_log_err("DRV_WEBCAM_CMD_CAPTURE_ON\n");
334 ret = EPDK_OK;
335 break;
336 }
337
338 case DRV_WEBCAM_CMD_CAPTURE_OFF:
339 {
340 if (pWebcamDevNode->tran_cb != NULL)
341 {
342 pWebcamDevNode->tran_cb((__u32)NULL, (__u32)NULL, (__u32)NULL);
343 }
344
345 pWebcamDevNode->capture = CAPTURE_NONE;
346 pWebcamDevNode->used_addr0 = (__u32)NULL;
347 pWebcamDevNode->used_addr1 = (__u32)NULL;
348 //WEBCAM_capture_video_stop();//关中断发生器
349 first_flag=0;
350 lost_frame_num=0;
351
352 hal_log_info("DRV_WEBCAM_CMD_CAPTURE_OFF pWebcamDevNode->tran_cb=%x\n",pWebcamDevNode->tran_cb);
353 ret = EPDK_OK;
354
355 //清掉webcam_frame数组,即full2, free2数组,也可以不清. 为简单起见,这里不清数组.
356 //initial_webcam_linklist_manager(&full2, WEBCAM_LISTTYPE_FULL);
357 //initial_webcam_linklist_manager(&free2, WEBCAM_LISTTYPE_FREE);
358 pWebcamDevNode->full2->initial(pWebcamDevNode->full2, WEBCAM_LISTTYPE_FULL);
359 pWebcamDevNode->free2->initial(pWebcamDevNode->free2, WEBCAM_LISTTYPE_FREE);
360 break;
361 }
362 case DRV_WEBCAM_CMD_SET_PTS:
363 {
364 pWebcamDevNode->pts = aux;
365 hal_log_err("DRV_WEBCAM_CMD_SET_PTS\n");
366 ret = EPDK_OK;
367 break;
368 }
369 case DRV_WEBCAM_CMD_GET_PTS:
370 {
371 ret = pWebcamDevNode->pts;
372 hal_log_err("DRV_WEBCAM_CMD_GET_PTS\n");
373 //ret = EPDK_OK;
374 break;
375 }
376 case DRV_WEBCAM_CMD_REQUEST_FRAME:
377 {
378 __s32 index;
379 __s32 frame_id;//index切切不要用全局变量
380
381 frame_id = pWebcamDevNode->full2->delete_element(pWebcamDevNode->full2);
382 if (frame_id != -1){
383 __webcam_frame_t **pp = (__webcam_frame_t ** )pbuffer;
384 index = translate_frame_id_to_index(frame_id);
385 *pp = pWebcamDevNode->p_webcam_frame[index];
386
387 ret = EPDK_OK;
388 }
389
390 break;
391 }
392 case DRV_WEBCAM_CMD_RELEASE_FRAME:
393 {
394 //linklist_insert(&webcam_free, aux);
395 //free2_insert(aux);
396 pWebcamDevNode->free2->insert_element(pWebcamDevNode->free2, aux);
397 //hal_log_err("DRV_WEBCAM_CMD_RELEASE_FRAME\n");
398 ret = EPDK_OK;
399 break;
400 }
401 case DRV_WEBCAM_CMD_SET_PTS_MODE:
402 {
403 pWebcamDevNode->pts_flag = aux;
404 ret = EPDK_OK;
405 break;
406 }
407 case DRV_WEBCAM_CMD_INSTALL_CALLBACK_GET_PTS:
408 {
409 pWebcamDevNode->CB_GetPts = (__pCBK_t)pbuffer;
410 ret = EPDK_OK;
411 break;
412 }
413 case DRV_WEBCAM_CMD_SET_COLOR_EFFECT:
414 {
415 ret = EPDK_FAIL;
416 hal_log_err("DRV_WEBCAM_CMD_SET_COLOR_EFFECT %d\n",aux);
417 break;
418 }
419 case DRV_WEBCAM_CMD_GET_COLOR_EFFECT:
420 {
421 ret = EPDK_FAIL;
422 hal_log_err("DRV_WEBCAM_CMD_GET_COLOR_EFFECT\n");
423 break;
424 }
425 case DRV_WEBCAM_CMD_SET_AWB:
426 {
427 ret = EPDK_FAIL;
428 hal_log_err("DRV_WEBCAM_CMD_SET_AWB %d\n",aux);
429 break;
430 }
431 case DRV_WEBCAM_CMD_GET_AWB:
432 {
433 ret = EPDK_FAIL;
434 hal_log_err("DRV_WEBCAM_CMD_GET_AWB\n");
435 break;
436 }
437 case DRV_WEBCAM_CMD_SET_AE:
438 {
439 ret = EPDK_FAIL;
440 hal_log_err("DRV_WEBCAM_CMD_SET_AE %d\n",aux);
441 break;
442 }
443 case DRV_WEBCAM_CMD_GET_AE:
444 {
445 ret = EPDK_FAIL;
446 hal_log_err("DRV_WEBCAM_CMD_GET_AE\n");
447 break;
448 }
449 case DRV_WEBCAM_CMD_SET_BRIGHT:
450 {
451 ret = EPDK_FAIL;
452 hal_log_err("DRV_WEBCAM_CMD_SET_BRIGHT %d\n",aux);
453 break;
454 }
455 case DRV_WEBCAM_CMD_GET_BRIGHT:
456 {
457 ret = EPDK_FAIL;
458 hal_log_err("DRV_WEBCAM_CMD_GET_BRIGHT\n");
459 break;
460 }
461 case DRV_WEBCAM_CMD_SET_CONTRAST:
462 {
463 ret = EPDK_FAIL;
464 hal_log_err("DRV_WEBCAM_CMD_SET_CONTRAST %d\n",aux);
465 break;
466 }
467 case DRV_WEBCAM_CMD_GET_CONTRAST:
468 {
469 ret = EPDK_FAIL;
470 hal_log_err("DRV_WEBCAM_CMD_GET_CONTRAST\n");
471 break;
472 }
473 case DRV_WEBCAM_CMD_SET_BAND:
474 {
475 ret = EPDK_FAIL;
476 hal_log_err("DRV_WEBCAM_CMD_SET_BAND %d\n",aux);
477 break;
478 }
479 case DRV_WEBCAM_CMD_GET_BAND:
480 {
481 ret = EPDK_FAIL;
482 hal_log_err("DRV_WEBCAM_CMD_GET_BAND\n");
483 break;
484 }
485 case DRV_WEBCAM_CMD_GET_PROGRSSV_INFO:
486 {
487 ret = 1;//bProgressiveSrc;
488 //hal_log_err("DRV_WEBCAM_CMD_GET_PROGRSSV_INFO[%d]\n",bProgressiveSrc);
489 break;
490 }
491 case DRV_WENCAM_CMD_SET_TRANSPORT_CB:
492 {
493 hal_log_info("DRV_WENCAM_CMD_SET_TRANSPORT_CB[%X]\n", pbuffer);
494 pWebcamDevNode->tran_cb = (transport_cb_t)pbuffer;
495 ret = EPDK_OK;
496 hal_log_err("DRV_WENCAM_CMD_SET_TRANSPORT_CB[%X]\n",pbuffer);
497 break;
498 }
499 case DRV_WENCAM_CMD_GET_IRQ_CB:
500 {
501 uvc_irq_t *cb = (uvc_irq_t *)pbuffer;
502
503 //hal_log_info("DRV_WENCAM_CMD_GET_IRQ_CB, %x\n", pWebcamDevNode->irq_cb);
504 ret = EPDK_OK;
505 *cb = pWebcamDevNode->irq_cb;
506 hal_log_err("DRV_WENCAM_CMD_GET_IRQ_CB[%X]\n",pbuffer);
507 break;
508
509 }
510 case DRV_WENCAM_CMD_WEBCAM_INSERT:
511 {
512 __s32 frame_id;
513 __s32 index;
514
515 if(pWebcamDevNode->capture == CAPTURE_ON && pWebcamDevNode->tran_cb != NULL)
516 {
517 //hal_log_info("DRV_WENCAM_CMD_WEBCAM_INSERT 1\n");
518 frame_id = pWebcamDevNode->free2->delete_element(pWebcamDevNode->free2);
519 if (frame_id != -1)
520 {//在free中请求buffer成功
521 index = translate_frame_id_to_index(frame_id);
522 pWebcamDevNode->tran_cb(pWebcamDevNode->webcam_frame[index].addr[0], (__u32)NULL, (__u32)NULL);
523 pWebcamDevNode->frame_id_last = frame_id;
524 pWebcamDevNode->capture = CAPTURE_ON_AND_CALLBACK;
525 }
526 else
527 {
528 hal_log_info("ERROR:webcam no buffer! ???? \n");
529 }
530 }
531 else if(pWebcamDevNode->capture == CAPTURE_REMOVE && pWebcamDevNode->tran_cb != NULL &&
532 pWebcamDevNode->used_addr0 != (__u32)NULL)
533 {
534 hal_log_info("DRV_WENCAM_CMD_WEBCAM_INSERT 2\n");
535 pWebcamDevNode->tran_cb(pWebcamDevNode->used_addr0, (__u32)NULL, (__u32)NULL);
536 pWebcamDevNode->capture = CAPTURE_ON_AND_CALLBACK;
537 }
538 hal_log_err("DRV_WENCAM_CMD_WEBCAM_INSERT\n");
539 ret = EPDK_OK;
540 break;
541 }
542 case DRV_WENCAM_CMD_WEBCAM_MOVED:
543 {
544 //hal_log_info("DRV_WENCAM_CMD_WEBCAM_MOVED, (%x,%x)\n", aux, pbuffer);
545 pWebcamDevNode->capture = CAPTURE_REMOVE;
546 pWebcamDevNode->used_addr0 = (__u32)aux;
547 pWebcamDevNode->used_addr1 = (__u32)pbuffer;
548 hal_log_err("DRV_WENCAM_CMD_WEBCAM_MOVED\n");
549 ret = EPDK_OK;
550 break;
551 }
552 default:
553 {
554 hal_log_err("Unkonwn Command...\n");
555 ret=EPDK_FAIL;
556 break;
557 }
558 }
559
560 WEBCAM_OpUnlock();
561
562 return ret;
563 }
564
WEBCAM_DEV_NODE_Init_Part1(void)565 __s32 WEBCAM_DEV_NODE_Init_Part1(void)
566 {
567 __u8 err;
568 if(pWebcamDevNode)
569 {
570 hal_log_err("webcam device node resource has been requested already!\n");
571 return EPDK_OK;
572 }
573 pWebcamDevNode = (__webcam_dev_t*)hal_malloc(sizeof(__webcam_dev_t));
574 if(!pWebcamDevNode)
575 {
576 hal_log_info("request memory for webcam device handle failed!\n");
577 return EPDK_FAIL;
578 }
579 memset(pWebcamDevNode, 0, sizeof(__webcam_dev_t));
580
581 pWebcamDevNode->irq_cb = webcam_irq_handle;
582 pWebcamDevNode->tran_cb = NULL;
583
584 pWebcamDevNode->webcam_lock = hal_sem_create(1);
585 if(NULL == pWebcamDevNode->webcam_lock)
586 {
587 hal_log_info("create semaphore webcam_lock fail\n");
588 goto __err0;
589 }
590 pWebcamDevNode->full2 = webcam_linklist_manager_init();
591 pWebcamDevNode->free2 = webcam_linklist_manager_init();
592 if(NULL==pWebcamDevNode->full2 || NULL==pWebcamDevNode->free2)
593 {
594 hal_log_info("create webcam linklist manager fail\n");
595 goto __err1;
596 }
597 pWebcamDevNode->full2->initial(pWebcamDevNode->full2, WEBCAM_LISTTYPE_FULL);
598 pWebcamDevNode->free2->initial(pWebcamDevNode->free2, WEBCAM_LISTTYPE_FREE);
599 return EPDK_OK;
600 __err1:
601 if(pWebcamDevNode->full2)
602 {
603 pWebcamDevNode->full2->exit(pWebcamDevNode->full2);
604 pWebcamDevNode->full2 = NULL;
605 }
606 if(pWebcamDevNode->free2)
607 {
608 pWebcamDevNode->free2->exit(pWebcamDevNode->free2);
609 pWebcamDevNode->free2 = NULL;
610 }
611 hal_sem_delete(pWebcamDevNode->webcam_lock);
612 pWebcamDevNode->webcam_lock = NULL;
613 __err0:
614 hal_log_info("%s %d %s pWebcamDevNode:%x!\n", __FILE__, __LINE__, __func__, pWebcamDevNode);
615 hal_free(pWebcamDevNode);
616 pWebcamDevNode = NULL;
617 return EPDK_FAIL;
618 }
619 //__s32 WEBCAM_DEV_NODE_Init_Part2(void)
620 //{
621 // return EPDK_OK;
622 //}
623
WEBCAM_DEV_NODE_Exit(void)624 __s32 WEBCAM_DEV_NODE_Exit(void)
625 {
626 __u8 err;
627
628 if(NULL == pWebcamDevNode)
629 {
630 hal_log_err("webcam dev node already exit!\n");
631 return EPDK_OK;
632 }
633 if(pWebcamDevNode->full2)
634 {
635 pWebcamDevNode->full2->exit(pWebcamDevNode->full2);
636 pWebcamDevNode->full2 = NULL;
637 }
638 if(pWebcamDevNode->free2)
639 {
640 pWebcamDevNode->free2->exit(pWebcamDevNode->free2);
641 pWebcamDevNode->free2 = NULL;
642 }
643 if(pWebcamDevNode->webcam_lock)
644 {
645 hal_sem_delete(pWebcamDevNode->webcam_lock);
646 pWebcamDevNode->webcam_lock = NULL;
647 }
648
649 hal_log_info("%s %d %s pWebcamDevNode:%x!\n", __FILE__, __LINE__, __func__, pWebcamDevNode);
650 hal_free(pWebcamDevNode);
651 pWebcamDevNode = NULL;
652 return EPDK_OK;
653 }
654
655
656
657
658
659
660
661