Bluetooth 蓝牙介绍(七):低功耗蓝牙HCI规范

HOST CONTROLLER INTERFACE(HCI) 功能规范

如果Controller支持 <Table 3.2: Legacy and extended advertising commands and events> 表中列出的任何传统广播命令或事件,并且还支持 LE 功能(扩展广播),则它应支持表中同一行中相应的扩展广播命令或事件。

如果自上次上电或复位以来,Host 曾经发出过传统广播命令然后发出扩展广播命令,或者曾经发出过扩展广播命令然后发出传统广播命令,则控制器应返回错误 不允许代码命令 (0x0C)。

Host 不应向支持 LE 功能(扩展广播)的控制器发出旧命令。

  • 如果Controller支持 BR/EDR 或 AMP 上的 ACL 连接,但不支持 LE 上的连接状态,那么对于它支持的每个具有句柄参数的命令或事件,它应仅支持 LE 以外的受支持传输上的基础功能。(此类Controller将不支持创建 LE 连接的命令或事件,因此所有有效句柄将代表 BR/EDR 或 AMP 连接)。
  • 如果控制器同时支持 BR/EDR 和 AMP,但仅支持这些传输之一上的测试模式,则它应仅支持 HCI_Enable_Device_Under_Test_Mode 命令中该传输的功能。
  • 如果对给定支持的传输的要求评估为 Mandatory,或评估为 Optional 并且控制器支持该传输上的命令或事件,则该传输应完全支持底层功能。否则,控制器不应支持该传输的基础功能,并且
    • 对于Command,如果主机发出带有 Handle 或 Connection_Handle 参数的命令,该命令引用该传输上的连接,则控制器应返回错误代码 Unsupported Feature or Parameter Value (0x11,参考 BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 1, Part F)。
    • 对于一个Event,控制器不应使用 Connection_Handle 参数生成该事件,该参数引用该传输上的连接。

HCI流量控制

数据流控制应在从 Host 到 Controller的方向上使用,以避免携带ACL数据的Controller数据缓冲区溢出,从而发往未响应的远程设备(使用 Connection_Handle)。

Host 管理 Controller 的数据缓冲区。对于主控制器,基于数据包的流量控制是默认设置。对于 AMP 控制器,基于数据块的数据流控制是 ACL 流量的默认设置。

根据 Vol 4, Part E 第 4.2 节,可以在主控制器中使用从控制器到主机的数据流控制。命令流控制在第 4.4 节和第 4.5 节中介绍。

HOST TO CONTROLLER DATA FLOW CONTROL

Host 到 Controller数据流控制定义了两种数据流控制方法:“基于packet-based”的流控制和“基于data-block-based”的流控制,称为缓冲区管理。原理可以参考这篇文章

当至少有一个连接到另一个设备时,或者在 BR/EDR 控制器上处于本地环回模式时,Controller 应使用 HCI_Number_Of_Completed_Packets 事件来控制来自Host的数据流。此事件包含一个 Connection_Handles 列表以及自上次事件返回以来已完成(传输、刷新或循环回主机)的 HCI 数据包的相应数量。

Host 根据此事件中返回的信息 和 HCI_LE_Read_Buffer_Size 命令(可选) 为以下 HCI 数据包选择 Connection_Handles。

每次发送一个 HCI / HCI ISO数据包时,Host 应假定 Controller 中相应链路类型(ACL、SCO 或 eSCO)的空闲缓冲区空间减少了一个 HCI / HCI ISO数据包。

当Controller完成一个或多个 HCI 数据包 和 HCI ISO 数据包(可选)时,它应向Host发送 HCI_Number_Of_Completed_Packets 事件,直到它最终报告所有未决的 HCI 数据包已完成。发送此事件的频率是特定于制造商的。

注意:如果同步流控制被禁用,HCI_Number_Of_Completed_Packets 事件将不会报告同步 Connection_Handles。

