1 /*
2 ********************************************************************************
3 *                                    eMOD
4 *                   the Easy Portable/Player Develop Kits
5 *                               mod_duckweed sub-system
6 *                          (module name, e.g.mpeg4 decoder plug-in) module
7 *
8 *          (c) Copyright 2010-2012, Allwinner Microelectronic Co., Ltd.
9 *                              All Rights Reserved
10 *
11 * File   : webcam_linklist_manager.c
12 * Version: V1.0
13 * By     : Eric_wang
14 * Date   : 2010-1-4
15 * Description:
16 ********************************************************************************
17 */
18 #include "string.h"
19 #include "hal_mem.h"
20 #include "hal_log.h"
21 #include "webcam_linklist_manager.h"
22 
23 //链表实现方式2
24 /*******************************************************************************
25 关于 链表实现方式2 的说明:
26 (1). 一个线程vdrv_task() 和一个中断处理程序webcam_irq_handle()会操作2个链表full2和free2
27      因此需要做互斥。
28 (2). 考虑到ISR是不会被打断的,所以只需要对vdrv_task()操作涉及的函数做互斥处理就行了
29     full2_insert( isr ), wt
30     full2_delete( vdrv_task ), rd
31     free2_insert( vdrv_task ), wt
32     free2_delete( isr ), rd
33 
34     所以,只需要对full2_delete()和free2_insert()做互斥处理就行了。所谓互斥,也就是
35     在处理前,把一些可能会被改变的变量记下来而已。
36 *******************************************************************************/
Impl_initial_webcam_linklist_manager(__webcam_linklist_manager_t * thiz,WEBCAM_LINKLIST_TYPE type)37 void Impl_initial_webcam_linklist_manager(__webcam_linklist_manager_t *thiz, WEBCAM_LINKLIST_TYPE type)
38 {
39     //memset(pManager, 0, sizeof(__webcam_linklist_manager_t));
40     thiz->list_type = type;
41     thiz->wt = thiz->rd = 0;
42     return;
43 }
Impl_webcam_linklist_manager_exit(__webcam_linklist_manager_t * thiz)44 __s32 Impl_webcam_linklist_manager_exit(__webcam_linklist_manager_t *thiz)
45 {
46     memset(thiz, 0, sizeof(__webcam_linklist_manager_t));
47     hal_log_info("%s %d %s thiz:%x!\n", __FILE__, __LINE__, __func__, thiz);
48     hal_free(thiz);
49     return 0;
50 }
51 
52 /*******************************************************************************
53 Function name: full2_insert
54 Description:
55     针对装满帧的数组做插入操作。
56     isr调用
57     修改wt
58     rd由vdrv_task()修改
59 Parameters:
60     1. idx:就是数组__webcam_frame_t webcam_frame[WEBCAM_BUFFER_NUM]的 frame_id
61 Return:
62 
63 Time: 2010/7/12
64 *******************************************************************************/
Impl_webcam_linklist_manager_insert(__webcam_linklist_manager_t * thiz,__s32 frame_id)65 __s32 Impl_webcam_linklist_manager_insert(__webcam_linklist_manager_t *thiz, __s32 frame_id)
66 {
67     //__u32 cpu_sr;
68     //__s32 full2_wt;
69     //__s32 full2_rd;
70     //__s32 uTmpRd;
71     //__s32 uNextRd;
72     __s32 uTmpWt = thiz->wt + 1;
73 
74     uTmpWt %= FRMID_CNT;
75     if(thiz->rd == uTmpWt)
76     {
77         hal_log_info("fatal error, [%d] array full!\n", thiz->list_type);
78     }
79 
80     thiz->frmid_array[thiz->wt] = frame_id;
81     thiz->wt = uTmpWt;
82 
83     return EPDK_OK;
84 }
85 /*******************************************************************************
86 Function name: full2_delete
87 Description:
88     取一个元素出来,
89     vdrv_task()调用。可能会没有元素。
90     修改rd,
91     wt由ISR修改
92 Parameters:
93 
94 Return:
95     1.如果没有元素, 返回-1
96     2.如果有,返回id号。
97 Time: 2010/7/12
98 *******************************************************************************/
Impl_webcam_linklist_manager_delete(__webcam_linklist_manager_t * thiz)99 __s32 Impl_webcam_linklist_manager_delete(__webcam_linklist_manager_t *thiz)
100 {
101     __s32 frame_id;
102     __s32 nTmpRd = thiz->rd;
103     if(thiz->rd == thiz->wt)
104     {
105         return -1;
106     }
107     else
108     {
109         //__u32 cpu_sr;
110         //__s32 full2_wt;
111         //__s32 full2_rd;
112         frame_id = thiz->frmid_array[nTmpRd++];
113         nTmpRd %= FRMID_CNT;
114         thiz->rd = nTmpRd;
115 
116         return frame_id;
117     }
118 }
webcam_linklist_manager_init()119 __webcam_linklist_manager_t* webcam_linklist_manager_init()
120 {
121     __webcam_linklist_manager_t *p = (__webcam_linklist_manager_t*)hal_malloc(sizeof(__webcam_linklist_manager_t));
122     printf("%s %d %s!\n", __FILE__, __LINE__, __func__);
123     if(NULL == p)
124     {
125         hal_log_info("malloc __webcam_linklist_manager_t fail\n");
126         return NULL;
127     }
128     memset(p, 0, sizeof(__webcam_linklist_manager_t));
129     p->initial = Impl_initial_webcam_linklist_manager;
130     p->insert_element = Impl_webcam_linklist_manager_insert;
131     p->delete_element = Impl_webcam_linklist_manager_delete;
132     p->exit = Impl_webcam_linklist_manager_exit;
133     return p;
134 }
135 
136