Home | History | Annotate | Download | only in common
      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 */
    328 typedef 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 */
    338 typedef 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 */
    351 typedef 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 */
    362 typedef 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
    374 typedef 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
    386 extern "C" {
    387 #endif
    388 
    389 /* Task management
    390 */
    391 GKI_API extern UINT8   GKI_create_task (TASKPTR, UINT8, INT8 *, UINT16 *, UINT16, void*, void*);
    392 GKI_API extern void    GKI_exit_task(UINT8);
    393 GKI_API extern UINT8   GKI_get_taskid(void);
    394 GKI_API extern void    GKI_init(void);
    395 GKI_API extern INT8   *GKI_map_taskname(UINT8);
    396 GKI_API extern UINT8   GKI_resume_task(UINT8);
    397 GKI_API extern void    GKI_run(void *);
    398 GKI_API extern void    GKI_stop(void);
    399 GKI_API extern UINT8   GKI_suspend_task(UINT8);
    400 GKI_API extern UINT8   GKI_is_task_running(UINT8);
    401 
    402 /* memory management
    403 */
    404 GKI_API extern void GKI_shiftdown (UINT8 *p_mem, UINT32 len, UINT32 shift_amount);
    405 GKI_API extern void GKI_shiftup (UINT8 *p_dest, UINT8 *p_src, UINT32 len);
    406 
    407 /* To send buffers and events between tasks
    408 */
    409 GKI_API extern UINT8   GKI_isend_event (UINT8, UINT16);
    410 GKI_API extern void    GKI_isend_msg (UINT8, UINT8, void *);
    411 GKI_API extern void   *GKI_read_mbox  (UINT8);
    412 GKI_API extern void    GKI_send_msg   (UINT8, UINT8, void *);
    413 GKI_API extern UINT8   GKI_send_event (UINT8, UINT16);
    414 
    415 
    416 /* To get and release buffers, change owner and get size
    417 */
    418 GKI_API extern void    GKI_change_buf_owner (void *, UINT8);
    419 GKI_API extern UINT8   GKI_create_pool (UINT16, UINT16, UINT8, void *);
    420 GKI_API extern void    GKI_delete_pool (UINT8);
    421 GKI_API extern void   *GKI_find_buf_start (void *);
    422 GKI_API extern void    GKI_freebuf (void *);
    423 #if GKI_BUFFER_DEBUG
    424 #define GKI_getbuf(size)    GKI_getbuf_debug(size, __FUNCTION__, __LINE__)
    425 GKI_API extern void   *GKI_getbuf_debug (UINT16, const char *, int);
    426 #else
    427 GKI_API extern void   *GKI_getbuf (UINT16);
    428 #endif
    429 GKI_API extern UINT16  GKI_get_buf_size (void *);
    430 #if GKI_BUFFER_DEBUG
    431 #define GKI_getpoolbuf(id)    GKI_getpoolbuf_debug(id, __FUNCTION__, __LINE__)
    432 GKI_API extern void   *GKI_getpoolbuf_debug (UINT8, const char *, int);
    433 #else
    434 GKI_API extern void   *GKI_getpoolbuf (UINT8);
    435 #endif
    436 
    437 GKI_API extern UINT16  GKI_poolcount (UINT8);
    438 GKI_API extern UINT16  GKI_poolfreecount (UINT8);
    439 GKI_API extern UINT16  GKI_poolutilization (UINT8);
    440 GKI_API extern void    GKI_register_mempool (void *p_mem);
    441 GKI_API extern UINT8   GKI_set_pool_permission(UINT8, UINT8);
    442 
    443 
    444 /* User buffer queue management
    445 */
    446 GKI_API extern void   *GKI_dequeue  (BUFFER_Q *);
    447 GKI_API extern void    GKI_enqueue (BUFFER_Q *, void *);
    448 GKI_API extern void    GKI_enqueue_head (BUFFER_Q *, void *);
    449 GKI_API extern void   *GKI_getfirst (BUFFER_Q *);
    450 GKI_API extern void   *GKI_getlast (BUFFER_Q *);
    451 GKI_API extern void   *GKI_getnext (void *);
    452 GKI_API extern void    GKI_init_q (BUFFER_Q *);
    453 GKI_API extern BOOLEAN GKI_queue_is_empty(BUFFER_Q *);
    454 GKI_API extern void   *GKI_remove_from_queue (BUFFER_Q *, void *);
    455 GKI_API extern UINT16  GKI_get_pool_bufsize (UINT8);
    456 
    457 /* Timer management
    458 */
    459 GKI_API extern void    GKI_add_to_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
    460 GKI_API extern void    GKI_delay(UINT32);
    461 GKI_API extern UINT32  GKI_get_tick_count(void);
    462 GKI_API extern INT8   *GKI_get_time_stamp(INT8 *);
    463 GKI_API extern void    GKI_init_timer_list (TIMER_LIST_Q *);
    464 GKI_API extern void    GKI_init_timer_list_entry (TIMER_LIST_ENT  *);
    465 GKI_API extern INT32   GKI_ready_to_sleep (void);
    466 GKI_API extern void    GKI_remove_from_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
    467 GKI_API extern void    GKI_start_timer(UINT8, INT32, BOOLEAN);
    468 GKI_API extern void    GKI_stop_timer (UINT8);
    469 GKI_API extern void    GKI_timer_update(INT32);
    470 GKI_API extern UINT16  GKI_update_timer_list (TIMER_LIST_Q *, INT32);
    471 GKI_API extern UINT32  GKI_get_remaining_ticks (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
    472 GKI_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 */
    478 typedef void (SYSTEM_TICK_CBACK)(BOOLEAN);
    479 
    480 /* Time queue management for system ticks
    481 */
    482 GKI_API extern BOOLEAN GKI_timer_queue_empty (void);
    483 GKI_API extern void    GKI_timer_queue_register_callback(SYSTEM_TICK_CBACK *);
    484 
    485 /* Disable Interrupts, Enable Interrupts
    486 */
    487 GKI_API extern void    GKI_enable(void);
    488 GKI_API extern void    GKI_disable(void);
    489 GKI_API extern void    GKI_sched_lock(void);
    490 GKI_API extern void    GKI_sched_unlock(void);
    491 
    492 /* Allocate (Free) memory from an OS
    493 */
    494 GKI_API extern void     *GKI_os_malloc (UINT32);
    495 GKI_API extern void      GKI_os_free (void *);
    496 
    497 /* os timer operation */
    498 GKI_API extern UINT32 GKI_get_os_tick_count(void);
    499 
    500 /* Exception handling
    501 */
    502 GKI_API extern void    GKI_exception (UINT16, char *);
    503 
    504 #if GKI_DEBUG == TRUE
    505 GKI_API extern void    GKI_PrintBufferUsage(UINT8 *p_num_pools, UINT16 *p_cur_used);
    506 GKI_API extern void    GKI_PrintBuffer(void);
    507 GKI_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