Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【FAQ】全志R329如何进行Tina Linux蓝牙低功耗默认连接参数修改

    其它全志芯片讨论区
    r329 r328 r818 faq 技术支持
    1
    1
    232
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 8 last edited by

      【问题背景】
      硬件:R328/other + 蓝牙模组(XR829/other)
      软件:Tina

      【问题简述】
      btmanger里面有更新连接参数的函数bt_manager_le_update_conn_params,
      但是该函数需要在连接完成后调用,有部分客户想要在发起连接时就使用一些连接参数。

      【问题分析】
      在运行蓝牙后,Linux内核蓝牙协议栈会创建调试节点,可以用于修改一些参数,其中就包括发起连接时的连接参数。

      具体位置在:

      /sys/kernel/debug/bluetooth/hci0
      

      里面内容有:

      adv_channel_map                idle_timeout
      adv_max_interval               inquiry_cache
      adv_min_interval               le_max_key_size
      auto_accept_delay              le_min_key_size
      blacklist                      link_keys
      conn_info_max_age              long_term_keys
      conn_info_min_age              manufacturer
      conn_latency                   quirk_simultaneous_discovery
      conn_max_interval              quirk_strict_duplicate_filter
      conn_min_interval              random_address
      dev_class                      remote_oob
      device_id                      rpa_timeout
      device_list                    sc_only_mode
      discov_interleaved_timeout     sniff_max_interval
      dut_mode                       sniff_min_interval
      features                       ssp_debug_mode
      force_bredr_smp                static_address
      force_static_address           supervision_timeout
      hardware_error                 use_debug_keys
      hci_revision                   uuids
      hci_version                    voice_setting
      identity                       white_list
      identity_resolving_keys        white_list_size
      

      我们主要关心下面几个参数:

      符号 描述 说明

      conn_latency	        从机潜伏时间	可以跳过连接事件最大次数
      conn_max_interval	最大连接间隔	     连接事件间隔最大值
      conn_min_interval	最小连接间隔	     连接事件间隔最小值
      supervision_timeout	监督超时时间	两次成功连接事件之间的最长时间。
      连接间隔范围: 6(7.5ms)< 1.25ms * conn_interval < 3200(4.0s)
      监督超时时间范围: 10(100 ms)< 10ms * supervision_timeout < 3200(32.0 s)
      从机潜伏时间范围: 0 < conn_latency < 499
      

      iPhone对这些参数有要求,具体看文章最后面。

      【解决方法】
      修改Linux内核代码tina/lichee/linux-4.9/net/bluetooth/hci_core.c
      函数 struct hci_dev *hci_alloc_dev(void)里面的默认参数。

      实现函数修改内核蓝牙协议栈的debugfs调试节点,启动蓝牙后调用一次即可:

      int bt_le_default_conn_params_set(uint16_t min_conn_interval, uint16_t max_conn_interval, 
                                        uint16_t slave_latency, uint16_t conn_sup_timeout)
      {                                                                                                                            
          if(min_conn_interval < 0x0006 || min_conn_interval > 0x0C80 ||
              max_conn_interval < 0x0006 || max_conn_interval > 0x0C80 ||
              min_conn_interval > max_conn_interval || slave_latency > 0x01F3 ||
              conn_sup_timeout < 0x000A || conn_sup_timeout > 0x0C80) {
              printf("param error!\n");
              return -1;
          }   
      
          char buf[128];
          if(access("/sys/kernel/debug/bluetooth/hci0",F_OK) == 0) {
              snprintf(buf, sizeof(buf), "echo %d > /sys/kernel/debug/bluetooth/hci0/conn_min_interval", min_conn_interval);
              printf("run:%s\n",buf);
              system(buf);
              snprintf(buf, sizeof(buf), "echo %d > /sys/kernel/debug/bluetooth/hci0/conn_max_interval", max_conn_interval);
              printf("run:%s\n",buf);
              system(buf);
              snprintf(buf, sizeof(buf), "echo %d > /sys/kernel/debug/bluetooth/hci0/conn_latency", slave_latency);
              printf("run:%s\n",buf);
              system(buf);
              snprintf(buf, sizeof(buf), "echo %d > /sys/kernel/debug/bluetooth/hci0/supervision_timeout", conn_sup_timeout);
              printf("run:%s\n",buf);
              system(buf);
          }   
              
          return 0;
      }
      
      // iphone 参数要求
      // Interval Min ≥ 15 ms (multiples of 15 ms)
      // Interval Min + 15 ms ≤ Interval Max (Interval Max == 15 ms is allowed)
      // Interval Max * (Slave Latency + 1) ≤ 2 seconds
      // Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout
      // Slave Latency ≤ 30
      // 2 seconds ≤ connSupervisionTimeout ≤ 6 seconds
      
      1 Reply Last reply Reply Quote Share 0
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

      Copyright © 2022 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策