예제 #1
0
/*****************************************************************************
 * FUNCTION
 *  btmtk_fs_delete
 * DESCRIPTION
 *
 * PARAMETERS
 *  fileName        [IN]
 * RETURNS
 *
 *****************************************************************************/
S32 btmtk_fs_delete(const U8 *fileName)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    bt_prompt_trace(MOD_BT, "[FS] +btmtk_fs_delete(%s)", fileName);
#ifdef BTMTK_ON_WISE
    bt_asc_str_n_to_ucs2_str((S8 *)pathBuf, (S8 *)fileName, FS_MAX_PATH_LEN * sizeof(U16));
    return translateFileError(FS_Delete(pathBuf));
#else

    translateFilePath(fileName, (U8 *)pathBuf);
    if (remove((char *)pathBuf) != 0)
    {
        bt_prompt_trace(MOD_BT, "[FS] -btmtk_fs_delete failed : %s, errno=%d", strerror(errno), errno);
        return BTMTK_FS_ERR;
    }
    bt_prompt_trace(MOD_BT, "[FS] -btmtk_fs_delete");
    return BTMTK_FS_OK;
#endif /* BTMTK_ON_WISE */
}
예제 #2
0
/*****************************************************************************
 * FUNCTION
 *  btmtk_fs_create_dir
 * DESCRIPTION
 *
 * PARAMETERS
 *  dirName     [IN]
 * RETURNS
 *
 *****************************************************************************/
S32 btmtk_fs_create_dir(const U8 *dirName)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    bt_prompt_trace(MOD_BT, "[FS] +btmtk_fs_create_dir(%s)", dirName);
#ifdef BTMTK_ON_WISE
    bt_asc_str_n_to_ucs2_str((S8 *)pathBuf, (S8 *)dirName, FS_MAX_PATH_LEN * sizeof(U16));
    return translateFileError(FS_CreateDir(pathBuf));
#else
    translateFilePath(dirName, (U8 *)pathBuf);
#ifdef BTMTK_ON_LINUX
    if (mkdir((char *)pathBuf, 0777) != 0)
#else
    if (_mkdir((char *)pathBuf) != 0)
#endif
    {
        bt_prompt_trace(MOD_BT, "[FS] -btmtk_fs_create_dir failed : %s, errno=%d", strerror(errno), errno);
        return BTMTK_FS_ERR;
    }
    bt_prompt_trace(MOD_BT, "[FS] -btmtk_fs_create_dir");
    return BTMTK_FS_OK;
#endif /* BTMTK_ON_WISE */
}
예제 #3
0
/*****************************************************************************
 * FUNCTION
 *  btmtk_fs_close
 * DESCRIPTION
 *
 * PARAMETERS
 *  fd      [IN]
 * RETURNS
 *
 *****************************************************************************/
S32 btmtk_fs_close(int fd)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    int handle = bt_file_desc[fd].handle;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (bt_file_desc[fd].used == KAL_FALSE)
    {
        bt_prompt_trace(MOD_BT, "[FS] +btmtk_fs_close(fd=%d) cannot found fd", fd);
        return BTMTK_FS_ERR;
    }

    bt_prompt_trace(MOD_BT, "[FS] +btmtk_fs_close(fd=%d, handle=0x%X)", fd, handle);
    bt_file_desc[fd].used = KAL_FALSE;
    bt_file_desc[fd].handle = 0;
#ifdef BTMTK_ON_WISE
    return translateFileError(FS_Close(handle));
#else
    if (fclose((FILE*) handle) != 0)
    {
        bt_prompt_trace(MOD_BT, "[FS] -btmtk_fs_close failed : %s, errno=%d", strerror(errno), errno);
        return BTMTK_FS_ERR;
    }
    return BTMTK_FS_OK;
#endif
}
예제 #4
0
static void waitWholeChipResetComplete(){
    int res = 0;
    char tmp;
    /*
    fd_set readfs;
    FD_ZERO(&readfs);
    FD_SET(commPort, &readfs);
    do{
        res = select(commPort+1,&readfs, NULL, NULL, NULL);
    }while((res < 0 && errno == EAGAIN));
    */
    do{
        res = read(commPort, &tmp, 1);
        if( res < 0 ){
            if( errno == 99 ){
                bt_prompt_trace(MOD_BT, "[RESET] 99 (WholeChipReset completed)");
                return;
            }else if(errno == 88){
                bt_prompt_trace(MOD_BT, "[RESET] 88 usleep(1000)");
                usleep(10000);
            }else if(errno != EAGAIN){
                break;
            }
        }else{
            break;
        }
    }while(1);
    bt_prompt_trace(MOD_BT, "[RESET] 99 (WholeChipReset completed) not waited : %d : errno=%d", res, errno);
}
예제 #5
0
    /* restore bt driver */
    if(commPort >= 0) {
        lib_handle = getDriverHandle();
        if(lib_handle) {
            bt_prompt_trace(MOD_BT, "Start to restore bt driver");
            SetUartSetup = dlsym(lib_handle, "SetUartSetup");
            bt_restore = dlsym(lib_handle, "bt_restore");
            if(bt_restore && SetUartSetup) {
                setUartBlockMode(commPort, 1);
                SetUartSetup(setup_uart_param);
                bt_restore(commPort);
            } else {
                bt_prompt_trace(MOD_BT, "[ERR] can locate bt_restore function");
            }
        }
    } else {
        bt_prompt_trace(MOD_BT, "commPort is invalid when GORM_Shutdown");
    }
    //bt_prompt_trace(MOD_BT, "+GORM_Shutdown");
    BTUartLinuxShutdown();
    //bt_prompt_trace("set_bluetooth_power(0)");
    if( set_bluetooth_power(0) < 0)
    {
        //bt_prompt_trace(MOD_BT, "[ERR] failed to set bt power");
        return BT_STATUS_FAILED;
    }
    //bt_prompt_trace(MOD_BT, "-GORM_Shutdown");
#else
    BTUartLinuxShutdown();
#endif  /* __MTK_STP_SUPPORTED__ */
#endif /* !defined(__ANDROID_EMULATOR__) */
    return BT_STATUS_SUCCESS;
}

#if defined(__ENABLE_SLEEP_MODE__)
static HciCommandType wOpCode2;          /* Opcode of HCI command sent from init
                                       * script.
                                       */
static HciReducedCommand    hciHostWakeupCmd;   /* Structure for sending commands.  Only
                                       * one command can be sent at a time.
                                       */
