1 /*
2 * EvHandler.c
3 *
4 * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * * Neither the name Texas Instruments nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #define __FILE_ID__ FILE_ID_50
35 #include "IPCKernelApi.h"
36 #include "EvHandler.h"
37 #include "osApi.h"
38 #include "osDebug.h"
39
40 #ifndef _WINDOWS
41 #include "windows_types.h"
42 #else
43 #include <windows.h>
44 #endif /*_WINDOWS*/
45
46 #ifdef EV_HANDLER_DEBUG
47 TI_HANDLE ghEvHandler; /* for debug, remove later*/
48 #endif
49
50 /* ************************** Upper Interface **********************************/
51
EvHandler_Create(TI_HANDLE hOs)52 TI_HANDLE EvHandler_Create (TI_HANDLE hOs)
53 {
54 TEvHandlerObj *pEvHandler;
55
56 PRINT(DBG_INIT_LOUD, (" EvHandlerInit\n"));
57 pEvHandler = os_memoryAlloc(hOs,sizeof(TEvHandlerObj));
58
59 if(NULL == pEvHandler)
60 {
61 PRINT(DBG_INIT_LOUD, ("EvHandler_Create() - Allocation failed! Returning NULL.\n"));
62 return NULL;
63 }
64
65 os_memoryZero(hOs,pEvHandler,sizeof(TEvHandlerObj));
66
67 #ifdef EV_HANDLER_DEBUG
68 ghEvHandler= pEvHandler;
69 PRINTF(DBG_INIT_VERY_LOUD, ("EvHandlerInit: ghEvHandler set to %08X\n", ghEvHandler));
70 #endif
71
72 pEvHandler->hOs = hOs;
73
74 pEvHandler->LastUMEventType = 0xFFFFFFFF;
75
76 return (TI_HANDLE) pEvHandler;
77 }
78
EvHandlerUnload(TI_HANDLE hEvHandler)79 TI_UINT32 EvHandlerUnload (TI_HANDLE hEvHandler)
80 {
81
82 TEvHandlerObj *pEvHandler;
83
84 PRINT(DBG_INIT_LOUD, (" ev_handler_unLoad\n"));
85 pEvHandler = (TEvHandlerObj *)hEvHandler;
86
87 os_memoryFree(pEvHandler->hOs,pEvHandler,sizeof(TEvHandlerObj));
88
89 return TI_OK;
90 }
91
92
EvHandlerRegisterEvent(TI_HANDLE hEvHandler,TI_UINT8 * pData,TI_UINT32 Length)93 TI_UINT32 EvHandlerRegisterEvent(TI_HANDLE hEvHandler, TI_UINT8* pData, TI_UINT32 Length)
94 {
95 TEvHandlerObj *pEvHandler;
96 IPC_EVENT_PARAMS *pEvParams;
97 TI_UINT32 ModuleIndex;
98
99 if( (hEvHandler==NULL) || (pData == NULL)){
100 PRINT(DBG_INIT_ERROR, "EvHandler:EvHandlerRegisterEvent Bad Handle passed \n");
101 return TI_NOK;
102 }
103
104 #ifdef EV_HANDLER_DEBUG
105 if (ghEvHandler != hEvHandler)
106 {
107 return TI_NOK;
108 }
109 #endif
110
111 pEvHandler = (TEvHandlerObj *)hEvHandler;
112 pEvParams = (IPC_EVENT_PARAMS *)pData;
113
114 PRINTF(DBG_INIT_LOUD, (" EvHandlerRegisterEvent EventType = %d \n",pEvParams->uEventType));
115
116 /* used to be: if ( sizeof(IPC_EVENT_PARAMS) != Length)
117 relaxed size checking (okay if output buffer is larger) */
118 if (sizeof(IPC_EVENT_PARAMS) > Length)
119 {
120 PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error sizeof(IPC_EVENT_PARAMS) != Length,"
121 "%d != %d \n",sizeof(IPC_EVENT_PARAMS), (int)Length));
122 return (TI_UINT32)STATUS_INVALID_PARAMETER;
123 }
124
125 if (pEvParams->uEventType >= IPC_EVENT_MAX){
126 PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error - Invalid Event Type = %d \n",
127 pEvParams->uEventType));
128 return (TI_UINT32)STATUS_INVALID_PARAMETER;
129 }
130
131 ModuleIndex = 0;
132
133 while ((ModuleIndex < MAX_REGISTERED_MODULES) &&
134 (pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID != NULL))
135 {
136 ModuleIndex++;
137 }
138
139 if (ModuleIndex == MAX_REGISTERED_MODULES)
140 {
141 PRINTF(DBG_INIT_WARNING, (" EvHandlerRegisterEvent %d "
142 "Registration queue full or event already registered!\n",
143 pEvParams->uEventType));
144 return (TI_UINT32)STATUS_INVALID_PARAMETER;
145 }
146
147 os_memoryCopy(pEvHandler->hOs,(TI_UINT8*)&pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex],
148 (TI_UINT8*)pEvParams,Length);
149
150 pEvParams->uEventID = (TI_HANDLE)&pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex];
151
152 pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID = pEvParams->uEventID;
153
154 PRINT(DBG_INIT_LOUD, " EvHandlerRegisterEvent Out \n");
155 return STATUS_SUCCESS;
156
157 }
158
159
EvHandlerUnRegisterEvent(TI_HANDLE hEvHandler,TI_HANDLE uEventID)160 TI_UINT32 EvHandlerUnRegisterEvent(TI_HANDLE hEvHandler, TI_HANDLE uEventID)
161 {
162 TEvHandlerObj *pEvHandler;
163 IPC_EVENT_PARAMS *pEvParams;
164 TI_UINT32 ModuleIndex;
165
166 #ifdef EV_HANDLER_DEBUG
167 if (ghEvHandler != hEvHandler )
168 {
169 return TI_NOK;
170 }
171 #endif
172
173 if (uEventID == NULL)
174 {
175 return TI_NOK;
176 }
177
178 pEvHandler = (TEvHandlerObj *)hEvHandler;
179 pEvParams = (IPC_EVENT_PARAMS *)uEventID;
180
181 PRINTF(DBG_INIT_LOUD, (" EvHandlerUnRegisterEvent EventType = %d \n",pEvParams->uEventType));
182
183 if( pEvParams->uEventType >= IPC_EVENT_MAX){
184 PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error Event Type = %d \n",
185 pEvParams->uEventType));
186 return (TI_UINT32)STATUS_INVALID_PARAMETER;
187 }
188
189 ModuleIndex = 0;
190
191 while ((ModuleIndex < MAX_REGISTERED_MODULES) &&
192 (pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID != pEvParams->uEventID))
193 {
194 ModuleIndex++;
195 }
196
197 if (ModuleIndex == MAX_REGISTERED_MODULES)
198 {
199 PRINTF(DBG_INIT_ERROR, (" EvHandlerUnRegisterEvent %d "
200 "Registration queue doesn't hold this event!\n",
201 pEvParams->uEventType ));
202 return (TI_UINT32)STATUS_INVALID_PARAMETER;
203 }
204 pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID = NULL;
205
206 return STATUS_SUCCESS;
207 }
208
209 /* ************************** Upper Interface End*********************************/
210
211 /* ************************** Bottom Interface **********************************/
212
EvHandlerSendEvent(TI_HANDLE hEvHandler,TI_UINT32 EvType,TI_UINT8 * pData,TI_UINT32 Length)213 TI_UINT32 EvHandlerSendEvent(TI_HANDLE hEvHandler, TI_UINT32 EvType, TI_UINT8* pData, TI_UINT32 Length)
214 {
215 TEvHandlerObj *pEvHandler;
216 IPC_EV_DATA* pNewEvent;
217 TI_UINT32 TailIndex=0;
218 TI_UINT32 ModuleIndex=0;
219
220 PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d \n", EvType));
221
222 if(hEvHandler == NULL){
223 PRINT(DBG_INIT_ERROR, "EvHandlerSendEvent Bad Handle passed \n");
224 return TI_NOK;
225 }
226
227 #ifdef EV_HANDLER_DEBUG
228 if (ghEvHandler != hEvHandler)
229 {
230 return TI_NOK;
231 }
232 #endif
233
234 pEvHandler = (TEvHandlerObj *)hEvHandler;
235
236 TailIndex = pEvHandler->SendEventArray.TailIndex;
237
238 while ((ModuleIndex < MAX_REGISTERED_MODULES) && (EvType <= IPC_EVENT_MAX))
239 {
240 if (pEvHandler->RegistrationArray[EvType][ModuleIndex].uEventID != NULL )
241 {
242 if(pEvHandler->SendEventArray.Counter == MAX_SEND_EVENTS)
243 {
244 PRINT(DBG_INIT_ERROR, " EvHandlerSendEvent Array Full u Fool! \n");
245 return TI_NOK;
246 }
247
248 pNewEvent = &pEvHandler->SendEventArray.Array[TailIndex];
249
250 /* copy the event parameters and data to the events queue*/
251 os_memoryCopy(pEvHandler->hOs,(TI_UINT8*)&pNewEvent->EvParams,
252 (TI_UINT8*)&pEvHandler->RegistrationArray[EvType][ModuleIndex],
253 sizeof(IPC_EVENT_PARAMS));
254
255 os_memoryZero(pEvHandler->hOs,(TI_UINT8*)pNewEvent->uBuffer, sizeof(pNewEvent->uBuffer));
256
257 os_memoryCopy(pEvHandler->hOs,
258 (TI_UINT8*)pNewEvent->uBuffer,
259 (TI_UINT8*)pData,
260 Length);
261
262 pNewEvent->uBufferSize = Length;
263
264 if(pNewEvent->EvParams.uDeliveryType == DELIVERY_PUSH)
265 {
266 PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d to OS \n", EvType));
267 PRINTF(DBG_INIT_LOUD, ("EvHandlerSendEvent Matching OS Registered event found at EvType = %d,"
268 "ModuleIndex = %d \n", EvType, ModuleIndex));
269 IPC_EventSend (pEvHandler->hOs,(TI_UINT8*)pNewEvent,sizeof(IPC_EV_DATA));
270 }
271 else {
272
273 pEvHandler->LastUMEventType = EvType;
274 pEvHandler->SendEventArray.TailIndex = (TailIndex+1) % MAX_SEND_EVENTS;
275 pEvHandler->SendEventArray.Counter++;
276 TailIndex = pEvHandler->SendEventArray.TailIndex;
277 PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d to User Mode \n", EvType));
278 PRINTF(DBG_INIT_LOUD, ("EvHandlerSendEvent Matching User Mode Registered event found at EvType = %d,"
279 "ModuleIndex = %d \n", EvType, ModuleIndex));
280 if (pEvHandler->SendEventArray.Counter == 1)
281 {
282 IPC_EventSend (pEvHandler->hOs,NULL,0);
283 }
284 }
285 } /* end if*/
286
287 ModuleIndex++;
288
289 } /* end of while*/
290
291 return TI_OK;
292 }
293
294 /* ************************** Bottom Interface End **********************************/
295