【原创】嵌入式6410中蓝牙的使用
0赞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 --->选项,如图
进入<*> Bluetooth subsystem support --->子选项,并做如下设置。如图
进入Bluetooth subsystem support --->子系统目录,配置如下:
在上图中选中“Bluetooth device drivers --->”,回车进入其子菜单,编译方式如图
选择好选项后,保存并退出。
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 型设备中