一、关于蓝牙的加载流程
1,插入USB蓝牙后,bluedroid会读取设备型号,然后添加设备,同时会去打开蓝牙驱动
2,蓝牙驱动的打开是调用的安卓标准的硬件设备流程,BluetoothManagerService会调用jni,jni会通过调用hardware下面的hw_get_module来获取蓝牙库文件,(system/lib/hw/)。
3,hw_get_module在获取到后,会调用内核rtk_btusb去打开设备,这里面会去获取设备的firmware,然后就能正常打开设备。
二:碰到的几个问题
1,没有打开dev/rtk_btusb的权限
这个需要按照安卓的机制,在te文件里面添加设备的权限,而蓝牙有个bluetooth.te是再external下面,而不是device
2,有权限后提示firmware打开失败
原因不明,再内核重新勾选,同时将device.te里面添加的rtk_bt_device去掉后就正常了,怀疑还是te文件的问题
3,8821蓝牙打不开
需要再bluetooth里面将这个设备的pid,vid添加进去,否则会不支持。
三、修改记录
1,修改device下的file_contexts文件,添加/dev/rtk_btusb u:object_r:mstar_device:s0
2,修改external下的bluetooth.te文件,添加allow bluetooth mstar_device:chr_file rw_file_perms;
3,将给过来rtkbt里面的用到的firmware添加到hardware的realtek/bt/system/etc/firmware下
4,修改device下的bluetooth.c,rtk_tables数组中添加新蓝牙的usb pid/vid。
5,内核bluetooth驱动中添加rtk_btusb.c文件
6,内核里将bluetooth驱动设为编译到内核里面,并在里面打开HCI相关的驱动
7、firmware需要在hardware/realtek/bt下面的rtkbt.mk文件里面拷贝