BES2300Z USB mode 讲解

2023-11-11

hello,在BES的蓝牙中有一些芯片是支持USB mode;在使用的过程中,在BT mode 和 USB mode 中只能有一种模式存在。

排版会有点乱,请谅解。

下面来讲解下BES2300Z 在USB mode 下打开的方法、遇到的一些问题等

 

首先在打开USB mode时需要将USB的宏打开 target.mk,如下图:

切换USB 和 BT模式是调用 void btusb_switch(enum BTUSB_MODE mode) 进行的。

修改USB设备名,如下图: (usb_dev_desc.c)

 

修改之后的显示如下图:

 

如果还是显示之前的设备名没有切换过来,需要将电脑上的设备卸载之后才会显示当前的,如下图两个红色框中USB设备驱动卸载掉:(之前的图没有了,手上也没有机器)

 

设置USB mode 按键功能,如下图:

 

USB mode 按键功能函数入口,如下图:

 

通过查看代码可以看出在将BT_USB_AUDIO_DUAL_MODE宏打开之后,在监测到plugin的时候就会将模式切换到USB模式,如下图:

     为什么会在这两个地方都有出现切换USB模式的函数呢?(以下是我自己的理解)

    答:因为在耳机检测到plugin的时候有时会进入int app_battery_handle_process_normal(uint32_t status,  union APP_BATTERY_MSG_PRAMS prams) 函数中,并没有进入int app_battery_handle_process_charging(uint32_t status,  union APP_BATTERY_MSG_PRAMS prams)函数中。所以原始代码就会在两个函数中都加上了切换USB 模式的函数。

 

当然在出盒也就是plugout的时候就需要将模式切换成BT模式,如下图:

      当然在切换模式的时候有时会出现重复切换同一种模式的情况,我们就会去想在重复切换的时候会不会导致程序出现错误等。这种情况我们不需要去考虑这些了,因为切换函数中有做这样的处理。

所以在plugin 中有两个地方调用 btusb_switch(BTUSB_MODE_USB) 就不需要担心。重复调用处理如下:

 

判断plugin接触供电的是充电器还是PC端,这个对于我们来说是个非常需要的功能。

往往一些客户会有这样的要求:

1、在与电脑连接的时候需要将设备切换到USB模式、

2、与充电器(适配器)连接的时候需要进入充电或者与手机连接不断开正常使用等。

所以在做这一功能的时候就需要我们想判断好当前连接的是什么状态再做完整的切换就会用到下面的接口函数。

(PS:在进行判断plugin连接的是什么设备时需要先将模式切换到USB模式,不切换到USB模式下面的接口函数是不会运行的。)

接口如下:

 上面的是原厂给出来的,下面是我自己在打印log时候找出来的。如下图:

以上两种判断是不是 PC端的接口函数,看个人喜好去判断了。

 

下面来说下上面说客户的两种要求:

模式1、在与电脑连接的时候需要将设备切换到USB模式、

    这个模式是最好满足的,默认代码就是这样的模式。虽然piugin之后就切换到了USB模式也与手机断开了,只要D+、D-没有数据传输就是充电模式了接口函数返回的就是false了,当然啦 btusb_mode也就变为了BTUSB_MODE_USB模式了。对于这个模式的实现不需要过多的对代码进行修改。

模式2、与充电器(适配器)连接的时候需要进入充电或者与手机连接不断开正常使用

    思路步骤:

       1、首先在plugin之后就需要将模式切换到USB模式

        2、在切换到USB模式时注意不要将BT模式下的音频通道给关闭了,因为关闭了会导致BT模式下播放的音乐会暂停

        3.1、判断是PC端的时候再将BT模式的音频通道关闭、重启设备进入USB模式

        3.2、判断否 将USB模式关闭掉、然后将模式切换为BT。防止在plugout时调用 btusb_switch(BTUSB_MODE_BT); 时出现问题

    

代码如下,仅供参考,具体还需要自己根据自己想要的模式去调试


void app_USBmode_handle(void const *param);
#define APP_USB_TIMER_MS  1000 
osTimerDef (APP_USBMODE_PHONE, app_USBmode_handle); 
static osTimerId app_USBmode_ui = NULL; 

void app_USBmode_handle(void const *param)
{
    // 判断是否连接PC端
    if (hal_usb_configured() == 1) 
    //if (usb_check_pin_flag == true)
    {
        // 关闭BT模式的音频
        btusb_btaudio_close(true);
#ifdef power_off_charger
        // 这是写参数到flash中,以便下次重启通过进行判断使用。
		app_user_plug_in_reset_status_set(1);
#endif
        system_reboot();
		return;
    }
    else {
        //btusb_switch(BTUSB_MODE_BT);
        // 关闭USB模式
        app_usbaudio_mode_off();
        // 将模式的标志位设置为BT模式,防止在plugout的时候调用函数切换到BT模式下导致程序出现死机或者错误情况
        btusb_mode = BTUSB_MODE_BT;
		osDelay(500);
#ifdef power_off_charger
        // 与上面的一样,写标志位到flash中
		app_user_plug_in_reset_status_set(0);
#endif
        // 重新初始化按键。因为在进入USB模式的时候会重新对按键进行初始化的。所以我们在判断是与充电适配器连接的时候就需要将按键的切换为BT模式下的按键功能。也可以使用USB模式下的按键功能,那样就需要去处理了
        app_key_open(true);
        app_key_init();       
    }
    // 关闭软件定时器
    osTimerStop(app_USBmode_ui);
}

