【FAQ】全志R329如何进行Tina Linux蓝牙低功耗默认连接参数修改
-
【问题背景】
硬件: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
-
-
-
-
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号