linux蓝牙驱动代码阅读笔记
- 格式:doc
- 大小:27.50 KB
- 文档页数:3
在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)。
蓝牙模块的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;}这个示例展示了如何使用蓝牙模块进行简单的数据传输。
先确认蓝牙的产商编号(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文件。
蓝牙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下使用蓝牙设备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下的驱动方法作者:秋忆出处:/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 驱动的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 可以实现以下功能:- 获取声卡设备的信息,如设备型号、支持的采样率等。
Linux设备驱动开发入门本文以快捷而简单的方式讲解如何像一个内核开发者那样开发linux设备驱动源作者: Xavier Calbet版权:GNU Free Documentation License 翻译: 顾宏军()中文版权:创作共用.署名-非商业用途-保持一致知识准备要开发Linux 设备驱动,需要掌握以下知识:•C 编程 需要掌握深入一些的C 语言知识,比如,指针的使用,位处理函数,等。
•微处理器编程 需要理解微机的内部工作原理:存贮器地址,中断,等。
这些内容对一个汇编程序员应该比较熟悉。
Linux 下有好几种不同的设备。
为简单起见,本文只涉及以模块形式加载的字符设备。
使用2.6.x 的内核。
(特别是Debian Sarge 使用的2.6.8内核。
)用户空间和内核空间当你开发设备驱动时,需要理解“用户空间”和内核空间之间的区别。
1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:•内核空间 :Linux 操作系统,特别是它的内核,用一种简单而有效的方法管理机器的硬件,给用户提供一个简捷而统一的编程接口。
同样的,内核,特别是它的设备驱动程序,是连接最终用户/程序员和硬件的一坐桥或者说是接口。
任何子程序或者函数只要是内核的一部分(例如:模块,和设备驱动),那它也就是内核空间的一部分。
•用户空间. 最终用户的应用程序,像UNIX 的shell 或者其它的GUI 的程序(例如,gedit),都是用户空间的一部分。
很显然,这些应用程序需要和系统的硬件进行交互。
但是,他们不是直接进行,而是通过内核支持的函数进行。
它们的关系可以通过下图表示:图1: 应用程序驻留在用户空间, 模块和设备驱动驻留在内核空间26:27:28:29:30:31:32:33:34:35:36:37:38:39:40:用户空间和内核空间之间的接口函数内核在用户空间提供了很多子程序或者函数,它们允许用户应用程序员和硬件进行交互。
第7章 输入设备驱动内核的输入子系统是为了对分散的、多种不同类别的输入设备(如键盘、鼠标、跟踪球、操纵杆、辊轮、触摸屏、加速计和手写板)进行统一处理的驱动。
输入子系统带来了如下好处:•统一了物理形态各异的相似的输入设备的处理功能。
例如,各种鼠标,不论PS/2、USB,还是蓝牙,都被同样处理。
•提供了用于分发输入报告给用户应用程序的简单的事件(event)接口。
你的驱动不必创建、管理/dev节点以及相关的访问方法。
因此它能很方便的调用输入API以发送鼠标移动、键盘按键,或触摸事件给用户空间。
X Windows这样的应用程序能够无缝地运行于输入子系统提供的event接口之上。
•抽取出了输入驱动的通用部分,简化了驱动,并提供了一致性。
例如,输入子系统提供了一个底层驱动(成为serio)的集合,支持对串口和键盘控制器等硬件输入设备的访问。
图7.1展示了输入子系统的操作。
此子系统包括一前一后运行的两类驱动:事件驱动和设备驱动。
事件驱动负责和应用程序的接口,而设备驱动负责和底层输入设备的通信。
鼠标事件产生者mousedev,是前者的实例;而PS/2鼠标驱动是后者的实例。
事件驱动和设备驱动都可以利用输入子系统的高效、可重用的核心提供的服务。
图 7.1. 输入子系统事件驱动是标准的,对所有的输入类都是可用的,所以你更可能的是实现设备驱动而不是事件驱动。
你的设备驱动可以利用一个已经存在的、合适的事件驱动通过输入核心和用户应用程序接口。
需要注意的是本章使用的名辞“设备驱动”指的是输入设备驱动,而不是输入事件驱动。
输入事件驱动输入子系统提供的事件接口已经发展成为很多图形窗口系统理解的标准。
事件驱动提供一个硬件无关的抽象,以和输入设备交互;如同帧缓冲接口(在第12章《视频设备驱动》中讨论)提供一个通用的机制以和显示设备通信一样。
事件驱动和帧缓冲驱动一起,将图形用户接口(GUI)和各种各样的底层硬件隔离开来。
Evdev接口Evdev是一个通用的输入事件驱动。
BlueZ学习BLUEZ学习BlueZ是Linux官⽅蓝⽛协议栈。
它是⼀个基于GNU General Public License (GPL)发布的开源项⽬,从Linux2.4.6开始便成为Linux 内核的⼀部分。
BlueZ⽀持蓝⽛核⼼层和协议,它灵活、⾼效,以模块化⽅式实现,具有以下特点:完整的模块化实现均衡的多处理安全⽀持多线程数据处理⽀持多个蓝⽛设备硬件抽象向所有层提供标准socket接⼝提供设备和服务级安全保证BlueZ包含多个相互独⽴的模块:Linux内核蓝⽛⼦系统核⼼L2CAP 和 SCO ⾳频内核层RFCOMM, BNEP, CMTP 和 HIDP内核实现HCI UART, USB, PCMCIA 和虚拟设备驱动通⽤蓝⽛和SDP库和守候进程配置和测试⼩⼯具协议解码和分析⼯具BlueZ内核模块,程序开发库和⼩⼯具能在⽀持Linux的多种硬件架构系统上运⾏,既⽀持单核也⽀持多核处理器。
BlueZ主要⽀持以下系统平台:Intel and AMD x86AMD64 and EM64T (x86-64)SUN SPARC 32/64bitPowerPC 32/64bitIntel StrongARM and XScaleHitachi/Renesas SH processorsMotorola DragonBall现在市⾯上的很多Linux发⾏版都⽀持BlueZ,基本上任何⼀个Linux系统都兼容BlueZ,如:Debian GNU/LinuxUbuntu LinuxFedora Core / Red Hat LinuxOpenSuSE / SuSE LinuxMandrake LinuxBlueZ的源代码可以从/doc/9284b341b90d6c85ed3ac603.html /download/下载,其中Linux 2.4 and 2.6系列内核已经包含BlueZ内核模块源程序,因此要使⽤BlueZ只需下载最新稳定的Linux内核源码就⾏了。
Linux HID使用手册一、介绍HID是Human Interface Devices的缩写,翻译成中文即为人机交互设备。
在Linux系统中,HID设备是一种常见的输入设备,如鼠标、键盘、游戏手柄等。
这些设备通过USB或蓝牙等接口与计算机连接,并通过HID协议与计算机进行通信。
二、HID设备的识别与连接在Linux系统中,当HID设备连接到计算机时,系统会自动识别并加载相应的驱动程序。
用户可以通过以下命令查看已连接的HID设备:插入HID设备并打开终端。
输入命令“lsusb”查看USB设备列表,找到HID设备的厂商ID和产品ID。
输入命令“dmesg | grep <厂商ID>:<产品ID>”查看HID设备的连接信息。
三、HID设备的配置与使用鼠标和键盘:Linux系统会自动识别并配置鼠标和键盘。
用户可以在系统设置中调整鼠标和键盘的灵敏度、按键映射等参数。
游戏手柄:对于游戏手柄,用户需要使用专门的工具进行配置。
常用的工具有“jstest-gtk”和“qjoypad”。
这些工具可以帮助用户映射手柄按键、设置摇杆灵敏度等。
自定义HID设备:如果用户需要使用自定义的HID设备,可以通过编写udev规则来实现。
udev规则可以帮助系统识别并加载自定义的HID设备驱动程序。
具体方法请参考相关文档。
四、HID设备的调试与排错查看设备状态:使用命令“lsusb -v <厂商ID>:<产品ID>”查看HID设备的详细信息,包括设备的状态、接口描述符等。
调试工具:使用hidraw工具可以对HID设备进行调试。
该工具可以读取和写入HID设备的报告,帮助用户分析设备的工作状态。
日志分析:当HID设备出现问题时,可以查看系统日志以获取更多信息。
使用命令“dmesg | grep hid”可以查看与HID设备相关的日志信息。
驱动更新:如果HID设备出现问题,可能是由于驱动程序不兼容或过时导致的。
linux bluetoothctl ble用法`bluetoothctl` 是Linux 系统下的一个命令行工具,用于与蓝牙设备进行交互。
在`bluetoothctl` 中,你可以执行一系列命令来管理蓝牙设备,包括BLE(低功耗蓝牙)设备。
以下是一些在`bluetoothctl` 中使用BLE 的基本用法:1. 启动Bluetooth 服务:在终端中运行以下命令启动`bluetoothctl`:```bashbluetoothctl```2. 开启蓝牙:在`bluetoothctl` 命令行中,使用`power on` 命令来开启蓝牙:```bashpower on```3. 启用扫描:使用`scan on` 命令来启用蓝牙扫描,以便发现附近的BLE 设备:```bashscan on```4. 停止扫描:当你发现目标设备后,使用`scan off` 命令停止扫描:```bashscan off```5. 列出已发现的设备:使用`devices` 命令列出已发现的蓝牙设备,找到你需要连接的BLE 设备的MAC 地址:```bashdevices```6. 连接BLE 设备:使用`connect` 命令并提供BLE 设备的MAC 地址来连接设备:```bashconnect <BLE_DEVICE_MAC_ADDRESS>```7. 断开BLE 设备连接:使用`disconnect` 命令断开与BLE 设备的连接:```bashdisconnect```8. 退出`bluetoothctl`:使用`quit` 命令退出`bluetoothctl`:```bashquit```这些是`bluetoothctl` 中使用BLE 的一些基本命令。
请注意,具体的操作可能会因蓝牙硬件和驱动程序的不同而有所差异。
在使用这些命令之前,请确保你的蓝牙硬件和驱动程序支持BLE,并查阅相关文档以获取更详细的信息。
linux蓝牙驱动代码阅读笔记昨天看了一下介绍蓝牙协议文档,今天索性对照看了看kernel里的代码(bluez),这里记点笔记,还是继承了老毛病,只关注整体流程而忽略细节,先了解个大概,等真正需要时再仔细分析。
net/hci_core.cHCI 在主机端的驱动主要是为上层提供一个统一的接口,让上层协议不依赖于具体硬件的实现。
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队列中取数据,然后根据数据的类型调用上层函数处理。
数据包有三种类型:1. HCI_EVENT_PKT: 用于处理一些通信事件,比如连接建立,连接断开,认证和加密等事件,这些事件控制协议状态的改变。
2. HCI_ACLDATA_PKT: 异步非连接的数据包,通过hci_acldata_packet提交给上层的L2CAP协议处理(hci_proto[HCI_PROTO_L2CAP])。
3. HCI_SCODATA_PKT: 同步面向连接的数据包,通过hci_scodata_packet提供给上层的SCO协议处理(hci_proto[HCI_PROTO_SCO])。
hci_tx_task 是负责发送数据的任务,发送所有connection中的ACL和SCO数据,以及hdev->raw_q中的数据包。
HCI为上层提供的接口主要有:1. hci_send_sco:发送SCO数据包,把要发送的数据包放入connection的发送队列中,然后调度发送任务去发送。
linux中编译驱动的方法
在Linux中编译驱动的方法通常涉及以下步骤:
1. 编写驱动代码:首先,您需要编写适用于Linux内核的驱动代码。
这通常是在内核源代码树之外编写的。
驱动代码通常以C语言编写,并遵循内核编程约定。
2. 获取内核源代码:为了编译驱动,您需要获得Linux内核的源代码。
您可以从Linux官方网站或镜像站点下载内核源代码。
3. 配置内核:在编译驱动之前,您需要配置内核以包含您的驱动。
这可以通过运行`make menuconfig`命令来完成。
在配置菜单中,您可以选择要编译的驱动以及相关的内核选项。
4. 编译驱动:一旦您配置了内核并选择了要编译的驱动,您可以使用`make`命令来编译驱动。
这将在内核源代码目录下生成可执行文件或模块文件。
5. 加载和测试驱动:一旦驱动被编译,您可以将其加载到Linux 内核中以进行测试。
您可以使用`insmod`命令将模块加载到内核,然后使用`dmesg`命令检查内核日志以查看驱动是否正确加载。
这些是基本的步骤,但具体的步骤可能会因您的环境和需求而有所不同。
在编译和加载驱动时,请确保您具有适当的权限和知识,因为这可能需要管理员权限,并且错误的操作可能会导致系统不稳定或损坏。
[BlueZ]2、使⽤bluetoothctl搜索、连接、配对、读写、使能notify蓝⽛。
星期三, 05. 九⽉ 2018 02:03上午 - beautifulzzzz⽬录1、前⾔上⼀篇讲了如何编译安装BlueZ-5,本篇主要在于玩BlueZ,⽤命令⾏去操作BLE设备:2、gatttool —— ⽼⼯具趟坑刚开始跟着操作gatttool,发现坑太多(主要原因是⼯具⽼了):采⽤sudo gatttool -b 4D:69:98:0E:91:5E -I 去连接发现会报错:Error: connect error: Connection refused (111)最终参考LINK-11发现需要加random选项():➜ ~ sudo gatttool -b 4D:69:98:0E:91:5E -I[4D:69:98:0E:91:5E][LE]> connectAttempting to connect to 4D:69:98:0E:91:5EError: connect error: Connection refused (111)[4D:69:98:0E:91:5E][LE]> exit➜ ~ sudo gatttool -t random -b 4D:69:98:0E:91:5E -I[4D:69:98:0E:91:5E][LE]> connectAttempting to connect to 4D:69:98:0E:91:5EConnection successful[4D:69:98:0E:91:5E][LE]>(gatttool:3104): GLib-WARNING **: Invalid file descriptor.过⼀回会10S⾃动断开,⽹上说这个⼯具⽼了,不建议⽤了():There are new tools to use with GATT, bluetoothctl/bluetoothd is the preferred since with that you have GAP, etc, but if want to use a stand alone tool then I suggest you use btgatt-client.3、bluetoothctl——NB的新⼯具命令⾏进⼊bluetoothctl操作环境():bluetoothctl我在⼿机上⽤lightblue模拟⼀个BLE设备ty_prod,之后对其service进⾏修改,调⽤scan on进⾏搜索还是⽼的,最终发现要先⽤remove移除之前的设备,之后再scan就会出现[NEW] Device 72:3B:E1:81:4E:4F ty_prod设备注:⽤lightblue模拟的设备的MAC不是固定的注:我发现在lightblue中⽆论怎么模拟BLE设备,⼀旦被连上搜索到的service都是IPone的[bluetooth]# devicesDevice 28:ED:6A:A0:26:B7 ty_prodDevice 58:71:33:00:00:24 Bluetooth KeyboardDevice 00:1A:7D:DA:71:0A SHEN-PCDevice 94:87:E0:B3:AC:6F Mi Phone[bluetooth]# remove 28:ED:6A:A0:26:B7...[bluetooth]# scan onDiscovery started[NEW] Device 72:3B:E1:81:4E:4F ty_prod[bluetooth]# scan off...Discovery stopped[bluetooth]# connect 72:3B:E1:81:4E:4FAttempting to connect to 72:3B:E1:81:4E:4F[CHG] Device 72:3B:E1:81:4E:4F Connected: yesConnection successful[ty_prod]索性就⽤IPhone⾃带的服务做测试了~[ty_prod]# infoDevice 28:ED:6A:A0:26:B7 (public)Name: tuya_mdev_testAlias: tuya_mdev_testAppearance: 0x0040Icon: phonePaired: yesTrusted: noBlocked: noConnected: yesLegacyPairing: noUUID: Fax (00001111-0000-1000-8000-00805f9b34fb)UUID: Generic Access Profile (00001800-0000-1000-8000-00805f9b34fb)UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)UUID: Current Time Service (00001805-0000-1000-8000-00805f9b34fb)UUID: Device Information (0000180a-0000-1000-8000-00805f9b34fb)UUID: Battery Service (0000180f-0000-1000-8000-00805f9b34fb)UUID: Vendor specific (7905f431-b5ce-4e99-a40f-4b1e122d00d0)UUID: Vendor specific (89d3502b-0f36-433a-8ef4-c502ad55f8dc)UUID: Vendor specific (9fa480e0-4967-4542-9390-d343dc5d04ae)UUID: Vendor specific (d0611e78-bbb4-4591-a5f8-487910ae4366)[CHG] Device 28:ED:6A:A0:26:B7 ServicesResolved: no[CHG] Device 28:ED:6A:A0:26:B7 Connected: no我们⽤Current Time Service,列出所有attributes操作如下:[tuya_mdev_test]# menu gatt[tuya_mdev_test]# list-attributes 28:ED:6A:A0:26:B7...Primary Service/org/bluez/hci0/dev_47_B1_26_C1_81_18/service004100001805-0000-1000-8000-00805f9b34fbCurrent Time ServiceCharacteristic/org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char004500002a0f-0000-1000-8000-00805f9b34fbLocal Time InformationCharacteristic/org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char004200002a2b-0000-1000-8000-00805f9b34fbCurrent TimeDescriptor/org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042/desc004400002902-0000-1000-8000-00805f9b34fbClient Characteristic Configuration...上⾯Current Time Service对应的服务如下图:我们选择Current Time进⾏操作UUID:0x2A2B[ty_prod]# select-attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042[tuya_mdev_test:/service0041/char0042]# readAttempting to read /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042[CHG] Attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041/char0042 Value:e2 07 09 05 01 24 11 03 f1 02 .....$....e2 07 09 05 01 24 11 03 f1 02 .....$....[tuya_mdev_test:/service0041/char0042]# attribute-infoCharacteristic - Current TimeUUID: 00002a2b-0000-1000-8000-00805f9b34fbService: /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0041Value:e2 07 09 05 01 2e 01 03 f5 02 ..........Notifying: yesFlags: readFlags: notify读出结果⼤致意思应该是:2018-9/5-1:36:17 周三读取⼀下0x180A的Device Information:[tuya_mdev_test:/service0006/char0007]# select-attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047/char004a [tuya_mdev_test:/service0047/char004a]# attribute-infoCharacteristic - Model Number StringUUID: 00002a24-0000-1000-8000-00805f9b34fbService: /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047Flags: read[tuya_mdev_test:/service0047/char004a]# readAttempting to read /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047/char004a[CHG] Attribute /org/bluez/hci0/dev_47_B1_26_C1_81_18/service0047/char004a Value:69 50 68 6f 6e 65 36 2c 32 iPhone6,269 50 68 6f 6e 65 36 2c 32 iPhone6,2当然写、使能notify也很简单,看help即可。
bluetoothctl 读写函数Bluetoothctl是一个位于Linux系统中的Bluetooth控制工具,它提供了一系列的命令行函数用于管理和配置蓝牙设备、服务和属性。
通过使用bluetoothctl命令行工具,我们可以使用其读写函数实现与蓝牙设备的交互以及进行基本的配置和控制。
首先,蓝牙设备的连接非常重要。
使用`bluetoothctl`命令行工具的`connect`函数可以连接到指定的蓝牙设备。
该命令的使用方法如下:```connect [device MAC address]```通过指定蓝牙设备的MAC地址,可以连接到该设备。
连接成功后,可以进行下一步的操作。
在连接到蓝牙设备后,我们可以使用`write`函数向设备发送数据。
该函数的使用方法如下:write [handle] [value]```其中,`handle`是要操作的特征值句柄,`value`是要写入的数据。
通过该函数,我们可以向设备发送指定的数据。
具体的特征值句柄和要写入的数据需要根据具体的蓝牙设备和服务进行设置。
例如,假设我们要将字符串"Hello, Bluetooth!"发送到蓝牙设备,我们可以使用以下命令:```write 0x0012 Hello, Bluetooth!```通过该命令,我们将字符串"Hello, Bluetooth!"发送到了特征值句柄为0x0012的蓝牙设备。
另外,我们还可以使用`read`函数来从蓝牙设备读取数据。
该函数的使用方法如下:read [handle]```通过指定要读取的特征值句柄,可以从蓝牙设备中读取相应的数据。
读取到的数据将会显示在命令行工具中。
除了发送和接收数据外,Bluetoothctl还提供了一些其他的命令行函数,用于管理和配置蓝牙设备。
例如,可以使用`paired-devices`函数列出已配对的蓝牙设备:```paired-devices```该命令将会列出已经与当前设备配对的蓝牙设备的信息。
导读:
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。