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模式相关的就讲解到这里了。有哪些不对请大佬指出