// 原始SDK里面的函数  app_battery.cpp文件中
int app_battery_handle_process_charging(uint32_t status,  union APP_BATTERY_MSG_PRAMS prams)
{
    ...
        case APP_BATTERY_STATUS_CHARGING:
            TRACE(1,"CHARGING:%d", prams.charger);
            if (prams.charger == APP_BATTERY_CHARGER_PLUGOUT)
            {
#ifdef BT_USB_AUDIO_DUAL_MODE
                TRACE(1,"%s:PlUGOUT.", __func__);
                btusb_switch(BTUSB_MODE_BT);
#else
#if CHARGER_PLUGINOUT_RESET
                TRACE(0,"CHARGING-->RESET");
                osTimerStop(app_battery_timer);
                app_shutdown();
#else
                app_battery_measure.status = APP_BATTERY_STATUS_NORMAL;
#endif
#endif
            }
            else if (prams.charger == APP_BATTERY_CHARGER_PLUGIN)
            {
#ifdef BT_USB_AUDIO_DUAL_MODE
                TRACE(1,"%s:PLUGIN.", __func__);
                app_status_indication_set(APP_STATUS_INDICATION_CHARGING);
                btusb_switch(BTUSB_MODE_USB);
            // 在切换到USB模式的时候进行一个定时器去判断plugin连接的是PC端还是充电适配器
#ifdef user_define_charger
            {
            if (app_USBmode_ui == NULL) {
                app_USBmode_ui = osTimerCreate(osTimer(APP_USBMODE_PHONE), osTimerPeriodic, NULL);
            }
            osTimerStop(app_USBmode_ui);
            osTimerStart(app_USBmode_ui, 2000);
            }
#endif
#endif
            }
            break;
    ...

}



//  下面的函数是在 btusb_audio.c 中

extern bool usb_check_pin_flag;
void btusb_switch(enum BTUSB_MODE mode)
{
    ...
    else
    {
        if(mode == BTUSB_MODE_BT) {
            TRACE(1,"%s: switch to BT mode.",__func__);
            if(btusb_usb_is_on)
            {
                TRACE(1,"%s: btusb_usbaudio_close.",__func__);
                // 将USB模式的音频通道关闭
                btusb_usbaudio_close();
                TRACE(1,"%s: btusb_usbaudio_close done.",__func__);
                osDelay(500);
            }
            btusb_mode = BTUSB_MODE_BT;
            btusb_btaudio_open(true);
            TRACE(1,"%s: switch to BT mode done.",__func__);
        }
        else {
            if(btapp_hfp_is_call_active() == 1)
            {
                TRACE(1,"%s: hfp is call active.",__func__);
                return;
            }
            TRACE(1,"%s: switch to USB mode.",__func__);
            // 注释掉关闭BT模式的通道,如果关闭了BT模式的音频通道会导致音乐会断开出现无声等
            //btusb_btaudio_close(true);
            TRACE(1,"%s: btusb_btaudio_close done.",__func__);
            osDelay(500);
            btusb_usbaudio_open();
            btusb_mode = BTUSB_MODE_USB;
            TRACE(1,"%s: switch to USB mode done.",__func__);
        }
    }
}

 

    好了,USB模式相关的就讲解到这里了。有哪些不对请大佬指出

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BES2300Z USB mode 讲解 的相关文章

