• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * EvHandler.c
3  *
4  * Copyright(c) 1998 - 2009 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     os_memoryZero(hOs,pEvHandler,sizeof(TEvHandlerObj));
59 
60     #ifdef EV_HANDLER_DEBUG
61     ghEvHandler= pEvHandler;
62       PRINTF(DBG_INIT_VERY_LOUD, ("EvHandlerInit: ghEvHandler set to %08X\n", ghEvHandler));
63     #endif
64 
65     pEvHandler->hOs = hOs;
66 
67     pEvHandler->LastUMEventType = 0xFFFFFFFF;
68 
69     return (TI_HANDLE) pEvHandler;
70 }
71 
EvHandlerUnload(TI_HANDLE hEvHandler)72 TI_UINT32 EvHandlerUnload (TI_HANDLE hEvHandler)
73 {
74 
75     TEvHandlerObj *pEvHandler;
76 
77     PRINT(DBG_INIT_LOUD, (" ev_handler_unLoad\n"));
78     pEvHandler = (TEvHandlerObj *)hEvHandler;
79 
80     os_memoryFree(pEvHandler->hOs,pEvHandler,sizeof(TEvHandlerObj));
81 
82     return TI_OK;
83 }
84 
85 
EvHandlerRegisterEvent(TI_HANDLE hEvHandler,TI_UINT8 * pData,TI_UINT32 Length)86 TI_UINT32 EvHandlerRegisterEvent(TI_HANDLE hEvHandler, TI_UINT8* pData, TI_UINT32 Length)
87 {
88     TEvHandlerObj *pEvHandler;
89     IPC_EVENT_PARAMS *pEvParams;
90     TI_UINT32 ModuleIndex;
91 
92     if( (hEvHandler==NULL) || (pData == NULL)){
93         PRINT(DBG_INIT_ERROR, "EvHandler:EvHandlerRegisterEvent Bad Handle passed \n");
94         return TI_NOK;
95     }
96 
97 #ifdef EV_HANDLER_DEBUG
98     if (ghEvHandler !=  hEvHandler)
99     {
100         return TI_NOK;
101     }
102 #endif
103 
104     pEvHandler  = (TEvHandlerObj *)hEvHandler;
105     pEvParams = (IPC_EVENT_PARAMS *)pData;
106 
107     PRINTF(DBG_INIT_LOUD, (" EvHandlerRegisterEvent EventType = %d \n",pEvParams->uEventType));
108 
109     /* used to be: if ( sizeof(IPC_EVENT_PARAMS) != Length)
110        relaxed size checking (okay if output buffer is larger)  */
111     if (sizeof(IPC_EVENT_PARAMS) > Length)
112     {
113         PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error sizeof(IPC_EVENT_PARAMS) != Length,"
114                                "%d != %d \n",sizeof(IPC_EVENT_PARAMS), (int)Length));
115         return (TI_UINT32)STATUS_INVALID_PARAMETER;
116     }
117 
118     if (pEvParams->uEventType >= IPC_EVENT_MAX){
119         PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error - Invalid Event Type = %d \n",
120               pEvParams->uEventType));
121         return (TI_UINT32)STATUS_INVALID_PARAMETER;
122     }
123 
124     ModuleIndex = 0;
125 
126     while ((ModuleIndex < MAX_REGISTERED_MODULES) &&
127        (pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID != NULL))
128     {
129         ModuleIndex++;
130     }
131 
132     if (ModuleIndex == MAX_REGISTERED_MODULES)
133     {
134         PRINTF(DBG_INIT_WARNING, (" EvHandlerRegisterEvent %d "
135                                   "Registration queue full or event already registered!\n",
136                                   pEvParams->uEventType));
137         return (TI_UINT32)STATUS_INVALID_PARAMETER;
138     }
139 
140     os_memoryCopy(pEvHandler->hOs,(TI_UINT8*)&pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex],
141                     (TI_UINT8*)pEvParams,Length);
142 
143     pEvParams->uEventID = (TI_HANDLE)&pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex];
144 
145     pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID = pEvParams->uEventID;
146 
147     PRINT(DBG_INIT_LOUD, " EvHandlerRegisterEvent Out \n");
148     return STATUS_SUCCESS;
149 
150 }
151 
152 
EvHandlerUnRegisterEvent(TI_HANDLE hEvHandler,TI_HANDLE uEventID)153 TI_UINT32 EvHandlerUnRegisterEvent(TI_HANDLE hEvHandler, TI_HANDLE uEventID)
154 {
155     TEvHandlerObj *pEvHandler;
156     IPC_EVENT_PARAMS *pEvParams;
157     TI_UINT32 ModuleIndex;
158 
159 #ifdef EV_HANDLER_DEBUG
160     if (ghEvHandler !=  hEvHandler )
161     {
162           return TI_NOK;
163     }
164 #endif
165 
166     if (uEventID == NULL)
167     {
168         return TI_NOK;
169     }
170 
171     pEvHandler = (TEvHandlerObj *)hEvHandler;
172     pEvParams  = (IPC_EVENT_PARAMS *)uEventID;
173 
174     PRINTF(DBG_INIT_LOUD, (" EvHandlerUnRegisterEvent EventType = %d \n",pEvParams->uEventType));
175 
176     if( pEvParams->uEventType >= IPC_EVENT_MAX){
177         PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error Event Type = %d \n",
178               pEvParams->uEventType));
179         return (TI_UINT32)STATUS_INVALID_PARAMETER;
180     }
181 
182     ModuleIndex = 0;
183 
184     while ((ModuleIndex < MAX_REGISTERED_MODULES) &&
185            (pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID != pEvParams->uEventID))
186     {
187         ModuleIndex++;
188     }
189 
190     if (ModuleIndex == MAX_REGISTERED_MODULES)
191     {
192         PRINTF(DBG_INIT_ERROR, (" EvHandlerUnRegisterEvent %d "
193                                "Registration queue doesn't hold this event!\n",
194                                pEvParams->uEventType ));
195         return (TI_UINT32)STATUS_INVALID_PARAMETER;
196     }
197     pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID = NULL;
198 
199     return STATUS_SUCCESS;
200 }
201 
202 /* ************************** Upper Interface End*********************************/
203 
204 /* ************************** Bottom Interface **********************************/
205 
EvHandlerSendEvent(TI_HANDLE hEvHandler,TI_UINT32 EvType,TI_UINT8 * pData,TI_UINT32 Length)206 TI_UINT32 EvHandlerSendEvent(TI_HANDLE hEvHandler, TI_UINT32 EvType, TI_UINT8* pData, TI_UINT32 Length)
207 {
208     TEvHandlerObj *pEvHandler;
209     IPC_EV_DATA*         pNewEvent;
210     TI_UINT32            TailIndex=0;
211     TI_UINT32            ModuleIndex=0;
212 
213     PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d  \n", EvType));
214 
215     if(hEvHandler == NULL){
216         PRINT(DBG_INIT_ERROR, "EvHandlerSendEvent Bad Handle passed \n");
217         return TI_NOK;
218     }
219 
220 #ifdef EV_HANDLER_DEBUG
221     if (ghEvHandler !=  hEvHandler)
222     {
223         return TI_NOK;
224     }
225 #endif
226 
227     pEvHandler  = (TEvHandlerObj *)hEvHandler;
228 
229     TailIndex   = pEvHandler->SendEventArray.TailIndex;
230 
231     while ((ModuleIndex < MAX_REGISTERED_MODULES) && (EvType <= IPC_EVENT_MAX))
232     {
233         if (pEvHandler->RegistrationArray[EvType][ModuleIndex].uEventID != NULL )
234         {
235             if(pEvHandler->SendEventArray.Counter == MAX_SEND_EVENTS)
236             {
237                 PRINT(DBG_INIT_ERROR, " EvHandlerSendEvent Array Full u Fool! \n");
238                 return TI_NOK;
239             }
240 
241             pNewEvent = &pEvHandler->SendEventArray.Array[TailIndex];
242 
243             /* copy the event parameters and data to the events queue*/
244             os_memoryCopy(pEvHandler->hOs,(TI_UINT8*)&pNewEvent->EvParams,
245                             (TI_UINT8*)&pEvHandler->RegistrationArray[EvType][ModuleIndex],
246                             sizeof(IPC_EVENT_PARAMS));
247 
248             os_memoryZero(pEvHandler->hOs,(TI_UINT8*)pNewEvent->uBuffer, sizeof(pNewEvent->uBuffer));
249 
250             os_memoryCopy(pEvHandler->hOs,
251                           (TI_UINT8*)pNewEvent->uBuffer,
252                           (TI_UINT8*)pData,
253                           Length);
254 
255             pNewEvent->uBufferSize = Length;
256 
257             if(pNewEvent->EvParams.uDeliveryType ==  DELIVERY_PUSH)
258             {
259                     PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d to OS \n", EvType));
260                     PRINTF(DBG_INIT_LOUD, ("EvHandlerSendEvent Matching OS Registered event found at EvType = %d,"
261                                           "ModuleIndex = %d  \n", EvType, ModuleIndex));
262                     IPC_EventSend (pEvHandler->hOs,(TI_UINT8*)pNewEvent,sizeof(IPC_EV_DATA));
263             }
264             else {
265 
266                 pEvHandler->LastUMEventType = EvType;
267                 pEvHandler->SendEventArray.TailIndex = (TailIndex+1) % MAX_SEND_EVENTS;
268                 pEvHandler->SendEventArray.Counter++;
269                 TailIndex   = pEvHandler->SendEventArray.TailIndex;
270                 PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d to User Mode \n", EvType));
271                 PRINTF(DBG_INIT_LOUD, ("EvHandlerSendEvent Matching User Mode Registered event found at EvType = %d,"
272                                        "ModuleIndex = %d  \n", EvType, ModuleIndex));
273                 if (pEvHandler->SendEventArray.Counter == 1)
274                 {
275                     IPC_EventSend (pEvHandler->hOs,NULL,0);
276                 }
277             }
278         } /* end if*/
279 
280        ModuleIndex++;
281 
282    } /* end of while*/
283 
284     return TI_OK;
285 }
286 
287  /* ************************** Bottom Interface End **********************************/
288