nxp的bluetooth驱动调试
最近在调试nxp的ap6256蓝牙模块驱动,写个笔记记录下心得。
文章目录
- 一、设备树配置
- 二、固件加载
- 三、指定打开串口路径
- 四、BUG解决
一、设备树配置
设备树配置的东西就三点,节点配置。还有就是驱动要编译。
1)把驱动匹配进去
bt_rfkill: bt_rfkill {compatible = "fsl,mxc_bt_rfkill";pinctrl-names = "default";pinctrl-0 = <&pinctrl_bt>;bt-power-gpios = <&gpio4 24 GPIO_ACTIVE_HIGH>;status ="okay";};
驱动文件就大家自己去弄了
2)bt_rst的拉高
pinctrl_bt: wlangrp {fsl,pins = <MX8MP_IOMUXC_SAI2_TXFS__GPIO4_IO24 0x41 /* BT_RST */MX8MP_IOMUXC_NAND_DATA00__GPIO3_IO06 0x16 /* BT_WAKE_HOST */>;};
3)对应的串口配置
蓝牙一般用串口通讯。
&uart3 {/* BT */pinctrl-names = "default";pinctrl-0 = <&pinctrl_uart3>;fsl,uart-has-rtscts;status = "okay";
};pinctrl_uart3: uart3grp {fsl,pins = <MX8MP_IOMUXC_SD1_DATA6__UART3_DCE_TX 0x140MX8MP_IOMUXC_SD1_DATA7__UART3_DCE_RX 0x140MX8MP_IOMUXC_SD1_RESET_B__UART3_DCE_RTS 0x140MX8MP_IOMUXC_SD1_STROBE__UART3_DCE_CTS 0x140>;};
同时需要去看有没有管角复用这些。
这样的话就可以在串口里面看到相关打印信息。
$> dmesg | grep -i BluetoothBluetooth: Core ver 2.18Bluetooth: HCI device and connection manager initializedBluetooth: HCI socket layer initializedBluetooth: L2CAP socket layer initializedBluetooth: SCO socket layer initializedBluetooth: HCI UART driver ver 2.2Bluetooth: HCI H4 protocol initializedBluetooth: HCI BCSP protocol initializedBluetooth: HCIATH3K protocol initializedBluetooth: RFCOMM TTY layer initializedBluetooth: RFCOMM socket layer initializedBluetooth: RFCOMM ver 1.11Bluetooth: BNEP (Ethernet Emulation) ver 1.3Bluetooth: BNEP filters: protocol multicastBluetooth: BNEP socket layer initializedBluetooth: HIDP (Human Interface Emulation) ver 1.2Bluetooth: HIDP socket layer initialized
如果是底层驱动,那么就可以用底层工具hci相关工具查看
$> hciconfig hci0 up$> hciconfighci0: Type: BR/EDR Bus: UARTBD Address: 64:A3:CB:5B:69:F0 ACL MTU: 1021:8 SCO MTU: 64:1UP RUNNING PSCANRX bytes:1772 acl:0 sco:0 events:69 errors:0TX bytes:1152 acl:0 sco:0 commands:65 errors:0
如果这里面没有设备出来
$> hciconfig hci0 upno device ***
这个就是关于蓝牙的固件没有加载进板子里面(我的这个是这样的,不敢说全部)。
二、固件加载
BCM4345C5.hcd
固件名字是这个
底层可以直接通过网口或者adb弄到板子上去,然后执行对应的命令就可以
安卓驱动需要指定对应的路径。
1)device/nxp/imx8m/evk_8mp/BoardConfig.mk
/*通过FILES把pc端文件传到板子上的指定目录*/
PRODUCT_COPY_FILES += \
device/nxp/imx8m/evk_8mp/firmware/bcm_ap6256/BT/BCM4345C5.hcd:vendor/etc/firmware/bcm/BCM4345C5.hcd# -------@block_bluetooth-------
# AP6256 BT
2)可以在板子上查看是否有对应的固件,如果没有则不行,先把这个固件弄到板子上。如果有,那么可以先尝试去打开连接蓝牙。
查看对应的log,如果没问题,那么就ok。如果有问题则查看log寻找对应的问题。
12-24 02:32:48.128 2210 2211 I bt_vendor: init
12-24 02:32:48.128 2210 2211 I bt_vnd_conf: Attempt to load conf from /etc/bluetooth/bt_vendor.conf
12-24 02:32:48.128 2210 2211 I bt_vnd_conf: vnd_load_conf file >/etc/bluetooth/bt_vendor.conf< not found
12-24 02:32:48.129 2210 2211 E bt_upio : init_rfkill : open(/sys/class/rfkill/rfkill0/type) failed: No such file or directory (2)
12-24 02:32:48.129 2210 2211 W bt_vendor: NOTE: BT_VND_PWR_ON now forces power-off first
12-24 02:32:48.129 2210 2211 E bt_upio : init_rfkill : open(/sys/class/rfkill/rfkill0/type) failed: No such file or directory (2)
12-24 02:32:48.129 2210 2211 I bt_userial_vendor: userial vendor open: opening /dev/ttyO1
12-24 02:32:48.129 2210 2211 E bt_userial_vendor: userial vendor open: unable to open /dev/ttyO1
12-24 02:32:48.152 2164 2206 F libc : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 2206 (bt_hci_thread), pid 2164 (droid.bluetooth)
12-24 02:32:48.207 2218 2218 I crash_dump64: obtaining output fd from tombstoned, type: kDebuggerdTombstone
我这里打印出了对应的log信息,发现蓝牙串口打开失败,或者打开错误。这里后面网上查看,自己寻找文件后发现这是因为没有指定打开那个串口,蓝牙厂商驱动将会尝试打开/dev/ttyO1所以会报错。
三、指定打开串口路径
在项目根目录下,有这样一个文件
hardware/broadcom/libbt/include/bt_vendor_brcm.h打开后这里有对应的说明:/* Run-time configuration file */
#ifndef VENDOR_LIB_CONF_FILE
#define VENDOR_LIB_CONF_FILE "/etc/bluetooth/bt_vendor.conf"
#endif/* Device port name where Bluetooth controller attached */
#ifndef BLUETOOTH_UART_DEVICE_PORT
#define BLUETOOTH_UART_DEVICE_PORT "/dev/ttyO1" /* maguro */
#endif/* Location of firmware patch files */
#ifndef FW_PATCHFILE_LOCATION
#define FW_PATCHFILE_LOCATION "/vendor/firmware/" /* maguro */
#endif#ifndef UART_TARGET_BAUD_RATE
#define UART_TARGET_BAUD_RATE 3000000
#endif
所以我们需要给他指定对应的打开路径
这里有你对应的板子的编译文件和路径
vi hardware/broadcom/libbt/conf/nxp/evk_8mp/bt_vendor.conf//打开后就可以设定路径
# UART device port where Bluetooth controller is attached
UartPort = /dev/ttymxc2
//修改固件路径
# Firmware patch file location
FwPatchFilePath = /vendor/etc/firmware/bcm
FwPatchFileName = BCM4345C5.hcd
如果没有这个文件,那么就是你需要在Android.mk文件里面去添加
hardware/broadcom/libbt/Android.mk修改对应板级文件
ifeq ($(TARGET_PRODUCT), evk_8mp)include $(LOCAL_PATH)/conf/nxp/evk_8mp/Android.mk
endif
hardware/broadcom/libbt/conf/nxp/evk_8mp/Android.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := bt_vendor.conf
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/etc/bluetoothLOCAL_SRC_FILES := $(LOCAL_MODULE)include $(BUILD_PREBUILT)
然后再试试。
如果修改好了,那么串口应该有对应的打印消息
12-24 02:42:41.734 3194 3194 I bt_vendor: init
12-24 02:42:41.734 3194 3194 I bt_vnd_conf: Attempt to load conf from /vendor/etc/bluetooth/bt_vendor.conf
12-24 02:42:41.735 3194 3194 E bt_upio : init_rfkill : open(/sys/class/rfkill/rfkill0/type) failed: No such file or directory (2)
12-24 02:42:41.735 3194 3194 W bt_vendor: NOTE: BT_VND_PWR_ON now forces power-off first
12-24 02:42:41.735 3194 3194 E bt_upio : init_rfkill : open(/sys/class/rfkill/rfkill0/type) failed: No such file or directory (2)
12-24 02:42:41.735 3194 3194 I bt_userial_vendor: userial vendor open: opening /dev/ttymxc2
12-24 02:42:41.735 3194 3194 I bt_userial_vendor: device fd = 7 open
12-24 02:42:41.749 3194 3255 I bt_hwcfg: bt vendor lib: set UART baud 1000000
12-24 02:42:41.753 3194 3255 D bt_hwcfg: Chipset BCM4345C5
12-24 02:42:41.753 3194 3255 D bt_hwcfg: Target name = [BCM4345C5]
12-24 02:42:41.753 3194 3255 I bt_hwcfg: FW patchfile: /vendor/etc/firmware/bcm/BCM4345C5.hcd
12-24 02:42:42.206 3194 3255 I bt_hwcfg: bt vendor lib: set UART baud 115200
12-24 02:42:42.206 3194 3255 D bt_hwcfg: Settlement delay -- 100 ms
12-24 02:42:42.206 3194 3255 I bt_hwcfg: Setting fw settlement delay to 100
12-24 02:42:42.370 3194 3255 I bt_hwcfg: bt vendor lib: set UART baud 1000000
12-24 02:42:42.371 3194 3255 I bt_hwcfg: Setting local bd addr to 13:20:40:00:13:CB
12-24 02:42:42.371 3194 3255 I bt_hwcfg: vendor lib fwcfg completed
12-24 02:42:42.372 3210 3253 I bt_hci : event_finish_startup
12-24 02:42:42.373 3210 3235 I bt_core_module: module_start_up Started module "hci_module"
然后连接蓝牙,这里我们就可以打开蓝牙的,然后进行蓝牙连接配对。
手机和开发板好像只能配对,不能连接,如果要连接,需要修改蓝牙的配置。可以用蓝牙耳机连接。
四、BUG解决
从上面的log看
12-24 02:42:41.735 3194 3194 E bt_upio : init_rfkill : open(/sys/class/rfkill/rfkill0/type) failed: No such file or directory (2)
这里有一个bug,这个bug导致的问题在与,我们安卓通过上层的蓝牙开关去调用蓝牙的时候。第二次是无法打开的,显示的log如下
01-25 05:11:16.441 2309 2311 W bt_vendor: NOTE: BT_VND_PWR_ON now forces power-off first
01-25 05:11:16.441 2309 2311 E bt_upio : init_rfkill : open(/sys/class/rfkill/rfkill0/type) failed: No such file or directory (2)
01-25 05:11:16.441 2309 2311 I bt_userial_vendor: userial vendor open: opening /dev/ttymxc2
01-25 05:11:16.442 2309 2311 I bt_userial_vendor: device fd = 7 open
01-25 05:11:16.436 2309 2309 I HwBinder:2309_2: type=1400 audit(0.0:2884): avc: denied { read } for name="u:object_r:default_prop:s0" dev="tmpfs" ino=109 scontext=u:r:hal_bluetooth_default:s0 tcontext=u:object_r:default_prop:s0 tclass=file permissive=1
01-25 05:11:16.440 2309 2309 I HwBinder:2309_2: type=1400 audit(0.0:2886): avc: denied { getattr } for path="/dev/__properties__/u:object_r:default_prop:s0" dev="tmpfs" ino=109 scontext=u:r:hal_bluetooth_default:s0 tcontext=u:object_r:default_prop:s0 tclass=file permissive=1
01-25 05:11:19.337 2276 2303 E bt_hci : startup_timer_expired
01-25 05:11:19.337 2309 2311 I android.hardware.bluetooth@1.0-impl: BluetoothHci::close()
01-25 05:11:19.338 2309 2311 I bt_userial_vendor: device fd = 7 close
01-25 05:11:19.340 2309 2311 E bt_upio : init_rfkill : open(/sys/class/rfkill/rfkill0/type) failed: No such file or directory (2)
01-25 05:11:19.341 2309 2311 I android.hardware.bluetooth@1.0-impl: Firmware configured in 2.899s
01-25 05:11:19.341 2276 2303 F libc : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 2303 (alarm_default_c), pid 2276 (droid.bluetooth)
01-25 05:11:19.438 2327 2327 F DEBUG : pid: 2276, tid: 2303, name: alarm_default_c >>> com.android.bluetooth <<<
01-25 05:11:19.502 2327 2327 F DEBUG : #01 pc 0000000000265434 /system/lib64/libbluetooth.so (startup_timer_expired(void*)+188) (BuildId: 3fae33ca1eda89f10865aeb654a96422)
01-25 05:11:19.502 2327 2327 F DEBUG : #02 pc 0000000000336e48 /system/lib64/libbluetooth.so (alarm_ready_generic(alarm_t*, std::__1::unique_lock<std::__1::mutex>&)+400) (BuildId: 3fae33ca1eda89f10865aeb654a96422)
01-25 05:11:19.503 2327 2327 F DEBUG : #03 pc 0000000000336c78 /system/lib64/libbluetooth.so (alarm_queue_ready(fixed_queue_t*, void*)+112) (BuildId: 3fae33ca1eda89f10865aeb654a96422)
01-25 05:11:19.503 2327 2327 F DEBUG : #04 pc 000000000033c090 /system/lib64/libbluetooth.so (internal_dequeue_ready(void*)+88) (BuildId: 3fae33ca1eda89f10865aeb654a96422)
01-25 05:11:19.503 2327 2327 F DEBUG : #05 pc 000000000033d714 /system/lib64/libbluetooth.so (run_reactor(reactor_t*, int)+388) (BuildId: 3fae33ca1eda89f10865aeb654a96422)
01-25 05:11:19.503 2327 2327 F DEBUG : #06 pc 000000000033d560 /system/lib64/libbluetooth.so (reactor_start(reactor_t*)+88) (BuildId: 3fae33ca1eda89f10865aeb654a96422)
01-25 05:11:19.503 2327 2327 F DEBUG : #07 pc 000000000033f088 /system/lib64/libbluetooth.so (run_thread(void*)+184) (BuildId: 3fae33ca1eda89f10865aeb654a96422)
01-25 05:11:19.528 221 221 I hwservicemanager: getTransport: Cannot find entry android.hardware.bluetooth@1.1::IBluetoothHci/default in either framework or device manifest.
01-25 05:11:19.529 2330 2330 E HidlServiceManagement: Service android.hardware.bluetooth@1.1::IBluetoothHci/default must be in VINTF manifest in order to register/get.
这里导致的原因猜测在于没有对应的节点,去控制蓝牙的上下电,当你上层关闭蓝牙的时候,其实蓝牙内部的还在工作,当你再次打开蓝牙的时候,他没有去初始化关电,导致的你的蓝牙无法打开。所以要把节点配置出来,通过节点去控制蓝牙的上下电。
这里需要修改你对应的defconfig文件
kernel_imx/arc/arm64/xxxdefconig在里面添加对应的rfkill节点CONFIG_RFKILL=y
CONFIG_RFKILL_INPUT=y
CONFIG_RFKILL_GPIO=y#CONFIG_BT_HCIVHCI=y
#CONFIG_BT_HCIUART=y
#CONFIG_BT_HCIBFUSB=y
#CONFIG_BT_HCIBTSDIO=y
#CONFIG_BT_HCIRFKILL=y
#CONFIG_DEBUG_FS=y
下面那几个好像是配置蓝牙的功能的,这个bug对应的上面三个节点就可以,完成后可以在你的镜像文件目录下查看.config文件里面有没有对应的编译
/out/target/product/evk_8mp/obj/KERNEL_OBJvi .configCONFIG_RFKILL_LEDS=y
CONFIG_RFKILL_INPUT=y
CONFIG_RFKILL_GPIO=y
可以看到对应的东西已经生成,再进入板子里面
2|evk_8mp:/ # ls sys/class/rfkill/rfkill0/state
sys/class/rfkill/rfkill0/state
也有对应的节点生成
可能还有一个问题就是你没有权限去读写,可能也会导致上面的bug
evk_8mp:/ # ls -l sys/class/rfkill/rfkill0/state
-rw-rw-rw- 1 root root 4096 2022-01-28 07:46 sys/class/rfkill/rfkill0/state
修改点在/system/core/rootdir/init.rc
添加下面一行代码
chmod 0666 /sys/class/rfkill/rfkill0/state
到此蓝牙可以连续的开和关,没有其余的bug。
nxp的bluetooth驱动调试相关推荐
- nxp的wifi驱动调试
文章目录 一.设备树配置 二.调试方法 2.1 确保模块加载 2.2 固件加载 2.3 文件权限 三.bug解决 感觉wifi相对与蓝牙来说,hal层和android上层需要配置的东西很多,对于底层来 ...
- 初级驱动调试笔记-总结
文章目录 一.拿到开发板的第一步 二.调试第一步 三.Makefile说明 3.1 内核版本说明 3.2 Makefile文件 3.3 Makefile 与Kconfig的关系 3.4 defconf ...
- android 蓝牙 驱动,转个蓝牙修改帖--Android BCM4330 蓝牙BT驱动调试记录
本帖最后由 旋律2014 于 2014-3-27 09:15 编辑 一.关于BT driver的移植: 1. Enablebluetootch in BoadConfig.mk BOARD_HAVE_ ...
- linux蓝牙模块调试,Ubuntu Bluetooth Driver 调试
kernel源码:Linux-3.2.16 升级Linux-3.2.16源码(参照:Linux-3.2.6内核升级).bluetooth驱动模块代码位于linux-3.2.16/net/bluetoo ...
- ubuntu18.04下双机驱动调试
环境搭建: https://blog.51cto.com/haidragon/2337256 这里要先说下如果要下内核断点要先在编译前去掉写保护,但是下自己写的驱动可以不要. 第二个最好编译完后压缩v ...
- VMware调试.【转】VMware+Windgb+Win7 内核驱动调试
ZC:我遇到的问题:com_1 怎么都不成功,记起来 貌似原来也遇到过这个问题,看了一下 VMware里面创建的是 "串行端口 2",于是 将 "com_1"改 ...
- 驱动调试(二)-环形缓冲区到文件
目录 驱动调试(二)-环形缓冲区到文件 目标 框架分析 虚拟文件系统proc dmesg proc_misc_init kmsg_read do_syslog 程序1创建文件 程序2提供读函数 程序3 ...
- 使用驱动调试助手应该注意的问题
最近,使用wince驱动牛人写的驱动调试助手调试扩展串口驱动,发现要注意一些问题. 以前使用驱动调试助手,我都是调试BSP上没有的驱动,现在调试已经存在的串口驱动该怎么做呢?难道要我把串口驱动从NK中 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(一)---Windbg的设置
原文发表于百度空间,2009-01-08 ========================================================================== Wind ...
- android 电容屏(二):驱动调试之基本概念篇
关键词:android 电容屏 tp 工作队列 中断 多点触摸协议 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0 平台:S5PV310(sams ...
最新文章
- JQuery Datatable用法
- 【Java并发编程】一、为什么需要学习并发编程?
- 自动化部署之jenkins
- 浅谈scatter-gather DMA
- 数据中心空调故障案例集
- 【小坑】Android 实现对话框会报错 (You need to use a Theme.AppCompat theme (or descendant) with this activity)
- Java根据学号提取班级_学生成绩管理系统 1. 能够实现根据以下关键字查询:学生姓名 、学号、班级、课 联合开发网 - pudn.com...
- Swift - 从字典(或者Alamofire)直接创建Model文件的工具
- JavaScript 清除图片背景颜色 使之透明
- linux的内核和发行版本号,【编测编学】linux内核及发行版本相关知识
- TCP,UDP数据包的大小以及MTU
- 【数据库系统】形式化查询语言の关系代数
- php显示服务器ipv6,php获取用户IPv4或IPv6地址的代码
- 义隆循环左移c语言,二进制除法运算(义隆单片机)
- pt-diskstats 报错 Can't locate Time/HiRes.pm in @INC
- 主合同与补充合同的区别有哪些?
- 推荐:mysql锁 innodb下的记录锁,间隙锁,next-key锁
- shell输入指定日期参数,输出该日期的前一天和后一天
- python工程师求职信_如何写求职信更容易被录用?
- 从三国演义谈创业的一点启示
热门文章
- 计算机id dns知识,智能DNS解析知识集锦
- 制造资源计划与企业资源计划(MRPⅡ)
- visio2003中、origin中、matlab中,字体的大小以pt为单位,与word中的几号字大小是如何对应?
- 3.21 Refused Bequest 被拒绝的馈赠
- WordPress使用domain/wp-json/api/v1/test 无法到接口可能的原因
- Facebook前身 哈佛大学“选美“网站核心算法 -- ELO等级分制度(附源码)
- 增加虚拟android内存,SD卡变RAM 增加虚拟内存方法
- 计算机网络拓扑结构功能是,计算机网络拓扑结构
- JAVA instrument简单使用
- Playwright-python 教程