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