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