Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1365611
  • 博文数量: 860
  • 博客积分: 425
  • 博客等级: 下士
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-20 19:57
个人简介

对技术执着

文章分类

全部博文(860)

文章存档

2019年(16)

2018年(12)

2015年(732)

2013年(85)

2012年(15)

我的朋友

分类: LINUX

2012-10-17 18:59:27

网上关于BT的驱动很少,所以我在开发过程中把其中的步骤记录下来。供大家相互学习讨论。

一、关于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;
        //[SIMT-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);
        //[SIMT-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。

网上关于BT的驱动很少,所以我在开发过程中把其中的步骤记录下来。供大家相互学习讨论。


一、关于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;
        //[SIMT-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);
        //[SIMT-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。

做BT的驱动已有半年的时间多了,有一定的认识,但还没完全精通,所以用笔记来记录自己一直以来的调试过程。

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(),这样就可以确保波特率已经设置好了。

做BT的驱动已有半年的时间多了,有一定的认识,但还没完全精通,所以用笔记来记录自己一直以来的调试过程。

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(),这样就可以确保波特率已经设置好了。


来自:http://blog.csdn.net/dwyane_zhang/article/details/7376972

阅读(6000) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~