接前一篇文章:Linux内核蓝牙子系统有什么(8)
本文内容参考:
Linux之蓝牙相关代码浅析 | DD'Notes
蓝牙驱动相关代码_蓝牙驱动代码-CSDN博客
linux蓝牙驱动代码阅读笔记_bt-sco.c-CSDN博客
Linux内核的蓝牙子系统架构-CSDN博客
BlueZ - Linux平台上的蓝牙协议栈-CSDN博客
蓝牙模块的bluedroid - 简书
https://wenku.csdn.net/answer/3f466076874411ed9a8700163e34985e
【内核教程第三十六讲】剖析Linux内核蓝牙子系统架构|内核缺页异常|锁与进程间通信|控制机制|竞态条件|临界区|内核锁机制|自旋锁|信号量|RCU机制_哔哩哔哩_bilibili
特此致谢!
上一回以一个内核模块为例,通过一个简单的蓝牙内核模块驱动的编写,初步认识了Linux内核中的蓝牙代码。本回就再深入讲解一下Linux蓝牙协议栈Bluez。
Linux蓝牙协议栈Bluez分为内核空间和用户空间两个部分,如下图所示:
由上图可知,内核部分又分为两块:HCI驱动和协议栈(前文书也讲到过)。
内核蓝牙HCI驱动
- drivers/bluetooth
存放蓝牙驱动程序源码。这些驱动程序用于与蓝牙硬件通信,通信的方式常见的有USB、UART和PC card等几种。
- /usr/lib/firmware、/lib/firmware等
存放蓝牙固件。
这里主要分析USB和UART接口的HCI驱动。
- USB
主要源码文件:btusb.c。
用到的USB主要的几类传输方式:中断传输、块传输、控制传输和同步(等时)传输。
数据是以sk_buff的方式传输,主要有3类:evt_skb、acl_skb、sco_skb。
USB蓝牙比较完整的流程如下图所示:
- UART
主要源码文件:hci_ldisc.c。
tty上层可能还会包含H4协议、三线H5协议、厂家自定义的协议等。
UART蓝牙比较完整的流程如下图所示:
下一回介绍Bluez内核空间的另外一部分:内核蓝牙协议栈。