中科蓝汛-------DUT模式详解

本文详细介绍了在嵌入式设备上实现六击按键功能的具体步骤,包括在config.h中定义宏,实现六击功能的结构体和函数,以及如何在bsp_key_process函数中调用。同时,文章还探讨了如何通过按键进入测试模式,以及在测试模式下LED状态的控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

step 1:

在config.h中,定义宏

#define DUT_MODE               0X7D7

 

step2:

六击功能实现

typedef struct {
    u8  counter;
    u8  strikes;
    u16 val;
} key_six_t;
key_six_t key_six_cb;


AT(.com_text.bsp.key)
u16 key_six_press_process(u16 key_val)
{
    key_six_t *s = &key_six_cb;

    if (s->counter) {
        s->counter--;
    }
    if (!s->counter) {
        s->strikes = 0;
        s->val = NO_KEY;
    }

    if (check_key_return(key_val)) {
        s->strikes++;
        if ((key_val == s->val) && (s->strikes == 6)) {
            //检测到6击按键
            printf("666666666666666666666666666666666\n");
            //msg_enqueue(DUT_MODE | (key_val & 0xff));
			msg_enqueue(DUT_MODE);
        } else {
            if (key_val != s->val) {
                s->strikes = 1;
                s->val = key_val;
            }
            s->counter = 120;               //按键松开超时600ms
        }
    }
    return key_val;
}

,并在bsp_key_process函数中,调用

step 3 :

在bsp_sys.h中, sys_cb_t结构体中,新建成员变量

	u8  User_cbt_test_en;  //测试模式

在config.h中,新建宏 #define USER_ENTER_CBT_EN_DATA 0xa8

#define USER_ENTER_CBT_EN_DATA    0xa8

在func_bt中,func_bt_enter函数中,添加如下代码

#if !BT_BACKSTAGE_EN
    //bsp_bt_init();
	if(USER_ENTER_CBT_EN_DATA==sys_cb.User_cbt_test_en)
			{
				printf(" CBT test  mode OK...	%x\n",sys_cb.User_cbt_test_en);//
				bt_cfg.cbt_test_mode = 1;
			//	bt_cfg.fcc_test_mode = 1;
				printf(" f_bt.disp_status =    %x\n",f_bt.disp_status);
				led_set_sta(0xff,0,4, 0xff);
			//	sys_cb.User_cbt_test_en = 0;
			}
			else
			{
				printf(" sys_cb.User_cbt_test_en != 0xa8   %x\n",sys_cb.User_cbt_test_en);
				bt_cfg.cbt_test_mode = 0;
			//	bt_cfg.fcc_test_mode = 0;
				sys_cb.User_cbt_test_en= 0;
			}

    dis_auto_pwroff();

step 4:

在msg_bt.c中 新增case

	case DUT_MODE:
		   printf("DUT_MODE\n");
		   sys_cb.User_cbt_test_en = USER_ENTER_CBT_EN_DATA;//	0xa8  则重启 BT mode  进入 测试模式
	//	   sys_cb.Test_mode_kth_cnt = 0;
		   bt_nor_delete_link_info();
		   func_cb.sta = FUNC_NULL;
		   break;

此时运行6击进入DUT,发现在此处设置led_set_sta(0xff,0,4, 0xff);后,按键无效

经发现,需要在#if !BT_BACKSTAGE_EN 新增一句bsp_bt_init();

调试后,红灯常亮在此处设置无效,6击之后直接进入勒配对模式,并没有运行led_set_sta(0xff,0,4, 0xff);

解决办法:

在func_bt.c 中,在func_bt_disp_status函数中,判断当前状态是否是test mode

if(1==bt_cfg.cbt_test_mode)
		{
	       rled_on();  //红灯常亮
		   //led_on();
		   led_off();//蓝灯灭
		   return;
		}

 

中科主要提供牙音频解决方案,其安卓演示程序或示例代码通常用于展示其芯片在牙连接、音频传输、EQ调试等方面的功能。虽然目前提供的引用资料中没有直接提及完整的安卓演示程序或示例代码的具体结构和内容,但可以基于中科的常见应用场景和技术文档,推测其安卓示例代码可能包含以下关键模块和功能。 ### 1. 牙连接与配对示例 中科的安卓演示程序通常包括牙设备的扫描、连接、配对以及断开连接的功能。示例代码中会包含使用 Android Bluetooth API 的实现,如下所示: ```java BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); BluetoothDevice device = bluetoothAdapter.getRemoteDevice("00:11:22:AA:BB:CC"); BluetoothGatt gatt = device.connectGatt(context, false, new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { if (newState == BluetoothProfile.STATE_CONNECTED) { Log.i("TAG", "Connected to GATT server."); gatt.discoverServices(); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { Log.i("TAG", "Disconnected from GATT server."); } } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { Log.i("TAG", "Services discovered."); // 可以在此处查找特定服务和特征值 } } }); ``` ### 2. SPP通信示例 中科芯片支持通过牙串口协议(SPP)进行数据通信。在安卓示例中,可能会使用 `BluetoothSocket` 实现与设备的串口通信,如下: ```java BluetoothDevice device = bluetoothAdapter.getRemoteDevice("00:11:22:AA:BB:CC"); BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString("0000110A-0000-1000-8000-00805F9B34FB")); socket.connect(); OutputStream outputStream = socket.getOutputStream(); InputStream inputStream = socket.getInputStream(); outputStream.write("Hello BlueXun!".getBytes()); ``` ### 3. EQ调试接口示例 中科支持通过牙串口(SPP)或特定引脚进行EQ调试[^4]。在安卓端,示例代码可能包含通过串口发送EQ参数配置命令的功能,如下: ```java public void sendEQCommand(int band, int gain) { String command = String.format("EQ %d %d", band, gain); try { outputStream.write(command.getBytes()); } catch (IOException e) { e.printStackTrace(); } } ``` ### 4. 日志与调试输出 根据中科的中断处理规则,安卓端的调试信息通常通过串口或牙日志接口输出[^2]。开发者可能在示例代码中集成日志接收功能,用于调试设备状态和性能。 ### 5. 硬件控制接口 中科芯片的GPIO和中断配置通常在嵌入式端完成[^1],但在安卓端可能提供相应的控制接口,例如通过牙发送控制指令来操作GPIO状态: ```java public void toggleGPIO(int pin, boolean high) { String command = String.format("GPIO %d %s", pin, high ? "HIGH" : "LOW"); try { outputStream.write(command.getBytes()); } catch (IOException e) { e.printStackTrace(); } } ``` --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值