在Linux中蓝牙的stack分层如下:
从总体上看分为两层, 一个在内核态,一个在用户态,内核态。
在内核态中的部分暴露了一个特殊的Socket给用户态,然后用户态使用命令+参数的格式传递给内核态。而如果硬件有反馈信息,一般是事件,那么会有callback消息上来。
硬件说明
对于蓝牙,一般都是模组,例如有些是BT Wifi模组,即BT-Wifi为一体的模组。
这种模组一般是通过UART,SDIO,或者USB接口与SoC的某类总线连接。
而模组本身其实也带有固件,甚至里面自己跑着操作系统,这个时候可能就需要下载固件。这个固件是由内核发现设备的时候从用户态获取,然后通过总线现在到模组中。
内核态的配置
对于现在的比较新的内核一般都有蓝牙的stack支持,以及驱动。
如同前面所说,蓝牙自己在内核态创建了一种新的socket来和上面的用户态通信。我们可以看到内核态中的muenuconfig中,蓝牙位于Networking support中:
选中了Bluetooth subsystem support后就有驱动等支持。
对于通用,常用的蓝牙dongle都有对应的驱动:
可以看到支持的范围很广:
- USB
- UART
- SDIO
-
以及broadcom特殊协议
我们购买的是CSR USB 的蓝牙dongle:
测试在编译好配置了bt的内核后,编译烧写,启动后我们可以插入Dongle,即可看到log:
然后就可以看到生成了hci节点了:
至此,蓝牙的内核态支持就好了。