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