随机推荐

  • IDEA构建Springboot项目(IDEA+Maven+Springboot+Git+Github)

    IDEA构建Springboot项目 开发环境的配置 IDEA Maven Git GitHub 创建Springboot项目 提交到远程仓库Github 一个Java Web项目工程的开始需要好多准备工作 如开发工具 IDEA或Eclip
  • linux如何查看端口是否开放

    linux查看端口是否开放的方法 首先打开端口 切换root用户登录 然后使用 lsof i 端口号命令行 最后使用 netstat aptn 命令行 查看所有开启的端口号 本教程操作环境 linux7 3系统 DELL G3电脑 linu
  • 史上最详细的Android系统SystemUI 启动过程详细解析

    Android 系统 SystemUI 介绍 Android 的 SystemUI 其实就是 Android 的系统界面 它包括了界面上方的状态栏 status bar 下方的导航栏Navigation Bar 锁屏界面 Keyguard
  • 解决MySQL报错:1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'informat

    一 问题描述 新安装的MySQL5 7 22 或 8 0 11 在 Navicat 上执行任一查询操作时 遇到报错 Err 1055 Expression 1 of ORDER BY clause is not in GROUP BY cl
  • 大家都在讨论华为OD?它到底怎么样

    一 华为od是什么 华为OD Outsourcing Developer 是华为和外企德科联合招聘项目的简称 目前华为大多数是OD招聘 OD模式也是华为提出的一种新的用工形式 OD项目过程中也会有部分优秀员工转为正编 不失作为进入大厂的一块
  • Java集成第三方OCR识别——文档篇

    Java快速集成OCR文字识别 相关文章 简介 官方文档 Web 配置操作 第一步 成为百度AI开放平台的开发者 第二步 开通文字识别服务 1 领取免费测试资源 2 创建应用 第三步 使用文字识别服务 1 添加OCR依赖 2 下载相关工具包
  • C++中换行endl和\n的区别

    转载自 http www sjyhome com c endl n html 在C 中 在显示的形式上 cout lt
  • .NET正则基础——.NET正则类及方法应用[转载]

    1 概述 初学正则时 对于Regex类不熟悉 遇到问题不知道该用哪种方法解决 本文结合一些正则应用的典型应用场景 介绍一下Regex类的基本应用 这里重点进行 NET类的介绍 对于正则的运用 不做深入探讨 正则的应用最终都是进行模式的匹配
  • python分析b站_用 Python 抓取 bilibili 弹幕并分析!

    时隔一年 嵩哥带来他的新作 雨幕 他依旧认真创作 追求高品质 作品在发表之前已听了五百遍以上 如此高品质的音乐 大家如何评价呢 通过哔哩哔哩上的视频弹幕 感受一下 01 实现思路 首先 利用哔哩哔哩的弹幕接口 把数据保存到本地 接着 对数据
  • HTML中下拉框的简单介绍<Select><option>

    1 下拉框的使用 在很多地方能见到下拉框的使用 最常用的就是在填写地址的时候 用户自己选择地址 2 效果演示 3 代码演示 下拉框主要用到
  • 浅谈cuda5.0新功能——warpshuffle

    warpshuffle 的具体定义可以在cuda C programming guide中被找到 但是这一功能只能被sm30或者更高的显卡支持 具体原因涉及到了kepler和fermi之间的差别 kepler在一个时钟周期内可以执行32个线
  • mybatis---设置typeAliasesPackage支持**通配符匹配

    设置typeAliasesPackage支持 通配符匹配 mybatis的typeAliasesPackage属性的作用是 搜索指定包别名 配置了以后xml文件中的resultType和parameterType就不需要指定全类名com e
  • 快速成长的秘诀|如何实现自我认知升级?

    一 写在开始 精英人数的增长速度持续加快后 很多人开始焦虑 我也焦虑 深知要走出焦虑不容易 我想把走出焦虑快速成长的认知和方法写成文章分享给更多人 做成PPT给更多人面对面分享 快速成长总共三篇 分别是 完成自己的认知升级 自我成长的方法
  • Network Password Recovery工具查看windows凭据隐藏密码

    查看windows凭据密码 方法一 使用重装系统工具里面自带的修改密码工具来修改或者清除密码 方法二 查看windows凭据密码 这里居然看不了 需要用到 nirsoft 公司做的免费工具 Network Password Recovery
  • switch_to

    理论部分请参考 深入理解Linux 内核 第三章 1 switch to 宏 define switch to prev next last do last switch to prev task thread info prev task
  • C/C++ --- 全局变量初始化总结

    注意 本文所说的全局变量指的是 variables with static storage 措词来自 c 的语言标准文档 什么时候初始化 根据 C 标准 全局变量的初始化要在 main 函数执行前完成 常识无疑 但是这个说法有点含糊 mai
  • 就业管理系统【软件建模与分析UML课设】

    觉得好记得点赞 关注我哦 界面设计如何不重要 重在画图 概 述 1 1系统目标 建设集就业管理办公自动化 毕业生与用人单位信息管理 就业部门形象化宣传为一体的综合性管理系统 组建一个具备人才管理 人才交流等功能的综合性信息系统 使整个人才交
  • mysql MHA集群安装

    一 主机规划 IP Hostname Master Slave Manager Node Data Node 10 22 83 42 node1 Master Data Node 10 22 83 26 node2 Slave Data N
  • 如何使用Egret制作游戏?

    好的 下面是使用Egret制作游戏的详细教程 一 前期准备 1 安装Egret Wing开发环境 可以在官网下载 https www egret com products wing html 2 安装Egret Engine 可以在官网下载
  • BES2300Z USB mode 讲解

    hello 在BES的蓝牙中有一些芯片是支持USB mode 在使用的过程中 在BT mode 和 USB mode 中只能有一种模式存在 排版会有点乱 请谅解 下面来讲解下BES2300Z 在USB mode 下打开的方法 遇到的一些问题