全志平台ap6476模组 bluetooth功能调试(1)驱动移植&配置修改

free-jdx 2021-01-20 17:04:49 7777
1. 前言

蓝牙移植内核修改的较少,
android层由于使用broadcom提供bplus,framework和package改动较多,
android部份的移植只提及重要的修改。

2. 内核配置

修改.config文件以支持蓝牙的low power mode和唤醒休眠主控功能和支持android4.2 hid设备。

蓝牙low power mode和唤醒休眠主控的支持。

linux-3.3目录下,输入make ARCH=arm menuconfig
选择   -> Networking support (NET [=y])
         -> Bluetooth subsystem support (BT [=y]) 
          -> Bluetooth device drivers
           -> <*> Bluetooth Low Power Manager Support 
             <*>   An inverter between bt hostwake pin and cpu 

ap6476模组是支持蓝牙唤醒休眠主控,需要在wakeup_src_para主键下把蓝牙的唤醒源添加上,唤醒源要跟wifi配置下的ap6xxx_bt_host_wake一致。

linux-3.3目录下,输入make ARCH=arm menuconfig
选择   -> Device Drivers  --->
         -> HID Devices  --->
          -> <*> User-space I/O driver support for HID subsystem
3. sys_config修改

sys_config.fex是系统的配置文件,蓝牙功能是否有、蓝牙功能脚、接口定义等均是在sys_config.fex中设定。

;--------------------------------------------------------------------------------
;blue tooth
;bt_used            ---- blue tooth used (0- no used, 1- used)
;bt_uard_id         ---- uart index
;--------------------------------------------------------------------------------
[bt_para]
bt_used             = 1
bt_uart_id          = 2
bt_wakeup           =
bt_gpio             =
bt_rst              =

bt_para是蓝牙配置的主键名,在sys_config.fex中是唯一的,会在脚本解释中被用到。
bt_used子键值为1代指平台使用蓝牙功能,值为0代指平台无蓝牙功能,bt_used会被rf电源管理驱动通过脚本解释读取其值,若值为0则不注册rfkill,直接返回空。
bt_uart_id子键值代指使用哪一路串口作为数据交互的通道,会在uart注册时被读取。

[uart_para2]
uart_used       = 1
uart_port       = 2
uart_type       = 4
uart_tx         = port:PG06<2><1><default><default>
uart_rx         = port:PG07<2><1><default><default>
uart_rts        = port:PG08<2><1><default><default>
uart_cts        = port:PG09<2><1><default><default>

蓝牙使用第2路串口,需要把uart_used子键值设成1,代指第2路串口会被使用,若uart_used值设成0,在系统启动时会由于资源跑空导致系统挂掉

[wakeup_src_para]
cpu_en              =   0
cpu_freq            =   48
; (cpu:apb:ahb)
pll_ratio           =   0x111
dram_selfresh_en        =   1
dram_freq           =   36
wakeup_bt           =  port:PL07<2><1><default><default>

ap6476模组是支持蓝牙唤醒休眠主控,需要在wakeup_src_para主键下把蓝牙的唤醒源添加上,唤醒源要跟wifi配置下的ap6xxx_bt_host_wake一致。

4. 驱动修改

(1)sw_uart.c

修改drivers/tty/serial/sw_uart.c文件中的sw_uart_probe函数,让btlmp.c获取蓝牙数据串口的句柄。

@@ -1185,7 +1185,9 @@ void sw_uart_procfs_remove(struct sw_uart_port *sw_uport)
        remove_proc_entry(proc_root, NULL);
 }
 #endif
-
+#ifdef CONFIG_BT_LPM
+extern void bluesleep_setup_uart_port(struct platform_device *uart_dev);
+#endif
 static int __devinit sw_uart_probe(struct platform_device *pdev)
 {
        u32 id = pdev->id;
@@ -1236,6 +1238,20 @@ static int __devinit sw_uart_probe(struct platform_device *pdev)
 #ifdef CONFIG_PROC_FS
        sw_uart_procfs_attach(sw_uport);
 #endif
+
+#ifdef CONFIG_BT_LPM
+       script_item_value_type_e type;
+       script_item_u val;
+       type = script_get_item("bt_para", "bt_uart_id", &val);
+       if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
+               SERIAL_MSG("failed to fetch bt uart configuration.");
+               return -1;
+       }
+       if (val.val != 0 && val.val == sw_uport->id) {
+               bluesleep_setup_uart_port(pdev);
+       }
+#endif
+
        SERIAL_DBG("add uart%d port, port_type %d, uartclk %d\n",

(2)rf电源管理修改

rf电源管理要添加ap6476的支持,包括两个方面,一是蓝牙电源管理的支持,二是把主控的32K时钟打开。

ap6476 蓝牙电源管理的支持需要在bt_pm.c中做修改,修改的地方如下。

@@ -51,6 +51,13 @@ static int rfkill_set_power(void *data, bool blocked)
                 wifi_pm_gpio_ctrl("ap6xxx_bt_regon", 0);
             }
             break;
