linux蓝牙驱动代码阅读笔记
linux 蓝牙操作

在Linux系统中使用蓝牙功能的基本方法首先确定硬件上有支持蓝牙的设备,然后运行如下命令,就可以开到我们的蓝牙设备了:代码如下:lsusb运行hciconfig可以看到:从上图可以看出,我们的蓝牙设备是hci0运行hcitooldev可以看到我们的蓝牙设备的硬件地址运行hcitoo --help 可以查看更多相关命令然后我们激活它:代码如下:sudohciconfig hci0 up要注意的是,激活前蓝牙必须是打开的,否则会出现如下错误:然后我们开始扫描了:代码如下:hcitool scan可以看到,发现了我手机的蓝牙了~~然后我们要开始连接了,连接阶段使用的主要命令是rfcomm:运行rfcomm --help 可以查看用法首先需要绑定目的蓝牙设备:代码如下:sudorfcomm bind /dev/rfcomm0 E0:A6:70:8C:A3:02注意:上面的这个地址是目的蓝牙设备的硬件地址接着我们连接它:代码如下:sudo cat >/dev/rfcomm0这是目的蓝牙主机就会弹出一个对话框要求输入pin码,随便输入一个,然后主机就会弹出一个对话框,只要输入的和刚才一致就可以通过验证。
之后我们发现我的手机已经显示了成功配对的标记了。
在配对完成之后我们需要删除绑定(否则在下次使用时会提示设备正忙),命令如下:代码如下:sudorfcomm release /dev/rfcomm0在 Linux 下使用 rfkill 软开关蓝牙及无线功能很多计算机系统包含无线电传输,其中包括Wi-Fi、蓝牙和3G设备。
这些设备消耗电源,在不使用这些设备时是一种能源浪费。
RFKill 是Linux内核中的一个子系统,它可提供一个接口,在此接口中可查询、激活并取消激活计算机系统中的无线电传输。
当取消激活传输时,可使其处于可被软件重新激活的状态(软锁定)或软件无法重新激活的位置(硬锁定)。
RFKill 为内核子系统提供应用程序编程界面(API)。
基于Linux的蓝牙无线模块USB驱动程序的开发

慈 中图分类号: 333 T 3. P
文献标识码: A
ቤተ መጻሕፍቲ ባይዱ
文章编号: 7 — 9420 ) — 1 — 7 1 1 02 ( 80 04 0 6 0 1 3
De eo me to n x b s d US Drv r )t l e e t o u e v lp n fLi u - a e B ie s、i B u te h M d ls lh ,
Ab ta t 1i p rd s u s ste d v lp n fUS d vc rv rp o rm fte Bleo t r ls e sr c :1 1spa e ic se h e eo me to B e ie d ie rg a o u to wi e sr — h h e c iea d d h e d l n te L n x o e ain s se e vrn n .a d c n l d s a d s mmaie e ev - — e v rmo u e i h i u p rto y tm n o me t n o cu e n i n u rz s t h d v lp n ft eUS d vc rv rp g a i n xe vrn n . e eo me to h B e ed ie r rm n Liu n o me t i o i e d v lp d mo ue C r a i e eo e d l a mo ee s — n
U B 机 控 制 器 S主
u 嗽 备 控 制 器 S 蓝 牙无 线模 块
接 中低 档 外设 , 传 输速 率 最 高可 达 1M / 。 1 其 2 b s图 为 U B作 为 蓝牙无 线模 块与 主 机传 输 层接 口时 主 S 机栈 与蓝牙 栈 的连接 情况 .
蓝牙模块c语言代码

