Bluetooth HCI Event的处理

1.当Bluetooth USB dongle插入USB接口时,driver/bluetooth/hci_usb.c中probe程序被调用。probe会调用hci_register_dev()--〉tasklet_init(&hdev->rx_task, hci_rx_task, (unsigned long) hdev);
将hci_rx_task() 连上rx_task->func.


2.同样在Bluetooth USB dongle插入时,hdev->open = hci_usb_open; 当USB Dongle被UP时,这个function被调用。它调用hci_usb_intr_rx_submit(),它注册URB完成处理程序,hci_usb_rx_complete。
当有URB出现时, hci_usb_rx_complete ->__recv_frame() ->hci_recv_frame()->hci_sched_rx(hdev);->hci_sched_rx() ->tasklet_schedule(&hdev->rx_task)
tasklet_schedule():
将这个tasklet放在 tasklet_vec链表的头部,并唤醒后台线程ksoftirqd。当后台线程ksoftirqd运行调用__do_softirq时,会执行在中断向量表softirq_vec里中断号TASKLET_SOFTIRQ对应的tasklet_action函数,然后tasklet_action遍历 tasklet_vec链表,调用每个tasklet的函数完成软中断操作。
也就是调用hci_rx_task()

也就是:当有URB时,会最终调用到hci_rx_task()

当包类型为 HCI Event时,则调用hci_event_packet()
在hci_event_packet()中,会判断是何种Event.并处理之。

下面以HCI_EV_DISCONN_COMPLETE为例子看Event如何被处理。这个Event表明连接断掉了。reason则表示断掉的原因。

HCI_EV_DISCONN_COMPLETE Event使用处理程序hci_disconn_complete_evt来处理,下面详细讲解:

1.hci_dev_lock():使用自旋锁得到资源。

2.hci_conn_hash_lookup_handle():从连接队列中找出对应连接。注:当有ACL或SOC连接时,这个连接就会被加入连接链表。

3.这个连接的state改为BT_CLOSED。

4.hci_proto_disconn_ind(): 调用全局变量hci_proto中的disconn_ind()。

注:在L2cap protocol insmod时,hci_register_proto()被调用。全局变量hci_proto则被赋值。disconn_ind=l2cap_disconn_ind;

所以当HCI层得到Disconnect时,会通知l2cap层做删除channel等工作。

且因为state改为BT_CLOSED. 所以在l2cap 层调用poll(最终调用bt_sock_poll)时会发现POLLHUP被置位。

这样l2cap应用程序就能够知道连接已经断开了。

### 蓝牙 HCI 指令集文档与规范 蓝牙主机控制器接口(HCI)定义了软件应用程序如何通过标准命令与蓝牙硬件交互。HCI指令集提供了详细的命令列表,允许上层协议栈控制蓝牙芯片的行为并获取状态信息。 #### 主要组成部分 HCI指令集主要包括以下几个部分: - **命令参数**:每个命令都有固定的格式,包括操作码(Opcode)、参数长度(Parameter Total Length)和具体参数。 - **事件响应**:当执行某个命令后,蓝牙控制器会返回相应的事件来通知主机命令的结果或当前的状态变化。 - **数据结构**:为了确保不同厂商设备之间的兼容性,HCI规定了一系列通用的数据结构用于表示各种配置选项和服务特性。 对于具体的实现细节,在实际编程环境中,`hci_send_command` 和 `hci_receive_event` 函数被用来发送HCI命令到蓝牙模块,并接收来自该模块的反馈事件[^2]。然而需要注意的是,真正的HCI API可能因不同的操作系统和支持库而有所差异。 #### 获取官方文档资源 想要深入了解完整的HCI指令集及其使用方法,建议查阅Bluetooth SIG发布的《Bluetooth Core Specification》中的相关章节,特别是Volume 2 (Core System Package) 的 Part E 部分,这里包含了所有关于HCI的消息格式说明以及支持的操作列表。 此外,《HCI Command and Event Reference Guide》也是一份非常有价值的参考资料,它不仅列出了所有的HCI命令,还解释了每条命令的功能描述、输入输出参数的意义等内容。 ```python import bluetooth.hci as hci def send_hci_command(command, parameters=None): """ 发送HCI命令给蓝牙适配器 :param command: 命令ID :param parameters: 可选参数字典 """ packet = hci.create_command_packet(command, parameters) response = hci.send_and_wait_for_response(packet) return parse_hci_response(response) def parse_hci_response(data): """解析接收到的HCI事件""" event_code = data[0] status = data[1] payload = data[2:] if status != 0x00: raise Exception(f"HCI Error {status}") return {"event": event_code, "data": payload} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值