近几周一直在移植bluetooth和wifi,看书的时间也没,也没有时间思考一些问题,总结一些移植碰到的困难之类的。前天,终于蓝牙也可以传输文件,通过a2dp播放音乐了,wifi也可以扫描到网络,并可以连接了,因为平台中有本地的一个nfs挂载,所以要上外网,必须要sd卡启动才可以。
14级台风,肯定损失惨重啊。在此只能默默地祝福了。昨天还知道了一件事,早上通过验证了,不知为何心里空空的,也不想去实验室了,只想默默地听听音乐,静静地呆在,什么也不想做。说的有点多了,只是我知道了,慢慢来,总会可以的,不用太在意这些。给人打工,永远是被剥削的。学长说的对,给多少工资,干多少活,再怎么努力,公司也不会给你太多的报酬,何必呢。所以把其他的时间都用来学习,用来创造美好的未来。好了,抱怨的够多了,下面还是开始谈谈我对android上bluetooth的移植吧。
bluetooth,linux底层驱动已经有了现成的驱动了,这里只要选上相应的就好了,在
中的选上相应的bluetooth和RF的两个选项
然后对于RF,选上两个就好
这里主要是bluetooth中有个RFKILL,用于判断那个按钮的开关状态的。
然后对于bluetooth
对于bluetooth device driver选上
uart的蓝牙,所以选上这个,又用了BCSP的协议。还有就是要准备好uart,如果只是用来传输文件的话,不用太高波特率的话,那么普通的uart就可以了,但是要达到上M的速度的话,必须要准备好高速uart。这里,要得到一个高速uart的节点,用于bluetooth的通信。好了,准备好了内核,接着就是android的事情了。
RFKILL的小小的说明,因为在创建android服务的时候才创建了rfkill0这个节点,然后就是节点里有个state和type,是在android中的蓝牙的硬件抽象层中要打开的,而这个有权限,所以后来在创建的时候就给他最高的权限了。具体在net/rfkill/core.c中,有个rfkill_dev_attrs,然后只要把修改为__ATTR(state, S_IRWXUGO, rfkill_state_show, rfkill_state_store), 和_ATTR(type, S_IRWXUGO, rfkill_state_show, NULL),这样就可以了。
接下来是android源码中的事情了,首先就是要在相应的平台下把蓝牙这个宏定义给选上。举个例子,比如说你的平台是samsung的Tuna平台,那么在device/Samsung/Tuna/BoardConfig.mk中有两个宏必须选上
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_BCM := true
这样再编译就可以了。
接着再看下android源码中对于bluetooth的一些代码主要的路径。
1、 Bluez的部分 /external/bluetooth/下
2、 bluez的适配层,也就是android上层通过jni往下调用驱动的硬件抽象曾。
/system/Bluetooth
3、 蓝牙的jni和java部分
这部分不用管太多,几乎不用去看,因为android上层一般都是木有问题的。
Bluez部分吧。主要是生成以下一个.so和应用程序
Libbluetoothd.so audio.a2dp.default.so bluetoothd hciconfig hcitool hciattach bccmd
bluez的适配层了,mm后得到了libbluedroid.so。
jni层也是定义了相关的宏的。
frameworks/base/core/jni/android_server_BluetoothService.cpp中,可能已经编译过后会出问题,只要把所有的.o删除了重新mm后就可以了。这时会重新生成一个libandroid_runtime.so
编译基本上这样就OK了,剩下的就是去调试了。
在init.rc中添加hciattach的服务,因为是用bcsp协议的,所以服务格式如下。
setvice hciattach system/bin/hciattach –n –s 115200 /dev/ttyDMA1 bcsp 115200
class main
disabled
oneshot
hciconfig就可以得到hci0这个设备了,如果不出现什么奇怪的事情的话,那么蓝牙就可以用了。
a2dp,那么波特率115200是远远不够的,于是要用到921600的波特率,但是对于bcsp协议没有修改蓝牙内部的波特率的代码。而bcsp是基于csr的,所以可以用bccmd来修改波特率。
pskey的寄存器中波特率的值,默认的是115200,可以通过修改这个值来修改波特率的。
bccmd –t bcsp –d /dev/ttyDMA1 –b 115200 psget –r 0x01be
472,对应于波特率是115200.所以我要设置波特率为921600的话,那么那个寄存器中的值应该是x=921600*472/115200=0xec0.
bccmd来设置波特率了
bccmd –t bcsp –d /dev/ttyDMA1 –b 115200 psset –r 0x01be 0xec0
这样,基本上就可以用bluetooth了。
至于a2dp这条路的话。主要上面的bluez中也已经有了audio.a2dp.default.so这个.so了,接着就是硬件抽象层中有个a2dp的接口,具体目录在/hardware/libhardware_legacy/audio/下,mm后得到audio_policy.default.so这个policy主要是处理音频通路的,因为这个策略是在有蓝牙连接的时候就使用蓝牙,否则是通过alsa出声音的。这样,只要连接上蓝牙的音频设备那么就可以播放音乐了。至此,android的bluetooth的移植到此就差不多完结了。剩下的就是优化和测试了。