我是靠谱客的博主 魔幻电话,最近开发中收集的这篇文章主要介绍BT调试过程分享(ap6256),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

板子:rk3568
模块:ap6256
平台:android11

1.报错:

07-20 03:27:57.288   282   301 I bt_vnd_conf: Attempt to load conf from /vendor/etc/bluetooth/bt_vendor.conf
07-20 03:27:57.288   282   301 D android.hardware.bluetooth@1.0-impl: Open vendor library loaded
07-20 03:27:57.289   282   301 W bt_vendor: NOTE: BT_VND_PWR_ON now forces power-off first
07-20 03:27:57.296     0     0 I [BT_RFKILL]: bt shut off power
07-20 03:27:57.296     0     0 I [BT_RFKILL]: rfkill_rk_set_power: set bt wake_host high!
07-20 03:27:57.348     0     0 I [BT_RFKILL]: ENABLE UART_RTS
07-20 03:27:57.448   282   301 I bt_userial_vendor: userial vendor open: opening /dev/ttyS8
07-20 03:27:57.448   282   301 I bt_userial_vendor: device fd = 7 open
07-20 03:27:57.454     0     0 I [BT_RFKILL]: DISABLE UART_RTS
07-20 03:27:57.454     0     0 I [BT_RFKILL]: bt turn on power
07-20 03:27:57.454     0     0 I [BT_RFKILL]: Request irq for bt wakeup host
07-20 03:27:57.454     0     0 I [BT_RFKILL]: ** disable irq
07-20 03:28:00.183  2174  2203 E bt_hci  : startup_timer_expired
07-20 03:28:00.183  2174  2203 I bt_hci_timeout: 15658734
07-20 03:28:00.183   282   301 I android.hardware.bluetooth@1.0-impl: BluetoothHci::close()
07-20 03:28:00.184   282   301 I bt_userial_vendor: device fd = 7 close
07-20 03:28:00.199   282   301 I android.hardware.bluetooth@1.0-impl: Firmware configured in 2.750s
07-20 03:28:00.199  2174  2203 F libc    : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 2203 (alarm_default_c), pid 2174 (droid.bluetooth)	//这里看网上说的是调用库出了问题,下面也打印出来的库的问题
07-20 03:28:00.205     0     0 I [BT_RFKILL]: bt shut off power
07-20 03:28:00.272  2222  2222 I crash_dump64: obtaining output fd from tombstoned, type: kDebuggerdTombstone
07-20 03:28:00.292  2222  2222 F DEBUG   : pid: 2174, tid: 2203, name: alarm_default_c  >>> com.android.bluetooth <<<
07-20 03:28:00.359  2222  2222 F DEBUG   :       #01 pc 00000000002ca328  /system/lib64/libbluetooth.so (startup_timer_expired(void*) (.cfi)+188) (BuildId: 306e172ba933ab28fd3d5cc230269a38)
07-20 03:28:00.359  2222  2222 F DEBUG   :       #02 pc 00000000003a9e50  /system/lib64/libbluetooth.so (alarm_ready_generic(alarm_t*, std::__1::unique_lock<std::__1::mutex>&)+388) (BuildId: 306e172ba933ab28fd3d5cc230269a38)
07-20 03:28:00.359  2222  2222 F DEBUG   :       #03 pc 00000000003a9340  /system/lib64/libbluetooth.so (alarm_queue_ready(fixed_queue_t*, void*) (.cfi)+124) (BuildId: 306e172ba933ab28fd3d5cc230269a38)
07-20 03:28:00.360  2222  2222 F DEBUG   :       #04 pc 00000000003af5a0  /system/lib64/libbluetooth.so (internal_dequeue_ready(void*) (.cfi)+108) (BuildId: 306e172ba933ab28fd3d5cc230269a38)
07-20 03:28:00.360  2222  2222 F DEBUG   :       #05 pc 00000000003b0d1c  /system/lib64/libbluetooth.so (run_reactor(reactor_t*, int)+412) (BuildId: 306e172ba933ab28fd3d5cc230269a38)
07-20 03:28:00.360  2222  2222 F DEBUG   :       #06 pc 00000000003b0b50  /system/lib64/libbluetooth.so (reactor_start(reactor_t*)+88) (BuildId: 306e172ba933ab28fd3d5cc230269a38)
07-20 03:28:00.360  2222  2222 F DEBUG   :       #07 pc 00000000003b2758  /system/lib64/libbluetooth.so (run_thread(void*) (.cfi)+188) (BuildId: 306e172ba933ab28fd3d5cc230269a38)

上面是我添加蓝牙报的错误

(1)

07-20 03:28:00.199  2174  2203 F libc    : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 2203 (alarm_default_c), pid 2174 (droid.bluetooth)	

这里看网上说的是调用库出了问题,下面也打印出来的库的问题

(2)

 I am_crash: [437,0,com.android.bluetooth,818462277,Native crash,Aborted,unknown,0]

crash报错的位置

(3)

