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