android蓝牙的调试(博通蓝牙工作 and 低功耗模式)
首先结合项目从整体上去把握这部分:
蓝牙模块中一个比较核心的文件是bluetooth.c, 在我们上电的时候, 会调用这个文件中bt_enable()这个函数, 在这个函数里面先调用set_bluetooth_power()上电,然后调用property_set("ctl.start", "hciattach"), 去启动hciattach这个服务,从而运行brcm_patchram_plus这个进程。这个服务会加载我们firmware等一些工作。这部分工作做完后, 我们会调用property_set("ctl.start","bluetoothd"),这个服务是启动我们的bluz进程。如果以上成功的话,蓝牙芯片将会开始工作。
蓝牙需要正常工作,简而言之,需要做三部分工作:
i) 给芯片上电。
ii) hciattach服务启动,从而加载固件,设置波特率等一系列的操作。(硬)
iii 启动bluetooth的协议,从而让蓝牙去正常工作。 (软)
其次来分析下具体的工作流程:
a) BT管脚介绍
BT_REG_ON 和BT_RESET打开蓝牙时拉高, 关闭蓝牙时候拉低。 平时不需要控制。一般放在RF-KILL里面,可以在命令行里面操作。
UART可以一直配置为UART(TX/RX/RTS/CTS), 也可以只在使用蓝牙的时候配置为UART.
I)相互对应: TX和RX,RTS和CTS, RTS和CTS用来做硬件流控
II)把自己的RTS(对方的CTS)拉高,对方就不能发数据
III)检测到自己的CTS为高(对方的RTS),就不能给对方发数据
IV)BT上电后(未做初始化),BT_RTS应为低
V)主机串口未打开后应该为低
睡眠控制脚: HOST_WAKE 和BT_WAKE
i) 对于AP来说, 一个是GPO, 一个是中断。
ii) 在BT使用前配置好, 在bluesleep.c中控制。
iii) 如果不使用lpm(低功耗模式), 可以不管这些, 在新板回来验证bt功能时候, 往往不需要低功耗模式。
a) 硬件验证
首先应该做下面的事情:
i)配置好UART的管脚
ii)配置好BT_REG_ON/BT_RESET的管脚, 并改好RFKILL代码
iii)BT_WAKE和HOAT_WAKE可以先不配
其次验证流程
下电:通过RFKILL拉低BT_REG_ON和BT_RESET让BT进入缺省状态
上电:同样通过RFKILL拉高BT_REG_ON和BT_REST让芯片处于上电状态
通过brcm_patchram_plus初始化BT芯片
Hciconfig uart0 up
Hcitool scan搜索设备,如果能够搜索到设备,则说明蓝牙芯片ok.
b) Brcm_patchram_plus的作用
像我们上面提到的那样, 在启动hciattach服务的时候, 会启动这个brcm_patchram_plus这个进程。这个进程是有brcm_patchram_plus.c这个文件编译而成。
它的作用是初始化蓝牙芯片, 进行基本参数的配置: lpm、PCM等参数
参数解释(brcm_patchram_plus)列出
-d: 显示调试信息
-enable_hci: 启动hci协议
-enable_lpm: 启动lpm模式
-baudrate: 指定工作时的波特率
-patchram: 指定hcd文件
- bd_addr: 加载蓝牙地址
- /dev/ttyxxx: 指定串口
brcm_patchram_plus -d –bd_addrxx:xx:xx:xx:xx:xx --enable_hci --enable_lpm --baudrate3000000 --patchram /etc/bcm4330.hcd /dev/ttyHS0
进行硬件验证时可以简化:
brcm_patchram_plus-d --enable_hci /dev/ttyHS0
c) LowPower Mode
lpm的具体参数设定在brcm_patchram_plu.c代码中
unsignedchar hci_write_sleep_mode[] = { 0x01, 0x27, 0xfc,
0x0c,//command length
0x01,// Sleep_Mode UART
0x01,// Host Idle Threshold, roughly 1*300ms
0x01,// Host Controller Idle Threshold
0x01,// BT_WAKE_Active_Mode, 0-active low, 1-active hgih
0x01,// HOST_WAKE_Active_Mode, 0- active low, 1-active hgih
0x01,// Allow_Host_Sleep_During_SCO
0x01,// Combine_Sleep_Mode_And_LPM
0x00,// Enable_Tristate_Control_Of_UART_Tx_Line
0x00,// Active_Connection_Handling_On_Suspend
0x00,// Resume_Timeout
0x00,// Enable_BREAK_To_Host
0x00//Pulsed_HOST_WAKE
};
BT芯片的lpm需要与HOST的bluesleep同时工作
在我们测试蓝牙睡眠的时候, 手动往/proc/bcm/asleep/proto写1, 就可以启动睡眠模式。
i)正常代码:
BlueZ:启动BT时,(BlueZ在bluetooth.c的bt_enable里面)
改动init.qcom.rc文件来打开/关闭BT芯片的lpm
servicehciattach /system/bin/brcm_patchram_plus --enable_hci --enable_lpm --baudrate 3000000 --patchram/etc/firmware/bcm4329.hcd /dev/ttyHS0
ii)AP通过BT_WAKE来控制BT
拉高BT_WAKE: BT不能睡眠,或者必须醒来
拉低BT_WAKE:BT可以睡眠,睡不睡BT自己决定
HOST每次发数据前都要拉高BT_WAKE
BT如果睡眠,会拉高BT_RTS来阻止HOST发数据
iii)Bluesleep.c概述
bluesleep_init: 创建结点,bluesleep_probe: 申请GPIO/INT/WAKE_LOCK资源 ,启动定时器监控主机发送数据(超时即可拉低BT_WAKE),打开中断来监控HOST_WAKE的状态 ,bluesleep_outgoing_data: 拉高BT_WAKE唤醒BT ,bluesleep_hostwake_isr: 中断处理函数,进行wake任务调度。
对于新的项目, 我们首先确保HOST_WAKE和BT_WAKE的INT和GPIO能正确的申请到 ,其次确保bluesleep被编译,如下三个结点被创建
/proc/bcm/asleep/proto、/proc/bcm/asleep/hostwake、/proc/bcm/asleep/btwake
三、项目中蓝牙一些bug分析。
i)在传送多个文件过程中, 传输几个文件后, 传输的进度条停止不动。并且内核一直在打印h4_recv: Unknown HCI packet type
答: 我们申请Host_wake中断类型为高电平。当第一次打开蓝牙时, Host_wake =1时,此时产生中断。然后就轮番改变中断类型。当我们传输文件过程中,会来好多次中断,从而会响应多次中断处理函数,这个函数会进行反复打开和关闭串口的工作。这就是问题之所在。当bt给 HOST传数据的时候,反复打开、关闭串口,从而会造成一段时间内串口是不工作的。因此会导致bt中的buf溢出。这就是数据的帧检测位出问题的原因:rfcomm_recv_frame:bad checksum in packet。
我们的做法是:在传输文件过程中,不要让HOST去关闭串口。直到我们文件传输结束,再用内核定时器去关闭串口。
ii)在传输过程中, 在UI上面点击搜索蓝牙设备, 没有任何反应,或弹出蓝牙进程无响应。
答:这样的问题, 一般是处理睡眠代码的流程有问题。在点击搜索蓝牙设备将界面的时候,HOST没有唤醒蓝牙设备。
iii) 在待机的情况下, 其他手机给测试机传输文件, 测试机没有任何反应。
答:经过分析才发现是这样的情况:当其他手机给我们测试机传文件的时候,中断也来了响应,然而刚来了响应后,系统又重新进入suspend状态。
我们的做法:在刚接受文件的时候, 可以尝试着给HOST加wakelock,不要让HOST睡眠。这样可以很好地解决问题。不过不要忘记在最后也加上unwakelock下哦。
iv)蓝牙在某些特定的情况下打不开。概率非常非常低。重启完手机后,蓝牙可以正常打开。
答:一般都是由于蓝牙在patchram_plus加载firmware没有成功,从而造成的。有可能是进程阻塞引起的。在加载固件的时候,尝试着在再次加载固件。
v)某些型号(如kewei)车载蓝牙连上手机待机电流为11MA,分析下原因。
答:手机蓝牙连接上耳机或carkit后,即使在没有打电话及听音乐的状态下,物理链路还是会保持的,也就是蓝牙的射频仍然在工作(这是协议规定的,否则会发生来电时无法用耳机或carkit接听等问题),而不同的耳机或carkit查询链接存在的时间间隔有所不同(主要由双方在链路建立时协商决定),因此在待机电流上则表现为不同的产品不一样,如图1是手机与kewei连接上后的OTA(空中数据包分析仪),OTA表明系统的POLL和NULL交互非常频繁(kewei作为主,主动发起POLL),这是导致手机待机电流上升的主要因素。图2 是和skyworth建立链接后的OTA,其交互频率要比kewei低10倍,因此表现在待机电流上会小些。
相关文档 下载: http://download.csdn.net/detail/angelbosj/4484676
版权声明:本文为博主原创文章,未经博主允许不得转载。
android蓝牙的调试(博通蓝牙工作 and 低功耗模式)的更多相关文章
- 在全志平台调试博通的wifi驱动(类似ap6212)【转】
转自:http://blog.csdn.net/fenzhi1988/article/details/44809779 调试驱动之前,首先先看看驱动代码,了解代码大致工作流程,再根据硬件配置驱动,比如 ...
- ZT Android 4.2 BT系统之蓝牙关闭过程全跟踪
Android 4.2 BT系统之蓝牙关闭过程全跟踪 分类: android 2013-08-03 00:34 2252人阅读 评论(10) 收藏 举报 代码位置: frameworks/ ...
- 高通Android平台硬件调试之Camera篇
之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...
- 『转』android官网翻译好的蓝牙API接口说明
Develop API Guides 连接 蓝牙 本文内容 基础知识 蓝牙权限 设置蓝牙 查找设备 查询配对的设备 发现设备 连接设备 连接为服务器 连接为客户端 管理连接 使用配置文件 供应商特定的 ...
- Android蓝牙实例(和单片机蓝牙模块通信)
最近做毕设,需要写一个简单的蓝牙APP进行交互,在网上也找了很多资料,终于给搞定了,这里分享一下^_^. 1.Android蓝牙编程 蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码 ...
- mac 蓝牙开启调试模式
mac 蓝牙开启调试模式 按住shift+option+鼠标右键点右上角的蓝牙图标
- android开发(42) 使用andorid操作蓝牙打印机
最近接到一个需求,使用android发起打印任务,通过蓝牙连接打印机.条件如下: 打印机:南京富士通DPK760E,具有蓝牙功能 Android手机:普通手机,Android 4.4版本,具有蓝牙功能 ...
- 【蓝牙】蓝牙,调试 hcitool与gatttool实例
Bluez协议栈在安装完以后,会提供两个命令行调试工具,hcitool与gattool,我们可以根据提供的工具来轻松的调试我们的蓝牙设备,调试BLE设备时,需要获取root权限. 蓝牙设备的开启与关闭 ...
- linux 蓝牙开发调试(rtl8821cs模块)
刚调完rtl8821cs的wifi功能,项目需要打通蓝牙配网功能. 调试过程中遇到各种问题中间几乎放弃,倒腾了几天最后还是打通了,顺便记录下过程. 通信接口:SDIO @WiFi.Uart @BT;工 ...
随机推荐
- openScales源码学习系列之 Feature属性
coordinates:当前区域,geometry或Polygon的点集合. countries.国家所在位置下标 SQKM.平方千米 COLOR_MAP.该国家的颜色类别 SQMI.平方英里 CON ...
- Linux设置高分辨率后无法进入X系统
Vmware9.0中Xubuntu分辨率从800x600变更为1366x768后在用户输入密码登录后会自动退出x系统,出现这种情况时可以切换到命令行登录界面,然后将-/.config/xfce4/xf ...
- poj 2051 Argus(优先队列)
题目链接: http://poj.org/problem?id=2051 思路分析: 优先级问题,使用优先队列求解:当执行某个任务后,再增加一个任务到队列中, 该任务的优先级为执行任务的时间加上其时间 ...
- JAVA面试中的几个重要基础问题
1.java是否会出现内存溢出?如何解决? 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存.为了解决Java中内存溢出问题,我们首先必 ...
- C语言数据结构----双向链表
概括:主要说明双向链表的基本概念和具体操作以及源代码. 一.基本概念 1.有了单链表以后我们可以把内存中小块的空间联系在一起,并且把每一个小块都存储上我们想要存储的数值.但是单链表只有一个next,我 ...
- Mac OS使用技巧之十五:快捷方便的Mini Dock
Mini Dock是前面忘记了提,这里做一些补充. Mini Dock是Mac OSX的一个值得大书特书的亮点.尽管windows下也有类似的东西,但Mac下却提供了更为全面的功能.通过M ...
- 跨域引入iframe 自适应高度
最近和别的公司合作一个项目,需要从他们那边引入一个页面,刚开始想的挺简单的,用iframe 引入就好啦,可是操作中才发现,自适应的问题不好解决,试了挺多办法,最终找到一个比较好的方法,记录一下,留着备 ...
- eclipse主题插件
打开eclipse ,选择 Help 选择Install New Software 点击 Add 输入http://eclipse-color-theme.github.com/update,选中Ec ...
- HTML5 总结-表单-输入类型
HTML5 Input 类型 HTML5 新的 Input 类型 HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证. 本章全面介绍这些新的输入类型: email url nu ...
- Python 第一章 基础知识
如果熟其他计算机语言,可能会习惯于每行以分号结束.Python则不同,一行就是一行,不管多少. 如果喜欢的话,可以加上分号,但是不会有任何作用(除非同一行还有更多的代码),而且这也不是同行的做法. & ...