/******************************************************************************* ** ** Function userial_init ** ** Description Initializes the userial driver ** ** Returns TRUE/FALSE ** *******************************************************************************/ uint8_t userial_init(void) { USERIALDBG("userial_init"); memset(&userial_cb, 0, sizeof(tUSERIAL_CB)); userial_cb.fd = -1; utils_queue_init(&(userial_cb.rx_q)); return TRUE; }
static int init(const bt_hc_callbacks_t* p_cb, unsigned char *local_bdaddr) { int result; ALOGI("init"); if (p_cb == NULL) { ALOGE("init failed with no user callbacks!"); return BT_HC_STATUS_FAIL; } hc_cb.epilog_timer_created = false; fwcfg_acked = false; has_cleaned_up = false; pthread_mutex_init(&hc_cb.worker_thread_lock, NULL); /* store reference to user callbacks */ bt_hc_cbacks = (bt_hc_callbacks_t *) p_cb; vendor_open(local_bdaddr); utils_init(); #ifdef HCI_USE_MCT extern tHCI_IF hci_mct_func_table; p_hci_if = &hci_mct_func_table; #else extern tHCI_IF hci_h4_func_table; p_hci_if = &hci_h4_func_table; #endif p_hci_if->init(); userial_init(); lpm_init(); utils_queue_init(&tx_q); if (hc_cb.worker_thread) { ALOGW("init has been called repeatedly without calling cleanup ?"); } // Set prio here and let hci worker thread inherit prio // remove once new thread api (thread_set_priority() ?) // can switch prio raise_priority_a2dp(TASK_HIGH_HCI_WORKER); hc_cb.worker_thread = thread_new("bt_hc_worker"); if (!hc_cb.worker_thread) { ALOGE("%s unable to create worker thread.", __func__); return BT_HC_STATUS_FAIL; } return BT_HC_STATUS_SUCCESS; }
/******************************************************************************* ** ** Function userial_init ** ** Description Initializes the userial driver ** ** Returns TRUE/FALSE ** *******************************************************************************/ uint8_t userial_init(void) { int idx; USERIALDBG("userial_init"); memset(&userial_cb, 0, sizeof(tUSERIAL_CB)); for (idx=0; idx < CH_MAX; idx++) userial_cb.fd[idx] = -1; utils_queue_init(&(userial_cb.rx_q)); return TRUE; }
static int init(const bt_hc_callbacks_t* p_cb, unsigned char *local_bdaddr) { pthread_attr_t thread_attr; struct sched_param param; int policy, result; ALOGI("init"); if (p_cb == NULL) { ALOGE("init failed with no user callbacks!"); return BT_HC_STATUS_FAIL; } hc_cb.epilog_timer_created = 0; fwcfg_acked = FALSE; /* store reference to user callbacks */ bt_hc_cbacks = (bt_hc_callbacks_t *) p_cb; init_vnd_if(local_bdaddr); utils_init(); if(is_bt_transport_smd()) { extern tHCI_IF hci_mct_func_table; extern tUSERIAL_IF userial_mct_func_table; p_hci_if = &hci_mct_func_table; p_userial_if = &userial_mct_func_table; } else { extern tHCI_IF hci_h4_func_table; extern tUSERIAL_IF userial_h4_func_table; p_hci_if = &hci_h4_func_table; p_userial_if = &userial_h4_func_table; } p_hci_if->init(); p_userial_if->init(); lpm_init(); utils_queue_init(&tx_q); if (lib_running) { ALOGW("init has been called repeatedly without calling cleanup ?"); } lib_running = 1; ready_events = 0; pthread_mutex_init(&hc_cb.mutex, NULL); pthread_cond_init(&hc_cb.cond, NULL); pthread_attr_init(&thread_attr); if (pthread_create(&hc_cb.worker_thread, &thread_attr, \ bt_hc_worker_thread, NULL) != 0) { ALOGE("pthread_create failed!"); lib_running = 0; return BT_HC_STATUS_FAIL; } if(pthread_getschedparam(hc_cb.worker_thread, &policy, ¶m)==0) { policy = BTHC_LINUX_BASE_POLICY; #if (BTHC_LINUX_BASE_POLICY!=SCHED_NORMAL) param.sched_priority = BTHC_MAIN_THREAD_PRIORITY; #endif result = pthread_setschedparam(hc_cb.worker_thread, policy, ¶m); if (result != 0) { ALOGW("libbt-hci init: pthread_setschedparam failed (%s)", \ strerror(result)); } } return BT_HC_STATUS_SUCCESS; }