摘要:
有时候设备驱动需要做一些与其他的设备通信的操作,但是驱动本身又不可以去实作,那这个时候就可以通过调用用户态的软件,通过这个软件和其他的设备进行通信。 那在内核态如何去调用用户态的程序呢?call_usermodehelper() 可以做到。这个linux kernel提供的一个接口,并且这个程序具体 阅读全文
摘要:
蓝牙关闭的流程比打开流程要简单,主要就是一些profile的断连以及协议栈相关结构的释放。 这里简单说一下其流程,就直接从协议栈的disable的接口说起了。 简单看下stack_manager_get_interface : 看shut_down_stack_async的具体实现: 这里就是把关闭 阅读全文
摘要:
首先介绍一下和inquiry的相关的流程。 inquiry是从协议栈下发的一个HCI命令。其格式如下: 这里简单介绍下第二个参数,是inquiry的持续时间, 从上图看出 inquiry持续的时间是 设定值乘以1.28s,如果设定值是10,那么实际持续的时间就是12.8s 那么下了这个HCI命令之后 阅读全文
摘要:
setting 界面开始搜索的时候,通常也会同时进行le scan,这一点在inquiry流程之命令下发中已经讲述。此篇文章主要是分析一下对于controller 搜索到的广播包的处理。这里以Android O的bluedroid的代码作为分析对象。 上面可以看出 btu_hci_msg_proce 阅读全文
摘要:
Android 上面的蓝牙inquiry 是在设置界面,打开蓝牙就会自动搜索周边的蓝牙设备,其最终调用到协议栈的start_discovery接口,此篇文章分析该接口的调用流程以及与controller交互过程。 上面代码的主要做的事情是,设置相关的搜索的参数,然后调用BTA_DmSearch(&i 阅读全文
摘要:
inquiry流程一般持续有12s多,当inquiry完成的时候,设备端会上报一个Event: Inquiry Complete 上来,那协议栈是如何把这个事件上传到应用层的呢?本篇文章来分析一下其具体的流程。 看btu_hcif_inquiry_comp_evt 的实现: 继续看btm_proce 阅读全文
摘要:
蓝牙进程中有多个线程,其中HCI 线程是负责处理蓝牙主机端和控制器的数据处理和收发的工作。 本篇文章就是分析一下该线程的数据处理流程。 1.跟HCI相关的接口 首先看看hci的相关的接口:在hci_layer.c中: 主要是结构是:hal,packet_fragmenter以及vendor,下面看看 阅读全文
摘要:
蓝牙的通信分为host和controller,host端发送数据和命令到controller,controller 上传event以及数据到host端,这要求上下两端的通信要求状态一致性。 当发生状态不一致的时候,Bluetooth进程应该有预案去重新初始化蓝牙。 这篇文章就介绍一种case,当控制 阅读全文
摘要:
在蓝牙enable的过程中会进行多个线程的创建以及将线程与队列进行绑定的工作。该篇文章主要分析一下处理hci数据这个 线程。 剩下的enable 的工作会在这个函数中btu_task_start_up继续做: 这里绑定的含义就是当被绑定的队列里面有数据可以读写的时候,就会在该线程中处理,处理的函数就 阅读全文
摘要:
此篇文章简单分析一下蓝牙解除配对在协议栈中的工作流程。分析的协议栈版本是Android8.0 协议栈的接口都定义在bluetooth.cc这个文件中: 这里需要注意一下bt_bdaddr_t 是一个结构体,内部一个元素是数组。 进入btif_dm_remove_bond: 这个函数btif_tran 阅读全文