snifer

【原创】基于嵌入式系统的Bluetooth USB 适配器工作实训

0
阅读(1979)

Bluetooth USB 适配器拥有一个 Bluetooth CSR 芯片组,并使用 USB 传输器来传输HCI 数据分组。因此,Linux USB 层、BlueZ USB 传输器驱动程序以及 BlueZ 协议栈是使设备工作的主要内核层。现在,您将了解到三层之间如何交互以使 Linux 网络应用程序在这个设备上运行。

Linux USB 子系统类似于 PCMCIA 子系统,它们都有与移动设备交互的主机控制器设备驱动程序,并且都包含一个向主机控制器和单个设备的设备驱动程序提供服务的核心层。

USB 主机控制器遵循两个标准之一:UHCI(通用主机控制器接口)或 OHCI(开放式主机控制器接口)。由于具有 PCMCIA,单个 USB 设备的 Linux 设备驱动程序不依赖于主机控制器。经由 USB 设备传输的数据分为四种类型(或管道):

Control

Interrupt

Bulk

Isochronous

前两个通常用于小型消息而后两个则用于较大型的消息。

USB 设备插入时,主机控制器使用控制管道来枚举它并给它分配设备地址(1 到127)。主机控制器设备驱动程序读取的设备描述符包含关于设备的信息,例如 class、subclass 和 protocol。Linux 的 usbcore 内核模块支持 USB 主机控制器和 USB 设备。并包含 USB 设备驱动程序可以使用的函数和数据结构。USB 驱动程序利用 usbcore 及自己的 class/subclass/protocol 信息(请参阅内核 include/linux/usb.h 中的 struct usb_driver)注册了两个入口点:probe 和 disconnect。当相应的 USB 设备被附加时,usbcore 用枚举期间从设备配置描述符中读取的 class 信息来匹配已注册的 class 信息,并将设备与相应的驱动程序绑定。这个核心使用一种叫做 USB Request Block 或 URB ( 在

include/linux/usb.h 中定义)的数据结构,来异步地管理主机和设备之间的数据传输。设备驱动程序使用这些例程来请求各种类型的数据传输( control 、interrupt 、bulk 或isochronous)。传送请求完成后,核心会使用以前注册的回调函数来通知驱动程序。

针对 Bluetooth USB 设备而言,HCI 命令使用 Control 管道传输,HCI 事件使用Interrupt 管道,Asynchronous (ACL) 数据使用 Bulk 管道,而 Synchronous (SCO) 音频数据使用 Isochronous 管道。Bluetooth 规范为 Bluetooth USB 设备定义了class/subclass/protocol 代码 0xE/0x01/0x01 。BlueZ USB 传输驱动程序(drivers/bluetooth/hci_usb.c)将该 class/subclass/protocol 信息注册到 Linux USB 核心。

Belkin USB 适配器插入时,主机控制器设备驱动程序会枚举它。因为在枚举期间从适配器读取的设备描述符与 hci_usb 驱动程序注册到 USB 核心的信息相匹配,所以这个驱动程序可附加到 Belkin USB 设备。由 hci_usb 驱动程序从以上描述的各个端点读取的 HCI、ACL 和 SCO 数据被透明传送到 BlueZ 协议栈。一旦做完这些,通过使用以上描述的BlueZ 服务和工具,Linux TCP/IP 应用程序就可以运行在 BlueZ BNEP 上,而串行应用程序则可以运行在 BlueZ RFCOMM 上。

实验步骤:

1.配置编译内核蓝牙驱动模块

在PC 机上运行以下命令

cd /arm2410s/kernel-2410 /*进入开发板内核目录*/

make menuconfig /*配置开发板内核*/

2. 选择Bluetooth support 选项,如图 所示:

blob.png

3.进入Bluetooth support 子选项,并做如下设置,代表该项以模块方式编译,<*>代表该项编译进内核,如图。

blob.png

4.在上图中选中“Bluetooth device drivers --->”,回车进入其子菜单,编译方式如图所示:

blob.png

5.选择好选项后,保存并退出make menuconfig。执行以下命令:

make clean /*删除上次编译产生的文件*/

make dep /*按选项,重新生成新的依赖关系*/

make bzImage /*编译内核映象文件bzImage*/

make modules /*编译方式的模块,生成可insmod 模块*/

6.新生成的内核映象文件bzImage 位于/arm2410s/kernel-2410//arch/arm/boot 下,用串口把该文件下载到开发板的flash。

7.把类似usb 盘的蓝牙模块插入开发板的usb 口,重启开发板,并复制第4 步新生成的文件到开发板:

在PC 机:

mkdir /arm2410s/tmpt_bluetooth

cp /arm2410s/kernel-2410/net/bluetooth/bnep/bnep.o /arm2410s/tmpt_bluetooth

cp /arm2410s/kernel-2410/net/bluetooth/rfcomm/rfcomm.o /arm2410s/tmpt_bluetooth

cp /arm2410s/kernel-2410/net/bluetooth/l2cap.o /arm2410s/tmpt_bluetooth

cp /arm2410s/kernel-2410/drivers/bluetooth/hci_usb.o /arm2410s/tmpt_bluetooth

在/arm2410s /tmpt_bluetooth 目录下,编写插入模块的start.sh 脚本,其内容如下:

#!/bin/sh

init()

{

insmod l2cap.o

insmod rfcomm.o

insmod bnep.o

insmod hci_usb.o

/etc/init.d/bluetooth start

pand --listen --role NAP

}

case "$1" in

net)

ifconfig bnep0 10.0.0.1

;;

*)

echo "init bluetooth"

init

exit 1

esac

exit 0

在开发板:

mount -t nfs -o nolock 192.168.0.43:/arm2410s /host

cp –arf /host/ tmpt_bluetooth /mnt/yaffs/.

8. 在开发板上运行蓝牙服务

cd /mnt/yaffs/tmpt_bluetooth

chmod 777 *

./star.sh

9. 在一台window 系统的PC 机上安装本次实验光盘目录下的蓝牙驱动软件或购买蓝牙时

blob.png

10.把类似usb 盘的蓝牙模块插入windowsPC 机的usb 口,点击上图中的红太阳搜索蓝牙设备,会搜索到linux 蓝牙设备。

blob.png

在linux 设备上点击右键,如图6.5.8 所示,选择 连接->蓝牙个人局域网服务,在弹出的对话框中选择“是”

blob.png

blob.png

过1-2 分钟,在显示屏的右下角会显示windows 下蓝牙设备分配的IP 地址。

blob.png

然后用ifconfig |more 命令来查看网卡,会发现比以前多了一个bnep0 网卡。

1.png

用ifconfig bnep0 169.254.145.112 重新为bnep0 设备分配IP,并且ping PC 机的IP:169.254.145.113,看是否ping 得通。

12.若一切顺利,下边就可以把bnep0 做为网卡来连接网络了。可以尝试一下开发板提供的ftp服务,如图所示,在浏览器中输入ftp://169.254.145.112,关闭弹出的用户名错误警告,在浏览器空白处点击右键,在弹出的快捷菜单中选择登陆。填入用户名root,密码无,然后登陆,结果如图所示。

blob.pngblob.png

好了。就写这么多,冬天来来。