• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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