2025-02-18 15:40:42 +08:00

247 lines
5.2 KiB
C

#include "typedef.h"
#include "app_config.h"
#include "task.h"
#include "btctrler_task.h"
#include "btcontroller_config.h"
#include "system/includes.h"
#define LOG_TAG "[BT_DUT]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
//bredr test api
extern void ble_enter_dut_tx_mode(void *param);
extern void bt_ble_adv_enable(u8 enable);
extern void bredr_fcc_init(u8 mode, u8 fre);
#if 0
static void bt_dut_api(void)
{
log_info("bt in dut \n");
#if TCFG_AUTO_SHUT_DOWN_TIME
extern void sys_auto_shut_down_disable(void);
sys_auto_shut_down_disable();
#endif
#if TCFG_USER_TWS_ENABLE
extern void tws_cancle_all_noconn();
tws_cancle_all_noconn() ;
#else
//sys_timer_del(app_var.auto_stop_page_scan_timer);
extern void bredr_close_all_scan();
bredr_close_all_scan();
#endif
#if TCFG_USER_BLE_ENABLE
#if (CONFIG_BT_MODE == BT_NORMAL)
bt_ble_adv_enable(0);
#endif
#endif
}
void bit_clr_ie(unsigned char index);
/* !!!Notice:when this api is called and sleep mode should be sure to exit; */
void bt_fix_fre_api(u8 fre)
{
bt_dut_api();
bit_clr_ie(IRQ_BREDR_IDX);
bit_clr_ie(IRQ_BT_CLKN_IDX);
bredr_fcc_init(BT_FRE, fre);
}
#endif
//ble test api
enum BLE_DUT_PAYLOAD_TYPE {
PAYLOAD_TYPE_PRBS9 = 0,
PAYLOAD_TYPE_11110000,
PAYLOAD_TYPE_10101010,
PAYLOAD_TYPE_PRBS15,
PAYLOAD_TYPE_11111111,
PAYLOAD_TYPE_00000000,
PAYLOAD_TYPE_00001111,
PAYLOAD_TYPE_01010101,
PAYLOAD_TYPE_SINGLE_CARRIER = 0xf0,
};
enum BLE_DUT_PHY_TYPE {
BLE_1M_UNCODED_PHY = 1,
BLE_2M_UNCODED_PHY,
BLE_1M_CODED_PHY_S8,
BLE_1M_CODED_PHY_S2,
};
struct ble_dut_param_set {
u8 ch_index; //tx ch index;(0~39 -> 2402~2480)
u8 payload_type; //tx payload type
u8 payload_len; //payload_len(0~0xff) when continuous_tx = 0;
u8 continuous_tx; //enable or disable continuous transmission mode(0/1)
};
/* !!!Notice:when this api is called and sleep mode should be sure to exit; */
void ble_fix_fre_api()
{
#if TCFG_USER_BLE_ENABLE
#if (CONFIG_BT_MODE == BT_NORMAL)
bt_ble_adv_enable(0);
#endif
os_time_dly(10);
struct ble_dut_param_set dut_param = {
.ch_index = 0,
.payload_type = PAYLOAD_TYPE_10101010,
.payload_len = 0x20,
.continuous_tx = 1,
};
ble_enter_dut_tx_mode(&dut_param);
#endif
}
static void *ble_dut_hdl = NULL;
extern void ll_hci_destory(void);
void ble_dut_mode_init(void)
{
if (!ble_dut_hdl) {
ll_hci_destory();
ble_dut_hdl = __ble_dut_ops->init();
}
}
void ble_dut_mode_exit(void)
{
if (ble_dut_hdl) {
__ble_dut_ops->exit(ble_dut_hdl);
ble_dut_hdl = NULL;
}
}
void ble_dut_tx_fre_api(u8 ch)
{
ble_dut_mode_init();
struct ble_dut_tx_param_t tx_param = {
.ch_index = ch,
.payload_len = 0x20,
.payload_type = PAYLOAD_TYPE_PRBS9,
.phy_type = BLE_1M_UNCODED_PHY,
};
log_info("BLE_DUT_TX-ch:%x\n", ch);
__ble_dut_ops->ioctrl(BLE_DUT_SET_TX_MODE, &tx_param);
}
void ble_dut_rx_fre_api(u8 ch)
{
ble_dut_mode_init();
struct ble_dut_rx_param_t rx_param = {
.ch_index = ch,
.phy_type = BLE_1M_UNCODED_PHY,
};
log_info("BLE_DUT_RX-ch:%x \n", ch);
__ble_dut_ops->ioctrl(BLE_DUT_SET_RX_MODE, &rx_param);
}
int ble_dut_test_end(void)
{
int pkt_valid_cnt = 0;
int pkt_err_cnt = 0;
if (ble_dut_hdl) {
__ble_dut_ops->ioctrl(BLE_DUT_SET_TEST_END, &pkt_valid_cnt, NULL);
log_info("pkt_rx_cnt:%d pkt_err_cnt:%d\n", pkt_valid_cnt, pkt_err_cnt);
} else {
log_error("ble dut hdl not inited\n");
}
return pkt_valid_cnt;
}
static volatile u8 bt_test_status = 0;
void ble_bqb_test_thread_init(void);
static hci_transport_config_uart_t config = {
HCI_TRANSPORT_CONFIG_UART,
115200,
0, // main baudrate
0, // flow control
NULL,
};
extern void dut_hci_controller_init(const hci_transport_t *transport, const void *config);
void ble_standard_dut_test_init(void)
{
log_info("%s\n", __FUNCTION__);
bt_test_status = 1;
ble_dut_mode_init();
//ble_bqb_test_thread_init();
dut_hci_controller_init((void *)hci_transport_uart_instance(), &config);
}
void ble_standard_dut_test_close(void)
{
log_info("%s\n", __FUNCTION__);
ble_dut_test_end();
ble_dut_mode_exit();
hci_transport_t *p_uart_trans = hci_transport_uart_instance();
p_uart_trans->close();
bt_test_status = 0;
}
void ble_dut_mode_key_handle(u8 type, u8 key_val)
{
static u8 rx_ch = 0;
static u8 tx_ch = 0;
switch (key_val) {
case 3:
ble_dut_tx_fre_api(tx_ch++);
if (tx_ch > 39) {
tx_ch = 0;
}
break;
case 1:
ble_dut_rx_fre_api(rx_ch++);
if (rx_ch > 39) {
rx_ch = 0;
}
break;
case 2:
ble_dut_test_end();
break;
case 0:
ble_standard_dut_test_init();
break;
case 4:
ble_standard_dut_test_close();
break;
defualt:
break;
}
}
static u8 bt_test_idle_query(void)
{
return !bt_test_status;
}
REGISTER_LP_TARGET(bt_test_lp_target) = {
.name = "bt_test",
.is_idle = bt_test_idle_query,
};