void Radio_hostWakeup(void)
{
    HciCommandType wOpCode_enc;
    /*
    if((stack_query_boot_mode() != FACTORY_BOOT)
         &&(0==bt_MMI_RFtest_mode)
        )*/
    {
        bt_prompt_trace(MOD_BT, "[SM] Radio_hostWakeup");
        wOpCode2 = 0xFCC1;
        hciHostWakeupCmd.parms[0] = 0;
        //    Assert(IsEntryAvailable(&hciHostWakeupCmd.node));
        //Call host provided interface to send host wakeup dummy command
        if (IsEntryAvailable(&hciHostWakeupCmd.node))
        {
            bt_prompt_trace(MOD_BT, "[SM] IsEntryAvailable(&hciHostWakeupCmd.node) return true");
            //Encrypt HCI commands
            if (/*enc_state >= START_CMD_ENC*/ 1)
            {
                wOpCode_enc = BT_XFile_EncryptionCommandOpcode(wOpCode2);
            }
            else
            {
                wOpCode_enc = wOpCode2;
            }
#ifdef __ENABLE_SLEEP_MODE__ /* avoid compile error */
            HCI_HostWakeupStartTimer();
#endif /* __ENABLE_SLEEP_MODE__ */
            HciTransmitCommand(wOpCode_enc, 0, (HciCommand *)&hciHostWakeupCmd, TRUE, FALSE );
        }
    }
}
예제 #6
0
/*static char packetbuf[1024];*/
unsigned short BTUartLinuxWrite(const unsigned char *buffer, unsigned short length)
{
    int nWritten = 0;
    int bytesToWrite;
    U16 i;
    unsigned char *ptr;


    bytesToWrite = length;

    /*
    ptr = packetbuf;
    for(i = 0;i < length;i++)
    {
        sprintf(ptr, "%02X ", buffer[i]);
        ptr+=3;
    }
    //bt_prompt_trace(MOD_BT, "[BT] Write %d bytes to uart", length);
    bt_prompt_trace(MOD_BT, "[BT] Write to uart %d : \"%s\"", commPort, packetbuf);
    */

    if(commPort < 0)
    {
        bt_prompt_trace(MOD_BT, "Write com after closed");
        return 0;
    }

	
    while(bytesToWrite > 0)
    {
        bt_prompt_trace_lv3(MOD_BT, "[BT] Start write to uart buffer=0x%x, bytesToWrite=%d", buffer, bytesToWrite);
        nWritten = write(commPort, buffer, bytesToWrite);
        if (nWritten > 0)
        {
            bt_prompt_trace_lv3(MOD_BT, "[BT][UART] %d bytes are written to uart", nWritten);
            bytesToWrite -= nWritten;
            buffer += nWritten;
        }
        else
        {
            bt_prompt_trace(MOD_BT, "[UART] Write uart failed : nWritten=%d, err=%s, errno=%d", nWritten, strerror(errno), errno);
            break;
        }
    }
    if(nWritten < 0){
        //bt_prompt_trace(MOD_BT, "[RESET] BTUartLinuxWrite return %d, errno=%d", nWritten, errno);
        if(errno == 88 || errno == 99){
        	wholeChipReset(errno);
        	return 0;
        }
    }
    bt_prompt_trace_lv3(MOD_BT, "[BT][UART] total wrote %d bytes to uart", length - bytesToWrite);
    return (length - bytesToWrite);
} 
예제 #7
0
unsigned char BTUartLinuxShutdown(void)
{
    bt_prompt_trace(MOD_BT, "[UART] Close UART port : %d", commPort);
    if(commPort >= 0)
    {
        bt_android_log("[UART] Close UART port : %d", commPort);
        if( close(commPort) < 0 ) {
            bt_prompt_trace(MOD_BT, "[UART] Close UART port failed : %d, %s", errno, strerror(errno));
            bt_android_log("[UART][ERR] Close UART port failed : %d, %s", errno, strerror(errno));
        }
        commPort = -1;
    }
    return 0x00;
}
예제 #8
0
static void* getDriverHandle() {
    void *lib_handle;
    lib_handle = dlopen("/data/libhciattach_mtk.so", RTLD_LAZY);
    if (!lib_handle) 
    {
        bt_prompt_trace(MOD_BT, "%s\n", dlerror());
        /* not found use default */
        lib_handle = dlopen("libhciattach_mtk.so", RTLD_LAZY);
    }
    if (!lib_handle) 
    {
        bt_prompt_trace(MOD_BT, "[ERR] dlopen failed : %s\n", dlerror());
    }
    return lib_handle;
}
예제 #9
0
int setup_uart_param(
    unsigned long hComPort, 
    int iBaudrate, 
    int iFlowControl)
{
	struct termios ti;
	int  fd;

        bt_prompt_trace(MOD_BT, "[UART] setup_uart_param %d %d\n", iBaudrate, iFlowControl);

	fd = (int)hComPort;
	if (fd < 0) {
		bt_prompt_trace(MOD_BT, "[UART][ERR] Invalid serial port");
		return -1;
	}

	tcflush(fd, TCIOFLUSH);

	if (tcgetattr(fd, &ti) < 0) {
		bt_prompt_trace(MOD_BT, "[UART][ERR] Can't get port settings");
		return -1;
	}

	cfmakeraw(&ti);

	ti.c_cflag |= CLOCAL;
    
    ti.c_cflag &= ~CRTSCTS;
    ti.c_iflag &= ~(IXON | IXOFF | IXANY | 0x80000000);

    /* HW flow control */
	if (iFlowControl == 1){
		ti.c_cflag |= CRTSCTS;
        bt_prompt_trace(MOD_BT, "[UART] HW flow control\n");
	}
	else if (iFlowControl == 2){ //MTK HW Xon/Xoff
        /* SW flow control */
		//ti.c_iflag |= (IXON | IXOFF | IXANY);
		ti.c_iflag |= 0x80000000;
            //ti.c_cflag |= CRTSCTS;
        bt_prompt_trace(MOD_BT, "[UART] SW flow control\n");
	}

	if (tcsetattr(fd, TCSANOW, &ti) < 0) {
		bt_prompt_trace(MOD_BT, "[UART][ERR] Can't set port settings");
		return -1;
	}

	/* Set baudrate */
	if (set_speed(fd, &ti, iBaudrate) < 0) {
		bt_prompt_trace(MOD_BT, "[UART][ERR] Can't set initial baud rate");
		return -1;
	}

	tcflush(fd, TCIOFLUSH);
       bt_prompt_trace(MOD_BT, "[UART] setup_uart_param success\n");
	return fd;
}
예제 #10
0
/* static char packetbuf[1024]; */
unsigned short BTUartLinuxRead(unsigned char *buffer, unsigned short length)
{
    unsigned short bytesToCopy = 0;
    int nRead = 0;

    bytesToCopy = length;
    bt_prompt_trace_lv3(MOD_BT, "[BT] Read uart buffer=0x%x, length=%d, commport=%d", buffer, length, commPort);

    if(commPort < 0)
    {
        bt_prompt_trace(MOD_BT, "Read com after closed");
        return 0;
    }

    while(bytesToCopy && (nRead = read(commPort, buffer, bytesToCopy)) > 0)
    {
        bt_prompt_trace_lv3(MOD_BT, "[BT] %d bytes is read from uart", nRead);
        bytesToCopy -= nRead;
        buffer += nRead;
    }
    if(nRead < 0){
        //bt_prompt_trace(MOD_BT, "[RESET] BTUartLinuxRead return %d, errno=%d", nRead, errno);
        if(errno == 88 || errno == 99){
        	wholeChipReset(errno);
        	return 0;
        }
    }
    bt_prompt_trace_lv3(MOD_BT, "[BT] total %d bytes is read", length - bytesToCopy);
	
    return (length - bytesToCopy);
} 
예제 #11
0
void  ShowBytes( void *  s,  int  n)
{
    U8 *  start  =  (U8* )s;
	int i=0;
	bt_prompt_trace(MOD_BT,"[HID][OFFSET] ADDRESS: VALUE\n\n");
 
 for  (  i  =   0 ; i  <  n; i ++ )
 {
        bt_prompt_trace(MOD_BT, "[HID][%4d] %8x: %2x\n ",i,start+i,*(start+i));
  
  if  ((i  +   1 )  %   4   ==   0 )
  {
           bt_prompt_trace(MOD_BT, " ----------------------\n " );
        } 
    } // for 
 } 