Controller 还应按照从Host 接收到的相同顺序,在空口传输从Host接收到的给定句柄的数据。对于相应的 Connection_Handle,从另一个设备在空中接收到的数据应以 HCI 数据包的形式发送到Host,其顺序与接收顺序相同。这意味着应该为每个 Handle 基础单独决定调度。

对于每个单独的句柄,数据的顺序不得与创建数据的顺序不同。HCI 不应在长度为 27 个八位字节或更少的 LE-U 逻辑链路上对 L2CAP 消息进行分段。

CONTROLLER TO HOST DATA FLOW CONTROL

在一些实现中,在从Controller 到 Host 的方向上也可能需要流量控制。

HCI_Set_Host_Controller_To_Host_Flow_Control 命令可用于打开或关闭该方向的流量控制。

Host 使用 HCI_Host_Number_Of_Completed_Packets 命令的方式与 Controller 使用 HCI_Number_Of_Completed_Packets 事件的方式完全相同,如本节前面所述。

HCI_Host_Number_Of_Completed_Packets 命令是一个特殊的命令,不使用命令流控制,并且可以在有连接或本地环回模式时随时发送。命令完成后,该命令也没有事件。这使得流控可以在两个方向上以完全相同的方式工作,并且不会干扰正常命令的流程。

断连行为

当Host 接收到 HCI_Disconnection_Complete HCI_Disconnection_Physical_Link_Complete 或 HCI_Disconnection_Logical_Link_Complete 事件时,Host 应假定已发送到Controller 以获取返回句柄的所有未确认 HCI 数据包已被刷新,并且相应的数据缓冲区已被释放

在断开连接事件之前,Controller不必在 HCI_Number_Of_Completed_Packets 事件中通知Host这件事,AMP 控制器也不必在 HCI_Number_Of_Completed_Data_Blocks 事件中通知Host这件事(并且之后不应这样做,因为 Connection_Handle 没有更有效)。

如果在从 Controller 到 Host 的方向上也启用了流控制,则 Controller 可以在发送 HCI_Disconnection_Complete 事件后,假设 Host 将在接收到 HCI_Disconnection_Complete 事件时为发送的 Handle 刷新其数据缓冲区。Host 不必在 HCI_Host_Number_Of_Completed_Packets 命令中将此通知Controller。

COMMAND FLOW CONTROL

在初始上电和复位后,主机应最多发送一个未完成的 HCI 命令数据包,直到接收到 HCI_Command_Complete 或 HCI_Command_Status 事件。

HCI_Command_Complete 和 HCI_Command_Status 事件包含一个名为 Num HCI Command Packets 的参数,该参数指示当前允许Host发送到Controller的 HCI 命令数据包的数量。

Controller可以缓存一个或多个 HCI 命令数据包,但Controller应按照接收到的顺序开始执行命令。Controller可以在完成之前的命令之前开始执行命令。因此,命令并不总是按照它们启动的顺序完成。

为了向Host 指示 Controller 已准备好接收 HCI 命令数据包,Controller可以生成 HCI_Command_Complete 或 HCI_Command_Status 事件,其中命令操作码设置为 0x0000,并且 HCI_Num_HCI_Command_Packets 事件参数设置为 1 或更多。

命令操作码 0x0000 是一个特殊值,表示此事件与Host 发送的命令无关。

Controller 可以随时发送带有命令操作码 0x0000 的 HCI_Command_Complete 或 HCI_Command_Status 事件,以更改Host 在等待之前可以发送的未完成 HCI 命令数据包的数量。如果Controller生成 HCI_Command_Complete 或 HCI_Command_Status 事件,并将 Num HCI 命令包事件参数设置为零,则主机应停止发送命令。对于大多数命令,当Controller完成命令时,应向主机发送 HCI_Command_Complete 事件。

某些命令在后台执行,完成后不会返回 HCI_Command_Complete 事件。相反,Controller应在开始执行命令时将 HCI_Command_Status 事件发送回Host。当与命令相关的动作完成时,与命令相关的事件应由Controller发送到Host。

