⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rmmi_bt.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        case RMMI_BT_FORCE_SCAN_WAIT:
		 	l4c_bt_clear_guard_timer();
			RMMI_BT_STATE_CHANGE(RMMI_BT_SCAN);
			l4c_bt_force_scan_lrsp(1,0);
        	break;
        	
/* ======================================================================= */			
/* Factory Test */
/* ======================================================================= */			

		case RMMI_BT_TEST_RESET:
			RMMI_PTR->BT_action = RMMI_BT_TEST_CDIS;
			rmmi_bt_send_btcmd( (kal_uint8*)"AT+CDIS=0" );
			l4c_bt_start_guard_timer(); //start guard timer in case no reponse from BT chip
			return;

		case RMMI_BT_TEST_CDIS:
			RMMI_PTR->BT_action = RMMI_BT_TEST_CEDUT;
			rmmi_bt_send_btcmd((kal_uint8*)"AT+CEDUT");	
			l4c_bt_start_guard_timer(); //start guard timer in case no reponse from BT chip
			return;
			
		case RMMI_BT_TEST_CEDUT:
			RMMI_PTR->BT_action = RMMI_BT_TEST_MODE;
			l4c_bt_enter_testmode_rsp(RMMI_PTR->BT_ctrl_src, KAL_TRUE);
			l4c_bt_clear_guard_timer(); //clear guard timer 
			break;

#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif			
/* ======================================================================= */	

		default:
			break;
	}
}

/*****************************************************************************
* FUNCTION
*  rmmi_bt_ccfg_hdlr
*
* DESCRIPTION
*   This is the handler when receiving "+CCFG" from BT chip,
*   "+CCFG" will be received after BT chip power on.
*   AT will need to continue the power-on/test mode process.
*	
* PARAMETERS
*
* RETURNS
*
* GLOBALS AFFECTED
*  none.
*****************************************************************************/
void rmmi_bt_ccfg_hdlr (rmmi_string_struct *source_string_ptr)
{
	kal_uint8	buffer[50];
	kal_uint8 bd_addr[3][10];

    kal_trace(TRACE_GROUP_3, RMMI_BT_ACTION, RMMI_PTR->BT_action);

	if (RMMI_PTR->BT_action == RMMI_BT_TEST_PWRON) ////test mode
	{
		/* This is test mode case : either by +EMBT=1 or MMI engineer mode */
 		kal_sprintf((char*)buffer, "AT+SETPS=028d,001f,0008");
		rmmi_bt_send_btcmd(buffer);	
		RMMI_PTR->BT_action = RMMI_BT_TEST_SETPROF;
		l4c_bt_start_guard_timer(); //start guard timer in case no reponse from BT chip
	}
	else if (RMMI_PTR->BT_action == RMMI_BT_PWRON)
	{

		/* Refer to CSR Known Issues and Solution Memo, AT+CWUP should not sent during power on config */
		rmmi_wakeup_flag = KAL_TRUE;

		/* this is for normal case: MMI enable Bluetooth */
		print_as_hex(&RMMI_PTR->BT_addr[0], bd_addr[0], 3);
		print_as_hex(&RMMI_PTR->BT_addr[3], bd_addr[1], 1);
		print_as_hex(&RMMI_PTR->BT_addr[4], bd_addr[2], 2);
		kal_sprintf((char*)buffer, "AT+SETPS=0001,00%s00%s%s,0008", bd_addr[0], bd_addr[1], bd_addr[2]);
#ifdef __BT_DEBUG__
		kal_print( (kal_char*)buffer );
#endif
		rmmi_bt_send_btcmd(buffer);	
		RMMI_PTR->BT_action = RMMI_BT_PWRON_SETADDR;
		l4c_bt_start_guard_timer(); //start guard timer in case no reponse from BT chip
	}
	else
	{
		/* BT chip auto reset by itself!!!!! */

#ifdef __BT_DEBUG__
		//BT_DEBUG: close the log file
		l4c_bt_close_log_file(1);
#endif

		l4c_bt_panic_lind();
		if (RMMI_PTR->BT_as_serial_port == KAL_TRUE)
		{
			RMMI_PTR->BT_as_serial_port = KAL_FALSE;
			UART_ClrRxBuffer (PS_UART_PORT, MOD_L4C);
	   		UART_ClrRxBuffer (L4C_PTR->uart_port_value, MOD_L4C);
			RMMI_PTR->BT_as_serial_port = KAL_FALSE;
			PS_UART_PORT = L4C_PTR->uart_port_value; /* set uart back to uart1/uart2*/
		}
		if (RMMI_PTR->BT_string != NULL)
		{
			free_ctrl_buffer(RMMI_PTR->BT_string);
			RMMI_PTR->BT_string = NULL;
		}
		RMMI_PTR->BT_action = RMMI_BT_IDLE;
	}


}

