和菜鸟一起学android4.0.3源码之bluetooth移植心得

       近几周一直在移植bluetoothwifi,看书的时间也没,也没有时间思考一些问题,总结一些移植碰到的困难之类的。前天,终于蓝牙也可以传输文件,通过a2dp播放音乐了,wifi也可以扫描到网络,并可以连接了,因为平台中有本地的一个nfs挂载,所以要上外网,必须要sd卡启动才可以。

      昨天的台风“海葵”在家乡登陆,虽然家里没出什么事,但是家乡遭受到这14级台风,肯定损失惨重啊。在此只能默默地祝福了。昨天还知道了一件事,早上通过验证了,不知为何心里空空的,也不想去实验室了,只想默默地听听音乐,静静地呆在,什么也不想做。说的有点多了,只是我知道了,慢慢来,总会可以的,不用太在意这些。给人打工,永远是被剥削的。学长说的对,给多少工资,干多少活,再怎么努力,公司也不会给你太多的报酬,何必呢。所以把其他的时间都用来学习,用来创造美好的未来。好了,抱怨的够多了,下面还是开始谈谈我对androidbluetooth的移植吧。

        对于bluetoothlinux底层驱动已经有了现成的驱动了,这里只要选上相应的就好了,在

中的选上相应的bluetoothRF的两个选项

 

然后对于RF,选上两个就好

这里主要是bluetooth中有个RFKILL,用于判断那个按钮的开关状态的。

然后对于bluetooth

 

对于bluetooth device driver选上

        因为开发的是uart的蓝牙,所以选上这个,又用了BCSP的协议。还有就是要准备好uart,如果只是用来传输文件的话,不用太高波特率的话,那么普通的uart就可以了,但是要达到上M的速度的话,必须要准备好高速uart。这里,要得到一个高速uart的节点,用于bluetooth的通信。好了,准备好了内核,接着就是android的事情了。

        这里还有一个RFKILL的小小的说明,因为在创建android服务的时候才创建了rfkill0这个节点,然后就是节点里有个statetype,是在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源码中的事情了,首先就是要在相应的平台下把蓝牙这个宏定义给选上。举个例子,比如说你的平台是samsungTuna平台,那么在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、  蓝牙的jnijava部分

这部分不用管太多,几乎不用去看,因为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出声音的。这样,只要连接上蓝牙的音频设备那么就可以播放音乐了。至此,androidbluetooth的移植到此就差不多完结了。剩下的就是优化和测试了。

 

posted on 2012-08-09 11:39  吴一达  阅读(222)  评论(0编辑  收藏  举报

导航