如果命令没有开始执行(例如,如果存在参数错误或当前不允许命令),则应返回 HCI_Command_Status 事件,并在 Status 参数中返回相应的错误代码,以及与发送的事件相关联的事件命令不得返回。

当连接断开并且存在与该连接相关的未完成命令时,Controller可以将与每个命令相关联的事件返回给Host。

每个此类事件应具有非零状态并应在 HCI_Disconnection_Complete 事件之前。在 HCI_Disconnection_Complete 事件之后不应发送该 Connection_Handle 的任何事件。

COMMAND ERROR HANDLING

除非在命令的描述中另有明确说明,否则任何参数中的任何错误都意味着该命令将不会开始执行;它只会返回一个错误代码。如果有多个错误代码适用,则实现应选择其中之一。

  • 如果返回 HCI_Command_Complete 事件的命令发生错误,则应在状态参数中报告该错误。
  • 如果返回 HCI_Command_Status 事件和特定于命令的完成事件的命令发生错误,则有两种可能;发生的情况取决于具体的错误。
  • 如果错误是 1,这意味着命令将不会开始执行(包括参数中的任何错误),则错误应作为 HCI_Command_Status 事件中的非零状态参数返回,并且不会返回完成事件。
  • 如果在 HCI_Command_Status 事件产生后才检测到错误,则 HCI_Command_Status 事件的状态参数应设置为零,错误应在完成事件的状态参数中返回。
  • 如果返回 HCI_Command_Complete 事件的命令发生错误,则返回参数字段可能仅包含为该命令指定的某些返回参数。解释错误原因的状态参数是第一个返回参数,应始终返回。
  • 如果在Status 参数之后有一个Handle 参数或BD_ADDR 参数,这个参数也应该被返回,以便Host 可以识别HCI_Command_Complete 事件属于命令的哪个实例。在这种情况下,Handle 或 BD_ADDR 参数的值应与相应命令参数中的值完全相同。

发生错误时是否返回更多参数取决于具体实现;如果不是,则事件将比它们更短。以上也适用于在其完成事件中将特定于命令的完成事件与状态参数相关联的命令,表 4.1 中显示的例外,它指示唯一有效的参数(状态除外)。

其他参数的有效性同样是特定于该组中失败命令的实现,但在任何情况下都应发送。
在这里插入图片描述
注意:HCI_Read_BD_ADDR 命令的 BD_ADDR 返回参数不用于标识 HCI_Command_Complete 事件属于 HCI_Read_BD_ADDR 命令的哪个实例。Controller在出现错误时返回此参数是可选的。


LMP TRANSACTION 和 LL PROCEDURE COLLISIONS

如果Host 发出返回成功 HCI_Command_Status 事件的命令,但随后触发 LMP(Link Manager Protocol) transaction / 事务 或 链路层程序,该程序以错误代码LMP Error Transaction Collision / LL Procedure Collision (0x23)终止,因为对等方也启动了相同的事务或程序,则Controller应采取以下行动之一:

  • Controller应等待对等发起的事务或过程完成并使用结果生成特定于命令的完成事件。在这种情况下,冲突不会报告给Host。
  • Controller应生成带有错误代码LMP Error Transaction Collision / LL Procedure Collision (0x23)的命令特定完成事件。

LE Host 和 Controller同步

为了使在Host 中接收到的同步数据的时序与在Controller中从同步物理通道接收到的同步数据的时序同步,Controller 可以在每个 HCI 中包含一个时间戳(参见 [Vol 6] Part G, Section 1) ISO 数据包。

类似地,Host 可以在发送到Controller的每个 SDU 中包含一个时间戳(参见 [Vol 6] Part G,Section 1)。Host 可以随时使用 LE 读取 ISO TX 同步命令读取最后一个 SDU 的时间戳和数据包序列号。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值