예제 #12
0
/*************************************************
 *  Name : BTUartLinuxInit
 *  Parameter : 
 *    func : If there is Rx data, callback to stack to handle
 *  Return value : 
 *    BT_STATUS_SUCCESS : Success
 *    BT_STATUS_FAILED : Failed
 *************************************************/
BtStatus BTUartLinuxInit(UartCallback func)
{
    // Checking if the uart is already opened
    // if com port is opened, let opencomm to close then open again
    /*
    if (commPort >= 0)
    {
        bt_android_log("[UART][ERR] the uart already opened : %d", commPort);
        bt_prompt_trace(MOD_BT, "[UART][ERR] the uart already opened : %d", commPort);
        return BT_STATUS_SUCCESS;
    }
    */
   // Create this write operation's OVERLAPPED structure's hEvent.
    BTAdpUartCtx.cb_func = func;
    //Power on BT before open uart
    set_bluetooth_power(0);
    /* Power on controller */
    if( set_bluetooth_power(1) < 0)
    {
        bt_prompt_trace(MOD_BT, "[ERR] failed to set bt power");
        return BT_STATUS_FAILED;
    }

    if ( openComm() != 0 ){
        set_bluetooth_power(0);
        return BT_STATUS_FAILED;
    }
    else
    {
        return BT_STATUS_SUCCESS;
    }
}
예제 #13
0
/*****************************************************************************
 * FUNCTION
 *  btmtk_fs_seek
 * DESCRIPTION
 *
 * PARAMETERS
 *  fd              [IN]
 *  offset          [IN]
 *  seek_mode       [IN]
 * RETURNS
 *
 *****************************************************************************/
S32 btmtk_fs_seek(int fd, U32 offset, btmtk_seek_mode_enum seek_mode)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    S32 pos;
    int handle = bt_file_desc[fd].handle;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (bt_file_desc[fd].used == KAL_FALSE)
    {
        bt_prompt_trace(MOD_BT, "[FS] btmtk_fs_seek(fd=%d) cannot found fd", fd);
        return BTMTK_FS_ERR;
    }

#ifdef BTMTK_ON_WISE
    pos = FS_Seek(handle, offset, translateSeekMode(seek_mode));
    return translateFileError(pos);
#else
    if (fseek((FILE *)handle, offset, translateSeekMode(seek_mode)) == 0)
    {
        pos = ftell((FILE *)handle);
        return pos;
    }
    return BTMTK_FS_ERR;
#endif
}
예제 #14
0
U32 bt_dbg_manual_dump_req_hdlr(ilm_struct *ilm_ptr){
    U32 *ptr = (U32*)1;
    bt_prompt_trace(MOD_BT, "Request manual dump");
    bt_android_log("Make mtkbt crash to get coredump");
    usleep(200000);
    *ptr= 0;
    return *ptr;
}
예제 #15
0
static void wholeChipReset(int err)
{
  bt_prompt_trace(MOD_BT, "[RESET] wholeChipReset : errno=%d", errno);
  Assert(0);
  if(err == 88){
		waitWholeChipResetComplete();
  }
	close(commPort);
	commPort = -1;
}
예제 #16
0
U8 Hid_Init_Parser(HidParseData*	tmpHidParser)
{
	//HidParseData*	tmpHidParser = (HidParseData*)hid_malloc(sizeof(HidParseData));
	if(!tmpHidParser)
	{
		bt_prompt_trace(MOD_BT,"[HID]HidParseData hid_malloc error");
		return 0;
	}
	
	tmpHidParser->reportDesc = NULL;
	tmpHidParser->usageQueue = (HidUsage*)hid_malloc(HID_USAGE_MAX * sizeof(HidUsage));
	if(!tmpHidParser->usageQueue)
	{
		bt_prompt_trace(MOD_BT,"[HID]usageQueue hid_malloc error");
		return 0;
	}

	btmtk_os_memset((U8*) tmpHidParser->usageQueue, 0, sizeof(HID_USAGE_MAX * sizeof(HidUsage)));

	tmpHidParser->usageSize = 0;
	tmpHidParser->usageNum = 0;
	tmpHidParser->reportDescLength = 0;
	tmpHidParser->logicalMAX = 0;
	tmpHidParser->logicalMIN = 0;
	tmpHidParser->physicalMAX = 0;
	tmpHidParser->physicalMIN = 0;
	tmpHidParser->reportCount = 0;
	tmpHidParser->reportSize = 0;
	tmpHidParser->reportID = 0;
	tmpHidParser->usagePage = 0;
	tmpHidParser->unitExponent = 0;
	tmpHidParser->unit = 0;

	tmpHidParser->pos = 0;
	tmpHidParser->collectionArray = (HidUsageCollection*)hid_malloc(HID_COLLECTION_MAX * sizeof(HidUsageCollection));
	btmtk_os_memset((HidUsageCollection*) tmpHidParser->collectionArray, 0, sizeof(HID_COLLECTION_MAX * sizeof(HidUsageCollection)));
	tmpHidParser->collectionIndex = 0;
	//return tmpHidParser;
	Hid_Init_KeyArray();
	return 1;
}
예제 #17
0
/*---------------------------------------------------------------------------
 *            HidStartServiceQuery()
 *---------------------------------------------------------------------------
 *
 * Synopsis:  Initiate the SDP service query for a HID device.
 *
 * Return:    See SDP_Query().
 */
