Broke Android_System_package in to individual repositories
diff --git a/src/bluez_hci/Android.mk b/src/bluez_hci/Android.mk
new file mode 100644
index 0000000..0320a39
--- /dev/null
+++ b/src/bluez_hci/Android.mk
@@ -0,0 +1,67 @@
+#
+# Copyright (C) 2009 Dynastream Innovations
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"wl12xx")
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_CFLAGS := -g -c -W -Wall -O2
+
+# Check which chip is used so correct values in messages
+ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"wl12xx")
+LOCAL_CFLAGS += -DBOARD_ANT_DEVICE_WILINK
+endif # BOARD_ANT_WIRELESS_DEVICE = wl12xx
+
+LOCAL_C_INCLUDES := \
+   $(LOCAL_PATH)/../common/inc \
+   $(LOCAL_PATH)/inc \
+   system/bluetooth/bluez-clean-headers \
+
+ifeq ($(BOARD_ANT_WIRELESS_POWER),"bluedroid")
+LOCAL_CFLAGS += -DBOARD_HAVE_ANT_WIRELESS
+LOCAL_C_INCLUDES += system/bluetooth/bluedroid/include/bluedroid
+endif # BOARD_ANT_WIRELESS_POWER = bluedroid
+
+LOCAL_C_INCLUDE += $(JNI_H_INCLUDE)
+
+LOCAL_SRC_FILES := \
+   ../../JAntNative.cpp \
+   ../common/ant_utils.c \
+   ant_native_hci.c \
+   ant_rx.c \
+   ant_tx.c \
+
+# jni
+LOCAL_SHARED_LIBRARIES +=  \
+   libnativehelper \
+
+# chip power
+LOCAL_SHARED_LIBRARIES += \
+   libbluedroid \
+
+# logging
+LOCAL_SHARED_LIBRARIES += \
+   libcutils \
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libantradio
+
+include $(BUILD_SHARED_LIBRARY)
+
+endif # BOARD_ANT_WIRELESS_DEVICE = "wl12xx"
+
diff --git a/src/bluez_hci/ant_native_hci.c b/src/bluez_hci/ant_native_hci.c
new file mode 100644
index 0000000..4650f62
--- /dev/null
+++ b/src/bluez_hci/ant_native_hci.c
@@ -0,0 +1,823 @@
+/*
+* ANT Stack
+*
+* Copyright 2009 Dynastream Innovations
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+/******************************************************************************\
+*
+*   FILE NAME:      ant_native_hci.c
+*
+*   BRIEF:
+*        This file provides the HCI implementation of ant_native.h
+*
+*
+\******************************************************************************/
+
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "antradio_power.h"
+
+#include "ant_types.h"
+#include "ant_native.h"
+#include "ant_utils.h"
+#include "ant_version.h"
+
+#include "ant_rx.h"
+#include "ant_tx.h"
+#include "ant_hciutils.h"
+#include "ant_log.h"
+
+static pthread_mutex_t         txLock;
+pthread_mutex_t                enableLock;
+
+static ANTRadioEnabledStatus radio_status = RADIO_STATUS_DISABLED;
+ANTRadioEnabledStatus get_and_set_radio_status(void);
+
+////////////////////////////////////////////////////////////////////
+//  ant_init
+//
+//  Initialises the native environment.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failures:
+//          ANT_STATUS_FAILED if could not initialize mutex
+//
+//  Psuedocode:
+/*
+LOCK antdevice_LOCK
+    CREATE mutex for locking Tx attempt
+    IF could not create mutex
+        RESULT = ANT_STATUS_FAILED
+    ELSE
+        CREATE mutex for locking enable/disable
+        IF could not create mutex
+            RESULT = ANT_STATUS_FAILED
+        ELSE
+            RESULT = ANT_STATUS_SUCCESS
+        ENDIF
+    ENDIF
+UNLOCK
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_init(void)
+{
+   int mutexResult;
+   ANTStatus status = ANT_STATUS_FAILED;
+   ANT_FUNC_START();
+
+   mutexResult = pthread_mutex_init(&txLock, NULL); //use default attr
+   if (mutexResult)
+   {
+      ANT_ERROR("Tx Lock mutex initialization failed: %s", strerror(mutexResult));
+   }
+   else
+   {
+      mutexResult = pthread_mutex_init(&enableLock, NULL);
+      if (mutexResult)
+      {
+         ANT_ERROR("Enable Lock mutex init failed %s", strerror(mutexResult));
+      }
+      else
+      {
+         status = ANT_STATUS_SUCCESS;
+      }
+   }
+
+   ANT_FUNC_END();
+   return status;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//  ant_deinit
+//
+//  De-initialises the native environment.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failures:
+//          ANT_STATUS_FAILED if could not de-initialize mutex
+//
+//  Psuedocode:
+/*
+LOCK antdevice_LOCK (also Init and Tx)
+    DESTROY mutex for locking Tx attempt
+    IF could not destroy mutex
+        RESULT = ANT_STATUS_FAILED
+    ELSE
+        DESTROY mutex for locking enable/disable
+        IF coult not destroy mutex
+            RESULT = ANT_STATUS_FAILED
+        ELSE
+            RESULT = ANT_STATUS_SUCCESS
+        ENDIF
+    ENDIF
+UNLOCK
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_deinit(void)
+{
+   int mutexResult;
+   ANTStatus result_status = ANT_STATUS_FAILED;
+   ANT_FUNC_START();
+
+   mutexResult = pthread_mutex_destroy(&txLock);
+   if (mutexResult)
+   {
+      ANT_ERROR("Tx Lock mutex destroy failed: %s", strerror(mutexResult));
+   }
+   else
+   {
+      mutexResult = pthread_mutex_destroy(&enableLock);
+      if (mutexResult)
+      {
+         ANT_ERROR("Enable Lock mutex destroy failed: %s", strerror(mutexResult));
+      }
+      else
+      {
+         result_status = ANT_STATUS_SUCCESS;
+      }
+   }
+
+   ANT_FUNC_END();
+   return result_status;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//  ant_enable_radio
+//
+//  Powers on the ANT part and initialises the transport to the chip.
+//  Changes occur in part implementing ant_enable() call
+//      On Android this is in the Bluedroid module.
+//      On Linux this is device specific
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failures:
+//          ANT_STATUS_TRANSPORT_INIT_ERR if could not enable
+//          ANT_STATUS_FAILED if failed to get mutex or init rx thread
+//
+//  Psuedocode:
+/*
+LOCK enable_LOCK
+    LOCK tx_LOCK
+        IF state is not enabled
+            STATE = ENABLING
+        ENDIF
+        ant enable
+        IF ant_enable success
+            IF rx thread is running
+                STATE = ENABLED
+                RESULT = SUCCESS
+            ELSE
+                start rx thread
+                IF starting rx thread fails
+                    ant disable
+                    get state
+                    IF state is enabled
+                        log a serious error
+                    ENDIF
+                    RESULT = FAILED
+                ELSE
+                    STATE = ENABLED
+                    RESULT = SUCCESS
+                ENDIF
+            ENDIF
+        ELSE
+            get state
+            IF state is enabled
+                log a serious error
+            ENDIF
+            RESULT = FAILURE
+        ENDIF
+    UNLOCK
+UNLOCK
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_enable_radio(void)
+{
+   int result;
+   int lockResult;
+   ANTStatus result_status = ANT_STATUS_FAILED;
+   ANT_FUNC_START();
+
+   ANT_DEBUG_V("getting enableLock in %s", __FUNCTION__);
+   lockResult = pthread_mutex_lock(&enableLock);
+   if(lockResult)
+   {
+      ANT_ERROR("Enable failed to get enableLock mutex: %s", strerror(lockResult));
+      return ANT_STATUS_FAILED;
+   }
+   ANT_DEBUG_V("got enableLock in %s", __FUNCTION__);
+
+   ANT_DEBUG_V("getting txLock in %s", __FUNCTION__);
+   lockResult = pthread_mutex_lock(&txLock);
+   if (lockResult)
+   {
+      ANT_ERROR("Enable txLock failed: %s", strerror(lockResult));
+      pthread_mutex_unlock(&enableLock);
+      return ANT_STATUS_FAILED;
+   }
+   ANT_DEBUG_V("got txLock in %s", __FUNCTION__);
+
+   if (get_and_set_radio_status() != RADIO_STATUS_ENABLED)
+   {
+      if (RxParams.thread)
+      {
+         ANT_WARN("in enable call: rx thread still exists but radio crashed. trying to recover");
+         ANT_DEBUG_V("radio crashed, letting rx thread join");
+         pthread_join(RxParams.thread, NULL);
+         RxParams.thread = 0;
+         ANT_DEBUG_V("recovered. joined by rx thread");
+      }
+      ANT_DEBUG_I("radio_status (%d -> %d)", radio_status, RADIO_STATUS_ENABLING);
+      radio_status = RADIO_STATUS_ENABLING;
+
+      if (RxParams.pfStateCallback)
+         RxParams.pfStateCallback(radio_status);
+   }
+
+   result = ant_enable();
+   ANT_DEBUG_D("ant_enable() result is %d", result);
+   if (result == 0)
+   {
+      if (RxParams.thread)
+      {
+         result_status = ANT_STATUS_SUCCESS;
+         radio_status = RADIO_STATUS_ENABLED; // sanity assign, cant be enabling
+         ANT_DEBUG_D("ANT radio re-enabled");
+      }
+      else
+      {
+         result = pthread_create(&RxParams.thread, NULL, ANTHCIRxThread, NULL);
+         if (result)
+         {
+            ANT_ERROR("Thread initialization failed: %s", strerror(result));
+            result_status = ANT_STATUS_FAILED;
+         }
+         else
+         {
+            result_status = ANT_STATUS_SUCCESS;
+            if (radio_status == RADIO_STATUS_ENABLING)
+            {
+               ANT_DEBUG_I("radio_status (%d -> %d)", radio_status, RADIO_STATUS_ENABLED);
+               radio_status = RADIO_STATUS_ENABLED;
+
+               if (RxParams.pfStateCallback)
+                  RxParams.pfStateCallback(radio_status);
+            }
+            else
+            {
+               ANT_WARN("radio was already enabled but rx thread was not running");
+            }
+         }
+      }
+   }
+   else
+   {
+      result_status = ANT_STATUS_TRANSPORT_INIT_ERR;
+   }
+
+   if (result_status != ANT_STATUS_SUCCESS)
+   {
+      ant_disable();
+
+      switch (get_and_set_radio_status())
+      {
+         case RADIO_STATUS_ENABLED:
+            ANT_ERROR("SERIOUS: enable failed, but ANT is enabled without a rx thread");
+            break;
+         default:
+            ANT_DEBUG_D("Enable failed, after cleanup chip is not enabled");
+            break;
+      }
+   }
+
+   ANT_DEBUG_V("releasing txLock in %s", __FUNCTION__);
+   pthread_mutex_unlock(&txLock);
+   ANT_DEBUG_V("released txLock in %s", __FUNCTION__);
+
+   ANT_DEBUG_V("releasing enableLock in %s", __FUNCTION__);
+   pthread_mutex_unlock(&enableLock);
+   ANT_DEBUG_V("released enableLock in %s", __FUNCTION__);
+
+   ANT_FUNC_END();
+   return result_status;
+}
+
+ANTStatus ant_radio_hard_reset(void)
+{
+   ANTStatus result_status = ANT_STATUS_NOT_SUPPORTED;
+   ANT_FUNC_START();
+   ANT_FUNC_END();
+   return result_status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  ant_disable_radio
+//
+//  Disables the HCI transport and powers off the ANT part.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failures:
+//          ANT_STATUS_FAILED if could not get mutex
+//          ANT_STATUS_NOT_DE_INITIALIZED if ant_disable failed
+//
+//  Psuedocode:
+/*
+LOCK enable_LOCK
+    LOCK tx_LOCK
+        IF not disabled
+            STATE = DISABLING
+        ENDIF
+        ant disable
+        IF rx thread is running
+            wait for rx thread to terminate
+        ENDIF
+        get radio status
+        IF radio is disabled
+            RESULT = SUCCESS
+        ELSE IF radio is enabled
+            log a serious error
+            RESULT = FAILURE
+        ELSE
+            RESULT = FAILURE
+        ENDIF
+    UNLOCK
+UNLOCK
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_disable_radio(void)
+{
+   int result;
+   int lockResult;
+   ANTStatus ret = ANT_STATUS_FAILED;
+   ANT_FUNC_START();
+
+   ANT_DEBUG_V("getting enableLock in %s", __FUNCTION__);
+   lockResult = pthread_mutex_lock(&enableLock);
+   if(lockResult)
+   {
+      ANT_ERROR("Disable failed to get enableLock mutex: %s", strerror(lockResult));
+      return ANT_STATUS_FAILED;
+   }
+   ANT_DEBUG_V("got enableLock in %s", __FUNCTION__);
+
+   ANT_DEBUG_V("getting txLock in %s", __FUNCTION__);
+   lockResult = pthread_mutex_lock(&txLock);
+   if (lockResult)
+   {
+      ANT_ERROR("Disable txLock failed: %s", strerror(lockResult));
+      pthread_mutex_unlock(&enableLock);
+      return ANT_STATUS_FAILED;
+   }
+   ANT_DEBUG_V("got txLock in %s", __FUNCTION__);
+
+   if (get_and_set_radio_status() != RADIO_STATUS_DISABLED)
+   {
+      ANT_DEBUG_I("radio_status (%d -> %d)", radio_status, RADIO_STATUS_DISABLING);
+      radio_status = RADIO_STATUS_DISABLING;
+
+      if (RxParams.pfStateCallback)
+         RxParams.pfStateCallback(radio_status);
+   }
+
+   result = ant_disable();
+   ANT_DEBUG_D("ant_disable() result is %d", result);
+
+   // If rx thread exists ( != 0)
+   if (RxParams.thread)
+   {
+      ANT_DEBUG_V("quit rx thread, joining");
+      pthread_join(RxParams.thread, NULL);
+      RxParams.thread = 0;
+      ANT_DEBUG_V("joined by rx thread");
+   }
+   else
+   {
+      ANT_DEBUG_W("rx thread is 0 (not created?)");
+   }
+
+   switch (get_and_set_radio_status())
+   {
+      case RADIO_STATUS_DISABLED:
+         ret = ANT_STATUS_SUCCESS;
+         break;
+      case RADIO_STATUS_ENABLED:
+         ANT_ERROR("SERIOUS: ANT was disabled, rx thread quit, but ANT is enabled");
+         ret = ANT_STATUS_FAILED;
+         break;
+      default:
+         ret = ANT_STATUS_NOT_DE_INITIALIZED;
+         break;
+   }
+
+   ANT_DEBUG_V("releasing txLock in %s", __FUNCTION__);
+   pthread_mutex_unlock(&txLock);
+   ANT_DEBUG_V("released txLock in %s", __FUNCTION__);
+
+   ANT_DEBUG_V("releasing enableLock in %s", __FUNCTION__);
+   pthread_mutex_unlock(&enableLock);
+   ANT_DEBUG_V("released enableLock in %s", __FUNCTION__);
+
+   ANT_FUNC_END();
+   return ret;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//  ant_radio_enabled_status
+//
+//  Returns if the chip/transport is disabled/disabling/enabling/enabled. This
+//  function will NOT overwrite internal state variable enabling or disabling.
+//  It will call get_and_set_radio_status() if not enabling/disabling which can
+//  change internal state on errors.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      The current radio status (ANTRadioEnabledStatus)
+//
+//  Psuedocode:
+/*
+IF Enabling
+    RESULT = Enabling
+ELSE IF Disabling
+    RESULT = Disabling
+ELSE
+    IF ant_is_enabled
+        Enabled
+        RESULT = Enabled
+    ELSE
+        Disabled
+        RESULT = Disabled
+    ENDIF
+ENDIF
+*/
+////////////////////////////////////////////////////////////////////
+ANTRadioEnabledStatus ant_radio_enabled_status(void)
+{
+   ANT_FUNC_START();
+
+   if ((RADIO_STATUS_ENABLING != radio_status) &&
+         (RADIO_STATUS_DISABLING != radio_status))
+   {
+      get_and_set_radio_status();
+   }
+
+   ANT_FUNC_END();
+   return radio_status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  get_and_set_radio_status
+//
+//  Returns if the chip/transport is disabled/enabled/unknown This function WILL
+//  overwrite what it thinks the state is with what the BlueZ core (kernel)
+//  thinks it is. It will overwrite enabling or disabling states, and might
+//  change internal state from enabled, disabled, or unknown to any of these
+//  three on errors.
+//
+//  Paramerters:
+//      -
+//
+//  Returns:
+//      The current radio status (ANTRadioEnabledStatus)
+//
+////////////////////////////////////////////////////////////////////
+ANTRadioEnabledStatus get_and_set_radio_status(void)
+{
+   ANTRadioEnabledStatus orig_status = radio_status;
+   ANT_FUNC_START();
+
+   switch (ant_is_enabled())
+   {
+      case 0:
+         radio_status = RADIO_STATUS_DISABLED;
+         break;
+      case 1:
+         radio_status = RADIO_STATUS_ENABLED;
+         break;
+      default:
+         ANT_ERROR("getting chip state returned an error");
+         radio_status = RADIO_STATUS_UNKNOWN;
+         break;
+   }
+   if (orig_status != radio_status)
+   {
+      ANT_DEBUG_I("radio_status (%d -> %d)", orig_status, radio_status);
+
+      if (RxParams.pfStateCallback)
+         RxParams.pfStateCallback(radio_status);
+   }
+
+   ANT_FUNC_END();
+   return radio_status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  set_ant_rx_callback
+//
+//  Sets which function to call when an ANT message is received.
+//
+//  Parameters:
+//      rx_callback_func   the ANTNativeANTEventCb function to be used
+//                         for recieved messages.
+//
+//  Returns:
+//          ANT_STATUS_SUCCESS
+//
+//  Psuedocode:
+/*
+    Rx Callback = rx_callback_func
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus set_ant_rx_callback(ANTNativeANTEventCb rx_callback_func)
+{
+   ANTStatus status = ANT_STATUS_SUCCESS;
+
+   ANT_FUNC_START();
+
+   RxParams.pfRxCallback = rx_callback_func;
+
+   ANT_FUNC_END();
+
+   return status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  set_ant_state_callback
+//
+//  Sets which function to call when an ANT state change occurs.
+//
+//  Parameters:
+//      state_callback_func   the ANTNativeANTStateCb function to be used
+//                            for recieved state changes.
+//
+//  Returns:
+//          ANT_STATUS_SUCCESS
+//
+//  Psuedocode:
+/*
+    State Callback = state_callback_func
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus set_ant_state_callback(ANTNativeANTStateCb state_callback_func)
+{
+   ANTStatus status = ANT_STATUS_SUCCESS;
+
+   ANT_FUNC_START();
+
+   RxParams.pfStateCallback = state_callback_func;
+
+   ANT_FUNC_END();
+
+   return status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  ant_tx_message
+//
+//  Sends an ANT message to the chip
+//
+//  Parameters:
+//      ucLen   the length of the message
+//      pucMesg pointer to the message data
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failure:
+//          ANT_STATUS_NOT_ENABLED
+//
+//  Psuedocode:
+/*
+IF not enabled
+    RESULT = NOT ENABLED
+ELSE
+    Lock
+    IF Lock failed
+        RESULT = FAILED
+    ELSE
+        STORE length (little endian) in send buffer
+        STORE data in send buffer
+    ENDIF
+ENDIF
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg)
+{
+   ANTStatus   status;
+
+   /* Socket for sending HCI commands */
+   int tx_socket = -1;
+
+   int lockResult;
+
+   ANT_FUNC_START();
+
+   ANT_DEBUG_V("getting txLock in %s", __FUNCTION__);
+   lockResult = pthread_mutex_lock(&txLock);
+   if (lockResult)
+   {
+      ANT_ERROR("ant_tx_message, could not get txLock: %s", strerror(lockResult));
+      return ANT_STATUS_FAILED;
+   }
+
+   ANT_DEBUG_V("got txLock in %s", __FUNCTION__);
+
+   if(RADIO_STATUS_ENABLED != get_and_set_radio_status())
+   {
+      ANT_DEBUG_E("ant_tx_message, ANT not enabled - ABORTING. Radio status = %d",
+                                                                  radio_status);
+      ANT_DEBUG_V("releasing txLock in %s", __FUNCTION__);
+      pthread_mutex_unlock(&txLock);
+      ANT_DEBUG_V("released txLock in %s", __FUNCTION__);
+      return ANT_STATUS_FAILED_BT_NOT_INITIALIZED;
+   }
+
+   // Open socket
+   tx_socket = ant_open_tx_transport();
+
+   if(tx_socket < 0)
+   {
+      ANT_ERROR("Could not open Tx socket");
+      ANT_DEBUG_V("releasing txLock in %s", __FUNCTION__);
+      pthread_mutex_unlock(&txLock);
+      ANT_DEBUG_V("released txLock in %s", __FUNCTION__);
+      return ANT_STATUS_FAILED;
+   }
+
+   // Send HCI packet
+   ANT_BOOL retryRx;
+   ANT_BOOL retryTx;
+   status = ANT_STATUS_FAILED;
+
+   int MAX_RETRIES_WRITE_FAIL = 10;
+   int MAX_RETRY_TIME_SECS = 10;
+   int commandWriteFailRetries = 0;
+
+   // Start New timed retry code:
+   time_t startTime = time(NULL);
+   time_t endTime = 0;
+   if((time_t)-1 != startTime)
+   {
+      endTime = startTime + MAX_RETRY_TIME_SECS;
+   }
+   else
+   {
+      ANT_ERROR("failed to get current time");
+   }
+
+   do // while (retryTx)
+   {
+      retryTx = ANT_FALSE;
+
+      if(ANT_STATUS_SUCCESS == write_data(pucMesg, ucLen))
+      {
+         do // while (retryRx)
+         {
+            retryRx = ANT_FALSE;
+         
+            if(ANT_TRUE == wait_for_message(tx_socket))
+            {
+               ANT_DEBUG_D("New HCI data available, reading...");
+            
+               status = get_command_complete_result(tx_socket);
+               switch (status)
+               {
+                  case ANT_STATUS_NO_VALUE_AVAILABLE:
+                  {
+                     ANT_WARN("Did not get an expected response for write, trying again");
+                     retryRx = ANT_TRUE;
+                     break;
+                  }
+                  case ANT_STATUS_FAILED:
+                  {
+                     ANT_ERROR("Command Complete: ANT_STATUS_FAILED");
+                     break;
+                  }
+                  case ANT_STATUS_COMMAND_WRITE_FAILED:
+                  {
+                     ANT_ERROR("Command Complete: ANT_STATUS_WRITE_FAILED");
+                   
+                     if(++commandWriteFailRetries < MAX_RETRIES_WRITE_FAIL)
+                     {
+                        ANT_DEBUG_D("Retrying.  Retry count = %d", 
+                                                      commandWriteFailRetries);
+                     
+                        retryTx = ANT_TRUE;
+                     }
+                     else
+                     {
+                        ANT_ERROR("Aborting.  Retry count = %d.  Max retries = %d",
+                              commandWriteFailRetries, MAX_RETRIES_WRITE_FAIL);
+                     }
+                     break;
+                  }
+                  case ANT_STATUS_TRANSPORT_UNSPECIFIED_ERROR:
+                  {
+                     ANT_DEBUG_D("Command Complete: ANT_STATUS_UNSPECIFIED_ERROR");
+                   
+                     time_t currentTime = time(NULL);
+                      
+                     if((time_t)-1 != currentTime)
+                     {
+                        if(currentTime < endTime)
+                        {
+                           ANT_DEBUG_V("Retrying. Current time = %d. "
+                              "End time = %d", (int)currentTime, (int)endTime);
+                        
+                           retryTx = ANT_TRUE;
+                        }
+                        else
+                        {
+                           ANT_ERROR("Command Complete: ANT_STATUS_UNSPECIFIED_ERROR");
+                           ANT_ERROR("Aborting. Current time = %d. End Time = %d",
+                                                (int)currentTime, (int)endTime);
+                        }
+                     }
+                     else
+                     {
+                        ANT_ERROR("Command Complete: failed to get current time");
+                     }
+                  
+                     break;
+                  }
+                  case ANT_STATUS_SUCCESS:
+                  {
+                     break;
+                  }
+                  default:
+                  {
+                     ANT_ERROR("Unhandled command complete status");
+                     break;
+                  }
+               }
+            }
+            else
+            {
+               ANT_WARN("Command Complete: wait for message failed");
+            }
+         } while (retryRx);
+      }
+      else
+      {
+         ANT_ERROR("write failed");
+         retryRx = ANT_FALSE;
+      
+         status = ANT_STATUS_FAILED;
+      }
+   } while(retryTx);
+   
+   ant_close_tx_transport(tx_socket);
+
+   ANT_DEBUG_V("releasing txLock in %s", __FUNCTION__);
+   pthread_mutex_unlock(&txLock);
+   ANT_DEBUG_V("released txLock in %s", __FUNCTION__);
+
+   ANT_FUNC_END();
+
+   return status;
+}
+
+const char *ant_get_lib_version()
+{
+   return "libantradio.so Bluez HCI Transport Version " 
+          LIBANT_STACK_MAJOR "." LIBANT_STACK_MINOR "." LIBANT_STACK_INCRE;
+}
+
diff --git a/src/bluez_hci/ant_rx.c b/src/bluez_hci/ant_rx.c
new file mode 100644
index 0000000..76d29ff
--- /dev/null
+++ b/src/bluez_hci/ant_rx.c
@@ -0,0 +1,275 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2009 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/******************************************************************************\
+*
+*   FILE NAME:      ant_rx.c
+*
+*   BRIEF:
+*      This file Implements the receive thread for an HCI implementation
+*      using Vendor Specific messages.
+*
+*
+\******************************************************************************/
+
+
+#define _GNU_SOURCE /* needed for PTHREAD_MUTEX_RECURSIVE */
+
+#include <errno.h>
+#include <poll.h>
+#include <pthread.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <sys/resource.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/un.h>
+
+#include "antradio_power.h"
+
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+#include <bluetooth/hci_lib.h>
+
+#include "ant_rx.h"
+#include "ant_hciutils.h"
+#include "ant_types.h"
+#include "ant_framing.h"
+#include "ant_log.h"
+#undef LOG_TAG
+#define LOG_TAG "antradio_rx"
+
+static char EVT_PKT_VENDOR_FILTER[] = {0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+                                       0x00,0x00,0x00,0x80,0x00,0x05,0x00,0x00};
+
+/* Global Options */
+ANTHCIRxParams RxParams = {
+   .pfRxCallback = NULL,
+   .pfStateCallback = NULL,
+   .thread = 0
+};
+
+extern pthread_mutex_t enableLock;
+extern ANTRadioEnabledStatus get_and_set_radio_status(void);
+/*
+ * This thread opens a Bluez HCI socket and waits for ANT messages.
+ */
+void *ANTHCIRxThread(void *pvHCIDevice)
+{
+   int ret = ANT_STATUS_SUCCESS;
+   int rxSocket;
+   int len;
+   unsigned char buf[HCI_MAX_EVENT_SIZE];
+   int result;
+   ANT_FUNC_START();
+
+   (void)pvHCIDevice; //unused waring
+
+   ANT_DEBUG_D("Entering ANTHCIRxThread");
+
+   rxSocket = create_hci_sock();
+   if (rxSocket < 0)
+   {
+      ANT_DEBUG_E("can't open HCI socket in rx thread: %s", strerror(errno));
+
+      ret = ANT_STATUS_FAILED;
+      goto out;
+   }
+
+   if (setsockopt(rxSocket, SOL_HCI, HCI_FILTER, &EVT_PKT_VENDOR_FILTER,
+                                             sizeof(EVT_PKT_VENDOR_FILTER)) < 0)
+   {
+      ANT_ERROR("failed to set socket options: %s", strerror(errno));
+
+      ret = ANT_STATUS_FAILED;
+      goto close;
+   }
+
+   /* continue running as long as not terminated */
+   while (get_and_set_radio_status() == RADIO_STATUS_ENABLED)
+   {
+      struct pollfd p;
+      int n;
+
+      p.fd = rxSocket;
+      p.events = POLLIN;
+
+      ANT_DEBUG_V("    RX: Polling HCI for data...");
+
+      /* poll socket, wait for ANT messages */
+      while ((n = poll(&p, 1, 2500)) == -1)
+      {
+         if (errno == EAGAIN || errno == EINTR)
+            continue;
+
+         ANT_ERROR("failed to poll socket: %s", strerror(errno));
+
+         ret = ANT_STATUS_FAILED;
+         goto close;
+      }
+
+      /* we timeout once in a while */
+      /* this let's us the chance to check if we were terminated */
+      if (0 == n)
+      {
+         ANT_DEBUG_V("    RX: Timeout");
+         continue;
+      }
+
+      ANT_DEBUG_D("New HCI data available, reading...");
+
+      /* read newly arrived data */
+      /* TBD: rethink assumption about single arrival */
+      while ((len = read(rxSocket, buf, sizeof(buf))) < 0)
+      {
+         if (errno == EAGAIN || errno == EINTR)
+            continue;
+
+         ANT_ERROR("failed to read socket: %s", strerror(errno));
+
+         ret = ANT_STATUS_FAILED;
+         goto close;
+      }
+
+    // 0 = packet type eg. HCI_EVENT_PKT
+    // FOR EVENT:
+    //   1 = event code  eg. EVT_VENDOR, EVT_CMD_COMPLETE
+    //   2 = Parameter total length
+    //   3... parameters
+    //  FOR CC
+    //      3   = Num HCI Command packets allowed to be sent
+    //      4+5 = ANT Opcode
+    //      6   = Result ??
+    //   FOR VS
+    //     3+4 = ANT Opcode
+    //     5   = length
+    //     6 ? MSB of length ?
+    //     7... ant message
+
+      if (len >= 7)
+      {
+          ANT_DEBUG_V("HCI Data: [%02X][%02X][%02X][%02X][%02X][%02X][%02X]...",
+             buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
+      }
+      else
+      {
+         ANT_ERROR("Failed to read full header off socket. len = %d", len);
+         continue;
+      }
+
+      if (len != (buf[2] + 3))
+      {
+         ANT_WARN("HCI packet length(%d) and bytes read(%d) dont match", buf[2] + 3, len);
+      }
+
+      if(HCI_EVENT_PKT == buf[0])
+      {
+         ANT_DEBUG_D("Received Event Packet");
+
+         if (EVT_VENDOR == buf[1])
+         {
+            if ((HCI_VSOP_ANT_LSB == buf[3]) && (HCI_VSOP_ANT_MSB == buf[4]))
+            {
+               ANT_DEBUG_D("Received ANT VS Message");
+
+               if (len < 9)
+               {
+                  ANT_ERROR("Malformed ANT header");
+                  ret = ANT_STATUS_FAILED;
+                  goto close;
+               }
+
+               ANT_DEBUG_V("ANT Mesg: ANTMesgSize:%d ANTMesgID:0x%02X ...",
+                                                               buf[7], buf[8]);
+
+               ANT_SERIAL(&(buf[7]), buf[5], 'R');
+
+               if(RxParams.pfRxCallback != NULL)
+               {
+                  RxParams.pfRxCallback(buf[5], &(buf[7]));
+               }
+               else
+               {
+                  ANT_ERROR("Can't send rx message - no callback registered");
+               }
+
+               continue;
+            }
+            else
+            {
+               ANT_DEBUG_W("Vendor Specific message for another vendor. "
+                                                         "Should filter out");
+            }
+         }
+         else
+         {
+            ANT_DEBUG_V("Other Event Packet, Ignoring");
+         }
+      }
+      else
+      {
+         ANT_DEBUG_V("Non-Event Packet, Ignoring");
+      }
+   }
+
+close:
+   result = pthread_mutex_trylock(&enableLock);
+   ANT_DEBUG_D("rx thread close: trylock enableLock returned %d", result);
+
+   if (result == 0)
+   {
+      ANT_DEBUG_W("rx thread socket has unexpectedly crashed");
+      if (RxParams.pfStateCallback)
+         RxParams.pfStateCallback(RADIO_STATUS_DISABLING);
+      ant_disable();
+      get_and_set_radio_status();
+      RxParams.thread = 0;
+      pthread_mutex_unlock(&enableLock);
+   }
+   else if (result == EBUSY)
+   {
+      ANT_DEBUG_V("rx thread socket was closed");
+   }
+   else
+   {
+      ANT_ERROR("rx thread close: trylock failed: %s", strerror(result));
+   }
+
+   if (-1 == close(rxSocket))
+   {
+      ANT_ERROR("failed to close hci device (socket handle=%#x): %s", rxSocket, strerror(errno));
+   }
+   else
+   {
+      ANT_DEBUG_D("closed hci device (socket handle=%#x)", rxSocket);
+   }
+
+out:
+   ANT_FUNC_END();
+
+   pthread_exit((void *)ret);
+
+#if defined(ANDROID)
+   return 0;
+#endif
+}
+
diff --git a/src/bluez_hci/ant_tx.c b/src/bluez_hci/ant_tx.c
new file mode 100644
index 0000000..2757a3b
--- /dev/null
+++ b/src/bluez_hci/ant_tx.c
@@ -0,0 +1,358 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2009 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/******************************************************************************\
+*
+*   FILE NAME:      ant_tx.c
+*
+*   BRIEF:
+*      This file Implements the transmit functionality for an HCI implementation
+*      using Vendor Specific messages.
+*
+*
+\******************************************************************************/
+
+#include <errno.h>
+#include <poll.h>
+#include <sys/uio.h>
+
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+#include <bluetooth/hci_lib.h>
+
+#include "ant_types.h"
+#include "ant_hciutils.h"
+#include "ant_framing.h"
+#include "ant_utils.h"
+#include "ant_log.h"
+#undef LOG_TAG
+#define LOG_TAG "antradio_tx"
+
+static char EVT_PKT_CMD_COMPLETE_FILTER[] = {0x10,0x00,0x00,0x00,0x00,0x40,0x00,
+                                 0x00,0x00,0x00,0x00,0x00,0xD1,0xFD,0x00,0x00};
+
+int g_ant_cmd_socket = -1;
+
+int ant_open_tx_transport(void)
+{
+   int socket = -1;
+   ANT_FUNC_START();
+
+   socket = create_hci_sock();
+   
+   if (socket < 0) 
+   {
+      ANT_DEBUG_E("failed to open HCI socket for tx: %s", strerror(errno));
+   }
+   else
+   {
+      g_ant_cmd_socket = socket;
+      ANT_DEBUG_D("socket handle %#x", g_ant_cmd_socket);
+      if (setsockopt(g_ant_cmd_socket, SOL_HCI, HCI_FILTER, 
+         &EVT_PKT_CMD_COMPLETE_FILTER, sizeof(EVT_PKT_CMD_COMPLETE_FILTER)) < 0)
+      {
+         ANT_ERROR("failed to set socket options: %s", strerror(errno));
+         close(socket);
+         socket = -1;
+      }
+   }
+
+   ANT_FUNC_END();
+   return socket;
+}
+
+void ant_close_tx_transport(int socket)
+{
+   ANT_FUNC_START();
+
+   if(0 < socket)
+   {
+      if (0 == close(socket)) 
+      {
+         ANT_DEBUG_D("closed hci device (socket handle=%#x)", socket);
+      }
+      else
+      {
+         ANT_ERROR("failed to close hci device (socket handle=%#x): %s", socket, strerror(errno));
+      }
+   }
+   else
+   {
+      ANT_DEBUG_E("requested close on socket %#x. invalid param", socket);
+   }
+
+   ANT_FUNC_END();
+}
+
+/* 
+Format of an HCI WRITE command to ANT chip:
+
+HCI Header:
+----------
+- HCI Packet Type:                                                      1 byte
+
+- HCI Opcode:                                                           2 bytes
+                                                               (LSB, MSB - LE)
+- HCI Parameters Total Len (total length of all subsequent fields):     1 byte
+
+HCI Parameters:
+--------------
+- VS Parameters Len (total length of ANT Mesg inculding Len/ID)         2 bytes
+                                                               (LSB, MSB - LE)
+- ANT Mesg Len (N = number of bytes in ANT Mesg Data):                  1 byte
+- ANT Mesg ID:                                                          1 byte
+- ANT Mesg Data:                                                        N bytes 
+*/
+
+ANT_BOOL wait_for_message(int socket)
+{
+   struct pollfd p;
+   int n;
+
+   ANT_BOOL bReturn = ANT_FALSE;
+   ANT_BOOL bRetry = ANT_FALSE;
+
+   ANT_FUNC_START();
+
+   p.fd = socket;
+   p.events = POLLIN;
+
+   do
+   {
+      bRetry = ANT_FALSE;
+   
+      ANT_DEBUG_V("    CC: Polling HCI for data...");
+   
+      /* poll socket, wait for ANT messages */
+      n = poll(&p, 1, 2500);
+      if (0 > n)
+      {
+         if (errno == EAGAIN || errno == EINTR)
+         {
+            ANT_DEBUG_W("    CC: error: %s", strerror(errno));
+            bRetry = ANT_TRUE;
+         }
+         else
+         {
+            ANT_ERROR("failed to poll socket. error: %s", strerror(errno));
+         }
+      }
+
+      /* timeout */
+      else if (0 == n)
+      {
+         ANT_ERROR("SERIOUS: Timeouted getting Command Complete");
+      }
+      else if(0 < n)
+      {
+         // There is data to read.
+         bReturn = ANT_TRUE;
+      }
+
+   } while(ANT_TRUE == bRetry);
+
+   ANT_FUNC_END();
+   
+   return bReturn;
+}
+
+ANTStatus write_data(ANT_U8 ant_message[], int ant_message_len)
+{
+   ANTStatus ret = ANT_STATUS_FAILED;
+   ANT_BOOL retry = ANT_FALSE;
+   int bytes_written;
+   struct iovec iov[2];
+   hci_vendor_cmd_packet_t hci_header;
+   ANT_U16 hci_opcode;
+
+   ANT_FUNC_START();
+
+   hci_opcode = cmd_opcode_pack(OGF_VENDOR_CMD, HCI_CMD_ANT_MESSAGE_WRITE);
+
+   hci_header.packet_type = HCI_COMMAND_PKT;
+   ANT_UTILS_StoreLE16(hci_header.cmd_header.opcode, hci_opcode);
+   hci_header.cmd_header.plen = ((ant_message_len + HCI_VENDOR_HEADER_SIZE) & 0xFF);
+   ANT_UTILS_StoreLE16(hci_header.vendor_header.hcilen, ant_message_len);
+
+   iov[0].iov_base = &hci_header;
+   iov[0].iov_len = sizeof(hci_header);
+   iov[1].iov_base = ant_message;
+   iov[1].iov_len = ant_message_len;
+
+   do //while retry
+   {
+      retry = ANT_FALSE;
+
+      if (g_ant_cmd_socket < 0)
+      {
+         ANT_DEBUG_E("bad socket handle %#x", g_ant_cmd_socket);
+         return ANT_STATUS_INTERNAL_ERROR;
+      }
+
+      ANT_SERIAL(ant_message, ant_message_len, 'T');
+
+      bytes_written = writev(g_ant_cmd_socket, iov, 2);
+
+      ANT_DEBUG_D("writing to socket %#x returned %d", g_ant_cmd_socket, 
+                                                               bytes_written);
+
+//      bytes_written < 0                   = error (check errno)
+//      bytes_written = 0                   = No data written
+//      bytes_written < sizeof(hci_message) = not all data written
+//      bytes_written = sizeof(hci_message) = all data written
+
+      if(bytes_written < 0)
+      {
+         ANT_ERROR("write to HCI failed: %s", strerror(errno));
+
+         if (errno == EAGAIN || errno == EINTR)
+         {
+            ANT_DEBUG_D("Retrying write to HCI");
+            retry = ANT_TRUE;
+         }
+         else
+         {
+            ret = ANT_STATUS_FAILED;
+         }
+      }
+      else if(bytes_written < ((int)sizeof(hci_header) + ant_message_len))
+      {
+         ANT_DEBUG_D("Only %d bytes written to HCI.", bytes_written);
+         ret = ANT_STATUS_FAILED;
+      }
+      else
+      {
+         ANT_DEBUG_V("writev successful");
+         ret = ANT_STATUS_SUCCESS;
+      }
+   } while(retry);
+
+   ANT_FUNC_END();
+ 
+   return ret;
+}
+
+// Returns:
+//  ANT_STATUS_NO_VALUE_AVAILABLE          if not a CC packet
+//  ANT_STATUS_FAILED                      if could not read socket or not a 
+//                                                       valid length CC packet
+//  ANT_STATUS_TRANSPORT_UNSPECIFIED_ERROR if CC indicates an unspecified error
+//  ANT_STATUS_COMMAND_WRITE_FAILED        if CC indicates a failure
+//  ANT_STATUS_SUCCESS                     if CC indicates message was received 
+ANTStatus get_command_complete_result(int socket)
+{
+   ANTStatus status = ANT_STATUS_NO_VALUE_AVAILABLE;
+   int len;
+   ANTStatus ret = ANT_STATUS_SUCCESS;
+   ANT_U8 ucResult = -1;
+   ANT_U8 buf[ANT_NATIVE_MAX_PARMS_LEN];
+
+   ANT_FUNC_START();
+   ANT_DEBUG_V("reading off socket %#x", socket);
+
+   /* read newly arrived data */
+   while ((len = read(socket, buf, sizeof(buf))) < 0)
+   {
+      if (errno == EAGAIN || errno == EINTR)
+         continue;
+
+      ANT_ERROR("failed to read socket. error: %s", strerror(errno));
+
+      ret = ANT_STATUS_FAILED;
+      goto close;
+   }
+
+   ANT_SERIAL(buf, len, 'C');
+
+   ANT_DEBUG_V("HCI Data: [%02X][%02X][%02X][%02X][%02X][%02X][%02X]...", 
+              buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
+
+   // 0 = packet type eg. HCI_EVENT_PKT
+   // FOR EVENT:
+   //   1 = event code  eg. EVT_VENDOR, EVT_CMD_COMPLETE
+   //   2 = Parameter total length
+   //   3... parameters
+   //  FOR CC
+   //      3   = Num HCI Vommand packets (allowed to be sent)
+   //      4+5 = ANT Opcode
+   //      6   = Result ??
+   //   FOR VS
+   //     3+4 = ANT Opcode
+   //     5   = length
+   //     6 ? MSB of length ?
+   //     7... ant message
+
+   if(HCI_EVENT_PKT == buf[0])
+   {
+      ANT_DEBUG_D("Received Event Packet");
+
+      if(EVT_CMD_COMPLETE == buf[1])
+      {
+         if(len < HCI_EVENT_OVERHEAD_SIZE) 
+         {
+            status = ANT_STATUS_FAILED;
+         }
+         else
+         {
+            if((HCI_CMD_OPCODE_ANT_LSB == buf[4]) && 
+                                         (HCI_CMD_OPCODE_ANT_MSB == buf[5]))
+            {
+               ucResult = buf[6];
+
+               ANT_DEBUG_V("Received COMMAND COMPLETE");
+            }
+            else
+            {
+               ANT_DEBUG_V("Command complete has wrong opcode");
+            }
+         }
+
+         /*
+          * if got a status byte, pass it forward, otherwise pass a failure
+          * status
+          */
+         if(status != ANT_STATUS_FAILED)
+         {
+            if(ucResult == 0)
+            {
+               ANT_DEBUG_D("Command Complete = SUCCESS");
+               status = ANT_STATUS_SUCCESS;
+            }
+            else if(ucResult == HCI_UNSPECIFIED_ERROR)
+            {
+               ANT_DEBUG_D("Command Complete = UNSPECIFIED_ERROR");
+
+               status = ANT_STATUS_TRANSPORT_UNSPECIFIED_ERROR;
+            }
+            else
+            {
+               status = ANT_STATUS_COMMAND_WRITE_FAILED;
+               ANT_DEBUG_D("Command Complete = WRITE_FAILED");
+            }
+         }
+      }
+      else
+      {
+         ANT_DEBUG_W("Other Event Packet, Should filter out");
+      }
+   }
+
+close:
+   ANT_FUNC_END();
+   return status;
+}
+
diff --git a/src/bluez_hci/inc/ant_framing.h b/src/bluez_hci/inc/ant_framing.h
new file mode 100644
index 0000000..7d01844
--- /dev/null
+++ b/src/bluez_hci/inc/ant_framing.h
@@ -0,0 +1,50 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2009 Dynastream Innovations
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and  
+ * limitations under the License.
+ */
+/******************************************************************************\
+*
+*   FILE NAME:      ANT_Framing.h
+*
+*   BRIEF:          
+*		This file defines ANT specific HCI values used by the ANT chip.
+*
+*
+\******************************************************************************/
+
+#ifndef __ANT_HCIFRAMING_H
+#define __ANT_HCIFRAMING_H
+
+#ifdef BOARD_ANT_DEVICE_WILINK
+
+/* Number to used by the VS Parameters Len field */
+#define ANT_NATIVE_HCI_VS_PARMS_LEN_FIELD_LEN    (2)
+
+#define HCI_CMD_ANT_MESSAGE_WRITE                ((ANT_U16)0x01D1)
+
+#define HCI_CMD_OPCODE_ANT_LSB                   0xD1
+#define HCI_CMD_OPCODE_ANT_MSB                   0xFD
+
+#define HCI_VSOP_ANT_LSB                         0x00
+#define HCI_VSOP_ANT_MSB                         0x05
+
+#else
+
+#error "Board ANT Device Type not recognised"
+
+#endif
+
+#endif /* __ANT_HCIFRAMING_H */
diff --git a/src/bluez_hci/inc/ant_hciutils.h b/src/bluez_hci/inc/ant_hciutils.h
new file mode 100644
index 0000000..f8cf579
--- /dev/null
+++ b/src/bluez_hci/inc/ant_hciutils.h
@@ -0,0 +1,121 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2009 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/******************************************************************************\
+*
+*   FILE NAME:      ant_hciuntils.h
+*
+*   BRIEF:
+*		This file defines the utility functions for an HCI implementation
+*
+*
+\******************************************************************************/
+
+#ifndef __ANT_HCIUTILS_H
+#define __ANT_HCIUTILS_H
+
+#include <errno.h>
+#include <sys/socket.h>
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+
+#include "ant_types.h"
+#include "ant_native.h"
+#include "ant_log.h"
+// -------------------------------------------------
+
+#define HCI_COMMAND_HEADER_SIZE 3
+typedef struct {
+   ANT_U8                     opcode[2];           // 0xFDD1 for ANT
+   ANT_U8                     plen;
+} __attribute__ ((packed)) hci_command_header_t;
+
+#define HCI_VENDOR_HEADER_SIZE 2
+typedef struct {
+   ANT_U8                  hcilen[2];
+} __attribute__ ((packed)) hci_vendor_header_t;
+
+#define HCI_COMMAND_OVERHEAD_SIZE ( HCI_COMMAND_HEADER_SIZE + \
+                                    HCI_VENDOR_HEADER_SIZE + 1)
+typedef struct {
+   ANT_U8                     packet_type;         // 0x01 for HCI_COMMAND_PKT
+   hci_command_header_t       cmd_header;
+   hci_vendor_header_t        vendor_header;
+} __attribute__ ((packed)) hci_vendor_cmd_packet_t;
+
+#define HCI_EVENT_HEADER_SIZE 2
+typedef struct {
+   ANT_U8                     event_c;             // 0xFF for Vendor Specific,
+                                                   // 0x0E for EVNT_CMD_COMPLETE
+   ANT_U8                     plen;                // data/parameter length
+} __attribute__ ((packed)) hci_event_header_t;
+
+#define HCI_EVENT_OVERHEAD_SIZE (HCI_EVENT_HEADER_SIZE + 5)
+typedef struct {
+   ANT_U8                     packet_type;         // HCI_EVENT_PKT
+   hci_event_header_t         header;
+   union {
+      struct {
+         ANT_U8               vendor_c[2];         // 0x0500 for ANT
+         ANT_U8               hcilen[2];
+      } vendor;
+      struct {
+         ANT_U8               num_token;
+         ANT_U8               opcode[2];           // 0xFDD1 for ANT
+         ANT_U8               resp;
+      } cmd_cmplt;
+   };
+   ANT_U8                     data[ANT_NATIVE_MAX_PARMS_LEN];  // Should be 255
+} __attribute__ ((packed)) hci_event_packet_t;
+
+typedef struct {
+   union {
+      hci_event_packet_t      hci_event_packet;
+      ANT_U8                  raw_packet[sizeof(hci_event_packet_t)];
+   };
+} rx_data_t;  // Use this is for vendor specific and command complete events
+
+
+// -------------------------------------------------
+
+static inline int create_hci_sock() {
+   struct sockaddr_hci sa;
+   int sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+   if (sk < 0)
+   {
+      ANT_ERROR("Failed to create bluetooth hci socket: %s", strerror(errno));
+   }
+   else
+   {
+      memset(&sa, 0, sizeof(sa));
+      // sockaddr_hci changed from kernel 2.6.37 to 2.6.38 adding member hci_channel
+      // In order to be backwards compatible set it to 0 if it exists (HCI_CHANNEL_RAW)
+      sa.hci_family = AF_BLUETOOTH;
+      sa.hci_dev = 0;
+      if (bind(sk, (struct sockaddr *) &sa, sizeof(sa)) < 0)
+      {
+         ANT_ERROR("Failed to bind socket %#x to hci0: %s", sk, strerror(errno));
+         close(sk);
+         sk = -1;
+      }
+   }
+   return sk;
+}
+
+#endif /* __ANT_HCIUTILS_H */
+
+
diff --git a/src/bluez_hci/inc/ant_rx.h b/src/bluez_hci/inc/ant_rx.h
new file mode 100644
index 0000000..c914bb6
--- /dev/null
+++ b/src/bluez_hci/inc/ant_rx.h
@@ -0,0 +1,54 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2009 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/******************************************************************************\
+*
+*   FILE NAME:      ant_rx.h
+*
+*   BRIEF:
+*		This file defines the receive thread function
+*
+*
+\******************************************************************************/
+
+#ifndef __ANT_OS_H
+#define __ANT_OS_H
+
+#include <pthread.h>
+#include "ant_types.h"
+#include "ant_native.h"
+
+typedef struct
+{
+   //The function to call back with received data
+   ANTNativeANTEventCb pfRxCallback;
+
+   //The function to call back with state changes
+   ANTNativeANTStateCb pfStateCallback;
+
+   //The thread object itself
+   pthread_t thread;
+
+} ANTHCIRxParams;
+
+extern ANTHCIRxParams RxParams;
+
+//The message receive thread
+void* ANTHCIRxThread(void* pvHCIDevice);
+
+#endif  /* __ANT_OS_H */
+
diff --git a/src/bluez_hci/inc/ant_tx.h b/src/bluez_hci/inc/ant_tx.h
new file mode 100644
index 0000000..5057011
--- /dev/null
+++ b/src/bluez_hci/inc/ant_tx.h
@@ -0,0 +1,42 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2009 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/******************************************************************************\
+*
+*   FILE NAME:      ant_tx.h
+*
+*   BRIEF:
+*		This file defines the transmit function
+*
+*
+\******************************************************************************/
+
+#ifndef __ANT_TX_H
+#define __ANT_TX_H
+
+#include "ant_types.h"
+#include "ant_hciutils.h"
+
+int         ant_open_tx_transport(void);
+void        ant_close_tx_transport(int socket);
+ANT_BOOL    wait_for_message(int socket);
+ANTStatus   write_data(ANT_U8 ant_message[], int ant_message_len);
+
+ANTStatus get_command_complete_result(int socket);
+
+#endif /* __ANT_TX_H */
+