/*****************************************************************************
* FUNCTION
*  rmmi_bt_crreg_hdlr
*
* DESCRIPTION
*   This is the handler when receiving "+CCREG" from BT chip,
*   "+CCREG" indicate that the BT power on is finished,
*   and sends REG_DEV_IND to MMI.
*   If it is for test mode, AT need to continue the test mode process.	
* PARAMETERS
*
* RETURNS
*
* GLOBALS AFFECTED
*  none.
*****************************************************************************/
void rmmi_bt_crreg_hdlr (rmmi_string_struct *source_string_ptr)
{
	if (RMMI_PTR->BT_action == RMMI_BT_TEST_RESET)
	{
		/* This is test mode case : either by +EMBT=1 or MMI engineer mode */
		rmmi_bt_send_btcmd((kal_uint8*)"AT+CDIS=0");	
		RMMI_PTR->BT_action = RMMI_BT_TEST_CDIS;
		l4c_bt_start_guard_timer(); //start guard timer in case no reponse from BT chip
	}
	else if (RMMI_PTR->BT_action == RMMI_BT_PWRON_RESET)
	{
		kal_uint8	buffer[30+RMMI_BT_MAX_FNAME_LEN];
	

		//MCU sleep mode is dsiable in bt pwr on req
		//shall enable sleep mode while BT chip warm reset
		//after warm reset, bt will send wake-up signal to ensure host is ready to receive data(EINT3---disable sleep mode)
		//L1SM_SleepEnable(rmmi_aux_PDNhandle);
		L1SM_SleepEnable(rmmi_bt_l1sm_handle);

		/* this is for normal case: MMI enable Bluetooth */
		l4c_bt_clear_guard_timer(); //clear guard timer 

		/* Refer to CSR Known Issues and Solution Memo B5994 */
		/* Friendly name should be config after warn reset */
		l4c_bt_poweron_status_lind(7);

		ASSERT(strlen((kal_char*)RMMI_PTR->BT_name) < RMMI_BT_MAX_FNAME_LEN);

		kal_sprintf((char*)buffer, "AT+SETPS=0108,s%s,0008", RMMI_PTR->BT_name);
#ifdef __BT_DEBUG__
 			kal_print( (kal_char*)buffer );
#endif
		rmmi_bt_send_btcmd(buffer);	
		RMMI_BT_STATE_CHANGE(RMMI_BT_PWRON_SETNAME);
		l4c_bt_start_guard_timer(); //start guard timer in case no reponse from BT chip
		return;

		/*
		l4c_bt_poweron_status_lind(7);
		l4c_bt_pwron_lrsp(KAL_TRUE);
		l4c_bt_reg_dev_lind();
		RMMI_PTR->BT_action = RMMI_BT_IDLE;
		*/
	}
}

