summaryrefslogtreecommitdiffstats
path: root/udrv
diff options
context:
space:
mode:
authorKausik Sinnaswamy <kausik@broadcom.com>2012-03-07 19:30:20 -0800
committerMatthew Xie <mattx@google.com>2012-07-14 11:19:12 -0700
commit95fa11b3b2f19a382c7e3a744a6afb452fad86df (patch)
tree1019e123db4596f2b8bd1259da04b51f3c44d7b2 /udrv
parente2197423bcf1a93c620be13d458a9da6693fa94d (diff)
downloadexternal_bluetooth_bluedroid-95fa11b3b2f19a382c7e3a744a6afb452fad86df.zip
external_bluetooth_bluedroid-95fa11b3b2f19a382c7e3a744a6afb452fad86df.tar.gz
external_bluetooth_bluedroid-95fa11b3b2f19a382c7e3a744a6afb452fad86df.tar.bz2
AV control and data path added
Change-Id: I88ec6084c140fa257154a98e23e075900e84cc8c
Diffstat (limited to 'udrv')
-rw-r--r--udrv/include/uipc.h163
-rw-r--r--udrv/ulinux/uipc.c258
2 files changed, 421 insertions, 0 deletions
diff --git a/udrv/include/uipc.h b/udrv/include/uipc.h
new file mode 100644
index 0000000..9fa6fbd
--- /dev/null
+++ b/udrv/include/uipc.h
@@ -0,0 +1,163 @@
+/********************************************************************************
+** *
+** Name uipc.h *
+** *
+** Function UIPC wrapper interface *
+** *
+** *
+** Copyright (c) 2007, Broadcom Corp., All Rights Reserved. *
+** Proprietary and confidential. *
+** *
+*********************************************************************************/
+#ifndef UIPC_H
+#define UIPC_H
+
+#ifndef UDRV_API
+#define UDRV_API
+#endif
+
+
+#define UIPC_CH_ID_ALL 0 /* used to address all the ch id at once */
+#define UIPC_CH_ID_0 1 /* shared mem interface */
+#define UIPC_CH_ID_1 2 /* TCP socket (GPS) */
+#define UIPC_CH_ID_2 3 /* BTIF control socket */
+#define UIPC_CH_ID_3 4 /* BTIF HH */
+#define UIPC_CH_ID_4 5 /* Future usage */
+#define UIPC_CH_ID_5 6 /* Future usage */
+#define UIPC_CH_ID_6 7 /* Future usage */
+#define UIPC_CH_ID_7 8 /* Future usage */
+#define UIPC_CH_ID_8 9 /* Future usage */
+#define UIPC_CH_ID_9 10 /* Future usage */
+#define UIPC_CH_ID_10 11 /* Future usage */
+#define UIPC_CH_ID_11 12 /* Future usage */
+#define UIPC_CH_ID_12 13 /* Future usage */
+#define UIPC_CH_ID_13 14 /* Future usage */
+#define UIPC_CH_ID_14 15 /* Future usage */
+#define UIPC_CH_ID_15 16 /* Future usage */
+#define UIPC_CH_ID_16 17 /* Future usage */
+#define UIPC_CH_ID_17 18 /* Future usage */
+#define UIPC_CH_ID_18 19 /* Future usage */
+#define UIPC_CH_ID_19 20 /* Future usage */
+#define UIPC_CH_ID_20 21 /* Future usage */
+#define UIPC_CH_ID_21 22 /* Future usage */
+#define UIPC_CH_ID_22 23 /* Future usage */
+#define UIPC_CH_ID_23 24 /* Future usage */
+#define UIPC_CH_ID_24 25 /* Future usage */
+
+
+
+#define UIPC_CH_NUM 25
+
+typedef UINT8 tUIPC_CH_ID;
+
+/*
+ * UIPC IOCTL Requests
+ */
+enum
+{
+ UIPC_REQ_TX_FLUSH = 1, /* Request to flush the TX FIFO */
+ UIPC_REQ_RX_FLUSH, /* Request to flush the RX FIFO */
+
+ UIPC_WRITE_BLOCK, /* Make write blocking */
+ UIPC_WRITE_NONBLOCK, /* Make write non blocking */
+
+ UIPC_REG_CBACK, /* Set a new call back */
+ UIPC_SET_RX_WM, /* Set Rx water mark */
+
+ UIPC_REQ_TX_READY, /* Request an indication when Tx ready */
+ UIPC_REQ_RX_READY /* Request an indication when Rx data ready */
+};
+
+typedef void (tUIPC_RCV_CBACK)(BT_HDR *p_msg); /* points to BT_HDR which describes event type and length of data; len contains the number of bytes of entire message (sizeof(BT_HDR) + offset + size of data) */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*******************************************************************************
+**
+** Function UIPC_Init
+**
+** Description Initialize UIPC module
+**
+** Returns void
+**
+*******************************************************************************/
+UDRV_API extern void UIPC_Init(void *);
+
+/*******************************************************************************
+**
+** Function UIPC_Open
+**
+** Description Open UIPC interface
+**
+** Returns void
+**
+*******************************************************************************/
+UDRV_API extern BOOLEAN UIPC_Open(tUIPC_CH_ID ch_id, tUIPC_RCV_CBACK *p_cback);
+
+/*******************************************************************************
+**
+** Function UIPC_Close
+**
+** Description Close UIPC interface
+**
+** Returns void
+**
+*******************************************************************************/
+UDRV_API extern void UIPC_Close(tUIPC_CH_ID ch_id);
+
+/*******************************************************************************
+**
+** Function UIPC_SendBuf
+**
+** Description Called to transmit a message over UIPC.
+** Message buffer will be freed by UIPC_SendBuf.
+**
+** Returns void
+**
+*******************************************************************************/
+UDRV_API extern BOOLEAN UIPC_SendBuf(tUIPC_CH_ID ch_id, BT_HDR *p_msg);
+
+/*******************************************************************************
+**
+** Function UIPC_Send
+**
+** Description Called to transmit a message over UIPC.
+**
+** Returns void
+**
+*******************************************************************************/
+UDRV_API extern BOOLEAN UIPC_Send(tUIPC_CH_ID ch_id, UINT16 msg_evt, UINT8 *p_buf, UINT16 msglen);
+
+/*******************************************************************************
+**
+** Function UIPC_Read
+**
+** Description Called to read a message from UIPC.
+**
+** Returns void
+**
+*******************************************************************************/
+UDRV_API extern UINT32 UIPC_Read(tUIPC_CH_ID ch_id, UINT16 *p_msg_evt, UINT8 *p_buf, UINT32 len);
+
+/*******************************************************************************
+**
+** Function UIPC_Ioctl
+**
+** Description Called to control UIPC.
+**
+** Returns void
+**
+*******************************************************************************/
+UDRV_API extern BOOLEAN UIPC_Ioctl(tUIPC_CH_ID ch_id, UINT32 request, void *param);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* UIPC_H */
+
+
diff --git a/udrv/ulinux/uipc.c b/udrv/ulinux/uipc.c
new file mode 100644
index 0000000..a06a057
--- /dev/null
+++ b/udrv/ulinux/uipc.c
@@ -0,0 +1,258 @@
+/*****************************************************************************
+ **
+ ** Name: uipc.c
+ **
+ ** Description: UIPC wrapper interface definition
+ **
+ ** Copyright (c) 2009-2011, Broadcom Corp., All Rights Reserved.
+ ** Broadcom Bluetooth Core. Proprietary and confidential.
+ **
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include <cutils/sockets.h>
+
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <signal.h>
+#include <errno.h>
+
+#include "gki.h"
+#include "data_types.h"
+#include "uipc.h"
+
+#define PCM_FILENAME "/data/test.pcm"
+#define SOCKPATH "/data/misc/bluedroid/.a2dp_sock"
+
+/* TEST CODE TO VERIFY DATAPATH */
+
+#define SOURCE_MODE_PCMFILE 1
+#define SOURCE_MODE_A2DP_SOCKET 2
+#define SOURCE_MODE SOURCE_MODE_A2DP_SOCKET
+
+static int listen_fd = -1;
+static int sock_fd = -1;
+static int source_fd = -1;
+
+static inline int create_server_socket(const char* name)
+{
+ int s = socket(AF_LOCAL, SOCK_STREAM, 0);
+
+ if(socket_local_server_bind(s, name, ANDROID_SOCKET_NAMESPACE_ABSTRACT) >= 0)
+ {
+ if(listen(s, 5) == 0)
+ {
+ APPL_TRACE_EVENT2("listen to local socket:%s, fd:%d", name, s);
+ return s;
+ }
+ else
+ APPL_TRACE_EVENT3("listen to local socket:%s, fd:%d failed, errno:%d", name, s, errno);
+ }
+ else
+ APPL_TRACE_EVENT3("create local socket:%s fd:%d, failed, errno:%d", name, s, errno);
+ close(s);
+ return -1;
+}
+
+int wait_socket(void)
+{
+ struct sockaddr_un remote;
+ int t;
+
+ APPL_TRACE_DEBUG0("wait socket");
+
+ listen_fd = create_server_socket(SOCKPATH);
+
+ if ((sock_fd = accept(listen_fd, (struct sockaddr *)&remote, &t)) == -1) {
+ APPL_TRACE_ERROR1("a2dp sock accept failed (%d)", errno);
+ return -1;
+ }
+
+ return sock_fd;
+}
+
+int open_source(void)
+{
+ int s;
+#if (SOURCE_MODE == SOURCE_MODE_PCMFILE)
+ s = open((char*)PCM_FILENAME , O_RDONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+
+ if (s == -1)
+ {
+ APPL_TRACE_ERROR0("unable to open pcm file\n");
+ s = -1;
+ return 0;
+ }
+#endif
+
+#if (SOURCE_MODE == SOURCE_MODE_A2DP_SOCKET)
+ s = wait_socket();
+#endif
+ return s;
+}
+
+void close_source(int fd)
+{
+ close(fd);
+
+#if (SOURCE_MODE == SOURCE_MODE_A2DP_SOCKET)
+ close(listen_fd);
+ listen_fd = -1;
+#endif
+}
+
+
+/*******************************************************************************
+ **
+ ** Function UIPC_Init
+ **
+ ** Description Initialize UIPC module
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+
+UDRV_API void UIPC_Init(void *p_data)
+{
+ APPL_TRACE_DEBUG0("UIPC_Init");
+}
+
+/*******************************************************************************
+ **
+ ** Function UIPC_Open
+ **
+ ** Description Open UIPC interface
+ **
+ ** Returns TRUE in case of success, FALSE in case of failure.
+ **
+ *******************************************************************************/
+UDRV_API BOOLEAN UIPC_Open(tUIPC_CH_ID ch_id, tUIPC_RCV_CBACK *p_cback)
+{
+ APPL_TRACE_DEBUG2("UIPC_Open : ch_id %d, p_cback %x", ch_id, p_cback);
+
+ return FALSE;
+}
+
+/*******************************************************************************
+ **
+ ** Function UIPC_Close
+ **
+ ** Description Close UIPC interface
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+UDRV_API void UIPC_Close(tUIPC_CH_ID ch_id)
+{
+ APPL_TRACE_DEBUG1("UIPC_Close : ch_id %d", ch_id);
+ close_source(source_fd);
+ source_fd = -1;
+}
+
+/*******************************************************************************
+ **
+ ** Function UIPC_SendBuf
+ **
+ ** Description Called to transmit a message over UIPC.
+ ** Message buffer will be freed by UIPC_SendBuf.
+ **
+ ** Returns TRUE in case of success, FALSE in case of failure.
+ **
+ *******************************************************************************/
+UDRV_API BOOLEAN UIPC_SendBuf(tUIPC_CH_ID ch_id, BT_HDR *p_msg)
+{
+ APPL_TRACE_DEBUG1("UIPC_SendBuf : ch_id %d", ch_id);
+ return FALSE;
+}
+
+/*******************************************************************************
+ **
+ ** Function UIPC_Send
+ **
+ ** Description Called to transmit a message over UIPC.
+ **
+ ** Returns TRUE in case of success, FALSE in case of failure.
+ **
+ *******************************************************************************/
+UDRV_API BOOLEAN UIPC_Send(tUIPC_CH_ID ch_id, UINT16 msg_evt, UINT8 *p_buf,
+ UINT16 msglen)
+{
+ APPL_TRACE_DEBUG1("UIPC_Send : ch_id:%d", ch_id);
+ return FALSE;
+}
+
+/*******************************************************************************
+ **
+ ** Function UIPC_ReadBuf
+ **
+ ** Description Called to read a message from UIPC.
+ **
+ ** Returns void
+ **
+ *******************************************************************************/
+UDRV_API void UIPC_ReadBuf(tUIPC_CH_ID ch_id, BT_HDR *p_msg)
+{
+ APPL_TRACE_DEBUG1("UIPC_ReadBuf : ch_id:%d", ch_id);
+}
+
+/*******************************************************************************
+ **
+ ** Function UIPC_Read
+ **
+ ** Description Called to read a message from UIPC.
+ **
+ ** Returns return the number of bytes read.
+ **
+ *******************************************************************************/
+UDRV_API UINT32 UIPC_Read(tUIPC_CH_ID ch_id, UINT16 *p_msg_evt, UINT8 *p_buf,
+ UINT32 len)
+{
+ int n;
+ int n_read = 0;
+
+ //APPL_TRACE_DEBUG1("UIPC_Read : ch_id %d", ch_id);
+
+ if (source_fd == -1)
+ {
+ source_fd = open_source();
+ }
+
+ while (n_read < (int)len)
+ {
+ n = read(source_fd, p_buf, len);
+
+ if (n == 0)
+ {
+ APPL_TRACE_EVENT0("remote source detached");
+ source_fd = -1;
+ return 0;
+ }
+ n_read+=n;
+ //APPL_TRACE_EVENT1("read %d bytes", n_read);
+ }
+
+ return n_read;
+}
+
+/*******************************************************************************
+**
+** Function UIPC_Ioctl
+**
+** Description Called to control UIPC.
+**
+** Returns void
+**
+*******************************************************************************/
+UDRV_API extern BOOLEAN UIPC_Ioctl(tUIPC_CH_ID ch_id, UINT32 request, void *param)
+{
+ APPL_TRACE_DEBUG2("#### UIPC_Ioctl : ch_ud %d, request %d ####", ch_id, request);
+ return FALSE;
+}
+