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