ABCSP是CSR为自己的蓝牙芯片及协议栈软件所做的协议栈与芯片传输协议,适用于嵌入式系统。
整体来讲主要有4层:
Uplevel:包括Sequence ,Datagram;MUX;Packet integrity
SLIP;
Uart Driver.
Uart.
Uart,串口,物理层,负责将数据在Host与host-controller之间传输。
Uart driver。串口驱动层,负责串口配置及数据传输链路控制。
SLIP,传输层,负责数据流的传输控制
Uplevel,传输应用层,负责对包进行重组,完整性检查,解析包头,包体以及包序列的正确性。
封包结构
BCSP封包只有一种,在此类封包上即发送数据,也发送相应包,
通常结构为: 0xc0 Header Payload (Header) 0xc0
BCSP escape: BCSP封包均以0xc0开头和结尾,此部分不计入封包长度。
BCSP Header:
长度4,分别表示包概要,长度及使用通道,长度,校验和。
其中第一个字节包概要包括了,包类型(1bit)、CRC校验开关(1bit)、ACK值(3bits)和SEQ值(3bits)。
如果CRC校验开关为开,则包尾会含有两个字节的CRC校验字。 包体长度的计算通过第二字节的高4位与第三个字节的低四位左移4位后相加得出。 使用通道可以用来表示包的作用类型,
例如0通常用于ack包,1用于建立bcsp连接时的同步包,2~15用于普通的蓝牙数据和信令包,15以上为自定义。经常会用到的通道还有5==ACL,6==L2CAP,7==SCO等。
拿一个具体的包来举例:
0xc0,0×40,0×41,0×00,0×7e,0xda, 0xdc, 0xed, 0xed ,(0xa9,0×7a),0xc0
这个包用来作为蓝牙启动后与芯片的同步请求。
包类型:非可靠包
CRC校验:开
包长度:4
通道:1
校验和:0×74,对于同步包来讲校验和固定
包体:0xda, 0xdc, 0xed, 0xed 为固定内容,请求与芯片同步通信。
CRC校验字:0xa9 0×7a
如果包体内容为HCI信令,则在这里还会包有HCI包头,通常HCI包中会含有各种蓝牙Profile封包,其中HCI头占4个字节,其中会指明包体长度及类型。
HCI封包的结构及分析待以后再谈。
附一些简单的小tips:
1、 ACK包seq field = 0, chan = 0, rel = 0,
2、 ACK包头一字节通常为40,48,50,58,60,68,70,78分别表示了从ACK0到ACK7.
3、 包头第一字节高位如果大于等于C,则为可靠CRC校验包,
4、 包头的第一字节低位如果大于等于8,则ACK值一定大于等于1,而SEQ值等于低位减去8.
以上都是很简单的计算过程,为了减少在分析包时的繁琐,可以直接记下。
下一步,将对ABCSP的工作流程进行学习,分析它发送、接收,以及包序列校验等过程。
原文地址:http://www.since1985i.com/study/bluetooth-abcsp-packets.html