source: svn/newcon3bcm2_21bu/nexus/modules/input_router/src/nexus_input_router.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 10.7 KB
Line 
1/***************************************************************************
2 *     (c)2011 Broadcom Corporation
3 *
4 *  This program is the proprietary software of Broadcom Corporation and/or its licensors,
5 *  and may only be used, duplicated, modified or distributed pursuant to the terms and
6 *  conditions of a separate, written license agreement executed between you and Broadcom
7 *  (an "Authorized License").  Except as set forth in an Authorized License, Broadcom grants
8 *  no license (express or implied), right to use, or waiver of any kind with respect to the
9 *  Software, and Broadcom expressly reserves all rights in and to the Software and all
10 *  intellectual property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU
11 *  HAVE NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY
12 *  NOTIFY BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE.
13 *
14 *  Except as expressly set forth in the Authorized License,
15 *
16 *  1.     This program, including its structure, sequence and organization, constitutes the valuable trade
17 *  secrets of Broadcom, and you shall use all reasonable efforts to protect the confidentiality thereof,
18 *  and to use this information only in connection with your use of Broadcom integrated circuit products.
19 *
20 *  2.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
21 *  AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
22 *  WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
23 *  THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND ALL IMPLIED WARRANTIES
24 *  OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE,
25 *  LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION
26 *  OR CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF
27 *  USE OR PERFORMANCE OF THE SOFTWARE.
28 *
29 *  3.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR ITS
30 *  LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT, OR
31 *  EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY RELATING TO YOUR
32 *  USE OF OR INABILITY TO USE THE SOFTWARE EVEN IF BROADCOM HAS BEEN ADVISED OF
33 *  THE POSSIBILITY OF SUCH DAMAGES; OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT
34 *  ACTUALLY PAID FOR THE SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE
35 *  LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF
36 *  ANY LIMITED REMEDY.
37 *
38 * $brcm_Workfile: nexus_input_router.c $
39 * $brcm_Revision: 5 $
40 * $brcm_Date: 11/11/11 2:24p $
41 *
42 * Module Description:
43 *
44 * Revision History:
45 *
46 * $brcm_Log: /nexus/modules/input_router/src/nexus_input_router.c $
47 *
48 * 5   11/11/11 2:24p erickson
49 * SW7125-1153: check NULL param in NEXUS_InputClient_GetCodes
50 *
51 * 4   11/8/11 11:28a erickson
52 * SWNOOS-497: Fixed compiler error building for SDE.
53 *
54 * 3   8/31/11 3:56p erickson
55 * SW7420-1993: fix global
56 *
57 * 2   8/26/11 11:31a erickson
58 * SW7420-1993: fix filter logic. improve DBG.
59 *
60 * 1   8/24/11 9:14a erickson
61 * SW7420-1993: add input_router
62 *
63 **************************************************************************/
64#include "nexus_base.h"
65#include "nexus_input_router_module.h"
66#include "nexus_input_router_impl.h"
67
68BDBG_MODULE(nexus_input_router);
69struct nexus_inputrouter_list g_nexus_inputrouter_list;
70
71NEXUS_InputRouterHandle NEXUS_InputRouter_Create( unsigned server_id )
72{
73    NEXUS_InputRouterHandle router;
74
75    router = BKNI_Malloc(sizeof(*router));
76    if (!router) {
77        BERR_TRACE(NEXUS_OUT_OF_SYSTEM_MEMORY);
78        return NULL;
79    }
80    BKNI_Memset(router, 0, sizeof(*router));
81    BDBG_OBJECT_SET(router, NEXUS_InputRouter);
82    router->server_id = server_id;
83    BLST_S_INIT(&router->clients);
84   
85    BLST_S_INSERT_HEAD(&g_nexus_inputrouter_list, router, link);
86   
87    return router;
88}
89
90void NEXUS_InputRouter_Destroy( NEXUS_InputRouterHandle router )
91{
92    BDBG_OBJECT_ASSERT(router, NEXUS_InputRouter);
93    /* autoclean should have destroyed all clients first */
94    BDBG_ASSERT(!BLST_S_FIRST(&router->clients));
95    BLST_S_REMOVE(&g_nexus_inputrouter_list, router, NEXUS_InputRouter, link);
96    BDBG_OBJECT_DESTROY(router, NEXUS_InputRouter);
97    BKNI_Free(router);
98}
99   
100NEXUS_InputClientHandle NEXUS_InputRouter_CreateClient( NEXUS_InputRouterHandle router, unsigned client_id )
101{
102    NEXUS_InputClientHandle client;
103    NEXUS_Error rc;
104
105    BDBG_OBJECT_ASSERT(router, NEXUS_InputRouter);
106
107    client = BKNI_Malloc(sizeof(*client));
108    if (!client) {
109        BERR_TRACE(NEXUS_OUT_OF_SYSTEM_MEMORY);
110        return NULL;
111    }
112    BKNI_Memset(client, 0, sizeof(*client));
113    BDBG_OBJECT_SET(client, NEXUS_InputClient);
114    client->router = router;
115    BLST_S_INSERT_HEAD(&client->router->clients, client, link);
116    client->client_id = client_id;
117   
118    /* default settings */
119    client->serverSettings.fifoSize = 100;
120    client->serverSettings.filterMask = 0xFFFFFFFF; /* everything */
121    client->settings.filterMask = 0xFFFFFFFF; /* everything */
122
123    client->codeAvailableCallback = NEXUS_TaskCallback_Create(client, NULL);
124    if (!client->codeAvailableCallback) {
125        goto error;
126    }
127   
128    /* allow the queue */
129    rc = NEXUS_InputRouter_SetClientSettings(router, client, &client->serverSettings);
130    if (rc) {rc = BERR_TRACE(rc); goto error;}
131
132    return client;
133
134error:
135    NEXUS_InputRouter_DestroyClient(client);
136    return NULL;
137}
138
139void NEXUS_InputRouter_DestroyClient( NEXUS_InputClientHandle client )
140{
141    BDBG_OBJECT_ASSERT(client, NEXUS_InputClient);
142
143    BDBG_OBJECT_ASSERT(client->router, NEXUS_InputRouter);
144    BLST_S_REMOVE(&client->router->clients, client, NEXUS_InputClient, link);
145
146    if (client->codeAvailableCallback) {
147        NEXUS_TaskCallback_Destroy(client->codeAvailableCallback);
148    }
149    if (client->fifo.data) {
150        BKNI_Free(client->fifo.data);
151    }
152
153    BDBG_OBJECT_DESTROY(client, NEXUS_InputClient);
154    BKNI_Free(client);
155    return;
156}
157   
158NEXUS_InputClientHandle NEXUS_InputClient_Acquire( unsigned client_id )
159{
160    NEXUS_InputRouterHandle router;
161    for (router = BLST_S_FIRST(&g_nexus_inputrouter_list); router; router = BLST_S_NEXT(router, link)) {
162        NEXUS_InputClientHandle client;
163        BDBG_OBJECT_ASSERT(router, NEXUS_InputRouter);
164        for (client = BLST_S_FIRST(&router->clients); client; client = BLST_S_NEXT(client, link)) {
165            BDBG_OBJECT_ASSERT(client, NEXUS_InputClient);
166            if (client->client_id == client_id) {
167                if (!client->acquired) {
168                    client->acquired = true;
169                    return client;
170                }
171                else {
172                    BDBG_ERR(("client_id %d already acquired", client_id));
173                    BERR_TRACE(NEXUS_NOT_AVAILABLE);
174                    break;
175                }
176            }
177        }
178    }
179    BDBG_ERR(("client_id %d not created", client_id));
180    BERR_TRACE(NEXUS_NOT_AVAILABLE);
181    return NULL;   
182}
183
184void NEXUS_InputClient_Release( NEXUS_InputClientHandle client )
185{
186    BDBG_OBJECT_ASSERT(client, NEXUS_InputClient);
187    client->acquired = false;
188
189    /* must clear out client's state */
190    client->settings.codeAvailable.callback = NULL;
191    NEXUS_InputClient_SetSettings(client, &client->settings);
192}
193
194void NEXUS_InputRouter_GetClientSettings( NEXUS_InputRouterHandle router, NEXUS_InputClientHandle client, NEXUS_InputRouterClientSettings *pSettings )
195{
196    BDBG_OBJECT_ASSERT(router, NEXUS_InputRouter);
197    BDBG_OBJECT_ASSERT(client, NEXUS_InputClient);
198    if (client->router != router) {
199        BERR_TRACE(NEXUS_INVALID_PARAMETER);
200        BKNI_Memset(pSettings, 0, sizeof(*pSettings));
201    }
202    else {
203        *pSettings = client->serverSettings;
204    }
205}
206   
207NEXUS_Error NEXUS_InputRouter_SetClientSettings( NEXUS_InputRouterHandle router, NEXUS_InputClientHandle client, const NEXUS_InputRouterClientSettings *pSettings )
208{
209    BDBG_OBJECT_ASSERT(router, NEXUS_InputRouter);
210    BDBG_OBJECT_ASSERT(client, NEXUS_InputClient);
211    if (client->router != router) {
212        return BERR_TRACE(NEXUS_INVALID_PARAMETER);
213    }
214    if (client->serverSettings.fifoSize != pSettings->fifoSize) {
215        BKNI_Free(client->fifo.data);
216        client->fifo.data = NULL;
217        client->fifo.rptr = client->fifo.wptr = 0;
218    }
219    if (pSettings->fifoSize && !client->fifo.data) {
220        client->fifo.data = BKNI_Malloc(sizeof(*client->fifo.data) * pSettings->fifoSize);
221        if (!client->fifo.data) {
222            return BERR_TRACE(NEXUS_OUT_OF_SYSTEM_MEMORY);
223        }
224    }
225   
226    client->serverSettings = *pSettings;
227    return 0;
228}
229
230void NEXUS_InputClient_GetSettings( NEXUS_InputClientHandle client, NEXUS_InputClientSettings *pSettings )
231{
232    BDBG_OBJECT_ASSERT(client, NEXUS_InputClient);
233    *pSettings = client->settings;
234}
235
236NEXUS_Error NEXUS_InputClient_SetSettings( NEXUS_InputClientHandle client, const NEXUS_InputClientSettings *pSettings )
237{
238    BDBG_OBJECT_ASSERT(client, NEXUS_InputClient);
239    NEXUS_TaskCallback_Set(client->codeAvailableCallback, &pSettings->codeAvailable);
240    client->settings = *pSettings;
241    return 0;
242}
243
244void NEXUS_InputRouter_GetDefaultCode( NEXUS_InputRouterCode *pCode )
245{
246    BKNI_Memset(pCode, 0, sizeof(*pCode));
247    pCode->filterMask = 0xFFFFFFFF;
248}
249
250void NEXUS_InputRouter_SendCode( NEXUS_InputRouterHandle router, const NEXUS_InputRouterCode *pCode )
251{
252    NEXUS_InputClientHandle client;
253    BDBG_OBJECT_ASSERT(router, NEXUS_InputRouter);
254    for (client = BLST_S_FIRST(&router->clients); client; client = BLST_S_NEXT(client, link)) {
255        /* do not send to unacquired client. apply all three masks */
256        if (client->acquired && 
257            (client->settings.filterMask & pCode->filterMask & client->serverSettings.filterMask)) {
258            if (!client->fifo.data) {
259                BDBG_WRN(("client %d dropped data because it has no fifo", client->client_id));
260                continue; 
261            }
262            client->fifo.data[client->fifo.wptr++] = *pCode;
263            if (client->fifo.wptr == client->serverSettings.fifoSize) {
264                client->fifo.wptr = 0;
265            }
266            if (client->fifo.wptr == client->fifo.rptr) {
267                BDBG_WRN(("client %d overflowed", client->client_id));
268            }
269            NEXUS_TaskCallback_Fire(client->codeAvailableCallback);
270        }
271    }
272}
273
274NEXUS_Error NEXUS_InputClient_GetCodes( NEXUS_InputClientHandle client, NEXUS_InputRouterCode *pCode, unsigned numEntries, unsigned *pNumReturned )
275{
276    unsigned n = 0;
277    BDBG_OBJECT_ASSERT(client, NEXUS_InputClient);
278    if (!pCode) {
279        return BERR_TRACE(NEXUS_INVALID_PARAMETER);
280    }
281    while (n < numEntries && client->fifo.rptr != client->fifo.wptr) {
282        pCode[n++] = client->fifo.data[client->fifo.rptr++];
283        if (client->fifo.rptr == client->serverSettings.fifoSize) {
284            client->fifo.rptr = 0;
285        }
286    }
287    *pNumReturned = n;
288    return 0;
289}
290
Note: See TracBrowser for help on using the repository browser.