From 95fa11b3b2f19a382c7e3a744a6afb452fad86df Mon Sep 17 00:00:00 2001 From: Kausik Sinnaswamy Date: Wed, 7 Mar 2012 19:30:20 -0800 Subject: AV control and data path added Change-Id: I88ec6084c140fa257154a98e23e075900e84cc8c --- udrv/include/uipc.h | 163 +++++++++++++++++++++++++++++++++ udrv/ulinux/uipc.c | 258 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 421 insertions(+) create mode 100644 udrv/include/uipc.h create mode 100644 udrv/ulinux/uipc.c (limited to 'udrv') 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 +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#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; +} + -- cgit v1.1