snifer

【原创】嵌入式6410中蓝牙的使用

0
阅读(2141)

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 RequestBlock 或 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上。

5. 实验步骤

♦ 实验目录:/UP-Magic6410/SRC/kernel/linux-2.6.21/

/UP-Magic6410/SRC/exp/wireless/03_bluetooth

♦ 在内核中添加蓝牙设备支持

1、进入宿主机中UP-Magic6410 型光盘内核目录:

[root@localhost ~]# cd /UP-Magic6410/SRC/kernel/linux-2.6.21/

2、运行 make menuconfig 命令配置内核对蓝牙的相关支持

选择Networking --->选项,如图

blob.png

进入<*> Bluetooth subsystem support --->子选项,并做如下设置。如图

blob.png

进入Bluetooth subsystem support --->子系统目录,配置如下:

blob.png

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


选择好选项后,保存并退出。

blob.png

3、重新编译内核,运行make 命令

[root@localhost linux-2.6.21]# make

scripts/kconfig/conf -s arch/arm/Kconfig

CHK include/linux/version.h

SYMLINK include/asm-arm/arch -> include/asm-arm/arch-s3c

make[1]: `include/asm-arm/mach-types.h' is up to date.

CHK include/linux/utsrelease.h

……

……

最终在内核源码目录的 arch/arm/boot 目录下生成新的ARM-LINUX 内核镜像文件zImage

[root@localhost linux-2.6.21]# ls arch/arm/boot/zImage

arch/arm/boot/zImage

[root@localhost linux-2.6.21]#

4、按照 UP-Magic6410 型光盘配套烧写文档将新生成的内核镜像文件zImage 烧写到UP-Magic6410 型设备中