四极管:蓝牙HCI驱动学习笔记

数据结构

1、HCI_EVENT

表示蓝牙控制器硬件的状态。

enum HCI_EVENT {

  DEVICE_UP,           设备开启

  DEVICE_DOWN,                  设备关闭

  DEVICE_ERROR                  设备出现错误

};

头文件:bt_hcip.h

2、HCI_TYPE

表示数据包的类型

enum HCI_TYPE {
  COMMAND_PACKET = 1,           命令包
  DATA_PACKET_ACL = 2,          访问控制列表数据
  DATA_PACKET_SCO = 3,          面向连接同步数据
  EVENT_PACKET = 4,             事件
  ETYPE_FINISH = 5              包的结束标志
};

头文件:bt_hcip.h

3、HCI_PARAMETERS

表示HCI传输的接口

typedef struct __hci_parameters {
  unsigned int uiSize;
  unsigned int fInterfaceVersion;       传输层驱动的版本号
  int iMaxSizeRead;                     缓冲区大小,不包含头和尾
  int iMaxSizeWrite;
  int iReadBufferHeader;                预设值
  int iReadBufferTrailer;               
  int iWriteBufferHeader;               0到start间的字节数
  int iWriteBufferTrailer;              end到size间的字节数
  int uiFlags;                                   取非有效,否则无效
  int fHardwareVersion;                 0/1/2
  unsigned int uiResetDelay;            reset命令发出到下一命令执行之前的时间间隔
  unsigned int uiWriteTimeout;          写超时时间
  unsigned int uiDriftFactor;           时间
  int iScoWriteLowNumPackets;           0
  int iScoWriteNumPackets;              0
  int iScoWritePacketSize;              0/-1
  int iScoSampleSize;                   8/16
} HCI_PARAMETERS;               

头文件:bt_hcip.h

 

 API函数

1、HCI_CloseConnection

void HCI_CloseConnection(void);

功能:关闭栈和HCI传输之间的连接

注意:调用这个函数将会解锁读和写,硬件未初始化,释放所有资源空间包括缓冲区。如果驱动在DLL中,当函数返回时会被卸载。

2、HCI_OpenConnection(void);

int HCI_OpenConnection(void);

功能:在栈中的HCI层和蓝牙硬件建立连接,返回成功代表传输启动,这种情况发生时,栈会调用HCI_ReadHciParamerters函数。

注意:这个函数是用来开启硬件,初始化硬件,和硬件建立连接。返回true代表成功建立连接。这是个阻塞函数

3、HCI_ReadHciParameters

int HCI_ReadHciParameters(
  HCI_PARAMETERS* pParms
);
功能:获取蓝牙控制器的硬件特征,返回true表示成功完成,false表示发生错误。如果返回false,栈接口立即调用HCI_CloseConnection。
注意:这个函数可以先于打开一个连接被调用。

4、HCI_ReadPacket

int HCI_ReadPacket(
  HCI_TYPE* peType, 
  BD_BUFFER* pInBuffer
);
功能:从连接的设备上读包,返回true表示成功完成,false表示发生错误。如果返回false,栈接口立即调用HCI_CloseConnection。
注意:只有包被读或者发生错误才会返回,读的时候函数被阻塞,如果错误发生,蓝牙协议栈将会关闭。这个函数必须解锁并返回错误在调用HCI_CloseConnection后。

5、HCI_WritePacket

int HCI_WritePacket(
  HCI_TYPE eType, 
  BD_BUFFER* pOutBuffer
);
功能:向连接的设备发送包,返回true表示成功完成,false表示发生错误。如果返回false,栈接口立即调用HCI_CloseConnection。
注意:这个函数要申请一个空的缓冲区为包头和包尾预留足够的空间,这个空间是HCI_ReadHciParameters中要求的。发送的时候函数被阻塞,如果错误发生,蓝牙协议栈将会关闭。这个函数必须解锁并返回错误在调用HCI_CloseConnection后。

6、HCI_StartHardware

int HCI_StartHardware(void);

功能:初始化蓝牙硬件

注意:为了确保硬件开启,蓝牙栈可以调用此函数。驱动可能会重新尝试初始化硬件。这个函数必须调用回调函数HCI_TransportCallback来确认设备开启状态并且解除临时标志标识硬件能用性。

7、HCI_StopHardware

int HCI_StopHardware(void);

功能:释放蓝牙硬件

注意:这个函数被调用是用来解除存在的硬件连接,并且暂时地不提示硬件设备的到来。这个函数必须调用回调函数HCI_TransportCallback来确认设备关闭状态并且直到HCI_StartHardware被调用竖起临时标志标识硬件能用性。

8、HCI_SetCallback

typedef int (*HCI_TransportCallback)(HCI_EVENT eEvent, void* pEvent);
  int HCI_SetCallback(
  HCI_TransportCallback pfCallback
);
功能:获取HCI参数
注意:如果pfCallback是空,驱动必须准备卸载。这个函数只有栈当前的连接被关闭的时候才被调用并且设置pfCallback为空。如果这个参数不为空,就代表有硬件插入或者拔出。如果检测到硬件的插入或者拔出,传输层就会调用此函数为上层提供服务。
 

          头文件:bt_hcip.h

        包:Btd.lib

 

蓝牙传输管理器首先搜索pnp设备,像:pcmcia,usb等。如果没有发现pnp设备,它会搜索注册表中已有的设备。

  默认寄存器设置

HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\Transports BuiltIn\1 这个注册键指示了内置的传输驱动的设置,1代表优先级

HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\Transports\PnP\<GUID>这个指出pnp传输驱动的设置

guid键代表了传输驱动IClass注册键值。这个值是BthUniv关于传输的寄存器的设置。在打开一个设备连接前,这些设置将会被拷贝到HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\HCI目录下。

如果通过设定合适的编译变量来指定传输驱动,如SYSGEN_BTH_USB_ONLY,那么在os设计中,BthUniv就用不到了。在这种情况下,那个合适的传输驱动的注册器设置将会自动地拷贝到HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\HCI。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值