概述
板子: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 注意事项
- 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。 - 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 文件的大小。 - pcba bt 测试
Pcba 的 bt 测试代码默认蓝牙模组使用的端口是/dev/ttyS0,如果有需要修改端口号,可以
通过修改/system/etc/bt_stack.conf 来配置
2.1 BT 无法打开
- 硬件问题
(1) 测量 bt 上电时序是否正确;
(2) 测量 32k 时钟是否正常供给;
(3) 测量串口数据通信是否正常; - 软件问题
(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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复