蓝牙模块的C语言代码取决于你使用的蓝牙模块型号以及你的具体需求。
不同的蓝牙模块可能使用不同的硬件接口和通信协议。
下面是一个简单的示例,展示了如何使用蓝牙模块进行数据传输。
请注意,这只是一个基本的示例,你需要根据你的具体硬件和需求进行修改。
首先,你需要包含必要的头文件和定义一些常量:c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fcntl.h>#include <termios.h>#define BLUETOOTH_DEVICE "/dev/rfcomm0" // 蓝牙设备文件路径#define BAUDRATE B9600 // 波特率接下来,你可以编写一个函数来初始化蓝牙设备:cint initialize_bluetooth() {int fd;struct termios options;// 打开蓝牙设备文件fd = open(BLUETOOTH_DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);if (fd == -1) {perror("open_port: Unable to open /dev/rfcomm0");return -1;}// 配置蓝牙设备fcntl(fd, F_SETFL, 0);// 获取当前配置tcgetattr(fd, &options);// 设置波特率cfsetispeed(&options, BAUDRATE);cfsetospeed(&options, BAUDRATE);// 设置数据位、停止位和校验位options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CSIZE;options.c_cflag |= CS8;// 设置流控制options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);// 设置输入模式options.c_iflag &= ~(IXON | IXOFF | IXANY);// 设置输出模式options.c_oflag &= ~OPOST;// 应用配置tcsetattr(fd, TCSANOW, &options);return fd;}然后,你可以编写一个函数来发送数据:cint send_data(int fd, const char *data) {int bytes_written = write(fd, data, strlen(data));if (bytes_written < 0) {perror("send_data: Error writing to socket");return -1;}return 0;}最后,你可以编写一个函数来接收数据:cint receive_data(int fd, char *buffer, int buffer_size) { int bytes_read = read(fd, buffer, buffer_size - 1);if (bytes_read < 0) {perror("receive_data: Error reading from socket");return -1;}buffer[bytes_read] = '\0'; // 添加字符串结束符return bytes_read;}现在,你可以在main函数中使用这些函数:cint main() {int fd;char buffer[256];// 初始化蓝牙设备fd = initialize_bluetooth();if (fd == -1) {printf("Failed to initialize bluetooth\n");return 1;}// 发送数据if (send_data(fd, "Hello, bluetooth!") == -1) {printf("Failed to send data\n");close(fd);return 1;}// 接收数据if (receive_data(fd, buffer, sizeof(buffer)) == -1) {printf("Failed to receive data\n");close(fd);return 1;}printf("Received data: %s\n", buffer);// 关闭蓝牙设备close(fd);return 0;}这个示例展示了如何使用蓝牙模块进行简单的数据传输。
Bluez的编译过程与方法

编译前的目录位置说明
• • • • 1、指定安装位置 /home/hdl/autobuild/hdl/Bluetooth/lib 2、Linux-2.6.28内核之include /home/hdl/autobuild/hdl/test/kernel/Linux2.6.28/include
编译过程与方法
• 解决办法: • bluez-4.48\network\Makefile中去掉`-fvisibility=hidden'
编译过程遇到问题及解决办法
• • • • • • • • • • • • • • • 编译bluez-4.48 CC main.lo CC manager.lo CC server.lo CC bridge.lo CC connection.lo CC common.lo CCLD Making all in serial CC main.lo cc1: error: unrecognized option `-fvisibility=hidden' make[2]: *** [main.lo] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2 [hdl@vsserver1 bluez-4.48]$
编译前说明及注意事项
• 1、四种方案均可,所选库根据编译器及库 之间的兼容性而定,库版本并不唯一 • 2、所选各库版本尽量偏低,避免带来意想 不到的错误,导致无法编译通过 • 3、dbus库可依赖expat或libxml,默认是 expat,建议用expat • 4、glib库版本过高,可能会用到zlib库 • 5、bluez-4.x以上版本,编译时需要用到 linux内核中的/include/linux/sockios.h
课题:BCM94352HMB蓝牙BCM20702A0在Ubuntu 14.04下的驱动方法