BtStatus HidStartServiceQuery(HidChannel *Channel)
{
    BtStatus status = BT_STATUS_FAILED;
    sdap_service_search_multi_attribute_struct search_pattern;
    ReportDescriptorList* reportDescriptorList = NULL;
    HidParseData*	hpd ;
	
    reportDescriptorList = HidFindReportDescriptorByAddr(Channel->cmgrHandler.remDev->bdAddr);
    if(reportDescriptorList != NULL && Channel->state == HID_STATE_OPEN)
    {
		Channel->queryRsp.descriptorLen = reportDescriptorList->reportDescriptorLength;
		Channel->queryRsp.descriptorList = (U8*)hid_malloc(reportDescriptorList->reportDescriptorLength);
		btmtk_os_memset((U8*) Channel->queryRsp.descriptorList, 0, reportDescriptorList->reportDescriptorLength); 			
		btmtk_os_memcpy((U8*) Channel->queryRsp.descriptorList, reportDescriptorList->reportDescriptor, reportDescriptorList->reportDescriptorLength);
		hpd = (HidParseData*)hid_malloc(sizeof(HidParseData));
		Hid_Init_Parser(hpd);
				Channel->reportCons[0] = (HidReportConstructor*)hid_malloc(HID_REPORT_ID_MAX * sizeof(HidReportConstructor));
		btmtk_os_memset((U8*) Channel->reportCons[0], 0, HID_REPORT_ID_MAX * sizeof(HidReportConstructor));
		
		if(HidAddDescriptor(Channel) == BT_STATUS_SUCCESS)
			bt_prompt_trace(MOD_BT,"[HID]HidAddDescriptor Successed!");
		else
			bt_prompt_trace(MOD_BT,"[HID]HidAddDescriptor failed!");
        
		Hid_Free_Parser(hpd);
		Channel->flags &= ~CHNL_FLAG_SERVICE_QUERY;
		HidSdpCallback(Channel, BT_STATUS_SUCCESS);
		return BT_STATUS_SUCCESS;
    }
    else
    {
	    search_pattern.rm = Channel->cmgrHandler.remDev;
	    search_pattern.sqt = &Channel->sdpQueryToken;
	    search_pattern.uuid = SC_HUMAN_INTERFACE_DEVICE;
	    search_pattern.callback = HidSdpEventHandler;
	    search_pattern.attribute_num = sizeof(bt_hid_attr_id_list)/sizeof(bt_hid_attr_id_list[0]);
	    search_pattern.attribute_id = bt_hid_attr_id_list;
	    status = SDAP_ServiceSearchMultipleAttribute2(search_pattern);
	    return status;
    }
} 
예제 #18
0
/*****************************************************************************
 * FUNCTION
 *  btmtk_fs_read
 * DESCRIPTION
 *
 * PARAMETERS
 *  fd          [IN]
 *  buffer      [?]
 *  size        [IN]
 * RETURNS
 *
 *****************************************************************************/
S32 btmtk_fs_read(int fd, void *buffer, U32 size)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    int handle = bt_file_desc[fd].handle;

#ifdef BTMTK_ON_WISE
    U32 byte_read = 0;
    S32 err;
#else
    size_t byte_read = 0;
#endif

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (bt_file_desc[fd].used == KAL_FALSE)
    {
        bt_prompt_trace(MOD_BT, "[FS] btmtk_fs_read(fd=%d) cannot found fd", fd);
        return BTMTK_FS_ERR;
    }

    bt_prompt_trace(MOD_BT, "[FS] +btmtk_fs_read(handle=0x%X, buffer=0x%X, size=%d)", handle, buffer, size);
#ifdef BTMTK_ON_WISE
    if ((err = FS_Read(handle, buffer, size, &byte_read)) == FS_NO_ERROR)
    {
        return byte_read;
    }
    return translateFileError(err);
#else
    byte_read = fread(buffer, 1, size, (FILE *) handle);
    if (byte_read == size || feof((FILE *) handle))
    {
        bt_prompt_trace(MOD_BT, "[FS] -btmtk_fs_read : %d", byte_read);
        return byte_read;
    }
    bt_prompt_trace(MOD_BT, "[FS] -btmtk_fs_read failed : %s, errno=%d", strerror(errno), errno);
    return BTMTK_FS_ERR;
#endif /* BTMTK_ON_WISE */
}
예제 #19
0
static BtStatus GORM_Shutdown(void)
{
#if !defined(__ANDROID_EMULATOR__)
#ifndef __MTK_STP_SUPPORTED__
    void* lib_handle;
    RESTORE bt_restore = NULL;
    SET_UART_SETUP SetUartSetup = NULL;
    /* restore bt driver */
    if(commPort >= 0) {
        lib_handle = getDriverHandle();
        if(lib_handle) {
            bt_prompt_trace(MOD_BT, "Start to restore bt driver");
            SetUartSetup = dlsym(lib_handle, "SetUartSetup");
            bt_restore = dlsym(lib_handle, "bt_restore");
            if(bt_restore && SetUartSetup) {
                setUartBlockMode(commPort, 1);
                SetUartSetup(setup_uart_param);
                bt_restore(commPort);
            } else {
                bt_prompt_trace(MOD_BT, "[ERR] can locate bt_restore function");
            }
        }
    } else {
        bt_prompt_trace(MOD_BT, "commPort is invalid when GORM_Shutdown");
    }
    //bt_prompt_trace(MOD_BT, "+GORM_Shutdown");
    BTUartLinuxShutdown();
    //bt_prompt_trace("set_bluetooth_power(0)");
    if( set_bluetooth_power(0) < 0)
    {
        //bt_prompt_trace(MOD_BT, "[ERR] failed to set bt power");
        return BT_STATUS_FAILED;
    }
    //bt_prompt_trace(MOD_BT, "-GORM_Shutdown");
#else
    BTUartLinuxShutdown();
#endif  /* __MTK_STP_SUPPORTED__ */
#endif /* !defined(__ANDROID_EMULATOR__) */
    return BT_STATUS_SUCCESS;
}
예제 #20
0
/*****************************************************************************
 * FUNCTION
 *  btmtk_fs_is_dir_exist
 * DESCRIPTION
 *
 * PARAMETERS
 *  dirName     [IN]
 * RETURNS
 *
 *****************************************************************************/