07-20 03:27:57.448   282   301 I bt_userial_vendor: userial vendor open: opening /dev/ttyS8

表示用的是UART8这里实际上我用的串口1

(4)

07-20 03:28:00.183  2174  2203 E bt_hci  : startup_timer_expired
07-20 03:28:00.183  2174  2203 I bt_hci_timeout: 15658734

这里发现startup超时了,说明驱动部分没成功,那加载库也是不成功的那么,所以下面我们可以从驱动方面去查找原因,看看IO口是否正确,供电是否正常

2.修改:

2.1指定用的哪一个串口

我的板子上AP6256用的是串口1,修改如下:

diff --git a/sbc_rk3568/bt_vendor.conf b/sbc_rk3568/bt_vendor.conf
index d98c62e..e09f556 100644
--- a/sbc_rk3568/bt_vendor.conf
+++ b/sbc_rk3568/bt_vendor.conf
@@ -1,5 +1,5 @@
 # UART device port where Bluetooth controller is attached
-UartPort = /dev/ttyS8
+UartPort = /dev/ttyS1
 
 # Firmware patch file location
 FwPatchFilePath = /vendor/etc/firmware/

这样修改过后发现还是不行,再去查看了一下IO_list和设备树,发现IO口跟GMAC0的复用了,导致io不受控制,更改过后恢复正常

下面是瑞星微官方给的一些调试手法:
驱动部分:

BT 电 源 控 制 驱 动 位 于 : net/rfkill/rfkill-bt.c , 代 码 会 生 成 节 点/sys/class/rfkill/rfkill0/state。
执行 echo 1 > sys/class/rfkill/rfkill0/state 可以手动给蓝牙模块上电;
echo 0 > /sys/class/rfkill/rfkill0/state 可以手动给蓝牙模块下电。
系统在打开蓝牙时候,会自动执行上电过程

Android 注意事项

  1. Libbt
    Libbt 负责蓝牙芯片的初始化,如加载蓝牙 firmware 等操作,不同蓝牙芯片使用不同的 libbt,libbt 一般都由芯片厂家提供。目前主要使用的是 broadcom 和 realtek,源码分别位于 hardware/broadcom/libbt 和 hardware/realtek/rtkbt/code/libbt-vendor。Libbt 一般都不需要做什么修改,只需要配置一下蓝牙模组使用的端口以及蓝牙 firmware 的路径即可,broadco
    m 和 realtek 模组的配置并不相同,分别位于 hardware/broadcom/libbt/conf/rockchip/rksdk/bt_vendor.conf 和 hardware/realtek/rtkbt/code/vendor/etc/bluetooth/rtkbt.conf。
  2. bluedroid
    Bluedroid 源码在 system/bt 下面,从 android9.0 开始,bluedroid 编译出来的库是libbluetooth.so 。 bluedroid 有 些 可 以 配 置 的 宏 可 以 放 在device/rockchip/rk3368/bluetooth/bdroid_buildcfg.h 下面来配置。可以通过修改机器中/system/etc/bt_stack.conf 来修改 bluedroid 中各部分的 log 输出级别。可以通过设置"persist.bluetooth.btsnoopenable"来控制是否输出 snoop log;设置"persist.bluetooth.btsnooppath"修改 snoop log 的保存路径,系统默认为"/data/misc/bluetooth/logs/btsnoop_hci.log";可以修改"persist.bluetooth.btsnoopsize"来设置 snoop log 文件的大小。
  3. pcba bt 测试
    Pcba 的 bt 测试代码默认蓝牙模组使用的端口是/dev/ttyS0,如果有需要修改端口号,可以
    通过修改/system/etc/bt_stack.conf 来配置

2.1 BT 无法打开

  1. 硬件问题
    (1) 测量 bt 上电时序是否正确;
    (2) 测量 32k 时钟是否正常供给;
    (3) 测量串口数据通信是否正常;
  2. 软件问题
    (1) 确认蓝牙模组跟主控 cpu 通信端口是否配置正确;
    (2) 确认内核 dts 配置是否符合硬件设计;
    (3) 确认蓝牙模组使用的 firmware 是否跟模组匹配;

3. 让蓝牙从eeprom中获取mac地址

修改目录:hardware/broadcom/libbt

diff --git a/include/vnd_rksdk.txt b/include/vnd_rksdk.txt
index 9e1953b..7d3f810 100644
--- a/include/vnd_rksdk.txt
+++ b/include/vnd_rksdk.txt
@@ -9,7 +9,7 @@
 BTHW_DBG = TRUE
 VNDUSERIAL_DBG = FALSE
 UPIO_DBG = FALSE
-USE_CONTROLLER_BDADDR = TRUE
+USE_CONTROLLER_BDADDR = FALSE
 FW_AUTO_DETECTION = TRUE
 BT_WAKE_VIA_PROC = TRUE
 SCO_PCM_ROUTING = 0