先确认蓝牙的产商编号(idVendor)和产品编号(idProduct),Linux下可通过lsusb或usb-devices命令查看,Windows下在设备管理里查看,如下图所示。
我的蓝牙idVendor为0x13d3,idProduct为0x3404。
Broadcom的大部分蓝牙设备都需要一个产商的固件补丁(RAM patch file),Linux下叫firmware,BCM20702A0也不例外。
在电脑提供商提供的Windows驱动安装包里可以找到类似“BCM20702A1_001.002.014.1443.1479.hex”这样的文件,就是固件内存补丁了,里面保存着十六进制的文本,可以打开来看。
怎么找到自己的蓝牙设备的固件内存补丁文件呢?方法一、在Windows驱动安装包里找到驱动的信息文件(.inf),如我的是“bcbtums-win8x64-brcm.inf”。
打开查找“USB\VID_13D3&PID_3404”(产商编号和产品编号按自己的),找到类似如下信息:%AzBtModule.DeviceDesc%=RAMUSB3404, USB\VID_13D3&PID_3404然后再查找“[RAMUSB3404”,会找到类似如下信息:[RAMUSB3404.CopyList]bcbtums.sysbtwampfl.sysBCM20702A1_001.002.014.1443.1479.hex看到“.hex”的文件名了吧,就是它了。
方法二、在Windows的设备管理器里查看,如下图所示。
把“.hex”文件保存起来,等下会用到。
现在重启进入Ubuntu 14.04操作系统……Ubuntu下的操作以命令为主。
第一步,修改内核,以kernel 3.13为例。
cd ~mkdir kernelcd kernelapt-get build-dep linux-image-`uname -r`apt-get source linux-image-`uname -r`cd linux-3.13.0/drivers/bluetooth/然后编辑代码文件btusb.c,找到BCM20702A0的设备编号代码,把/* Broadcom BCM20702A0 */{ USB_DEVICE(0x0b05, 0x17b5) },{ USB_DEVICE(0x0b05, 0x17cb) },{ USB_DEVICE(0x04ca, 0x2003) },{ USB_DEVICE(0x0489, 0xe042) },{ USB_DEVICE(0x13d3, 0x3388), .driver_info = BTUSB_BCM_PATCHRAM }, { USB_DEVICE(0x13d3, 0x3389), .driver_info = BTUSB_BCM_PATCHRAM }, { USB_DEVICE(0x413c, 0x8197), .driver_info = BTUSB_BCM_PATCHRAM }, { USB_DEVICE(0x413c, 0x8143), .driver_info = BTUSB_BCM_PATCHRAM },改为/* Broadcom BCM20702A0 */{ USB_DEVICE(0x13d3, 0x3404), .driver_info = BTUSB_BCM_PATCHRAM }, { USB_DEVICE(0x0b05, 0x17b5) },{ USB_DEVICE(0x0b05, 0x17cb) },{ USB_DEVICE(0x04ca, 0x2003) },{ USB_DEVICE(0x0489, 0xe042) },{ USB_DEVICE(0x13d3, 0x3388), .driver_info = BTUSB_BCM_PATCHRAM }, { USB_DEVICE(0x13d3, 0x3389), .driver_info = BTUSB_BCM_PATCHRAM }, { USB_DEVICE(0x413c, 0x8197), .driver_info = BTUSB_BCM_PATCHRAM }, { USB_DEVICE(0x413c, 0x8143), .driver_info = BTUSB_BCM_PATCHRAM },保存修改,然后编译btusb模块,执行:make -C /lib/modules/`uname -r`/build M=`pwd` modules正常就会编译出btusb.ko文件。
BLE蓝牙 4.0 学习笔记

蓝牙4.0 BLE center与peripheral建立连接绑定过程 (2)蓝牙4.0 BLE peripheral 广播设置 (7)蓝牙4.0 BLE 数据传输(一) (11)蓝牙4.0 BLE 数据传输(二) (12)蓝牙4.0 BLE 数据传输(三) (16)蓝牙4.0 BLE 数据传输(四) (19)蓝牙4.0 BLE 数据传输(五) (23)蓝牙4.0 BLE 程序设计相关问题解答(转载) (25)蓝牙4.0 BLE SimpleBLEPeripheral_添加新CHAR值及UUID (33)蓝牙4.0 BLE peripheral 广播设置学习笔记(转载) (45)蓝牙4.0 BLE key处理过程看任务、事件、消息机制 (50)CC254x 内部存储结构FLASH (53)蓝牙4.0 BLE FLASH 操作 (58)蓝牙4.0 BLE center与peripheral建立连接绑定过程蓝牙主机从机建立连接绑定过程center与simplePeripheral建立连接过程center首先进行osal_init_system()初始化各个任务,SimpleBLECentral_Init->osal_set_event( simpleBLETaskId, START_DEVICE_EVT );进入SimpleBLECentral_ProcessEvent()调用VOID GAPCentralRole_StartDevice( (gapCentralRoleCB_t *) &simpleBLERoleCB );//当初始化完成,会发送GAP_DEVICE_INIT_DONE_EVENT由于注册了simpleBLERoleCB函数,因此发送的event由simpleBLERoleCB函数接收static void simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )此时pEvent->gap.opcode =GAP_DEVICE_INIT_DONE_EVENT,相应信息存储于pEvent中typedef union{gapEventHdr_t gap; //!< GAP_MSG_EVENT and status.gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure.gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure.gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure.gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure.gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure.} gapCentralRoleEvent_t;联合体,只有deviceInfo里面的数据是正确的typedef struct{osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and statusuint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENTuint8 devAddr[B_ADDR_LEN]; //!< Device's BD_ADDRuint16 dataPktLen; //!< HC_LE_Data_Packet_Lengthuint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets} gapDeviceInitDoneEvent_t;能获得如设备地址等信息设备初始化完成通过串口发送'1'触发设备发现进行设备扫描GAP_DEVICE_INFO_EVENT 0x0D //!< Sent during the Device Discovery Process when a device is discovered.GAP_DEVICE_DISCOVERY_EVENT 0x01 //!< Sent when the Device Discovery Process is complete.当发现一个设备时,触发一个设备info事件同样是在simpleBLECentralEventCB 处理此时pEvent改变为deviceInfo可以获得广告设备的类型,地址。
linux下使用蓝牙设备bluetoothhciconfighcitool
linux下使用蓝牙设备bluetoothhciconfighcitoollinux下使用蓝牙设备 bluetooth hciconfig hcitool2012-02-14 13:261 加载蓝牙模块需要加载的模块有bluetooth、 hci_uart、 l2cap、 rfcomm、sco、 bnep,位于/lib/modules/`uname-r`/kernel/net/bluetooth 和/lib/modules/`uname -r`/kernel/driver/bluetooth注:可以使用 bt_ins.sh 与 bt_rm.sh 两个脚本,进行蓝牙模块的添加与删除#!/bin/bash#name: bt_in.sh#author:young#date: 2007-01-16#decription: insmod for bt modulesinsmod /lib/modules/`uname -r`/kernel/net/bluetooth/bluetooth.koinsmod /lib/modules/`uname -r`/kernel/net/bluetooth/l2cap.koinsmod /lib/modules/`uname -r`/kernel/net/bluetooth/sco.koinsmod /lib/modules/`uname -r`/kernel/net/bluetooth/bnep/bnep.koinsmod /lib/modules/`uname -r`/kernel/net/bluetooth/rfcomm/rfcomm.koinsmod /lib/modules/`uname -r`/kernel/drivers/bluetooth/hci_uart.kolsmod | grep bluetooth#!/bin/bash#name: bt_rm.sh#author:young#date: 2007-01-16#description: rmmod bt modules from kernelrmmod hci_uartrmmod bneprmmod scormmod rfcommrmmod l2caprmmod bluetoothlsmod2 重启Bluetooth系统服务# /etc/init.d/bluetooth restartRestarting Bluetooth services: [ OK ]3 邦定tty设备# hciattach -n /dev/ttyUSB0 ericsson 57600 &注: 成功后就不要再次邦定tty设备了命令hciconfig提供有关本地设备的详细信息。
BCM94352HMB蓝牙BCM20702A0在Ubuntu 14.04下的驱动方法
BCM94352HMB蓝牙BCM20702A0在Ubuntu 14.04下的驱动方法作者:秋忆出处:/qiuyi21/p/bcm20702a0_ubuntu.html先确认蓝牙的产商编号(idVendor)和产品编号(idProduct),Linux下可通过lsusb或usb-devices命令查看,Windows下在设备管理里查看,如下图所示。
我的蓝牙idVendor为0x13d3,idProduct为0x3404。
Broadcom的大部分蓝牙设备都需要一个产商的固件补丁(RAM patch file),Linux下叫firmware,BCM20702A0也不例外。
在电脑提供商提供的Windows驱动安装包里可以找到类似“BCM20702A1_001.002.014.1443.1479.hex”这样的文件,就是固件内存补丁了,里面保存着十六进制的文本,可以打开来看。
怎么找到自己的蓝牙设备的固件内存补丁文件呢?方法一、在Windows驱动安装包里找到驱动的信息文件(.inf),如我的是“bcbtums-win8x64-brcm.inf”。
打开查找“USB\VID_13D3&PID_3404”(产商编号和产品编号按自己的),找到类似如下信息:%AzBtModule.DeviceDesc%=RAMUSB3404, USB\VID_13D3&PID_3404然后再查找“[RAMUSB3404”,会找到类似如下信息:[RAMUSB3404.CopyList]bcbtums.sysbtwampfl.sysBCM20702A1_001.002.014.1443.1479.hex看到“.hex”的文件名了吧,就是它了。
方法二、在Windows的设备管理器里查看,如下图所示。
把“.hex”文件保存起来,等下会用到。
现在重启进入Ubuntu 14.04操作系统……Ubuntu下的操作以命令为主。
第一步,修改内核,以kernel 3.13为例。
Linux蓝牙协议栈的USB设备驱动
1 概 述
蓝牙 技术 是开放 式通信规范 ,而 Ln x是开放源码的操 iu 作系 统 。廉价 设备 与免费 软件 的结合 ,促进 了蓝牙 技术 和
给出实现蓝牙设备驱动 的重要数据结构和流程 ,并 总结 Ln x下开发蓝牙 U B设备 驱动 的一般方法和关键技术。 i u S
关键诃 :Lnx i 系统 ;蓝牙 协议栈 ;设备 驱动 u
US De i eDrv rf rLi u u t o h S a k B v c i e n x Bl e o t t c o
n l z st mp e ntt n o l e o t US ta p r rv rs h me a a ap o e sn r e u d t i, n i e e a asr c u e a a a y e e i l me a o fb u t o B rns o td i e c e d d t r c s i g p oc d e i e al a d g v st e k y d t tu t r d h i h n r n h n
i p m n t n f l t t dvc i r t u m r e e p ra v l i i x le o S v e r e ad e e c n l y m l et o u o h e i d v . m a zs p c o d e p g n u t t U Bd i i r y eh o g ・ e a i ob e o e r e Is i t a o h f e o n L u b oh h e cdv t k t n h o
linux 驱动的 ioctl 详细说明
linux 驱动的ioctl 详细说明摘要:1.概述ioctl 的作用和用法2.ioctl 的错误码及含义3.ioctl 的参数4.ioctl 的返回值及意义5.ioctl 在Linux 声卡驱动中的应用正文:一、概述ioctl 的作用和用法ioctl(input/output control)是Linux 系统中一种用于设备控制的系统调用,通过ioctl,用户进程可以对设备进行配置、查询和控制等操作。
ioctl 的用法通常为:```int ioctl(int fd, int request,...);```其中,fd 表示设备的文件描述符,request 表示设备驱动程序所支持的控制请求,后面的省略号表示可能的附加参数。
二、ioctl 的错误码及含义ioctl 系统调用可能返回以下错误码:- -1:表示发生了错误,此时errno 系统变量将包含具体的错误码。
- 0:表示操作成功完成。
- 其他大于0 的值:表示设备的某些特殊状态,具体含义需根据设备类型和驱动程序来确定。
三、ioctl 的参数ioctl 的参数主要包括以下几类:1.设备文件描述符fd:表示要控制的设备的文件描述符。
2.控制请求request:表示要执行的设备控制操作,如配置、查询、控制等。
3.附加参数:根据设备类型和控制请求的不同,可能需要提供不同的附加参数。
这些参数通常是设备驱动程序所支持的数据结构或整数变量。
四、ioctl 的返回值及意义ioctl 的返回值表示设备驱动程序处理控制请求的结果。
如果返回值为-1,则表示发生了错误;如果返回值为0,则表示操作成功完成;如果返回值为其他大于0 的值,则表示设备的某些特殊状态。
具体的错误码和含义可以通过errno 系统变量获取。
五、ioctl 在Linux 声卡驱动中的应用在Linux 声卡驱动中,ioctl 被广泛应用于配置声卡设备、查询声卡状态、控制声音播放等。
例如,通过ioctl 可以实现以下功能:- 获取声卡设备的信息,如设备型号、支持的采样率等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
导读:
linux蓝牙驱动代码阅读笔记
转载时请注明出处和作者联系方式
作者联系方式:李先静
昨天看了一下介绍蓝牙协议文档,今天索性对照看了看kernel里的代码(bluez),这里记点笔记,还是继承了老毛病,只关注整体流程而忽略细节,先了解个大概,等真正需要时再仔细分析。
net/hci_core.c
HCI在主机端的驱动主要是为上层提供一个统一的接口,让上层协议不依赖于具体硬件的实现。
HCI在硬件中的固件与HCI在主机端的驱动通信方式有多种,比如像UART、USB 和PC Card等等。
hci_core.c相当于一个框架,用于把各种具体通信方式胶合起来,并提供一些公共函数的实现。
hci_cmd_task是负责发送CMD的任务,它从hdev->cmd_q队列中取CMD,然后调用hci_send_frame把CMD发送出去,hci_send_frame又会调用实际的HCI驱动的send函数发送数据。
hci_rx_task是负责接收数据的任务,它从hdev->rx_q队列中取数据,然后根据数据的类型调用上层函数处理。
数据包有三种类型:
HCI_EVENT_PKT:用于处理一些通信事件,比如连接建立,连接断开,认证和加密等事件,这些事件控制协议状态的改变。
HCI_ACLDATA_PKT:异步非连接的数据包,通过hci_acldata_packet提交给上层的L2CAP协议处理(hci_proto[HCI_PROTO_L2CAP])。
HCI_SCODATA_PKT:同步面向连接的数据包,通过hci_scodata_packet提供给上层的SCO协议处理(hci_proto[HCI_PROTO_SCO])。
hci_tx_task是负责发送数据的任务,发送所有connection中的ACL和SCO数据,以及hdev->raw_q中的数据包。
HCI为上层提供的接口主要有:
hci_send_sco:发送SCO数据包,把要发送的数据包放入connection的发送队列中,然后调度发送任务去发送。
hci_send_acl:发送ACL数据包,把要发送的数据包放入connection的发送队列中,然后调度发送任务去发送。
hci_send_cmd:发送命令数据,把要发送的数据包放入hdev->cmd_q队列中,然后调度命令发送任务去发送。
hci_register_proto/hci_unregister_proto:注册/注销上层协议,HCI会把接收到的数据转发给这些上层协议。
hci_register_dev/hci_unregister_dev: 注册/注销设备,HCI会把要发送的数据通过这些设备发送出去。
其它一些公共函数。
net/hci_conn.c
提供了一些连接管理,论证和加密的函数。
net/hci_event.c
事件处理函数,负责状态机的维护,这些事件通常会使连接从一个状态转换另一个状态。
hci_si_event:用于发送事件。
hci_event_packet:用于处理底层上报的事件,从hci_rx_task处调用过来。
net/hci_sock.c
给上层提供一个socket接口,应用程序可以通过socket的方式来访问HCI。
hci_sock_init:中注册了BTPROTO_HCI类型family。
hci_sock_create:创建sock的函数,它的sock的ops指向hci_sock_ops。
hci_sock_setsockopt/hci_sock_getsockopt:设置/获取sock的一些选项。
hci_sock_sendmsg:发送消息,根据消息的类型把消息放到适当的队列中。
hci_sock_recvmsg:接收消息,从接收队列中取消息。
hci_sock_recvmsg:ioctl函数。
net/hci_sysfs.c
提供一些sysfs文件系统接口。
net/l2cap.c
L2CAP是HCI之上的协议,提供诸如QoS,分组,多路复用,分段和组装之类的功能。
通过bt_sock_register为上层提供一个sock接口:
l2cap_sock_create:创建sock的函数,它的sock的ops指向l2cap_sock_ops。
l2cap_sock_setsockopt/l2cap_sock_getsockopt设置/获取sock的一些选项。
l2cap_sock_sendmsg:发送消息,通过HCI提供hci_send_acl函数把消息传递给下层的设备。
bt_sock_recvmsg:接收消息,从接收队列中取消息。
通过hci_register_proto向其下的HCI注册协议:
l2cap_connect_ind:处理连接请求。
l2cap_connect_cfm:确认连接。
l2cap_disconn:处理断开请求。
l2cap_auth_cfm:认证确认。
l2cap_encrypt_cfm:加密确认。
l2cap_recv_acldata:处理来自HCI的数据。
net/sco.c
SCO也是运行在HCI之上的协议,它是面向连接的可靠的传输方式,主要用于声音数据传输。
通过bt_sock_register为上层提供一个sock接口:
sco_sock_create:创建sock的函数,它的sock的ops指向sco_sock_ops。
sco_sock_setsockopt/sco_sock_getsockopt设置/获取sock的一些选项。
sco_sock_sendmsg:发送消息,通过HCI提供sco_send_frame函数把消息传递给下层的设备。
bt_sock_recvmsg:接收消息,从接收队列中取消息。
通过hci_register_proto向其下的HCI注册协议:
sco_connect_ind:处理连接请求。
sco_connect_cfm:确认连接。
sco_disconn_ind:处理断开请求。
sco_recv_scodata: 处理来自HCI数据。
rfcomm/*
rfcomm是基于l2CAP之上的协议,它在蓝牙协议之上封装传统的RS232串口。
drivers/bluetooth
前面我们介绍的都是HCI及其上层的协议,HCI下层的实现就是HCI驱动程序,这些驱动程序用于与蓝牙硬件通信,通信的方式常见的有USB,UART和PC card等几种。
这里我们看看USB的方式:
drivers/bluetooth/hci_usb.c
hci_usb_probe: 调用hci_register_dev向前面说的hci_core注册HCI设备。
hci_usb_send_frame:用于提供给HCI去发送数据包。
它把数据包放到传输队列__transmit_q(husb, bt_cb(skb)->pkt_type)之中,然后调用hci_usb_tx_process去传输数据。
hci_usb_tx_process:根据数据的类型去调用hci_usb_send_ctrl /hci_usb_send_isoc /hci_usb_send_bulk把数据通过USB发送给硬件。
~~end~~
本文来自CSDN博客,转载请标明出处:/yingfox/archive/2007/11/10/1877567.aspx。