BT_BOOL btmtk_fs_is_dir_exist(const U8 *dirName)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
#ifdef BTMTK_ON_WISE
    FS_HANDLE file_handle;

    bt_asc_str_n_to_ucs2_str((S8 *)pathBuf, (S8 *)dirName, FS_MAX_PATH_LEN * sizeof(U16));
    if ((file_handle = FS_Open(pathBuf, FS_OPEN_DIR | FS_READ_ONLY)) > 0)
    {
        FS_Close(file_handle);
        return TRUE;
    }
    return FALSE;
#else /* BTMTK_ON_WISE */
#ifdef BTMTK_ON_LINUX
    struct stat buf;
    BT_BOOL bRet;
#else
    struct _stat buf;
#endif
    translateFilePath(dirName, (U8 *)pathBuf);
#ifdef BTMTK_ON_LINUX
    bRet = (BT_BOOL)((stat((char *)pathBuf, &buf) != 0) ? FALSE : TRUE);
    if(!bRet)
    {
        bt_prompt_trace(MOD_BT, "[FS] btmtk_fs_is_dir_exist failed : %s, errno=%d", strerror(errno), errno);
    }
    return bRet;
#else
    return (BT_BOOL)((_stat((char *)pathBuf, &buf) != 0) ? FALSE : TRUE);
#endif
#endif /* BTMTK_ON_WISE */
    bt_prompt_trace(MOD_BT, "[FS] -btmtk_fs_is_dir_exist");
}
예제 #21
0
BtStatus HidAddDescriptor(HidChannel *channel)
{
	if(!channel)
	{
		bt_prompt_trace(MOD_BT,"[HID]Empty Channel");
		return BT_STATUS_FAILED;
	}			
	
    
    bt_prompt_trace(MOD_BT,"[HID]channel->descLen=%d",channel->descLen);
    
    btmtk_os_memcpy(channel->descStr + channel->descLen, 
                    channel->queryRsp.descriptorList, 
                    channel->queryRsp.descriptorLen);
    
    channel->descLen += channel->queryRsp.descriptorLen;

    bt_prompt_trace(MOD_BT,"[HID]channel->descLen=%d",channel->descLen);
    HidShowBytes(channel->descStr, channel->descLen);

    return 0;
}
예제 #22
0
int set_speed(int fd, struct termios *ti, int speed)
{
    int ret;
    struct serial_struct ss;
    int baudenum = get_uart_speed(speed);

    if((ioctl(fd,TIOCGSERIAL,&ss))<0){  
        bt_prompt_trace(MOD_BT, "%s: BAUD: error to get the serial_struct info:%s",__func__, strerror(errno));  
        return -1;  
    }

    if ((baudenum == B57600) && (speed != 57600)) {
        /* struct serial_struct ss;  */
        bt_prompt_trace(MOD_BT, "%s: non-standard baudrate: %d", __func__, speed);
        //cfsetispeed(ti,B38400);  
        //cfsetospeed(ti,B38400);  
        tcflush(fd,TCIFLUSH);/*handle unrecevie char*/  
        //tcsetattr(fd,TCSANOW,ti);  
        /*
        if((ioctl(fd,TIOCGSERIAL,&ss))<0){  
            bt_prompt_trace(MOD_BT, "%s: BAUD: error to get the serial_struct info:%s",__func__, strerror(errno));  
            return -1;  
        }*/
        if(!(ss.flags & ASYNC_SPD_CUST)) {
            bt_prompt_trace(MOD_BT, "ASYNC_SPD_CUST is not set. Set ASYNC_SPD_CUST");
            ss.flags |= ASYNC_SPD_CUST;  
            ss.custom_divisor = ss.baud_base / speed;  
            if(ss.custom_divisor*speed != ss.baud_base )
                ss.custom_divisor = speed | (1<<31);
            if((ioctl(fd,TIOCSSERIAL,&ss))<0){  
                bt_prompt_trace(MOD_BT, "BAUD: error to set serial_struct:%s",strerror(errno));  
                return -2;  
            }
        }
        return 0;
    } else {
        bt_prompt_trace(MOD_BT, "%s: standard baudrate: %d -> %d", __func__, speed, baudenum);
        if(ss.flags & ASYNC_SPD_CUST) {
            bt_prompt_trace(MOD_BT, "ASYNC_SPD_CUST is set. Clear ASYNC_SPD_CUST");
            ss.flags &= ~ASYNC_SPD_CUST;
            ss.custom_divisor = 1;
            if((ioctl(fd,TIOCSSERIAL,&ss))<0){
                bt_prompt_trace(MOD_BT, "BAUD: error to set serial_struct:%s",strerror(errno));
                return -2;  
            }            
        }
        cfsetospeed(ti, baudenum);
        cfsetispeed(ti, baudenum);
        tcsetattr(fd, TCSANOW, ti);        
        return 0;
    }
}
예제 #23
0
/* return value : < 0 means failed, and others means success */
static int setUartBlockMode(int handle, U8 block) 
{
    int val;

    /* uart handle is opened as blocking, change it to non-blocking */
    if( (val = fcntl(handle, F_GETFL, 0)) < 0) 
    {
        bt_prompt_trace(MOD_BT, "[UART][ERR] get handle flag failed");
    } 
    else
    {
        if(block == 0)
        {
            val |= O_NONBLOCK;
        }
        else
        {
            val &= ~O_NONBLOCK;
        }
        val = fcntl(commPort, F_SETFL, val);
    }
    bt_prompt_trace(MOD_BT, "setUartBlockMode(%d,%d)=%d", handle, block, val);
    return val;
}
예제 #24
0
void Hid_Free_Mem()
{
	int i;
	for(i = 0; i < MAX_KEY_ARRAY_SIZE; i++)
	{
		if(keyArySet[i].firstAry == 1)
		{
			bt_prompt_trace(MOD_BT,"[HID]Free the array table");
			hid_free(keyArySet[i].keyAry);
			keyArySet[i].firstAry = 0;
		}
		keyArySet[i].keyAry = NULL;
		keyArySet[i].keyAryIndex = 0;
		keyArySet[i].reportID = 0;
	}
}
예제 #25
0
void BTUartLinuxSetSpeed(unsigned short speed)
{
    struct termios options;
    bt_prompt_trace(MOD_BT, "[BT][UART] set uart speed to speed %d", speed);
    return;
    /* Get default com port setting */
    if( -1 == tcgetattr(commPort, &options) )
    {
        return;
    }

    /* Set baud rate to 115200 */
    cfsetispeed(&options, B115200);
    cfsetospeed(&options, B115200);
    /* Set new com port setting */
    if( -1 == tcsetattr(commPort, TCSANOW, &options) )
    {
        return;
    }
    return;
}
예제 #26
0
/*****************************************************************************
 * FUNCTION
 *  btmtk_fs_init
 * DESCRIPTION
 *
 * PARAMETERS
 *  void
 * RETURNS
 *  void
 *****************************************************************************/
