解读linux 蓝牙驱动 程序linux 蓝牙驱动代码阅读笔记昨天看了一下介绍蓝牙协议文档,今天索性对照看了看 kernel 里的代码(bluez),这里记点笔记,还是继承了老毛病, 只关注整体流程而忽略细节,先了解个大概,等真正需要时再仔细分析。 net/hci_core.c HCI 在主机端的驱动主要是为上层提供一个统一的接口,让上层协议不依赖于具体硬件的实现。HCI 在硬件中的固件 与 HCI 在主机端的驱动通信方式有多种,比如像 UART、USB 和 PC Card 等等。hci_core.c 相当于一个框架,用于把 各种具体通信方式胶合起来,并提供一些公共函数的实现。 hci_cmd_task 是负责发送 CMD 的任务,它从 hdev->cmd_q 队列中取 CMD,然后调用 hci_send_frame 把CMD发送出去, hci_send_frame 又会调用实际的 HCI 驱动的 send 函数发送数据。 hci_rx_task 是负责接收数据的任务,它从 hdev->rx_q 队列中取数据,然后根据数据的类型调用上层函数处理。数据 包有三种类型: 1. HCI_EVENT_PKT: 用于处理一些通信事件,比如连接建立,连接断开,认证和加密等事件,这些事件控制协议状 态的改变。 2. HCI_ACLDATA_PKT: 异步非连接的数据包,通过 hci_acldata_packet 提交给上层的 L2CAP 协议处理 (hci_proto[HCI_PROTO_L2CAP])。 3. HCI_SCODATA_PKT: 同步面向连接的数据包,通过 hci_scodata_packet 提供给上层的 SCO 协议处理 (hci_proto[HCI_PROTO_SCO])。 hci_tx_task 是负责发送数据的任务,发送所有 connection 中的 ACL 和 SCO 数据,以及 hd……