podman的host模式_參數説明

podman的host模式_數據_02

podman的host模式_podman的host模式_03

(1)Set Controller To Host Flow Control Command

podman的host模式_數據_04

這個命令是Host用來開啓/關閉從Controller到Host的流控(ACL數據和(e)SCO數據),如果不使用這個命令,ACL數據和(e)SCO數據的流控一般來説默認都是開啓的(不確定,一般都不下這個命令)。

參數説明:

Flow_Control_Enable(1 Octet):取值範圍如下

podman的host模式_參數説明_05

返回參數説明:

Status(1 Octet):0x00表示成功,其他值表示失敗

舉例説明:(暫時沒有)

(2)Host Buffer Size Command

podman的host模式_參數説明_06

這個命令是Host用來通知controller自己有多大的緩衝區(length * packets)可以被controller用來傳輸ACL和(e)SCO數據,然後controller會根據這個命令的配置來發送數據,這個命令是跟Host_Number_Of_Completed_Packets command一塊使用的:

第一步:host發送HCI Reset進行初始化

第二步:host發送HCI_Set_Controller_To_Host_Flow_Control設置支持/不支持哪幾種流控(不使用一般默認ACL和(e)SCO流控都開啓,一般都不用

第三步:Host發送HCI_Host_Buffer_Size通知controller可以使用的Host_ACL_Data_Packet_Length、Host_Synchronous_Data_Packet_Length、Host_Total_Num_ACL_Data_Packets、Host_Total_Num_Synchronous_Data_Packets

第四步:host發送ALC和(e)SCO數據分別不能超過Host_ACL_Data_Packet_Length和Host_Synchronous_Data_Packet_Length,發送一個packet,host端會記錄發送的數量,例如host發送了一個ACL數據包,則當前剩餘可發送的ACL數據包就是Host_Total_Num_ACL_Data_Packets – 1

第五步:host收到這一包ACL數據後,會進行處理,處理完以後,然後發送Host_Number_Of_Completed_Packets給controller,通知controller釋放了幾個packet,因為收到一包數據並且處理完了一包,所以就是1個packet

第六步:controller收到Host_Number_Of_Completed_Packets以後,因為參數是1,所以當前剩餘可發送的ACL數據包就是Host_Total_Num_ACL_Data_Packets – 1 + 1個數據包

第七步:重複第五步和第六步

注意:Host_ACL_Data_Packet_Length和Host_Synchronous_Data_Packet_Length中不包括HCI Data Packet header的長度

參數説明:

Host_ACL_Data_Packet_Length(2 Octet):host可以接收的最大ACL數據包長度

Host_Synchronous_Data_Packet_Length(1 Octet):host可以接收的最大(e)SCO數據包長度

Host_Total_Num_ACL_Data_Packets(2 Octet):host最大可以存儲ACL數據包的數量

Host_Total_Num_Synchronous_Data_Packets(2 Octet):host最大可以存儲(e)SCO數據包的數量

返回參數説明:

Status(1 Octet):0x00表示成功,其他值表示失敗

舉例説明:

Command如下:

podman的host模式_Data_07

0x01:表示HCI Command Packet

0x0C33:表示是HCI_Host_Buffer_Size command

指令的OGF是0x03即0000 11

OCF是0x0033即00 0011 0011

所以整個opcode是0000 1100 0011 0011即0x0C33

0x07:表示Parameter_Total_Length=7,即參數總長度是7個byte

0x069b:表Host_ACL_Data_Packet_Length為1691byte

0xff:表示Host_Synchronous_Data_Packet_Length為255byte

0x0014:表示Host_Total_Num_ACL_Data_Packets為20個數據包

0x000a:表示Host_Total_Num_Synchronous_Data_Packets為10個數據包

對應的Event:

Command Complete event:

podman的host模式_數據_08

0x04:表示HCI Event Packet

0x0e:表示這個event是command complete event

0x04:表示Parameter_Total_Length即4個byte

0x01:表示Num_HCI_Command_Packets

0x0C33:表示是HCI_Host_Buffer_Size command

0x00:表示status為0

(3)Host Number Of Completed Packets Command

podman的host模式_參數説明_09

這個命令是Host發送給controller,通知controller與上一個Host_Number_Of_Completed_Packets命令比較,每個Connection Handle已經處理完成多少個數據包,即有多少個數據包的空間被釋放。

注意:正常情況下,host發送Host_Number_Of_Completed_Packets命令以後不會收到任何event,但是如果Host_Number_Of_Completed_Packets命令中的某一個或者某幾個參數無效,那麼host會收到Command Complete event,其中status是Invalid HCI Command Parameters error code

參數説明:

Number_Of_Handles(1 Octet):表示一共有多少connection

Connection_Handle[i] (2 Octet):表示具體每個connection是多少

Host_Num_Of_Completed_Packets [i] (2 Octet):這個參數與Connection_Handle[i]的i相對應表示每個handle對應的處理完成的packet的數量

舉例説明:(暫時沒有)

(4)Set Event Mask Command

podman的host模式_podman的host模式_10

這個命令用來設置controller具體產生哪些events,“LE Meta Event” bit可以enable/disable所有的LE event

參數説明:

Event_Mask(8 Octet):具體取值如下:

podman的host模式_數據_11

podman的host模式_podman的host模式_12

podman的host模式_podman的host模式_13

podman的host模式_Data_14

podman的host模式_數據_15

舉例説明:

Command如下:

podman的host模式_數據_16

0x01:表示HCI Command Packet

0x0C01:表示是HCI_Set_Event_Mask command

指令的OGF是0x03即0000 11

OCF是0x0001即00 0000 0001

所以整個opcode是0000 1100 0000 0001即0x0C01

0x08:表示Parameter_Total_Length=8,即參數總長度是8個byte

0x3d bf ff ff ff ff ff ff:表示Event_Mask的值,具體參考上面的表,這個順序跟上面表格中的順序是一樣的

對應的Event:

Command Complete event:

podman的host模式_Data_17

0x04:表示HCI Event Packet

0x0e:表示這個event是command complete event

0x04:表示Parameter_Total_Length即4個byte

0x01:表示Num_HCI_Command_Packets

0x0C01:表示是HCI_Set_Event_Mask command

0x00:表示status為0

(5)Set Event Filter Command

podman的host模式_Data_18

這個命令可以用來設置event過濾器,hci reset以後,默認是沒有任何過濾器的,並且Auto_Accept_Flag=off(這個參數用來設置是否自動接受連接請求),如果event過濾器設置滿了,則會報錯:Memory Full error code

如果Filter_Type != 0 && Filter_Condition_Type != 0x00,每次發送這個命令就會增加一個event過濾器(不會覆蓋舊的過濾器)

如果Filter_Type == 0x00,發送這個命令會清空所有的event過濾器同時設置Auto_Accept_Flag=off,注意這時候只有Filter_Type一個參數,不能使用Filter_Condition_Type和Condition

如果Filter_Type != 0 && Filter_Condition_Type == 0x00,那麼只有清理這個Filter_Type相關的event過濾器

Filter_Type取值有3種:

A、Inquiry Result過濾器:用來過濾Inquiry Result events的(分為三種Filter_Condition_Type,可以設置其中的一種或者幾種)

    a、搜索過程中返回所有設備的response

    b、搜索過程中只返回有特定Class of Device的設備的response

    c、搜索過程中只返回有特定BD_ADDR的設備的response

B、Connection Setup過濾器:用來過濾連接的相關的event(Connection Complete或者Connection Request event)的(分為3種Filter_Condition_Type,可以設置其中的一種或者幾種)

a、允許來自所有設備連接

    b、只允許來自特定Class of Device的設備的連接

    c、只允許來自特定BD_ADDR的設備的連接

    這三種Filter_Condition_Type都有一個Condition:Auto_Accept_Flag,用來設置是否自動接受連接請求,自動接受則只會產生Connection Complete event,不自動接受則會先產生Connection Request event,host接受以後,連接建立完成,會再產生Connection Request event

注意:

A、即使設置了Auto_Accept_Flag=on,在Connection Complete event之前,還是會有Link Key Request、PIN Code Request和Link Key Notification event

B、當新的和舊的event過濾器衝突時,新的會覆蓋舊的,例如:Connection Setup過濾器時,其他參數都一樣,只有Auto-Accept_Flag不同,那麼新的過濾器會覆蓋舊的

參數説明:

Filter_Type1 Octet

Filter_Condition_Type1 Octet

Condition

0x00(清理所有event過濾器)

無(0 Octet)

無(0 Octet)

0x01(Inquiry Result)

0x00(返回所有設備的response)

無(0 Octet)

0x01(返回特定COD設備的response)

Class_of_Device(3 Octet)

默認值:0x000000返回所有設備的response

其他值:0xXXXXXX返回符合cod要求的設備的response

Class_of_Device_Mask(3 Octet)

對COD參數的某個bit位不感興趣則設置0

0x02(返回特定BD_ADDR設備的response)

BD_ADDR(6 Octet)設備地址

0x02(Connection Setup)

0x00(允許來自所有設備連接)

Auto_Accept_Flag(1 Octet)

0x01:Auto_Accept_Flag=off,不自動接受連接請求

0x02:Auto_Accept_Flag=on,自動接受連接請求(role switch disabled)

0x03 Auto_Accept_Flag=on,自動接受連接請求(role switch enabled)如果是(e)SCO,與0x02效果一樣

0x01(允許特定COD設備的連接)

Class_of_Device(3 Octet)

默認值:0x000000允許所有設備的連接請求

其他值:0xXXXXXX允許符合cod要求的設備的設備的連接請求

Class_of_Device_Mask(3 Octet)

對COD參數的某個bit位不感興趣則設置0,SCO連接時,如果COD不知道,則默認是接受連接的

Auto_Accept_Flag(1 Octet)

0x01:Auto_Accept_Flag=off,不自動接受連接請求

0x02:Auto_Accept_Flag=on,自動接受連接請求(role switch disabled)

0x03 Auto_Accept_Flag=on,自動接受連接請求(role switch enabled)如果是(e)SCO,與0x02效果一樣

0x02(允許特定BD_ADDR設備的連接)

BD_ADDR(6 Octet)設備地址

Auto_Accept_Flag(1 Octet)

0x01:Auto_Accept_Flag=off,不自動接受連接請求

0x02:Auto_Accept_Flag=on,自動接受連接請求(role switch disabled)

0x03 Auto_Accept_Flag=on,自動接受連接請求(role switch enabled)如果是(e)SCO,與0x02效果一樣

舉例説明:

Command如下:

podman的host模式_數據_19

0x01:表示HCI Command Packet

0x0C05:表示是HCI_Set_Event_Filter command

指令的OGF是0x03即0000 11

OCF是0x0005即00 0000 0101

所以整個opcode是0000 1100 0000 0101即0x0C05

0x02:表示Parameter_Total_Length=2,即參數總長度是2個byte

0x01:表示Filter_Type為Inquiry Result過濾器

0x00:表示搜索過程中返回所有設備的response

對應的Event:

Command Complete event:

podman的host模式_Data_20

0x04:表示HCI Event Packet

0x0e:表示這個event是command complete event

0x04:表示Parameter_Total_Length即4個byte

0x01:表示Num_HCI_Command_Packets

0x0C05:表示是HCI_Set_Event_Filter command

0x00:表示status為0

(6)Data Buffer Overflow Event

podman的host模式_Data_21

這個event表示Controller的數據緩衝區已經溢出

參數説明:

Link_Type(1 Octet): 表示ACL連接還是SCO連接,0x00表示SCO連接,0x01

表示ACL連接

舉例説明:(暫時沒有)

(7)Read Synchronous Flow Control Enable Command

podman的host模式_Data_22

這個命令用來獲取Synchronous_Flow_Control_Enable的值。這個值只能在沒有連接存在的情況下才能修改

返回參數説明:

Status(1 Octet):0x00表示成功,其他值表示失敗

Synchronous_Flow_Control_Enable(1 Octet):這個參數是用來設置對於SCO連接BR/EDR Controller是否發送Number Of Completed Packets events for synchronous Connection_Handles. 0x00表示disable,0x01表示enable

舉例説明:(暫時沒有)

(8)Write Synchronous Flow Control Enable Command

podman的host模式_Data_23

這個命令用來設置Synchronous_Flow_Control_Enable的值,這個值只能在沒有連接存在的情況下才能修改

參數説明:

Synchronous_Flow_Control_Enable(1 Octet):這個參數是用來設置對於SCO連接BR/EDR Controller是否發送Number Of Completed Packets events for synchronous Connection_Handles. 0x00表示disable,0x01表示enable

返回參數説明:

Status(1 Octet):0x00表示成功,其他值表示失敗

舉例説明:(暫時沒有)