void btmtk_fs_init(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    char cwdpath[128];

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    bt_prompt_trace(MOD_BT, "[FS] btmtk_fs_init");
    OS_Report("[FS][INIT] BT_DB_PATH='%s'", BT_DB_PATH);
    OS_Report("[FS][INIT] BT_DB_FILE='%s'", BT_DB_FILE);
#ifdef BTMTK_ON_LINUX
    memset( cwdpath, 0 , sizeof(cwdpath));
    getcwd(cwdpath, sizeof(cwdpath)-1);
    OS_Report("[FS][INIT] getcwd()='%s'", cwdpath);
#else
    OS_Report("[FS][INIT] getcwd() unknow" );
#endif
    memset(bt_file_desc, 0x0, sizeof(file_info_struct) * BT_MAX_NUM_FILES);
}
예제 #27
0
BtStatus HidCacheReportDescriptor(BD_ADDR addr, U8* HidDescriptorList, U32 length)
{
    U8 i = 0;
	
    for (i = 0; i < HID_MAX_REPORT_DESCRIPTOR_NUM; i++)
    {
        if (!CachedReportDescriptor[i].inUse)
        {
            btmtk_os_memcpy(CachedReportDescriptor[i].BtAddr.addr, addr.addr, 6);
            CachedReportDescriptor[i].inUse = TRUE;
            CachedReportDescriptor[i].reportDescriptor = (U8*)hid_malloc(length);
            if(!CachedReportDescriptor[i].reportDescriptor)
            {
                bt_prompt_trace(MOD_BT,"[HID]CachedReportDescriptor[i].reportDescriptor hid_malloc error");
                return BT_STATUS_FAILED;
            }
            btmtk_os_memset(CachedReportDescriptor[i].reportDescriptor, 0 ,length);
            btmtk_os_memcpy(CachedReportDescriptor[i].reportDescriptor, HidDescriptorList, length);
            CachedReportDescriptor[i].reportDescriptorLength = length;
            break;
        }
    }
    return BT_STATUS_SUCCESS;
}
예제 #28
0
/*---------------------------------------------------------------------------
 *            HidStateConnPending()
 *---------------------------------------------------------------------------
 *
 * Synopsis:  Connection Pending state for the HID channel.
 *
 * Return:    void
 */
void HidStateConnPending(HidChannel *Channel, L2capChannelId Cid, 
                             L2capCallbackParms *Parms)
{
    //BtSniffInfo sniffInfo;
    BtStatus status;
    
    kal_trace(BT_TRACE_G2_PROFILES,HIDSTATECONNPENDINGx02X ,Parms->event);    
    switch (Parms->event) 
    {
    case L2EVENT_CONNECT_AUTORIZED:
        L2Cap_AuthorizeConnectRsp(Cid, TRUE);
        break;
    case L2EVENT_CONNECT_IND:
        /* A second connection was requested */
        status = L2CAP_ConnectRsp(Cid, L2CONN_ACCEPTED, 0);
        kal_trace(BT_TRACE_G2_PROFILES,L2CAP_CONNECTRSPx02X ,status);
        break;
    case L2EVENT_CONNECTED:
        /* A connection is up */
        //Assert(Channel->conCount < 2);
	if(Channel->conCount >= 2){
		bt_prompt_trace(MOD_BT,"[HID]Channel->conCount >= 2");
		return;
		}
        Channel->conCount++;
        CMGR_HidNoRoleSwitch(1);
        if (Channel->conCount == 2) 
        {
            /* Notify the application */
            Channel->state = HID_STATE_OPEN;
            HidAppCallback(Channel, HIDEVENT_OPEN, BT_STATUS_SUCCESS,
                           Channel->cmgrHandler.remDev, 
                           sizeof(BtRemoteDevice));

            /* Put it on the list of registered handlers */
            CMGR_SetDeviceAsMaster(&Channel->cmgrHandler);
//            CMGR_ActivateSniffTimer(&Channel->cmgrHandler);
        } 
        else if (Channel->flags & CHNL_FLAG_INITIATOR) 
        {
            /* The channel initiated the connection, establish the 
             * interrupt channel 
             */
            if (Channel->intrCid == Cid)
            {
                /* This means control channel has broken before
                    interrupt channel established */
                L2CAP_DisconnectReq(Cid);
                break;
            }
            if (L2CAP_ConnectReq(&HID(hidIntrPsm), BT_PSM_HID_INTR, 
                                 Channel->cmgrHandler.remDev, 0,
                                 &(Channel->intrCid)) != BT_STATUS_PENDING) 
             {
                /* Connect request failed, tear down the first connection */
                status = L2CAP_DisconnectReq(Channel->ctrlCid);
                kal_trace(BT_TRACE_G2_PROFILES,HID_L2CAP_DISCONNECT_REQ_CID_CIDx02X_STATUSx02X ,Channel->ctrlCid, status);
            }
        }
        break;
    case L2EVENT_DISCONNECTED:
        /* Connection is going down */
        CMGR_HidNoRoleSwitch(0);        
        HidStateDiscPending(Channel, Cid, Parms);
        break;
    default:
        /* Ignore any other events */
        kal_trace(BT_TRACE_G2_PROFILES,HID_CHANNEL_CONN_PENDING_STATE_RECEIVED_AN_UNEXPECTED_EVENT_x02X , Parms->event);
    }
}
예제 #29
0
/*---------------------------------------------------------------------------
 *            HidStateOpen()
 *---------------------------------------------------------------------------
 *
 * Synopsis:  Open state for the HID channel.
 *
 * Return:    void
 */
