• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 1999-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 #ifndef GKI_H
19 #define GKI_H
20 
21 
22 /* Include platform-specific over-rides */
23 #if (defined(NFC_STANDALONE) && (NFC_STANDALONE == TRUE))
24     #include "gki_target.h"
25 #else
26     /* For non-nfc_standalone, include Bluetooth definitions */
27     #include "bt_target.h"
28 #endif
29 
30 
31 
32 #include "bt_types.h"
33 
34 /* Error codes */
35 #define GKI_SUCCESS         0x00
36 #define GKI_FAILURE         0x01
37 #define GKI_INVALID_TASK    0xF0
38 #define GKI_INVALID_POOL    0xFF
39 
40 
41 /************************************************************************
42 ** Mailbox definitions. Each task has 4 mailboxes that are used to
43 ** send buffers to the task.
44 */
45 #define TASK_MBOX_0    0
46 #define TASK_MBOX_1    1
47 #define TASK_MBOX_2    2
48 #define TASK_MBOX_3    3
49 
50 #define NUM_TASK_MBOX  4
51 
52 /************************************************************************
53 ** Event definitions.
54 **
55 ** There are 4 reserved events used to signal messages rcvd in task mailboxes.
56 ** There are 4 reserved events used to signal timeout events.
57 ** There are 8 general purpose events available for applications.
58 */
59 #define MAX_EVENTS              16
60 
61 #define TASK_MBOX_0_EVT_MASK   0x0001
62 #define TASK_MBOX_1_EVT_MASK   0x0002
63 #define TASK_MBOX_2_EVT_MASK   0x0004
64 #define TASK_MBOX_3_EVT_MASK   0x0008
65 
66 
67 #define TIMER_0             0
68 #define TIMER_1             1
69 #define TIMER_2             2
70 #define TIMER_3             3
71 
72 #define TIMER_0_EVT_MASK    0x0010
73 #define TIMER_1_EVT_MASK    0x0020
74 #define TIMER_2_EVT_MASK    0x0040
75 #define TIMER_3_EVT_MASK    0x0080
76 
77 #define APPL_EVT_0          8
78 #define APPL_EVT_1          9
79 #define APPL_EVT_2          10
80 #define APPL_EVT_3          11
81 #define APPL_EVT_4          12
82 #define APPL_EVT_5          13
83 #define APPL_EVT_6          14
84 #define APPL_EVT_7          15
85 
86 #define EVENT_MASK(evt)       ((UINT16)(0x0001 << (evt)))
87 
88 /************************************************************************
89 **  Max Time Queue
90 **/
91 #ifndef GKI_MAX_TIMER_QUEUES
92 #define GKI_MAX_TIMER_QUEUES    3
93 #endif
94 
95 /************************************************************************
96 **  Macro to determine the pool buffer size based on the GKI POOL ID at compile time.
97 **  Pool IDs index from 0 to GKI_NUM_FIXED_BUF_POOLS - 1
98 */
99 
100 #if (GKI_NUM_FIXED_BUF_POOLS < 1)
101 
102 #ifndef GKI_POOL_ID_0
103 #define GKI_POOL_ID_0                0
104 #endif /* ifndef GKI_POOL_ID_0 */
105 
106 #ifndef GKI_BUF0_SIZE
107 #define GKI_BUF0_SIZE                0
108 #endif /* ifndef GKI_BUF0_SIZE */
109 
110 #endif /* GKI_NUM_FIXED_BUF_POOLS < 1 */
111 
112 
113 #if (GKI_NUM_FIXED_BUF_POOLS < 2)
114 
115 #ifndef GKI_POOL_ID_1
116 #define GKI_POOL_ID_1                0
117 #endif /* ifndef GKI_POOL_ID_1 */
118 
119 #ifndef GKI_BUF1_SIZE
120 #define GKI_BUF1_SIZE                0
121 #endif /* ifndef GKI_BUF1_SIZE */
122 
123 #endif /* GKI_NUM_FIXED_BUF_POOLS < 2 */
124 
125 
126 #if (GKI_NUM_FIXED_BUF_POOLS < 3)
127 
128 #ifndef GKI_POOL_ID_2
129 #define GKI_POOL_ID_2                0
130 #endif /* ifndef GKI_POOL_ID_2 */
131 
132 #ifndef GKI_BUF2_SIZE
133 #define GKI_BUF2_SIZE                0
134 #endif /* ifndef GKI_BUF2_SIZE */
135 
136 #endif /* GKI_NUM_FIXED_BUF_POOLS < 3 */
137 
138 
139 #if (GKI_NUM_FIXED_BUF_POOLS < 4)
140 
141 #ifndef GKI_POOL_ID_3
142 #define GKI_POOL_ID_3                0
143 #endif /* ifndef GKI_POOL_ID_4 */
144 
145 #ifndef GKI_BUF3_SIZE
146 #define GKI_BUF3_SIZE                0
147 #endif /* ifndef GKI_BUF3_SIZE */
148 
149 #endif /* GKI_NUM_FIXED_BUF_POOLS < 4 */
150 
151 
152 #if (GKI_NUM_FIXED_BUF_POOLS < 5)
153 
154 #ifndef GKI_POOL_ID_4
155 #define GKI_POOL_ID_4                0
156 #endif /* ifndef GKI_POOL_ID_4 */
157 
158 #ifndef GKI_BUF4_SIZE
159 #define GKI_BUF4_SIZE                0
160 #endif /* ifndef GKI_BUF4_SIZE */
161 
162 #endif /* GKI_NUM_FIXED_BUF_POOLS < 5 */
163 
164 
165 #if (GKI_NUM_FIXED_BUF_POOLS < 6)
166 
167 #ifndef GKI_POOL_ID_5
168 #define GKI_POOL_ID_5                0
169 #endif /* ifndef GKI_POOL_ID_5 */
170 
171 #ifndef GKI_BUF5_SIZE
172 #define GKI_BUF5_SIZE                0
173 #endif /* ifndef GKI_BUF5_SIZE */
174 
175 #endif /* GKI_NUM_FIXED_BUF_POOLS < 6 */
176 
177 
178 #if (GKI_NUM_FIXED_BUF_POOLS < 7)
179 
180 #ifndef GKI_POOL_ID_6
181 #define GKI_POOL_ID_6                0
182 #endif /* ifndef GKI_POOL_ID_6 */
183 
184 #ifndef GKI_BUF6_SIZE
185 #define GKI_BUF6_SIZE                0
186 #endif /* ifndef GKI_BUF6_SIZE */
187 
188 #endif /* GKI_NUM_FIXED_BUF_POOLS < 7 */
189 
190 
191 #if (GKI_NUM_FIXED_BUF_POOLS < 8)
192 
193 #ifndef GKI_POOL_ID_7
194 #define GKI_POOL_ID_7                0
195 #endif /* ifndef GKI_POOL_ID_7 */
196 
197 #ifndef GKI_BUF7_SIZE
198 #define GKI_BUF7_SIZE                0
199 #endif /* ifndef GKI_BUF7_SIZE */
200 
201 #endif /* GKI_NUM_FIXED_BUF_POOLS < 8 */
202 
203 
204 #if (GKI_NUM_FIXED_BUF_POOLS < 9)
205 
206 #ifndef GKI_POOL_ID_8
207 #define GKI_POOL_ID_8                0
208 #endif /* ifndef GKI_POOL_ID_8 */
209 
210 #ifndef GKI_BUF8_SIZE
211 #define GKI_BUF8_SIZE                0
212 #endif /* ifndef GKI_BUF8_SIZE */
213 
214 #endif /* GKI_NUM_FIXED_BUF_POOLS < 9 */
215 
216 
217 #if (GKI_NUM_FIXED_BUF_POOLS < 10)
218 
219 #ifndef GKI_POOL_ID_9
220 #define GKI_POOL_ID_9                0
221 #endif /* ifndef GKI_POOL_ID_9 */
222 
223 #ifndef GKI_BUF9_SIZE
224 #define GKI_BUF9_SIZE                0
225 #endif /* ifndef GKI_BUF9_SIZE */
226 
227 #endif /* GKI_NUM_FIXED_BUF_POOLS < 10 */
228 
229 
230 #if (GKI_NUM_FIXED_BUF_POOLS < 11)
231 
232 #ifndef GKI_POOL_ID_10
233 #define GKI_POOL_ID_10                0
234 #endif /* ifndef GKI_POOL_ID_10 */
235 
236 #ifndef GKI_BUF10_SIZE
237 #define GKI_BUF10_SIZE                0
238 #endif /* ifndef GKI_BUF10_SIZE */
239 
240 #endif /* GKI_NUM_FIXED_BUF_POOLS < 11 */
241 
242 
243 #if (GKI_NUM_FIXED_BUF_POOLS < 12)
244 
245 #ifndef GKI_POOL_ID_11
246 #define GKI_POOL_ID_11                0
247 #endif /* ifndef GKI_POOL_ID_11 */
248 
249 #ifndef GKI_BUF11_SIZE
250 #define GKI_BUF11_SIZE                0
251 #endif /* ifndef GKI_BUF11_SIZE */
252 
253 #endif /* GKI_NUM_FIXED_BUF_POOLS < 12 */
254 
255 
256 #if (GKI_NUM_FIXED_BUF_POOLS < 13)
257 
258 #ifndef GKI_POOL_ID_12
259 #define GKI_POOL_ID_12                0
260 #endif /* ifndef GKI_POOL_ID_12 */
261 
262 #ifndef GKI_BUF12_SIZE
263 #define GKI_BUF12_SIZE                0
264 #endif /* ifndef GKI_BUF12_SIZE */
265 
266 #endif /* GKI_NUM_FIXED_BUF_POOLS < 13 */
267 
268 
269 #if (GKI_NUM_FIXED_BUF_POOLS < 14)
270 
271 #ifndef GKI_POOL_ID_13
272 #define GKI_POOL_ID_13                0
273 #endif /* ifndef GKI_POOL_ID_13 */
274 
275 #ifndef GKI_BUF13_SIZE
276 #define GKI_BUF13_SIZE                0
277 #endif /* ifndef GKI_BUF13_SIZE */
278 
279 #endif /* GKI_NUM_FIXED_BUF_POOLS < 14 */
280 
281 
282 #if (GKI_NUM_FIXED_BUF_POOLS < 15)
283 
284 #ifndef GKI_POOL_ID_14
285 #define GKI_POOL_ID_14                0
286 #endif /* ifndef GKI_POOL_ID_14 */
287 
288 #ifndef GKI_BUF14_SIZE
289 #define GKI_BUF14_SIZE                0
290 #endif /* ifndef GKI_BUF14_SIZE */
291 
292 #endif /* GKI_NUM_FIXED_BUF_POOLS < 15 */
293 
294 
295 #if (GKI_NUM_FIXED_BUF_POOLS < 16)
296 
297 #ifndef GKI_POOL_ID_15
298 #define GKI_POOL_ID_15                0
299 #endif /* ifndef GKI_POOL_ID_15 */
300 
301 #ifndef GKI_BUF15_SIZE
302 #define GKI_BUF15_SIZE                0
303 #endif /* ifndef GKI_BUF15_SIZE */
304 
305 #endif /* GKI_NUM_FIXED_BUF_POOLS < 16 */
306 
307 
308 /* Timer list entry callback type
309 */
310 typedef void (TIMER_CBACK)(void *p_tle);
311 #ifndef TIMER_PARAM_TYPE
312 #ifdef  WIN2000
313 #define TIMER_PARAM_TYPE    void *
314 #else
315 #define TIMER_PARAM_TYPE    UINT32
316 #endif
317 #endif
318 /* Define a timer list entry
319 */
320 typedef struct _tle
321 {
322     struct _tle  *p_next;
323     struct _tle  *p_prev;
324     TIMER_CBACK  *p_cback;
325     INT32         ticks;
326     TIMER_PARAM_TYPE   param;
327     UINT16        event;
328     UINT8         in_use;
329 } TIMER_LIST_ENT;
330 
331 /* Define a timer list queue
332 */
333 typedef struct
334 {
335     TIMER_LIST_ENT   *p_first;
336     TIMER_LIST_ENT   *p_last;
337     INT32             last_ticks;
338 } TIMER_LIST_Q;
339 
340 
341 /***********************************************************************
342 ** This queue is a general purpose buffer queue, for application use.
343 */
344 typedef struct
345 {
346     void    *p_first;
347     void    *p_last;
348     UINT16   count;
349 } BUFFER_Q;
350 
351 #define GKI_IS_QUEUE_EMPTY(p_q) ((p_q)->count == 0)
352 
353 /* Task constants
354 */
355 #ifndef TASKPTR
356 typedef void (*TASKPTR)(UINT32);
357 #endif
358 
359 
360 #define GKI_PUBLIC_POOL         0       /* General pool accessible to GKI_getbuf() */
361 #define GKI_RESTRICTED_POOL     1       /* Inaccessible pool to GKI_getbuf() */
362 
363 /***********************************************************************
364 ** Function prototypes
365 */
366 
367 #ifdef __cplusplus
368 extern "C" {
369 #endif
370 
371 /* Task management
372 */
373 GKI_API extern UINT8   GKI_create_task (TASKPTR, UINT8, INT8 *, UINT16 *, UINT16);
374 GKI_API extern void    GKI_destroy_task(UINT8 task_id);
375 GKI_API extern void    GKI_task_self_cleanup(UINT8 task_id);
376 GKI_API extern void    GKI_exit_task(UINT8);
377 GKI_API extern UINT8   GKI_get_taskid(void);
378 GKI_API extern void    GKI_init(void);
379 GKI_API extern void    GKI_shutdown(void);
380 GKI_API extern INT8   *GKI_map_taskname(UINT8);
381 GKI_API extern UINT8   GKI_resume_task(UINT8);
382 GKI_API extern void    GKI_run(void *);
383 GKI_API extern void    GKI_freeze(void);
384 GKI_API extern void    GKI_stop(void);
385 GKI_API extern UINT8   GKI_suspend_task(UINT8);
386 GKI_API extern UINT8   GKI_is_task_running(UINT8);
387 
388 /* memory management
389 */
390 GKI_API extern void GKI_shiftdown (UINT8 *p_mem, UINT32 len, UINT32 shift_amount);
391 GKI_API extern void GKI_shiftup (UINT8 *p_dest, UINT8 *p_src, UINT32 len);
392 
393 /* To send buffers and events between tasks
394 */
395 GKI_API extern UINT8   GKI_isend_event (UINT8, UINT16);
396 GKI_API extern void    GKI_isend_msg (UINT8, UINT8, void *);
397 GKI_API extern void   *GKI_read_mbox  (UINT8);
398 GKI_API extern void    GKI_send_msg   (UINT8, UINT8, void *);
399 GKI_API extern UINT8   GKI_send_event (UINT8, UINT16);
400 
401 
402 /* To get and release buffers, change owner and get size
403 */
404 GKI_API extern void    GKI_change_buf_owner (void *, UINT8);
405 GKI_API extern UINT8   GKI_create_pool (UINT16, UINT16, UINT8, void *);
406 GKI_API extern void    GKI_delete_pool (UINT8);
407 GKI_API extern void   *GKI_find_buf_start (void *);
408 GKI_API extern void    GKI_freebuf (void *);
409 GKI_API extern void   *GKI_getbuf (UINT16);
410 GKI_API extern UINT16  GKI_get_buf_size (void *);
411 GKI_API extern void   *GKI_getpoolbuf (UINT8);
412 GKI_API extern UINT16  GKI_poolcount (UINT8);
413 GKI_API extern UINT16  GKI_poolfreecount (UINT8);
414 GKI_API extern UINT16  GKI_poolutilization (UINT8);
415 GKI_API extern void    GKI_register_mempool (void *p_mem);
416 GKI_API extern UINT8   GKI_set_pool_permission(UINT8, UINT8);
417 
418 
419 /* User buffer queue management
420 */
421 GKI_API extern void   *GKI_dequeue  (BUFFER_Q *);
422 GKI_API extern void    GKI_enqueue (BUFFER_Q *, void *);
423 GKI_API extern void    GKI_enqueue_head (BUFFER_Q *, void *);
424 GKI_API extern void   *GKI_getfirst (BUFFER_Q *);
425 GKI_API extern void   *GKI_getlast (BUFFER_Q *);
426 GKI_API extern void   *GKI_getnext (void *);
427 GKI_API extern void    GKI_init_q (BUFFER_Q *);
428 GKI_API extern BOOLEAN GKI_queue_is_empty(BUFFER_Q *);
429 GKI_API extern void   *GKI_remove_from_queue (BUFFER_Q *, void *);
430 GKI_API extern UINT16  GKI_get_pool_bufsize (UINT8);
431 
432 /* Timer management
433 */
434 GKI_API extern void    GKI_add_to_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
435 GKI_API extern void    GKI_delay(UINT32);
436 GKI_API extern UINT32  GKI_get_tick_count(void);
437 GKI_API extern INT8   *GKI_get_time_stamp(INT8 *);
438 GKI_API extern void    GKI_init_timer_list (TIMER_LIST_Q *);
439 GKI_API extern void    GKI_init_timer_list_entry (TIMER_LIST_ENT  *);
440 GKI_API extern INT32   GKI_ready_to_sleep (void);
441 GKI_API extern void    GKI_remove_from_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
442 GKI_API extern void    GKI_start_timer(UINT8, INT32, BOOLEAN);
443 GKI_API extern void    GKI_stop_timer (UINT8);
444 GKI_API extern void    GKI_timer_update(INT32);
445 GKI_API extern UINT16  GKI_update_timer_list (TIMER_LIST_Q *, INT32);
446 GKI_API extern UINT32  GKI_get_remaining_ticks (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
447 GKI_API extern UINT16  GKI_wait(UINT16, UINT32);
448 
449 /* Start and Stop system time tick callback
450  * true for start system tick if time queue is not empty
451  * false to stop system tick if time queue is empty
452 */
453 typedef void (SYSTEM_TICK_CBACK)(BOOLEAN);
454 
455 /* Time queue management for system ticks
456 */
457 GKI_API extern BOOLEAN GKI_timer_queue_empty (void);
458 GKI_API extern void    GKI_timer_queue_register_callback(SYSTEM_TICK_CBACK *);
459 
460 /* Disable Interrupts, Enable Interrupts
461 */
462 GKI_API extern void    GKI_enable(void);
463 GKI_API extern void    GKI_disable(void);
464 GKI_API extern void    GKI_sched_lock(void);
465 GKI_API extern void    GKI_sched_unlock(void);
466 
467 /* Allocate (Free) memory from an OS
468 */
469 GKI_API extern void     *GKI_os_malloc (UINT32);
470 GKI_API extern void      GKI_os_free (void *);
471 
472 /* os timer operation */
473 GKI_API extern UINT32 GKI_get_os_tick_count(void);
474 
475 /* Exception handling
476 */
477 GKI_API extern void    GKI_exception (UINT16, char *);
478 
479 #if GKI_DEBUG == TRUE
480 GKI_API extern void    GKI_PrintBufferUsage(UINT8 *p_num_pools, UINT16 *p_cur_used);
481 GKI_API extern void    GKI_PrintBuffer(void);
482 GKI_API extern void    GKI_print_task(void);
483 #else
484 #undef GKI_PrintBufferUsage
485 #define GKI_PrintBuffer() NULL
486 #endif
487 
488 #ifdef __cplusplus
489 }
490 #endif
491 
492 
493 #endif
494 
495