📄 rmmi_bt.c
字号:
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 + -