void HidStateOpen(HidChannel *Channel, L2capChannelId Cid, 
                  L2capCallbackParms *Parms)
{
    HidTransaction *trans = NULL;
    HidInterrupt   *intr = NULL;
    U16 mtu;
    
    kal_trace(BT_TRACE_G2_PROFILES,HIDSTATEOPENx02X ,Parms->event);    
    switch (Parms->event) 
    {
    case L2EVENT_DISCON_IND:
    case L2EVENT_DISCONNECTED:
        Channel->state = HID_STATE_DISC_PENDING;
        if (!(Channel->flags & CHNL_FLAG_TERMINATOR)) 
        {
            /* Call the application to indicate the connection is going down.
                 L2capDiscReason provided in status*/
            HidAppCallback(Channel, HIDEVENT_CLOSE_IND, Parms->status,
                           Channel->cmgrHandler.remDev, 
                           sizeof(BtRemoteDevice));
        }
        /* Connection is going down */
        HidStateDiscPending(Channel, Cid, Parms);
        break;
        
    case L2EVENT_PACKET_HANDLED:
        kal_trace(BT_TRACE_G2_PROFILES,CIDxDCTRLCIDxD ,Cid,Channel->ctrlCid);
        if (Cid == Channel->ctrlCid) 
        {
            trans = (HidTransaction *)Parms->ptrs.packet->ulpContext;
            kal_trace(BT_TRACE_G2_PROFILES,HIDSTATEOPEN1_PKT_RETURNED_WITH_TRANS_TYPExD ,trans->type);
            if (trans->flags & TRANS_FLAG_ERROR) 
            {
                /* Ignore this event, transaction failed */
                kal_trace(BT_TRACE_G2_PROFILES,HIDSTATEOPENPKT_RETURNED_WITH_ERR_FLAG);
                InsertTailList(&HID(packetPool), &Parms->ptrs.packet->node);
                break;
            }
            mtu = L2CAP_GetTxMtu(Channel->ctrlCid);
        }
        else
        {
            /* Interrupt channel */
            intr = (HidInterrupt *)Parms->ptrs.packet->ulpContext;
            if (intr->flags & INTR_FLAG_ERROR) 
            {
                /* Ignore this event, interrupt failed */
                InsertTailList(&HID(packetPool), &Parms->ptrs.packet->node);
                break;
            }
            mtu = L2CAP_GetTxMtu(Channel->intrCid);
        }

        if (Parms->ptrs.packet->dataLen < mtu - 1)
        {
            /* A packet was handled, put it back in the pool */
            /* Only return packet when no more data need to be sent */            
            InsertTailList(&HID(packetPool), &Parms->ptrs.packet->node);
        }

        /* See if there is more data to send */
        if (Cid == Channel->ctrlCid) 
        {
            /* Check for more data */
            if (Parms->ptrs.packet->dataLen >= mtu -1) 
          {
                /* More data to send, send another packet */
                kal_trace(BT_TRACE_G2_PROFILES,HIDSTATEOPEN_SEND_MORE_DATA);
                //trans->flags &= ~TRANS_FLAG_START;
	       if(!(trans->flags & TRANS_FLAG_SENT))
	                if (HidSendTransPacket(Channel, trans, Parms->ptrs.packet) 
	                                                        != BT_STATUS_PENDING) 
	                {
	                    /* Complete the transaction with an error */
	                    trans->flags |= TRANS_FLAG_ERROR;

	                    InsertTailList(&HID(packetPool), &Parms->ptrs.packet->node);

	                    /* Complete the transaction with an error, check for a new
	                     * transaction.
	                     */
	                    HidCompleteTransaction(Channel, trans, BT_STATUS_FAILED);
	                }
            } 
            else 
            {
                /* No more data to send in this transaction, complete this
                 * transaction (if no response is expected) and see if there 
                 * is another transaction to start.
                 */
                trans->flags |= TRANS_FLAG_SENT;
                kal_trace(BT_TRACE_G2_PROFILES,HIDSTATEOPEN2_PKT_RETURNED_WITH_TRANS_TYPExD ,trans->type);
                switch (trans->type) {
                case HID_TRANS_CONTROL:
                case HID_TRANS_SET_REPORT_RSP:
                case HID_TRANS_SET_PROTOCOL_RSP:
                case HID_TRANS_SET_IDLE_RATE_RSP:
                case HID_TRANS_GET_REPORT_RSP:
                case HID_TRANS_GET_PROTOCOL_RSP:
                case HID_TRANS_GET_IDLE_RATE_RSP:
                //Add by stanley: 2007-0607
                case HID_HANDSHAKE:
                    kal_trace(BT_TRACE_G2_PROFILES,HIDCOMPLETETRANSACTION_WITH_TYPExD ,trans->type);
                    HidCompleteTransaction(Channel, trans, BT_STATUS_SUCCESS);
                    break;
                }
            }
        } 
        else 
        {

            /* Check for more data */
            if (Parms->ptrs.packet->dataLen >= mtu -1) 
          {
                /* More data to send, send another packet */
                //intr->flags &= ~INTR_FLAG_START;
	       if(!(intr->flags & INTR_FLAG_SENT))
	                if (HidSendIntrPacket(Channel, intr, Parms->ptrs.packet) 
	                                                        != BT_STATUS_PENDING) 
	                {
	                    /* Complete the interrupt with an error */
	                    intr->flags |= INTR_FLAG_ERROR;
	                    InsertTailList(&HID(packetPool), &Parms->ptrs.packet->node);
	                    /* Complete the interrupt with an error, check for a new
	                     * interrupt.
	                     */
	                    HidCompleteInterrupt(Channel, intr, BT_STATUS_FAILED);
	                }
            } 
            else 
            {
                /* No more data to send in this interrupt, complete this
                 * interrupt.
                 */
                 
                	intr->flags |= INTR_FLAG_SENT;
	    
                	HidCompleteInterrupt(Channel, intr, BT_STATUS_SUCCESS);
                
            }
        }
        break;
    case L2EVENT_DATA_IND:
        if (Cid == Channel->ctrlCid) 
        {
            //Assert(Channel !=0);
		if(Channel ==0){
			bt_prompt_trace(MOD_BT,"[HID]channel ==0");
			return;
			}
            /* A control channel request was received */
            HidControlChannel(Channel, Cid, Parms);
        } 
        else 
        {
            //Assert(Channel !=0);
		if(Channel ==0){
			bt_prompt_trace(MOD_BT,"[HID]channel ==0");
			return;
			}
            /* Application data was received */
            HidInterruptChannel(Channel, Cid, Parms);
        }
        break;
    default:
        /* Ignore any other events */
        kal_trace(BT_TRACE_G2_PROFILES,HID_SERVER_OPEN_STATE_RECEIVED_AN_UNEXPECTED_EVENT_x02X , Parms->event);
        break;
    }
}
예제 #30
0
/*---------------------------------------------------------------------------
 *            HidL2Callback()
 *---------------------------------------------------------------------------
 *
 * Synopsis:  L2CAP callback function for the Channel.
 *
 * Return:    void
 */