+        case 10: /* ap6476 */
+             if (!blocked) {
+                wifi_pm_gpio_ctrl("ap6xxx_bt_regon", 1);
+            } else {
+                wifi_pm_gpio_ctrl("ap6xxx_bt_regon", 0);
+            }
+            break;
         default:
             RF_MSG("no bt module matched !!\n");

由电路原理图看,蓝牙的32K时钟是由主控的PM07提供,需要在系统启动时就把32K时钟打开,要注意的是32K时钟还会对应一个电压源的,也要把电压源打开。
32K时钟的开启在wifi_pm_ap6xxx.c中实现,修改如下。

@@ -15,6 +15,50 @@ static int ap6xxx_wl_regon = 0;
 static int ap6xxx_bt_regon = 0;
 static char * axp_name = NULL;

+static void ap6xxx_pm7_32k_clkout(void)
+{
+       struct regulator* ldo = NULL;
+       int ret = 0;
+       u32 clk_index = GPIOM(7);
+
+       ldo = regulator_get(NULL, "axp22_dldo4");
+       if (!ldo) {
+               ap6xxx_msg("request axp axp22_ldoio1 fail\n");
+               goto out2;
+       }
+       ret = regulator_set_voltage(ldo, 1800000, 1800000);
+       if (ret < 0) {
+               ap6xxx_msg("set voltage for axp gpio1/ldo fail\n");
+               goto out2;
+       }
+       ret = regulator_enable(ldo);
+       if (ret < 0) {
+               ap6xxx_msg("enable for axp gpio1/ldo fail\n");
+               goto out2;
+       }
+
+       ap6xxx_msg("enable bt 32khz clk, power form axp22_dldo4.\n");
+       if (0 != gpio_request(clk_index, NULL)) {
+               ap6xxx_msg("request clk gpio failed\n");
+               goto out2;
+       }
+
+       if (0 != sw_gpio_setcfg(clk_index, 3)) {
+               ap6xxx_msg("set clk gpio function to 3 failed\n");
+               goto out1;
+       }
+
+       *(volatile int*)0xf1f014f0 = 0x80000000;
+
+out1:
+       gpio_free(clk_index);
+out2:
+       if (!ldo) {
+               regulator_put(ldo);
+       }
+       return;
+}
+

@@ -156,4 +200,7 @@ void ap6xxx_gpio_init(void)
        ops->power = ap6xxx_power;

        ap6xxx_module_power(1);
+
+       //ap6xxx_msg("open 32k clk for bt\n");
+       ap6xxx_pm7_32k_clkout();
 }
5. 安卓端配置修改
(1)BoardConfig.mk

BoardConfig.mk是android系统平台配置文件,需要在BoardConfig.mk中添加蓝牙功能的支持。

# 2. Bluetooth Configuration
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_BCM := true
BLUETOOTH_USE_BPLUS := true

BOARD_HAVE_BLUETOOTH值为ture代指平台带蓝牙功能,值为true framework蓝牙部份的代码才得到编译;
BOARD_HAVE_BLUETOOTH_BCM值为true代指使用broadcom蓝牙,/device/common/libbt下的代码才会得到编译;
BLUETOOTH_USE_BPLUS值为true代指使用bplus,/external/bluetooth/bluedroid代码不会编译,也就是用bplus替换了android4.2原生实现的profile。

(2)fiber_xxx.mk

fiber_xxx.mk文件添加蓝牙相关文件的拷贝。

PRODUCT_COPY_FILES += \
    hardware/broadcom/wlan/firmware/ap6476/bcm2076b1.hcd:system/vendor/modules/bcm2076b1.hcd

PRODUCT_COPY_FILES += \
    device/softwinner/fiber-a31st/ap6476/bplus.default.so:system/lib/hw/bplus.default.so \
    device/softwinner/fiber-a31st/ap6476/iop_bt.db:system/etc/bluetooth/iop_bt.db \
    external/bluetooth/bluedroid/conf/auto_pair_devlist.conf:system/etc/bluetooth/auto_pair_devlist.conf \
    external/bluetooth/bluedroid/conf/bt_did.conf:system/etc/bluetooth/bt_did.conf \
    external/bluetooth/bluedroid/conf/bt_stack.conf:system/etc/bluetooth/bt_stack.conf \
    external/bluetooth/bluedroid/conf/bt_vendor.conf:system/etc/bluetooth/bt_vendor.conf
(3)init.sun6i.rc

init.sun6i.rc文件中添加对蓝牙接口、电源管理和相关目录的执行权限的修改。

# bluetooth
    # UART device
    chmod 0660 /dev/ttyS2
    chown bluetooth net_bt_stack /dev/ttyS2

    # power up/down interface
    chmod 0660 /sys/class/rfkill/rfkill0/state
    chmod 0660 /sys/class/rfkill/rfkill0/type
    chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state
    chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/type

    # bluetooth LPM
    chmod 0220 /proc/bluetooth/sleep/lpm
    chmod 0220 /proc/bluetooth/sleep/btwrite
    chown bluetooth net_bt_stack /proc/bluetooth/sleep/lpm
    chown bluetooth net_bt_stack /proc/bluetooth/sleep/btwrite
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
free-jdx
红包 96 8 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区