diff --git a/src/hardware.c b/src/hardware.c
index b799692..b8cc546 100644
--- a/src/hardware.c
+++ b/src/hardware.c
@@ -109,6 +109,9 @@
       next 2 bytes are for codec type */
 #define SCO_CODEC_PARAM_SIZE                    3
 
+#define EEPROM_PATH  "/sys/bus/i2c/devices/5-0050/eeprom"
+#define BT_MAC_OFFSET 30
+
 /******************************************************************************
 **  Local type definitions
 ******************************************************************************/
@@ -590,6 +593,16 @@
     return (retval);
 }
 
+static bool mac_addr_check(unsigned char *addr, int value){
+    int i,num = 0;
+
+    for (i = 0; i < 6; i++)
+        if (addr[i] == value)
+            num++;
+
+    return ((num == 6) ? 1 : 0);
+}
+
/*******************************************************************************
**
** Function         hw_config_set_bdaddr
**
** Description      Program controller's Bluetooth Device Address
**
** Returns          TRUE, if valid address is sent
**                  FALSE, otherwise
**
*******************************************************************************/
static uint8_t hw_config_set_bdaddr(HC_BT_HDR *p_buf)
 {
     uint8_t retval = FALSE;
     uint8_t *p = (uint8_t *) (p_buf + 1);
+    
+    unsigned char macaddr[6] = {0};
+    int fd,bytes;
+
+    fd = open(EEPROM_PATH, O_RDONLY);
+    if (fd >= 0) {
+        lseek(fd, BT_MAC_OFFSET, SEEK_SET);
+        if ((bytes = read(fd, macaddr, 6)) == 6) {
+            if (!mac_addr_check(macaddr, 0) && !mac_addr_check(macaddr, 0xff))
+                memcpy(vnd_local_bd_addr, macaddr, 6);
+        } else {
+            ALOGE("Read /sys/bus/i2c/devices/5-0050/eeprom failedn");
+        }
+        close(fd);
+    } else {
+        ALOGE("Open /sys/bus/i2c/devices/5-0050/eeprom failed;fd:%dn",fd);
+    }
 
     ALOGI("Setting local bd addr to %02X:%02X:%02X:%02X:%02X:%02X",
         vnd_local_bd_addr[0], vnd_local_bd_addr[1], vnd_local_bd_addr[2],

这里需要注意一点就是EEPROM_PATH这个路径需要修改成自己的eeprom节点在系统的的路径并且需要在.rc文件中给这个节点添加权限否则会出现打开文件失败的的log(报错:ALOGE(“Open /sys/bus/i2c/devices/5-0050/eeprom failed;fd:%dn”,fd);)

at24.c中的修改如下:


diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
index dc35376..a6ebde5 100644
--- a/drivers/misc/eeprom/at24.c
+++ b/drivers/misc/eeprom/at24.c
@@ -614,6 +614,28 @@
 		return 0;
 	}
 }
+/* Get MAC from eeprom start*/
+static struct at24_data *at24_priv = NULL;
+int at24_get_macaddr(unsigned char *buf, int offset)
+{
+	if (at24_priv != NULL) {
+		return at24_read(at24_priv, offset, buf, 6);
+	} else
+		return -1;
+}
+
+EXPORT_SYMBOL(at24_get_macaddr);
+
+int at24_set_macaddr(unsigned char *buf, int offset)
+{
+	if (at24_priv != NULL) {
+		return at24_write(at24_priv, offset, buf, 6);
+	} else
+		return -1;
+}
+
+EXPORT_SYMBOL(at24_set_macaddr);
+/* Get MAC from eeprom end*/
 
 static int at24_probe(struct i2c_client *client)
 {
@@ -749,6 +771,10 @@
 	if (pdata.setup)
 		pdata.setup(at24->nvmem, pdata.context);
 
+	/* Get MAC from eeprom start*/
+	at24_priv = at24;
+	/* Get MAC from eeprom end*/
+	
 	return 0;
 

另外出现访问库错误:
可以试一试添加下面的内容在hardware/broadcom/libbt/include

diff --git a/include/vnd_rksdk.txt b/include/vnd_rksdk.txt
index 811cf25..7d3f810 100644
--- a/include/vnd_rksdk.txt
+++ b/include/vnd_rksdk.txt
@@ -22,3 +22,5 @@ PCM_DATA_FMT_FILL_BITS = 0
 PCM_DATA_FMT_FILL_METHOD = 0
 PCM_DATA_FMT_FILL_NUM = 0
 PCM_DATA_FMT_JUSTIFY_MODE = 0
+PROC_BTWRITE_TIMER_TIMEOUT_MS = 0
+BT_WAKE_VIA_PROC_NOTIFY_DEASSERT = TRUE

这里附上一个别人的调试手法:
http://doc.qlqcetc.cn/docs/x2000/x2000-bt

最后

以上就是魔幻电话为你收集整理的BT调试过程分享(ap6256)的全部内容,希望文章能够帮你解决BT调试过程分享(ap6256)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(94)

评论列表共有 0 条评论

立即
投稿
返回
顶部