/*****************************************************************************
* FUNCTION
*  rmmi_bt_cinqres_hdlr
*
* DESCRIPTION
*   This is the handler when receiving "+CINQRES" from BT chip,
*   parse the command ans send indication to MMI
* PARAMETERS
*
* RETURNS
*
* GLOBALS AFFECTED
*  none.
*****************************************************************************/
void rmmi_bt_cinqres_hdlr (rmmi_string_struct *source_string_ptr)
{
	kal_uint8 index;
	kal_uint8 name[40];
	kal_uint8 addr[6];
	kal_bool	ret_val;

	kal_uint8 cod[3];	//class of device
	kal_uint8 major_class;
	kal_uint8 minor_class;
	kal_uint8 type;

	kal_trace(TRACE_GROUP_3, RMMI_BT_INQRES );
	RMMI_BT_LOG_STATE();

		l4c_bt_start_guard_timer();
		
	ret_val = rmmi_bt_str_validator(source_string_ptr, RMMI_COMMA, 40, name, KAL_FALSE);
	if (ret_val == KAL_FALSE)
		kal_mem_set(name, 0, 40);

	ret_val = rmmi_bt_hex_validator(source_string_ptr, RMMI_COMMA, 6, addr);
	if (ret_val == KAL_FALSE)
		kal_mem_set(addr, 0, 6);
 	 
	ret_val = rmmi_bt_hex_validator(source_string_ptr, RMMI_PTR->s_reg.s3, 3, cod);
	if (ret_val == KAL_FALSE)
		kal_mem_set(cod, 0, 3);

	major_class = cod[1] & 0x1f;
	minor_class = (cod[2] & 0xff) >> 2;

	switch (major_class)
	{
		case 0x01: //computer
			if (minor_class == 1)
				type = RMMI_BT_DEV_COMPUTER_DESKTOP;
			else if (minor_class == 2)
				type = RMMI_BT_DEV_COMPUTER_SERVER;
			else if (minor_class == 3)
				type = RMMI_BT_DEV_COMPUTER_LAPTOP;
			else if (minor_class == 4)
				type = RMMI_BT_DEV_COMPUTER_HANDHELD;
			else if (minor_class == 5)
				type = RMMI_BT_DEV_COMPUTER_PALM;
			else
				type = RMMI_BT_DEV_COMPUTER_UNCLASSIFIED;			
		break;
		case 0x02: //phone
			if (minor_class == 1)
				type = RMMI_BT_DEV_PHONE_CELLULAR;
			else if (minor_class == 2)
				type = RMMI_BT_DEV_PHONE_CORDLESS;
			else if (minor_class == 3)
				type = RMMI_BT_DEV_PHONE_SMARTPHONE;
			else if (minor_class == 4)
				type = RMMI_BT_DEV_PHONE_WIRED_MODAM;
			else
				type = RMMI_BT_DEV_PHONE_UNCLASSIFIED;	
		break;
		case 0x04: //audio
			if (minor_class == 1)
				type = RMMI_BT_DEV_AUDIO_HEADSET;
			else
				type = RMMI_BT_DEV_AUDIO_UNCLASSIFIED;	
		break;
		default:
			type = RMMI_BT_DEV_OTHERS;			
	}
	
	l4c_bt_inq_lind(BT_INQ_NOT_FINISH, NULL, name, addr, type);
	
}

/*****************************************************************************
* FUNCTION
*  rmmi_bt_cinqcfm_hdlr
*
* DESCRIPTION
*   This is the handler when receiving "+CINQCFM" from BT chip,
*   parse the command ans send indication to MMI
* PARAMETERS
*
* RETURNS
*
* GLOBALS AFFECTED
*  none.
*****************************************************************************/
void rmmi_bt_cinqcfm_hdlr (rmmi_string_struct *source_string_ptr)
{
	kal_uint8 status;

	status = (kal_uint8)rmmi_int_validator(source_string_ptr, RMMI_PTR->s_reg.s3);

	kal_trace(TRACE_GROUP_3, RMMI_BT_INQCFM, status );
	RMMI_BT_LOG_STATE();

	if( RMMI_PTR->BT_action == RMMI_BT_INQ_RES )
	{
		l4c_bt_clear_guard_timer();
		RMMI_BT_STATE_CHANGE( RMMI_BT_IDLE );
	}
	else if( RMMI_PTR->BT_action == RMMI_CANCELOP_WAIT )
	{
		l4c_bt_clear_guard_timer();

		RMMI_BT_STATE_CHANGE( RMMI_BT_IDLE );
		if( RMMI_PTR->BT_rmmi_rsp_flag == KAL_TRUE )
		{	
			RMMI_PTR->BT_rmmi_rsp_flag = KAL_FALSE;
			l4c_bt_cancel_op_lrsp();
		}
	}

	l4c_bt_inq_lind(status, NULL, NULL, NULL, NULL);

}


void rmmi_bt_cpinreq_hdlr (rmmi_string_struct *source_string_ptr)
{
	kal_uint8 addr[6];
	kal_bool	ret_val;

	kal_trace(TRACE_GROUP_3, RMMI_BT_PINREQDEV );
	RMMI_BT_LOG_STATE();

	l4c_bt_clear_guard_timer();
	ret_val = rmmi_bt_hex_validator(source_string_ptr, RMMI_COMMA, 6, addr);
	if (ret_val == KAL_FALSE)
		kal_mem_set(addr, 0, 6);

	if( RMMI_PTR->BT_action == RMMI_BT_PAIR_WAIT )
	{
		l4c_bt_pair_lrsp(KAL_TRUE, NULL);
	}

	l4c_bt_pin_req_lind(NULL, addr);	

	//RMMI_BT_STATE_CHANGE( RMMI_BT_PIN_REQ_WAIT );
}

