蓝牙学习(2)USB Adapter

主要分析一下蓝牙USB Adapter使用USB接口传输HCI包的实现及过程。
这里写图片描述

参照上面的Bluetooth core system architecture图, 蓝牙USB Adapter作为Bluetooth controller以USB的物理形式连接到Linux host processor上,通过HCI protocol和Host通信。

bluetooth in Linux kernel

Linux kernel side主要包括:

  • Bluetooth Core: (net\bluetooth\*)
    • HCI (Host Controller Interface) device and connection manager, schedule
    • SCO (Synchronous Connection Oriented) audio links
    • L2CAP (Logical Link Control and Adaptation Protocol)
    • SMP (Security Manager Protocol) on LE (Low Energy) links
  • HCI Device drivers (Interface to the hardware)
    • USB (btusb)
    • UART (hciuart)
    • SDIO
  • RFCOMM (RFCOMM Protocol for serial communication) Module (creates /dev/rfcomm serial devices)
  • BNEP (Bluetooth Network Encapsulation Protocol) Module (creates /sys/class/net/bnep network interfaces)
  • CMTP (CAPI Message Transport Protocol) Module
  • HIDP (Human Interface Device Protocol) Module (creates /sys/class/input devices)

HCI device driver

HCI:Host Controller Interface

HCI提供了访问Controller的统一接口

Controller主要包含下面几种类型

  • BR/EDR Controller
  • BD/EDR/LE Controller
  • LE Controller
  • AMP Controller (Alternate MAC/PHY)

include/net/bluetooth/hci.h 中定义的HCI bus 接口类型包括:

/* HCI bus types */
#define HCI_VIRTUAL 0
#define HCI_USB     1
#define HCI_PCCARD  2
#define HCI_UART    3
#define HCI_RS232   4
#define HCI_PCI     5
#define HCI_SDIO    6
#define HCI_SPI     7
#define HCI_I2C     8
#define HCI_SMD     9

btusb

bluetooth USB adapter是作为usb device挂载到USB总线上的。因此是通过usb_driver提供的机制去probe,而不是直接通过platform_driver.
这点和i2c, SPI 等设备驱动都是类似的。

static struct usb_driver btusb_driver = {
    .name       = "btusb",
    .probe      = btusb_probe,
    .disconnect = btusb_disconnect,
#ifdef CONFIG_PM
    .suspend    = btusb_suspend,
    .resume     = btusb_resume,
#endif
    .id_table   = btusb_table,
    .supports_autosuspend = 1,
    .disable_hub_initiated_lpm = 1,
};
probe

在probe函数中, hci device的operators函数指针被赋值

static int btusb_probe(struct usb_interface *intf,
               const struct usb_device_id *id)
{
    //...
    hdev->open   = btusb_open;
    hdev->close  = btusb_close;
    hdev->flush  = btusb_flush;
    hdev->send   = btusb_send_frame;
    hdev->notify = btusb_notify;
    //...
}

其中HCI Device数据结构定义, include/net/bluetooth/hci_core.h

struct hci_dev {
    struct list_head list;
    struct mutex    lock;
    char        name[8];
    unsigned long   flags;
    __u16       id;
    __u8        bus;
    __u8        dev_type;

    //...

    int (*open)(struct hci_dev *hdev);
    int (*close)(struct hci_dev *hdev);
    int (*flush)(struct hci_dev *hdev);
    int (*setup)(struct hci_dev *hdev);
    int (*shutdown)(struct hci_dev *hdev);
    int (*send)(struct hci_dev *hdev, struct sk_buff *skb);
    void (*notify)(struct hci_dev *hdev, unsigned int evt);

    //...
    }  
接收发送数据

Bluetooth USB设备定义了不同的pipe用于不同类型的数据传输
- Control pipes are used to transport HCI commands.
- Interrupt pipes are responsible for carrying HCI events.
- Bulk pipes transfer asynchronous connectionless (ACL) Bluetooth data.
- Isochronous pipes carry SCO audio data.

static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
{
    struct urb *urb;
    BT_DBG("%s", hdev->name);
    switch (hci_skb_pkt_type(skb)) {
    case HCI_COMMAND_PKT:
        urb = alloc_ctrl_urb(hdev, skb);
        if (IS_ERR(urb))
            return PTR_ERR(urb);
        hdev->stat.cmd_tx++;
        return submit_or_queue_tx_urb(hdev, urb);
    case HCI_ACLDATA_PKT:
        urb = alloc_bulk_urb(hdev, skb);
        if (IS_ERR(urb))
            return PTR_ERR(urb);
        hdev->stat.acl_tx++;
        return submit_or_queue_tx_urb(hdev, urb);
    case HCI_SCODATA_PKT:
        if (hci_conn_num(hdev, SCO_LINK) < 1)
            return -ENODEV;
        urb = alloc_isoc_urb(hdev, skb);
        if (IS_ERR(urb))
            return PTR_ERR(urb);
        hdev->stat.sco_tx++;
        return submit_tx_urb(hdev, urb);
    }
    return -EILSEQ;
}

接收中断处理:
注册

btusb_open -->
btusb_submit_intr_urb-->
//initialize a interrupt urb
usb_fill_int_urb(urb, data->udev, pipe, buf, size,
             btusb_intr_complete, hdev, data->intr_ep->bInterval);

usb_complete_t 回调函数btusb_intr_complete被注册

    if (btusb_recv_intr(data, urb->transfer_buffer,
                    urb->actual_length) < 0) {
            bt_dev_err(hdev, "corrupted event packet");
            hdev->stat.err_rx++;
        }

btusb_recv_intr函数中,数据被copy到skb. 内核中所有network相关的queue, buffer都用这个通用的结构体。

Reference

https://iotbreaks.com/base-knowledge-about-bluetooth/

http://www.embeddedlinux.org.cn/essentiallinuxdevicedrivers/final/ch16lev1sec1.html#ch16lev1sec1

https://wiki.linuxfoundation.org/networking/sk_buff

转载于:https://www.cnblogs.com/feiwatson/p/9514875.html

### 回答1: AicSemi Bluetooth USB driver是一个在device\hisilicon\bigfish\bluetooth\aicbt\driver/aic_btusb.c文件中实现的驱动程序,用于支持AicSemi蓝牙USB设备的连接和数据传输。该驱动程序的主要功能包括初始化和配置AicSemi蓝牙USB设备,以及提供与蓝牙设备通信所需的接口和控制命令。此驱动程序是在HiSilicon的BigFish平台上开发的,用于与AicSemi蓝牙芯片进行通信。 ### 回答2: AicSemi蓝牙USB驱动程序是位于device\hisilicon\bigfish\bluetooth\aicbt\driver/aic_btusb.c的一个驱动程序文件。这个驱动程序是为AicSemi蓝牙USB设备设计的,它允许计算机与AicSemi蓝牙USB设备进行通信和交互。 在这个驱动程序文件中,实现了一系列函数和方法,用于连接、初始化和管理AicSemi蓝牙USB设备。驱动程序负责在计算机的操作系统中注册该设备,并集成到蓝牙子系统中。它将AicSemi蓝牙USB设备与操作系统的蓝牙协议栈进行交互,以实现蓝牙设备的功能。 该驱动程序还提供了一些控制和配置接口,以确保AicSemi蓝牙USB设备的正常运行。它可以支持设备的恢复、升级和调试等功能。同时,该驱动程序也可以处理各种蓝牙协议和配置的相关任务,如控制设备的广播、连接和配对等。 为了确保与操作系统的兼容性和稳定性,该驱动程序还可能包含一些错误检测和修复的代码,以处理可能出现的异常情况和错误。此外,它可能还包含与设备相关的硬件资源管理、电源管理和设备配置的代码。 总之,AicSemi蓝牙USB驱动程序是将AicSemi蓝牙USB设备与计算机操作系统协同工作的关键组件。它使得用户可以通过计算机与AicSemi蓝牙USB设备进行无线通信,实现蓝牙设备的各种功能和操作。 ### 回答3: AicSemi Bluetooth USB driver是一个位于device\hisilicon\bigfish\bluetooth\aicbt\driver\aic_btusb.c文件中的驱动程序,用于支持AicSemi蓝牙USB设备的功能。 蓝牙USB驱动程序是一种软件,用于控制蓝牙设备与计算机之间的通信。它使计算机能够识别、连接和与蓝牙设备进行数据交换。 AicSemi Bluetooth USB driver是为AicSemi蓝牙USB设备而设计的驱动程序。它包含在device\hisilicon\bigfish\bluetooth\aicbt\driver\aic_btusb.c文件中,并提供与该设备通信所需的功能。 该驱动程序实现了与AicSemi蓝牙USB设备之间的低级别通信。它与操作系统进行交互,处理设备的插入和拔出事件,并解析从设备发送的数据。 AicSemi Bluetooth USB driver通过与蓝牙协议栈进行交互,使操作系统能够识别AicSemi蓝牙USB设备并与之进行通信。它还负责处理设备的连接和通信过程中的错误和异常情况。 该驱动程序提供了一种桥接计算机和AicSemi蓝牙USB设备之间的通信渠道。它使用户能够通过计算机与蓝牙设备进行数据传输、音频播放和文件共享等操作。 总之,AicSemi Bluetooth USB driver是一个用于支持AicSemi蓝牙USB设备的驱动程序,它实现了计算机与设备之间的通信功能,使用户可以方便地使用蓝牙设备进行各种操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值