void HidL2Callback(L2capChannelId Cid, L2capCallbackParms *Parms)
{
    HidChannel *channel;

    channel = HidFindChannelByCid(Cid, Parms->aclLink);
    kal_trace(BT_TRACE_G2_PROFILES,HIDPARMSEVENTx02X ,Parms->event);
    kal_trace(BT_TRACE_G2_PROFILES,HID_CID_x02X ,Cid);
    kal_trace(BT_TRACE_G2_PROFILES,HID_CHANNELx08X , channel);
    switch (Parms->event) 
    {
    case L2EVENT_CONNECT_AUTORIZED:
        if (channel == NULL) 
        {
            U8 searchType;
            if (Parms->owner.psm == &HID(hidCtrlPsm))
                searchType = HID_FIND_CTRL_CID;
            else
                searchType = HID_FIND_INTR_CID;

            channel = HidFindUnusedChannel(searchType, Parms->aclLink);
            if (channel == NULL)
            {
                if (!HidCheckValidConnect(searchType, Cid, Parms->aclLink))
                {
                    Parms->aclLink->discFlag = TRUE;
                    L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0);
                    break;
                }

                //  Get a new channel 
                channel = HidNewChannel();
                if (channel == NULL) 
                {
                    kal_trace(BT_TRACE_G2_PROFILES,CHANNEL_IS_0_RETURN);
                    /* No channel available, reject the request */
                    Parms->aclLink->discFlag = TRUE;
                    L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0);
                    break;
                }
                channel->cmgrHandler.remDev = Parms->aclLink;
            }
        }
        if (channel->conCount == 0)
        {
            /* Only create ACL link for the first L2CAP connection */
            if (CMGR_CreateDataLink(&channel->cmgrHandler, 
                                    &Parms->aclLink->bdAddr) != BT_STATUS_SUCCESS) 
            {
                /* Could not create a link to the ACL */
                (void)L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0);
                break;
            }
        }

        if (Parms->owner.psm == &HID(hidCtrlPsm)) 
            channel->ctrlCid = Cid;
        else 
            channel->intrCid = Cid;
        /* Call the state machine */
        if (channel != 0) 
        {
            kal_trace(BT_TRACE_G2_PROFILES,HID_A_SMAx02XBx02X ,channel->state,Cid);
            HID(hidState)[channel->state](channel, Cid, Parms);
        }
        else
            kal_trace(BT_TRACE_G2_PROFILES,HIDCHANNEL_0);
        break;
    case L2EVENT_CONNECT_IND:
#ifdef HID_AUTHORIZATION
        //Assert(channel !=0);
	if(channel ==0){
		bt_prompt_trace(MOD_BT,"[HID]channel ==0");
		return;
		}
        L2CAP_ConnectRsp(Cid, L2CONN_ACCEPTED, 0);
#else
        if (channel == 0) 
        {
            /* Get a new channel */
            if (Parms->owner.psm == &HID(hidCtrlPsm)) 
                channel = HidFindUnusedChannel(HID_FIND_CTRL_CID, Parms->aclLink);
            else 
                channel = HidFindUnusedChannel(HID_FIND_INTR_CID, Parms->aclLink);
        }

        if (channel == 0) 
        {
            /* No channel available, reject the request */
            L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0);
            break;
        }
        //Assert(channel !=0);
	if(channel ==0){
		bt_prompt_trace(MOD_BT,"[HID]channel ==0");
		return;
		}
        if (CMGR_CreateDataLink(&channel->cmgrHandler, 
                                &Parms->aclLink->bdAddr) != BT_STATUS_SUCCESS) 
       {
            /* Could not create a link to the ACL */
            (void)L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0);
            break;
        }        /* Drop through */    
        //Assert(channel !=0);
	if(channel ==0){
		bt_prompt_trace(MOD_BT,"[HID]channel ==0");
		return;
		}
        if (Parms->owner.psm == &HID(hidCtrlPsm)) 
            channel->ctrlCid = Cid;
        else 
            channel->intrCid = Cid;

        /* Call the state machine */
        if (channel != 0) 
        {
            kal_trace(BT_TRACE_G2_PROFILES,HID_B_SMAx02XBx02X ,channel->state,Cid);
            HID(hidState)[channel->state](channel, Cid, Parms);
        }
        else
            kal_trace(BT_TRACE_G2_PROFILES,HIDCHANNEL_0);

#endif
        break;
    case L2EVENT_CONNECTED:
        /* Save the channel ID for the channel being requested */
        if (channel == 0)
        {
            L2CAP_DisconnectReq(Cid);
            break;
        }
        
        if (Parms->owner.psm == &HID(hidCtrlPsm)) 
            channel->ctrlCid = Cid;
        else 
            channel->intrCid = Cid;

        /* Call the state machine */
        if (channel != 0) 
        {
            kal_trace(BT_TRACE_G2_PROFILES,HID_C_SMAx02XBx02X ,channel->state,Cid);
            HID(hidState)[channel->state](channel, Cid, Parms);
        }
        else
            kal_trace(BT_TRACE_G2_PROFILES,HIDCHANNEL_0);
        break;
    case L2EVENT_DISCONNECTED:
        CMGR_HidNoRoleSwitch(0);           
        if (channel != 0) 
        {
            kal_trace(BT_TRACE_G2_PROFILES,HID_D_SMAx02XBx02X ,channel->state,Cid);
            HID(hidState)[channel->state](channel, Cid, Parms);
        }
        else
        {
            kal_trace(BT_TRACE_G2_PROFILES,UNUSED_CHANNEL_0_IGNORE_IT);
        }
        break;
    default:
        /* Call the state machine */
        if (channel != 0) 
        {
            kal_trace(BT_TRACE_G2_PROFILES,HID_E_SMAx02XBx02X ,channel->state,Cid);
            HID(hidState)[channel->state](channel, Cid, Parms);
        }
        else
            kal_trace(BT_TRACE_G2_PROFILES,HIDCHANNEL_0);
        break;
    }
}