void rmmi_bt_clink_hdlr (rmmi_string_struct *source_string_ptr)
{
	kal_uint8 addr[6];
	kal_uint8 link_key[16];
	kal_bool	ret_val;

	kal_trace(TRACE_GROUP_3, RMMI_BT_LINKEY );
	RMMI_BT_LOG_STATE();

	if( RMMI_PTR->BT_action != RMMI_CANCELOP_WAIT )
	{
		ret_val = rmmi_bt_hex_validator(source_string_ptr, RMMI_COMMA, 6, addr);
		ASSERT ( ret_val == KAL_TRUE);

		ret_val = rmmi_bt_hex_validator(source_string_ptr, RMMI_PTR->s_reg.s3, 16, link_key);
		ASSERT ( ret_val == KAL_TRUE);

		l4c_bt_linkkey_lind(BT_PAIR_COMPLETE, addr, link_key, NULL);
		l4c_bt_pair_lrsp(KAL_TRUE, 0);
	}

	/* state change after received +CPINCFM */
	//RMMI_BT_STATE_CHANGE( RMMI_BT_IDLE );
}

void rmmi_bt_cpincfm_hdlr (rmmi_string_struct *source_string_ptr)
{
	kal_uint8 status;
	kal_bool	ret_val;
	kal_uint8 addr[6];

	ret_val = rmmi_bt_hex_validator(source_string_ptr, RMMI_COMMA, 6, addr);
	ASSERT ( ret_val == KAL_TRUE);
    status = (kal_uint8)rmmi_int_validator(source_string_ptr, RMMI_PTR->s_reg.s3);

	kal_trace(TRACE_GROUP_3, RMMI_BT_PINCNF, status );
	RMMI_BT_LOG_STATE();

	if( RMMI_PTR->BT_action != RMMI_CANCELOP_WAIT )
	{
	    if (status != BT_PAIR_COMPLETE)//complete already sent linkkey_lind when receiving +CLINK
	    {
	    	l4c_bt_linkkey_lind(status, addr, NULL, NULL);
			l4c_bt_pair_lrsp(KAL_FALSE, status);
	    }
	    else
	    	l4c_bt_pair_lrsp(KAL_TRUE, status);

	 	RMMI_BT_STATE_CHANGE( RMMI_BT_IDLE );
	}

    return;
}

void rmmi_bt_crfcstat_hdlr (rmmi_string_struct *source_string_ptr)
{
	kal_uint32 handle;
	kal_uint8 status;
	kal_uint8 addr[6];
	kal_uint8 zero_addr[6];
	kal_bool ret_val;

	kal_mem_set(zero_addr, 0, 6);
		
	ret_val = rmmi_bt_hex_validator(source_string_ptr, RMMI_COMMA, 6, addr);
	if (ret_val == KAL_FALSE)
		kal_mem_set(addr, 0, 6);
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif

	//handle = (kal_uint32)rmmi_int_validator(source_string_ptr, RMMI_COMMA);
	status = (kal_uint8)rmmi_int_validator(source_string_ptr, RMMI_PTR->s_reg.s3);

	kal_trace(TRACE_GROUP_3, RMMI_BT_RFCSTAT, status );
	RMMI_BT_LOG_STATE();


	if ((status != BT_RFC_CONN_COMPLETE) /* && (status != BT_RFC_CONN_CANCEL)*/ )
	{
		if( RMMI_PTR->BT_as_serial_port == KAL_TRUE )
		{
		UART_ClrRxBuffer (PS_UART_PORT, MOD_L4C);
   		UART_ClrRxBuffer (L4C_PTR->uart_port_value, MOD_L4C);
		RMMI_PTR->BT_as_serial_port = KAL_FALSE;
		PS_UART_PORT = L4C_PTR->uart_port_value; /* set uart back to uart1/uart2*/

		//default : pull DisGpio low (we might have pulled it high when MMI request disconnect.
		GPIO_WriteIO(0, BT_GetDscGpio());
		rmmi_bt_poll_data_select_stop_timer();
	}
	}

	if(  RMMI_PTR->BT_action == RMMI_BT_IDLE 
		|| RMMI_PTR->BT_action == RMMI_BT_SCAN 
		|| RMMI_PTR->BT_action == RMMI_BT_PAGE_WAIT 
		|| RMMI_PTR->BT_action == RMMI_BT_CONNECTED 
		|| RMMI_PTR->BT_action == RMMI_BT_SET_PIN_WAIT 
		|| RMMI_PTR->BT_action == RMMI_BT_DISCON_WAIT )
	{
		if( status == BT_RFC_CONN_COMPLETE )
		{
			RMMI_BT_STATE_CHANGE( RMMI_BT_CONNECTED );
		}
		else if( RMMI_PTR->BT_action != RMMI_BT_SCAN )
		{
			RMMI_BT_STATE_CHANGE( RMMI_BT_IDLE );
		}
		//l4c_bt_rf_conn_lind(NULL, addr, status);
	}
	else if( RMMI_PTR->BT_action >= RMMI_BT_FORCE_IDLE 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -