精华内容
下载资源
问答
  • Android蓝牙驱动开发总结,详细解析蓝牙驱动的流程,非常好的资料!
  • 简洁完美稳定的Android蓝牙驱动蓝牙串口调试助手,有十六进制显示和发送选择开关,代码简洁,方便修改,并且有接收中断线程,方便移植需要蓝牙通讯的程序中
  • Android蓝牙驱动开发总结Android之蓝牙驱动开发总结一 Bluetooth基本概念1二 Android Bluetooth架构12.1 Bluetooth架构图12.2 Bluetooth代码层次结构3三 Bluetooth协议栈分析43.1 蓝牙协议栈43.2 Android与蓝牙协议...

    Android蓝牙驱动开发总结

    Android之蓝牙驱动开发总结一 Bluetooth基本概念1二 Android Bluetooth架构12.1 Bluetooth架构图12.2 Bluetooth代码层次结构3三 Bluetooth协议栈分析43.1 蓝牙协议栈43.2 Android与蓝牙协议栈的关系5四 Bluetooth之HCI层分析54.1 HCI层与基带的通信方式64.2 包的分析及研究74.3 通信过程的研究与分析8五 Bluetooth之编程实现85.1 HCI层编程85.2 L2CAP层编程105.3 SDP层编程12六 Bluetooth之启动过程实现136.1 Bluetooth启动步骤146.2 Bluetooth启动流程146.3 Bluetooth数据流向146.4 Bluez控制流程146.5 Bluetooth启动过程分析15七 Bluetooth之驱动移植157.1 android系统配置157.2 启动项修改167.3 电源管理rfkill驱动167.4 Rebuild Android image and reboot167.5 实现BT睡眠唤醒机制167.6 系统集成17八 Bluetooth之调试与编译178.1 Bluetooth驱动调试178.2 Bluetooth 调试工具18九 Bluetooth之应用程序开发189.1 Bluetooth的API开发189.2 The Basics开发189.3 Bluetooth Permissions开发199.4 Setting Up Bluetooth服务199.5 Finding Devices服务209.6 Connecting Devices服务229.7 Managing a Connection服务269.8 Working with Profiles服务28十 总结与疑问29一 Bluetooth基本概念蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各种数字数据系统、甚至家用电器采用无线方式联接起来。它的传输距离为10cm~10m,如果增加功率或是加上某些外设便可达到100m的传输距离。它采用2.4GHz ISM频段和调频、跳频技术,使用权向纠错编码、ARQ、TDD和基带协议。TDMA每时隙为0.625μs,基带符合速率为1Mb/s。蓝牙支持64kb/s实时语音传输和数据传输,语音编码为CVSD,发射功率分别为1mW、2.5mW和100mW,并使用全球统一的48比特的设备识别码。由于蓝牙采用无线接口来代替有线电缆连接,具有很强的移植性,并且适用于多种场合,加上该技术功耗低、对人体危害小,而且应用简单、容易实现,所以易于推广。蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应用。底层硬件部分包括无线跳频(RF)、基带(BB)和链路管理(LM)。无线跳频层通过2.4GHz无需授权的ISM频段的微波,实现数据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。基带负责跳频以及蓝牙数据和信息帧的传输。链路管理负责连接、建立和拆除链路并进行安全控制。二 Android Bluetooth架构2.1 Bluetooth架构图Android蓝牙系统分为四个层次,内核层、BlueZ库、BlueTooth的适配库、BlueTooth的JNI部分、Java框架层、应用层。下面先来分析Android的蓝牙协议栈。图1 面向库的架构视图Linuxkernel层:bluez协议栈、uart驱动, h4协议, hci,l2cap, sco, rfcommbluez层:这是bluez用户空间的库,开源的bluetooth代码,包括很多协议,生成libbluetooth.so。library层:libbluedroid.so等framework层:实现了Headset /Handsfree 和 A2DP/AVRCP profile,但其实现方式不同Handset/Handfree是直接 在bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,大大降低了实现的难度。Android的蓝牙协议栈采用BlueZ来实现,BlueZ分为两部分:内核代码和用户态程序及工具集。图2 面向进程的架构视图2.2 Bluetooth代码层次结构(1)JAVA层frameworks/base/core/java/android/bluetooth/包含了bluetooth的JAVA类。(2)JNI层frameworks/base/core/jni/android_bluetooth_开头的文件定义了bluez通过JNI到上层

    展开全文
  • Porting Realtek Bluetooth USB driver into Android 5.0 Guide ...安卓蓝牙驱动添加,rtl8723蓝牙,rtl 1.1 要修改的文件: 要修改到底文件如下: build Chg build\core\product.mk device New device\comp...

    Porting Realtek Bluetooth USB driver into Android 5.0 Guide
    Date : 2014/12/31
    Version : 1.0
    安卓蓝牙驱动添加,rtl8723蓝牙,rtl

    1.1 要修改的文件:

    要修改到底文件如下:

    1. build

    Chg build\core\product.mk

    1. device

    New device\companyName\platformName\bluetooth\bdroid_buildcfg.h
    Chg device\companyName\platformName\BoardConfig.mk
    Chg device\companyName\platformName\platformName.mk
    New device\companyName\platformName\android.hardware.bluetooth.xml
    New device\companyName\platformName\android.hardware.bluetooth_le.xml
    Chg device\companyName\platformName\init.platformName.rc

    1. hardware
      New hardware\realtek*

    2. kernel
      Chg kernal\arch\arm\configs\ platformName_android_defconfig
      New kernal\driver\bluetooth\rtk_btusb.c
      New kernal\driver\bluetooth\rtk_btusb.h
      C

    展开全文
  • 本帖最后由 旋律2014 于 2014-3-27 09:15 编辑一、关于BT driver的移植:1. Enablebluetootch in ...实现BT电源管理rfkill驱动。Kernel/driver/bluetooth/bluetooth-power.c 高通的这个文件基本上不用动。在kernel\...

    本帖最后由 旋律2014 于 2014-3-27 09:15 编辑

    一、关于BT driver的移植:

    1. Enablebluetootch in BoadConfig.mk

    BOARD_HAVE_BLUETOOTH := true

    2.实现BT电源管理rfkill驱动。

    Kernel/driver/bluetooth/bluetooth-power.c    高通的这个文件基本上不用动。

    在kernel\arch\arm\mach_msm7x27.c: static int bluetooth_power(int on)中

    实现:上电:把bt_reset pin 和bt_reg_on pin 拉低

    mdelay(10);

    把bt_resetpin 和bt_reg_on pin 拉高

    mdelay(150)

    下电:把bt_reset pin 和bt_reg_on pin 拉低

    3. RebuildAndroid image and reboot

    命令行测试:

    echo 0 >/sys/class/rfkill/rfkill0/state   //BT下电

    echo 1 >/sys/class/rfkill/rfkill0/state   //BT上电

    brcm_patchram_plus-d --patchram /etc/firmware/BCM4329B1_002.002.023.0061.0062.hcd/dev/ttyHS0

    hciattach -s115200 /dev/ttyHS0 any

    没任何错误提示是可以用以下测试

    hciconfig hci0up

    hcitool scan

    4.实现BT睡眠唤醒机制

    Kernel\drivers\bluetooth\bluesleep.c一般来说这个文件改动比较少,但可能逻辑上会有些问题。需要小的改动。

    在kernel\arch\arm\mach_xxx/board_xxx.c:bluesleep_resources中定义gpio_host_wake(BT唤醒host脚)、gpio_ext_wake(host唤醒BT脚)、host_wake(BT唤醒host的中断号)。

    注:各个平台的board_xxx.c文件名字不同,请客户确认

    5.系统集成

    1)在init.qcom.rc中确认有下面的内容:

    service hciattach/system/bin/sh /system/etc/init.qcom.bt.sh

    user bluetooth

    group qcom_oncrpc bluetooth net_bt_admin

    disabled

    oneshot

    2)修改init.qcom.bt.sh

    确认有:

    BLUETOOTH_SLEEP_PATH=/proc/bluetooth/sleep/proto

    echo 1 >$BLUETOOTH_SLEEP_PATH

    /system/bin/hciattach-n /dev/ttyHS0 any 3000000 flow & 改为:

    ./brcm_patchram_plus--enable_lpm –enable_hci --patchram /system/etc/wifi/BCM4329BT.hcd --baudrate3000000 /dev/ttyHS0 &

    注掉:高通下载firmware的命令。

    6.重新编译system。此时BT应该能运行了。

    二、BT的休眠唤醒配置

    BT的休眠在driver/bluetooth/bluesleep.c中,首先驱动的名字叫“bluesleep”与arch/arm/mach-msm/board-msm7x30.c相匹配就执行platform_driver_probe(&bluesleep_driver, bluesleep_probe)然后调用static int __init bluesleep_probe(struct platform_device *pdev),这里会配置两个引脚HOST_WAKE_BT & BT_WAKE_HOST

    bsi = kzalloc(sizeof(struct bluesleep_info), GFP_KERNEL);

    if (!bsi)

    return -ENOMEM;

    res = platform_get_resource_byname(pdev, IORESOURCE_IO,

    "gpio_host_wake");

    if (!res) {

    BT_ERR("couldn´t find host_wake gpio\n");

    ret = -ENODEV;

    goto free_bsi;

    }

    bsi->host_wake = res->start;

    //[zhangmin-111230] change the configuration of BT sleep gpio from bt_power to here {

    gpio_tlmm_config(GPIO_CFG(bsi->host_wake, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),GPIO_CFG_ENABLE);

    //[zhangmin-111230] }

    ret = gpio_request(bsi->host_wake, "bt_host_wake");

    if (ret)

    goto free_bsi;

    ret = gpio_direction_input(bsi->host_wake);

    bsi->host_wake_irq = platform_get_irq_byname(pdev, "host_wake");

    如上代码所示,主要将HOST_WAKE_BT设置为输出脚,BT_WAKE_HOST 设置为输入脚并也设置为中断脚,等待BT芯片的唤醒。

    然后再bluesleep_init函数中建立BT目录/proc/bluetooth/sleep/读btwake中HOST_WAKE_BT的状态。读出的状态值为0或1。

    或在BT目录/proc/bluetooth/sleep/写btwake中HOST_WAKE_BT的状态。写出状态值为0或1。

    Part 1.有时候会出现打开蓝牙打不开的现象。

    答:在/system/bluetooth/bluedroid/bluetooth.c中的注册socket时间增加时间。具体做法是在函数int bt_enable()中

    for (attempt = 1000; attempt > 0;  attempt--) {

    hci_sock = create_hci_sock();

    if (hci_sock < 0) goto out;

    if (!ioctl(hci_sock, HCIDEVUP, HCI_DEV_ID)) {

    break;

    }

    close(hci_sock);

    usleep(10000);  // 10 ms retry delay

    }

    修改红色标记的延时时间,即可解决偶尔开蓝牙出现打不开的现象。

    Part 2.打开蓝牙时间过长,会要16秒时间。

    答:这个跟开启蓝牙加载patchram有很大的关系,由以前的两部分加载,现在变成一部分加载

    改之前:

    /system/bin/brcm_patchram_plus.dat -d --enable_lpm --patchram /etc/BCM4330.hcd /dev/ttyHS0

    /system/bin/brcm_patchram_plus.dat -d -baudrate 3000000 /dev/ttyHS0

    改之后:

    brcm_patchram_plus.dat  --enable_lpm --enable_hci --patchram /etc/BCM4330.hcd /dev/ttyHS0 --baudrate 3000000 &

    修改过后能稳定加载BT。

    还可以修改波特率来加快加载patchram的速度。具体操作如下

    在函数void proc_patchram()中添加指定的波特率:

    if (use_baudrate_for_download) {

    cfsetospeed(&termios, B115200);

    cfsetispeed(&termios, B115200);

    tcsetattr(uart_fd, TCSANOW, &termios);

    }

    指定加载patchram的波特率为115200.

    并且在主函数main()里要在两次执行函数proc_reset()中间追加一次执行函数proc_baudrate(),这样就可以确保波特率已经设置好了。

    BCM4330 WIFI 调试记录

    Part 1

    问:打开wifi,连接wifi热点,提示连接成功,但headbar上不显示wifi图标,back退出wifi设置,再进入,提示wifi已断开。

    答:首先现象复现,当现象复现时进入adb shell,然后输入ifconfig 查看是否有wlan0 端口,然后在adb shell 中ping 192.168.1.101(嵌入式设备的IP),如果能Ping通则说明底层wifi设备与AP是连接通的。所以把问题转向上层。上层在frameworks/base/services/java/com/android/server/ConnectivityService.java文件中查看private void handleDisconnect(NetworkInfo info)函数的实现,问题可能出现在这里。

    Part 2

    问:出现新热点,需要重启WIFI才可以扫描到。

    问:20s内无法连接到WIFI热点。

    问:已连接的热点关闭,不会自动连接下一个热点。

    答:这些问题都是供应商芯片的firmware没有配置好,所以直接找FAE换掉。

    Part 3

    问:调试中如果遇到dhd_sdio_probe fail 。

    问:发现sdio register timeout 。

    答:因为我们用到的WIFI数据通道是SDIO接口,所以要在log信息中查看sdcard是否有加载。没加载的话就看看WIFI芯片的上电(如WIFI_REG_ON这个PIN脚)。

    Part 4

    问:如果在wifi的设置里面选中wifi选项出现ERRO(或错误)的提示。

    答:首先在adb shell中lsmod查看.ko文件是否已经加载。如没加载cat /proc/kmsg查看是否是版本匹配的问题。如遇版本匹配则在kernel/scripts/setlocalversion中将echo “+”中去掉。如果顺利加载了驱动,则要看看MAC地址是否有,并且是否合理。

    Part 5

    问:发现在WIFI设置选项中有已经选上了wifi并且勾应打上了,过一会出现wifi的勾自动消失。

    答:这种情况在adb shell中用ifconfig查看Wlan的接口用的是否是wlan0,有可能是eth0。如果是eth0则在hardware/libhardware_legacy/wifi/wifi.c中的#define WIFI_DRIVER_MODULE_ARG  "firmware_path=/system/etc/firmware/wlan/sdio.bin nvram_path=/data/simcom/nvram.txt iface_name=wlan0" 中查看iface_name=wlan0是否已经加上。

    Part 6

    问:有的路由器不能扫描的到。

    答:查看wlan的设置的channel是否在1-14这个频段,因为如果wlan设置成USA模式则channel的范围在1-11之间,channel 12,13,14就不会收索的到。所以要在nvram.txt中修改成ccode=ALL,并且在gqcom_cfg.ini中把APCntryCode=ALL。这样应该就可以扫描到所有的channel了。当然如果上层还是没有收索到的话,在Settings.java中也要做相应的修改。

    常用的命令:wl channels_in_country

    wl chanlist

    wl channels

    wl country

    Part 7

    问:【预置条件】:wifi 已连接 wifi sleep policy模式为When screen turns off

    【操作步骤】:wifi连接网络,静置屏幕熄灭大约5分钟,再次点亮屏幕

    【测试结果】:wifi一直处在scanning状态,无法连接网络,关闭再打开恢复正常

    【预期结果】:点亮屏幕后,wifi自动连接成功

    答:调试分析记录:

    1.在frameworks/base/services/java/com/android/server/WifiService.java中修改LCD灭屏后关掉WIFI的时间长短,由以前的2分钟修改为现在的1秒钟。

    结果是短时间休眠后唤醒可以顺利连上AP,但经过长时间休眠(如15分钟)后唤醒机器还是无法连接AP。

    2.检查Kernel中POWER_ON使能脚,看是否有其它地方被占用过,结果是屏蔽所有其它用到过该脚的代码还是无用。

    3.检查CP侧代码,将CP侧POWER_ON引脚由以前的某种特殊功能设置成普通的Output模式,然后AP就可以自由的控制其高低电平了。

    修改后的结果还是以无效告终。

    4.检查external/wpa_supplicant_6/wpa_supplicant/文件夹下面的代码,检查WEXT驱动代码。结果还是失败。

    5.最后在机器休眠15分钟后,用底层命令行来scan、连接等动作的操作,结果根本无法扫描到AP。故把问题集中在驱动底层。经过修改dhd.ko、sdio.bin文件

    现在此Bug终于得解。

    6.也有问题不出现在驱动dhd.ko文件中,可能出现在mmc驱动中的sdio通道。在函数mmc_pm_notify中当出现PM_POST_SUSPEND或PM_POST_HIBERNATION的情况时就有可能移除掉了sdio通道,所以函数mmc_detect_change(host, 0)要加一个判断,当sdio作为wifi通道时就不能移除。移除后的后果就是此Bug。

    Android BCM4330 FM驱动调试

    FM Porting

    1 修改init.xxx.rc 增加服务,并把btld push到/system/bin下

    service btld /system/bin/logwrapper /system/bin/btld

    user root

    group bluetooth net_bt_admin

    disabled

    oneshot

    2 合并system\bluetooth\bluedroid下的代码

    主要是bluetooth enable及fm enable部份的代码

    3 合并frameworks下的代码

    BT和Fm及电源管理部份,主要提供给system service

    4 编译packages\apps\FmRadio

    编译得到FmRadio.apk,直接intall到android机子上使用.

    一、底层关于FM驱动的Lib库,首先要想好在底层我们要准备好提供上层的JNI接口。

    如下几个接口:

    1.fm_power_on();                                  打开FM;

    2.fm_power_off();                                  关掉FM;

    3.fm_search_freq(int frq, char up);    FM自动搜台,并跳到下一个台的位置;

    4.fm_get_freq();                                     FM得到当前电台的频率;

    5.fm_set_mute();                                   设置FM静音;

    6.fm_set_volue(int value);                    设置FM的音量大小;

    这些函数实现后,编译成动态库(生成.so文件)。

    二、在framework/base/core/jni目录下实现一个.cpp文件把lib库调用,实现FM的一些工作,这个jni就会直接给mangerserver,最上面的apk应用会调用Manger层,而manger和mangerserver之间的通信是通过IPC机制实现的。

    展开全文
  • Android 蓝牙驱动 概要

    2014-06-21 22:16:30
    在linux中,蓝牙设备驱动是网络设备,使用网络接口。 蓝牙设备的网络协议,所定义的协议族为: AF_BLUETOOTH (31) 蓝牙协议部分头文件: include/net/bluetooth/hci_core.h include/...
    在linux中,蓝牙设备驱动是网络设备,使用网络接口。
    蓝牙设备的网络协议,所定义的协议族为:
    AF_BLUETOOTH (31)
    蓝牙协议部分头文件:
    include/net/bluetooth/hci_core.h
    include/net/bluetooth/bluetooth.h
    蓝牙协议源代码文件:
    net/bluetooth/*
    蓝牙系统的协议和驱动程序在内核进行menuconfig配置时,配置选项为:networking support >bluetooth subsystem support >bluetooth device drivers.
    蓝牙协议对应的配置文件为:net/bluetooth/Kconfig;蓝牙系统驱动程序对应的配置文件为:drivers/bluetooth/Kconfig
    在蓝牙协议部分,包含了主控制接口(HCI),SCO(SCO audio links)模块,L2CAP(Logical Link Control and Adaptation Protocol)模块,BNEP模块(蓝牙网络封装协议)等,BNEP等模块内容包含在其中的几个子目录中。
    蓝牙驱动中的不同接口文件:
    hci_vhci.c 蓝牙虚拟主控制器驱动程序;
    hci_uart.c 蓝牙串口驱动程序;
    btusb.c       蓝牙usb驱动程序;
    btsdio.c     蓝牙sdio驱动程序;


     Android 的蓝牙协议栈使用BlueZ实现来对GAP, SDP以及RFCOMM等应用规范的支持,并获得了SIG认证。由于Bluez使用GPL授权, 所以Android 框架通过D-BUS IPC来与bluez的用户空间代码交互以避免使用未经授权的代码。             

     蓝牙的驱动程序一般都通过标准的HCI控制实现。但根据硬件接口和初始化流程的不同,又存在一些差别。这类初始化动作一般是一些晶振频率,波特率等基础设置。比如CSR的芯片一般通过BCSP协议完成最初的初始化配置,再激活标准HCI控制流程。对Linux来说,一旦bluez可以使用HCI与芯片建立起通信(一般是hciattach + hciconfig),便可以利用其上的标准协议(SCO, L2CAP等),与蓝牙通信,使其正常工作了

    展开全文
  • 网上关于BT的驱动很少,所以我在开发过程中把其中的步骤记录下来。供大家相互学习讨论。一、关于BT driver的移植:1. Enablebluetootch in BoadConfig.mkBOARD_HAVE_BLUETOOTH := true2.实现BT电源管理rfkill驱动。...
  • Android 蓝牙驱动开发Android蓝牙驱动开发总结Android 蓝牙驱动开发一 Bluetooth 基本概念 1二 Android Bluetooth 架构 12.1 Bluetooth 架构图 12.2 Bluetooth 代码层次结构 3三 Bluetooth 协议栈分析 43.1 蓝牙...
  • Android蓝牙驱动开发总结
  • Android蓝牙开发必备,是初学者,初级工程师学习Android 蓝牙的必备手册。 主要分为三部分 1.打开蓝牙; 2.查找附近已配对或可用的设备; 3.连接设备; 4.设备间数据 交换。
  • Android应用源码安卓蓝牙游戏手柄驱动项目
  • android(linux)平台蓝牙驱动的详细调试过程和总结
  • 说明本文档是基于Android 8.1版本的一款博通蓝牙驱动移植全过程记录。本驱动是通过/dev/ttyS2和蓝牙进行通信。因为较android以前的版本有很大变化尤其是上层关于蓝牙协议栈的部分,以前老版本用Bluez再到后来的...
  • 安卓电视盒用蓝牙驱动
  • 安卓蓝牙BLE驱动代码

    2015-09-16 17:12:51
    安卓蓝牙BLE驱动代码,支持安卓4.0 BLE,低功耗BLE蓝牙

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,462
精华内容 4,184
关键字:

安卓蓝牙驱动