第一部分:HCI协议(四)HCI flow control的具体实现
四、HCI flow control的具体实现:
1、从host到Controller的数据流控分为两种:Packet-based Data Flow Control和Data-Block-Based Data Flow Control
对于BR/EDR、LE 或者BR/EDR/LE controller来说packet based flow control是默认的,对于AMP control来说data block based flow control是默认的;数据流控机制使用Write Flow Control Mode command来进行选择,因为我们用的是BR/EDR、LE 或者BR/EDR/LE controller,所以我们蓝牙不需要使用这个命令,这里只介绍packet based flow control
如果BR/EDR/LE controller为ACL数据实现了单独的缓冲区
A、host应该使用LE Read Buffer Size command来确定ACL data的缓冲区大小(LE-U logical link);
B、host应该对每个缓冲区使用单独的packet based flow control;
C、ACL 数据包里面的Connection_Handle用来确定使用哪个缓冲区以及使用哪个logical link(ACL-U, ASB-U, or LE-U);
如果没有实现单独的缓冲区,所有的ACL数据应该使用下面的BR/EDR的缓冲区控制机制并且只需要使用Connection_Handle确定使用哪个logical link(ACL-U, ASB-U, or LE-U)
这里只记录Packet-based Data Flow Control
初始化过程:
支持LE
(1)使能packet based flow control机制,因为我们使用的是BR/EDR、LE 或者BR/EDR/LE controller这一步可以不用。
(2)LE Read Buffer Size command,返回的参数LE_ACL_Data_Packet_Length用来确定HCI ACL Data Packets的最大size(不包括包头),还有一个参数Total_Num_LE_ACL_Data_Packets,用来确定HCI ACL Data Packets的总数
(3)如果HCI ACL Data Packets的总数的总数是0,那么使用Read Buffer Size command确定缓冲区大小,用这个缓冲区来发送所有的BR/EDR和LE HCI ACL Data Packets
不支持LE
(1)使能packet based flow control机制,因为我们使用的是BR/EDR、LE 或者BR/EDR/LE controller这一步可以不用。
(2)Read Buffer Size command使用返回的两个参数ACL_Data_Packet_Length
和Synchronous_Data_Packet_Length来确定HCI ACL 和 synchronous Data Packets的最大size(不包括包头),另外两个参数Total_Num_ACL_Data_Packets和Total_Num_Synchronous_Data_Packets来确定HCI ACL和synchronous Data Packets的总数
流控过程:
(1)controller发送Number Of Completed Packets event用来控制host发送数据的流控,这个event包含Connection_Handles和与Connection_Handles对应的Num_Completed_Packets (这个数量是与前一次Number Of Completed Packets event进行对比的)
(2)host根据Number Of Completed Packets event来计算当前缓冲区的使用情况,host发送数据hci数据包之前要确定controller有空余的空间
例如:
A、使用Read Buffer Size command获取到支持7个ACL包,每个包是1024byte
B、发送第一个HCI data packet后,此时还可以发送6个HCI data packets
C、过一会收到一个Number Of Completed Packets event,Num Complete Packets是1,表示刚才用掉的一个HCI Data packet被释放了,此时还可以发送7个HCI data packets
注意:host根据create hci数据包的顺序发送hci数据包,controller根据从host接收到的数据包的顺序发送空中包,同样controller接收到的数据包也应该根据对应的Connection_Handle以及接收顺序发送给host
注意:HCI在LE-U logical link上传输L2CAP message应该大于27 octets。
2、从CONTROLLER到HOST的数据流控
使用HCI_Set_Host_Controller_To_Host_Flow_Control使能controller到host的流控
初始化过程:
使用HCI_Host_Buffer_Size通知controller关于host的内存情况Host_ACL_Data_Packet_Length和Host_Synchronous_Data_Packet_Length分别表示host端ACL数据包长度和Synchronous数据包长度;Host_Total_Num_ACL_Data_Packets和Host_Total_Num_Synchronous_Data_Packets分别表示host端ACL数据包最大数量和Synchronous数据包最大数量。
流控过程:
Host发送HCI_Host_Number_Of_Completed_Packets通知controller释放了多少packets的空间
3、断开连接时流控的具体规定
当host到controller的流控被使用时,当host接收到HCI_Disconnection_Complete、HCI_Disconnection_Physical_Link_Complete 或者HCI_Disconnection_Logical_Link_Complete event后,host应该认为controller里面与相关handle有关的packetbuffer都已经被释放,而且controller也不会发送HCI_Number_Of_Completed_Packets event给host
当controller到host的流控被使用时,controller在发送HCI_Disconnection_Complete以后,controller同样会认为与相关handle有关的packetbuffer都已经被释放,而且host也不会发送HCI_Host_Number_Of_Completed_Packets command给controller