搜档网
当前位置:搜档网 › 蓝牙鼠标调试过程

蓝牙鼠标调试过程

蓝牙鼠标调试过程
蓝牙鼠标调试过程

现象:

连上鼠标后,能够出现鼠标图标,并且可以移动一下,然后再怎么移动鼠标都没反应了,在蓝牙的驱动层(btusb.c),加打印信息,发现这个时候即使移动蓝牙鼠标,bulk端点也没有数据上报上来了,但设置界面还可以执行扫描,能够扫描到其他的蓝牙设备,说明蓝牙usb驱动包括蓝牙的usb dongle这个时候还能工作,而为什么不上报鼠标数据,很可能是这个时候蓝牙鼠标的内部出问题了。

注意的问题:

1 蓝牙的数据分为以下几种:acl(异步数据包),sco(同步数据包),event (事件包),command(命令包)其中sco数据包是用在蓝牙语音的,在蓝牙鼠标的情况下,是用不到。

2 在蓝牙的usb驱动中,acl数据包是通过bulk传输的,sco是通过iso传输的,event是通过intr传输的,command是通过ctrl传输的。

3 而蓝牙鼠标的坐标是通过acl数据传递过来的,即是通过bulk传输的,而不是我们一般臆想得通过intr来传输

解决过程:

1 通过控制台的hidd命令(可以通过

external\bluetooth\bluez\compat\hidd.c文件编译生成)来连接(不启动bluez服务层),鼠标是可以正常工作的,说明蓝牙的驱动部分是能够正常工作的。

2 基于以上,初步定为应该是蓝牙的应用空间出现了问题;蓝牙的应用空间分为几个层次,最上层是java部分,中间是 bluez服务层,为了确定问题到底出现在哪一层,我们不启动java层(即不去通过设置界面来启动蓝牙),而只启动蓝牙的bluez服务层(方法是:在控制台执行start bluetoothd),然后同样在控制台来连接蓝牙鼠标,则会出现同样现象的问题,基于此,我们定位问题应该是有bluez服务层这一层,即bluetoothd服务所引起的。

3 为了确定到底是什么原因引起的,我们用hcidump命令,来查看正确的时候与错误的时候的内核hci层所打印出来的 log信息的差异(因为上层不管使用何协议,何数据包都会通过hci层来交互的),发现错误的时候,都是在连接模式发送切换的时候出现的。摘部分log信息如下:

hci_conn_enter_active_mode: conn cf19a800 mode 2

hci_conn_enter_active_mode: conn cf19a800 mode 2

hci_conn_enter_active_mode: conn cf19a800 mode 2

hci_conn_enter_active_mode: conn cf19a800 mode 2

hci_conn_enter_active_mode: conn cf19a800 mode 0

从以上log到代码,发现应该是蓝牙鼠标在active与sniff连接模块之间切换时,发送了这种错误。

4 基于以上的信息,猜测应该是bluez服务层让蓝牙鼠标进sniff连接模式时,就会出现这个问题,为了验证是不是这个问题引起的,我们修改

/etc/bluetooth/main.conf中的DefaultLinkPolicy值为3(该值用来控制蓝牙的连接模式),使其不进去sniff模式。

5 修改保存,重启平板电脑,进入设置界面,并且连上蓝牙鼠标,这个时候就不会出现蓝牙鼠标动一下就没反应的问题了,至此确定是由于蓝牙鼠标的active 与sniff模块之间切换的时候,还存在问题。该问题可能只针款雷柏的鼠标才存在这个问题,针对其他牌子的蓝牙鼠标可能不存在这个问题,这需要使用其他牌子的鼠标来做验证。但至少雷柏的蓝牙键盘就不存在这个问题。

相关主题