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 "bt_target.h" 23 #include "bt_types.h" 24 25 /* Error codes */ 26 #define GKI_SUCCESS 0x00 27 #define GKI_FAILURE 0x01 28 #define GKI_INVALID_TASK 0xF0 29 #define GKI_INVALID_POOL 0xFF 30 31 32 /************************************************************************ 33 ** Mailbox definitions. Each task has 4 mailboxes that are used to 34 ** send buffers to the task. 35 */ 36 #define TASK_MBOX_0 0 37 #define TASK_MBOX_1 1 38 #define TASK_MBOX_2 2 39 #define TASK_MBOX_3 3 40 41 #define NUM_TASK_MBOX 4 42 43 /************************************************************************ 44 ** Event definitions. 45 ** 46 ** There are 4 reserved events used to signal messages rcvd in task mailboxes. 47 ** There are 4 reserved events used to signal timeout events. 48 ** There are 8 general purpose events available for applications. 49 */ 50 #define MAX_EVENTS 16 51 52 #define TASK_MBOX_0_EVT_MASK 0x0001 53 #define TASK_MBOX_1_EVT_MASK 0x0002 54 #define TASK_MBOX_2_EVT_MASK 0x0004 55 #define TASK_MBOX_3_EVT_MASK 0x0008 56 57 58 #define TIMER_0 0 59 #define TIMER_1 1 60 #define TIMER_2 2 61 #define TIMER_3 3 62 63 #define TIMER_0_EVT_MASK 0x0010 64 #define TIMER_1_EVT_MASK 0x0020 65 #define TIMER_2_EVT_MASK 0x0040 66 #define TIMER_3_EVT_MASK 0x0080 67 68 #define APPL_EVT_0 8 69 #define APPL_EVT_1 9 70 #define APPL_EVT_2 10 71 #define APPL_EVT_3 11 72 #define APPL_EVT_4 12 73 #define APPL_EVT_5 13 74 #define APPL_EVT_6 14 75 #define APPL_EVT_7 15 76 77 #define EVENT_MASK(evt) ((UINT16)(0x0001 << (evt))) 78 79 /* Timer list entry callback type 80 */ 81 typedef void (TIMER_CBACK)(void *p_tle); 82 #ifndef TIMER_PARAM_TYPE 83 #define TIMER_PARAM_TYPE UINT32 84 #endif 85 /* Define a timer list entry 86 */ 87 typedef struct _tle 88 { 89 struct _tle *p_next; 90 struct _tle *p_prev; 91 TIMER_CBACK *p_cback; 92 INT32 ticks; 93 INT32 ticks_initial; 94 TIMER_PARAM_TYPE param; 95 TIMER_PARAM_TYPE data; 96 UINT16 event; 97 UINT8 in_use; 98 } TIMER_LIST_ENT; 99 100 /* Define a timer list queue 101 */ 102 typedef struct 103 { 104 TIMER_LIST_ENT *p_first; 105 TIMER_LIST_ENT *p_last; 106 } TIMER_LIST_Q; 107 108 109 /*********************************************************************** 110 ** This queue is a general purpose buffer queue, for application use. 111 */ 112 typedef struct 113 { 114 void *p_first; 115 void *p_last; 116 UINT16 count; 117 } BUFFER_Q; 118 119 #define GKI_IS_QUEUE_EMPTY(p_q) ((p_q)->count == 0) 120 121 /* Task constants 122 */ 123 #ifndef TASKPTR 124 typedef void (*TASKPTR)(UINT32); 125 #endif 126 127 128 #define GKI_PUBLIC_POOL 0 /* General pool accessible to GKI_getbuf() */ 129 #define GKI_RESTRICTED_POOL 1 /* Inaccessible pool to GKI_getbuf() */ 130 131 /*********************************************************************** 132 ** Function prototypes 133 */ 134 135 #ifdef __cplusplus 136 extern "C" { 137 #endif 138 139 /* Task management 140 */ 141 GKI_API extern UINT8 GKI_create_task (TASKPTR, UINT8, INT8 *, UINT16 *, UINT16); 142 GKI_API extern void GKI_destroy_task(UINT8 task_id); 143 GKI_API extern void GKI_task_self_cleanup(UINT8 task_id); 144 GKI_API extern void GKI_exit_task(UINT8); 145 GKI_API extern UINT8 GKI_get_taskid(void); 146 GKI_API extern void GKI_init(void); 147 GKI_API extern void GKI_shutdown(void); 148 GKI_API extern INT8 *GKI_map_taskname(UINT8); 149 GKI_API extern void GKI_run(void); 150 GKI_API extern void GKI_stop(void); 151 152 /* To send buffers and events between tasks 153 */ 154 GKI_API extern void *GKI_read_mbox (UINT8); 155 GKI_API extern void GKI_send_msg (UINT8, UINT8, void *); 156 GKI_API extern UINT8 GKI_send_event (UINT8, UINT16); 157 158 159 /* To get and release buffers, change owner and get size 160 */ 161 GKI_API extern void GKI_freebuf (void *); 162 GKI_API extern void *GKI_getbuf (UINT16); 163 GKI_API extern UINT16 GKI_get_buf_size (void *); 164 GKI_API extern void *GKI_getpoolbuf (UINT8); 165 GKI_API extern UINT16 GKI_poolcount (UINT8); 166 GKI_API extern UINT16 GKI_poolfreecount (UINT8); 167 GKI_API extern UINT16 GKI_poolutilization (UINT8); 168 169 170 /* User buffer queue management 171 */ 172 GKI_API extern void *GKI_dequeue (BUFFER_Q *); 173 GKI_API extern void GKI_enqueue (BUFFER_Q *, void *); 174 GKI_API extern void GKI_enqueue_head (BUFFER_Q *, void *); 175 GKI_API extern void *GKI_getfirst (BUFFER_Q *); 176 GKI_API extern void *GKI_getlast (BUFFER_Q *); 177 GKI_API extern void *GKI_getnext (void *); 178 GKI_API extern void GKI_init_q (BUFFER_Q *); 179 GKI_API extern BOOLEAN GKI_queue_is_empty(BUFFER_Q *); 180 GKI_API extern void *GKI_remove_from_queue (BUFFER_Q *, void *); 181 GKI_API extern UINT16 GKI_get_pool_bufsize (UINT8); 182 183 /* Timer management 184 */ 185 GKI_API extern void GKI_add_to_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT *); 186 GKI_API extern void GKI_delay(UINT32); 187 GKI_API extern UINT32 GKI_get_tick_count(void); 188 GKI_API extern void GKI_init_timer_list (TIMER_LIST_Q *); 189 GKI_API extern INT32 GKI_ready_to_sleep (void); 190 GKI_API extern BOOLEAN GKI_remove_from_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT *); 191 GKI_API extern void GKI_start_timer(UINT8, INT32, BOOLEAN); 192 GKI_API extern void GKI_stop_timer (UINT8); 193 GKI_API extern void GKI_timer_update(INT32); 194 GKI_API extern UINT16 GKI_update_timer_list (TIMER_LIST_Q *, INT32); 195 GKI_API extern UINT32 GKI_get_remaining_ticks (TIMER_LIST_Q *, TIMER_LIST_ENT *); 196 GKI_API extern UINT16 GKI_wait(UINT16, UINT32); 197 GKI_API extern BOOLEAN GKI_timer_queue_is_empty(const TIMER_LIST_Q *timer_q); 198 GKI_API extern TIMER_LIST_ENT *GKI_timer_getfirst(const TIMER_LIST_Q *timer_q); 199 GKI_API extern INT32 GKI_timer_ticks_getinitial(const TIMER_LIST_ENT *tle); 200 201 /* Disable Interrupts, Enable Interrupts 202 */ 203 GKI_API extern void GKI_enable(void); 204 GKI_API extern void GKI_disable(void); 205 206 /* Allocate (Free) memory from an OS 207 */ 208 GKI_API extern void *GKI_os_malloc (UINT32); 209 GKI_API extern void GKI_os_free (void *); 210 211 /* os timer operation */ 212 GKI_API extern UINT32 GKI_get_os_tick_count(void); 213 214 /* Exception handling 215 */ 216 GKI_API extern void GKI_exception (UINT16, char *); 217 218 #if GKI_DEBUG == TRUE 219 GKI_API extern void GKI_PrintBufferUsage(UINT8 *p_num_pools, UINT16 *p_cur_used); 220 GKI_API extern void GKI_PrintBuffer(void); 221 GKI_API extern void GKI_print_task(void); 222 #else 223 #undef GKI_PrintBufferUsage 224 #define GKI_PrintBuffer() NULL 225 #endif 226 227 #ifdef __cplusplus 228 } 229 #endif 230 231 232 #endif 233