RK3568 AP6275S蓝牙驱动程序调度过程

1、前言

         今年3月份调度了RK3568驱动程序,当时由于时间的问题,AP6275S蓝牙驱动程序没有调试成功。当时仔细检查的设备树的配置。

wireless_bluetooth: wireless-bluetooth {
		compatible = "bluetooth-platdata";
		clocks = <&rk809 1>;
		clock-names = "ext_clock";
		//wifi-bt-power-toggle;
		uart_rts_gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>;
		pinctrl-names = "default", "rts_gpio";
		pinctrl-0 = <&uart8m0_rtsn>;
		pinctrl-1 = <&uart8_gpios>;
		BT,reset_gpio    = <&gpio4 RK_PB7 GPIO_ACTIVE_HIGH>;
		BT,wake_gpio     = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
		BT,wake_host_irq = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;
		status = "okay";
	};

     AP6275S使用外部时钟,RK3568程序工作后,hciconfig查看不到蓝牙设备。检测dmesg启动的流程关于bluetooth部分也没有发现问题:

firefly@firefly:~$
firefly@firefly:~$ dmesg | grep BT
[    1.649733] [BT_RFKILL]: Enter rfkill_rk_init
[    1.651127] [BT_RFKILL]: bluetooth_platdata_parse_dt: get property: uart_rts_gpios = 73.
[    1.651169] [BT_RFKILL]: bluetooth_platdata_parse_dt: get property: BT,reset_gpio = 143.
[    1.651186] [BT_RFKILL]: bluetooth_platdata_parse_dt: get property: BT,wake_gpio = 142.
[    1.651202] [BT_RFKILL]: bluetooth_platdata_parse_dt: get property: BT,wake_host_irq = 135.
[    1.651273] [BT_RFKILL]: Request irq for bt wakeup host
[    1.651367] [BT_RFKILL]: ** disable irq
[    1.651500] [BT_RFKILL]: bt_default device registered.
[    7.877390] [BT_RFKILL]: rfkill_rk_set_power: set bt wake_host high!
[    7.930246] [BT_RFKILL]: ENABLE UART_RTS
[    8.036706] [BT_RFKILL]: DISABLE UART_RTS
[    8.036757] [BT_RFKILL]: bt turn on power
[    8.036787] [BT_RFKILL]: Request irq for bt wakeup host
[    8.036829] [BT_RFKILL]: ** disable irq
firefly@firefly:~$

       后来,又对比一个硬件的原理图与开发板的原理图,发现AP6275S的蓝牙串口的RTS,CTS未连接,因此修改硬件飞线连接,蓝牙还是没有设备出来。

 2、转机

      在蓝牙未调试出来后的这段时间,一直忙于项目管理上的杂事(未写代码),平时小憩时候一直在想这个问,为什么蓝牙不通,蓝牙使用串口来进行通信,串口在设备树中又没有配置,查看蓝牙驱动程序也没有串口相关的操作,只有串口RTS, CTS的电平控制。这个疑问一直萦绕在脑海中,为什么呢?

       直到写文章的上一周,看到了篇文章,给解决问题找到的了新的思路:AP6275S移植总结

里面有一个brcm_patchram_plus -d --enable_hci --no2bytes --tosleep 200000 --baudrate 1500000 --patchram /system/etc/firmware/BCM4362A2.hcd /dev/ttyS4 &这个指令用于给蓝牙模块下载程序的命令。我马上在我这台设备试了一下,发现设备没有brcm_patchram_plus命令,而有brcm_patchram_plus1命令,那就用brcm_patchram_plus1来测试,实际连接的是串口8,所以修改命令执行一次,蓝牙设备出来了。看来问题的原因就是未执行这条指令导出。

         马上查看了开发的文件系统,ps -ef | grep brcm,查看到有这个线程在工作。

firefly@firefly:~$ ps -ef | grep brcm
root         673       1  0 17:44 ?        00:00:00 /usr/bin/brcm_patchram_plus1 --enable_hci --no2bytes --use_baudrate_for_download --tosleep 200000 --baudrate 1500000 --patchram /system/etc/firmware/BCM4362A2.hcd /dev/ttyS8
firefly     1506    1329  0 18:25 pts/0    00:00:00 grep --color=auto brcm
firefly@firefly:~$

3、开机自启动蓝牙

       在找到问题后,就要解决为什么我自己做的板子的系统开机不能自动执行蓝牙固件下载的功能?

        通过一边学习系统启动相关知识,一边动手调试,得出可以通过以下几条命令先后找到这个线程启动的位置。brcm_patchram_plus1程序是由init进程启动,那在哪里启动的呢?

       通pstree -a命令获取到进程树:systemd程序启动的这个brcm_patchram_plus

      看来找systemd程序,这是一个系统服务相关的程序,使用systemctl status。查到有一个bt-attach.service服务启动的。

    找到bt-attach.service这个服务的位置 /etc/systemd/system$下面

     查看服务内容,得出启动的程序是/usr/bin/bt-attach。问题应该是出在这里。


firefly@firefly:/usr/bin$ cat bt-attach
#!/usr/bin/env bash

model_name=$(tr -d '\0' </sys/firmware/devicetree/base/model | tr 'a-z' 'A-Z')

while read line
do
        chip_name=$(echo ${line} | cut -d ' ' -f 1)

        if [[ ${model_name} == *3588* ]]; then
                uart=$(basename /sys/firmware/devicetree/base/pinctrl/wireless-bluetooth/uart*-gpios | tr -cd "[0-9]")
                uart="/dev/ttyS${uart}"
                break
        elif [[ ${model_name} == *${chip_name}* ]]; then
                uart=$(echo ${line} | cut -d ' ' -f 2)
                break
        fi

done < /usr/bin/bt_uart.cfg

bt_type=$(rk_wifi_gettype)

rtk_attach() {
        ret=`ps -ef |grep rtk_hciattach |grep -v "grep" |wc -l`
        if [ ${ret} = 1 ]; then
            killall rtk_hciattach
            sleep 1
        fi
        /usr/bin/rtk_hciattach -n -s 115200 ${uart} rtk_h5 1500000 noflow &
}

if [[ ${bt_type} = "RTL"* ]]; then
        rtk_attach
        exit 0
else
        killall brcm_patchram_plus1
        #uart="/dev/ttyS8"
        fwname=$(/usr/bin/bt_fwname ${uart})
        echo "zsm $fwname"
        if [[ ${fwname} = "bcm43438a1.hcd" ]]; then
                ln -sf /vendor/etc/firmware/nvram_ap6212a.txt /vendor/etc/firmware/nvram.txt
        elif [[ ${fwname} = "BCM4345C0.hcd" ]]; then
                ln -sf /vendor/etc/firmware/nvram_ap6255.txt /vendor/etc/firmware/nvram.txt
        fi

        start-stop-daemon --start --oknodo --pidfile /var/run/hciattach.pid --background --startas \
/usr/bin/brcm_patchram_plus1 -- --enable_hci --no2bytes --use_baudrate_for_download \
--tosleep  200000 --baudrate 1500000 --patchram /system/etc/firmware/${fwname} ${uart}
fi

exit 0

     仔细的分析一下这个脚本,它会读取/sys/firmware/devicetree/base/model这个文件,这个文件的内容来自于设备树中。脚本从这里来读取CPU的型号,之后再从bt_uart.cfg中读取蓝牙的串口号配置。问题出在我修改了设备树中model,没有写cpu型号,加上cpu型号RK3568后,这个脚本程序可以正常读取取串口号,启动蓝牙模块 AP6275S了。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/25133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaCV - 图像暗通道去雾

一、效果图 二、实现原理 暗通道先验:首先说在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值,也就是说该区域光强是一个很小的值。所以给暗通道下了个数学定义,对于任何输入的图像J,其暗通道可以用下面的公式来表示:其中JC表示彩色图像每个…

【Vue2.0源码学习】虚拟DOM篇-Vue中的DOM-优化更新子节点

1. 前言 在上一篇文章中&#xff0c;我们介绍了当新的VNode与旧的oldVNode都是元素节点并且都包含子节点时&#xff0c;Vue对子节点是 先外层循环newChildren数组&#xff0c;再内层循环oldChildren数组&#xff0c;每循环外层newChildren数组里的一个子节点&#xff0c;就去…

超100篇! VAD论文梳理汇总!

GitHub的一位博主整理了上百篇语音活动检测&#xff08;VAD&#xff09;的论文&#xff0c;按照其中使用的特征方法以及适用的环境进行了分类整理&#xff0c;时间跨度为从198*年至2019年。此外&#xff0c;还提供了几个VAD代码&#xff0c;它们的性能表现较好。需要的同学可以…

基于深度学习的高精度牙齿健康检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度牙齿健康检测识别系统可用于日常生活中检测牙齿健康状况&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的牙齿目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数…

Niagara—— System和Emitter节点

目录 一&#xff0c;发射器节点 Properties Emitter Spawn Emitter Update Particle Spawn Particle Update Renderer 二&#xff0c;系统节点 Properties System Spawn System Update Niagara是按照从上到下按顺序&#xff0c;依次执行模块Module&#xff08;可编程…

Locust接口性能测试

谈到性能测试工具&#xff0c;我们首先想到的是LoadRunner或JMeter。LoadRunner是非常有名的商业性能测试工具&#xff0c;功能非常强大。但现在一般不推荐使用该工具来进行性能测试&#xff0c;主要是使用也较为复杂&#xff0c;而且该工具体积比较大&#xff0c;需要付费且价…

UE5的IK Rig重定向注意问题

推荐先把官方文档看仔细&#xff0c;明白IK Rig重定向原理&#xff0c;对理解UE5怎么进行动画骨骼重定向&#xff0c;以及重定向后骨骼出现问题应该怎么调整非常有帮助。 IK Rig重定向 主要功能点 IK Rig IK Rig的作用是定义两个转化关系中的源骨骼和目标骨骼的主要部件的骨…

Linux——网络套接字2|Tcp服务器编写

本篇博客先看后面的代码,再回来看上面这些内容。 .hpp文件,基本调用 服务器基本框架

ASEMI代理KY可控硅BT169的工作原理及应用领域

编辑-Z 本文主要介绍了可控硅BT169的工作原理及其在各个领域的用。首先&#xff0c;我们将详细阐述可控硅BT169的工作原理&#xff0c;包括结构特点、工作过程等&#xff1b;其次&#xff0c;我们将探讨可控硅BT169在家用电器、工业控制、电力电子等领域的应用。 1、可控硅BT1…

进程(三)

进程三 2.11 进程同步、进程互斥2.11.1 进程同步2.11.2 进程互斥2.11.3 总结 2.12 进程互斥和软件实现方法2.12.1 单标志法2.12.2 双标志先检查法2.12.3 双标志后检查法2.12.4 Peterson 算法2.12.5 总结 2.13 进程互斥和硬件实现方法2.13.1 中断屏蔽方法2.13.2 TestAndSet 指令…

Makefile基础教程(路径搜索)

文章目录 前言一、常用的源码管理方式二、VPATH和vpath1.VPATH2.vpath3.VPATH和vpath优缺点对比三、VPATH和vpath同时出现make会怎么处理四、vpath指定多个文件夹总结前言 在前面的文章中我们的文件全部都是放在同一个目录下面的,那么在实际的工程开发中会这样做吗?答案肯定…

使用Nodejs搭建简单的HTTP服务器 - 内网穿透公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 转载自cpolar内网穿透的文章&#xff1a;使用Nodejs搭建HTTP服务&#xff0c;并实现公网远程访问「内网穿透」 前言 Node.…

【满分】【华为OD机试真题2023B卷 JAVAJS】经典屏保

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 经典屏保 知识点循环迭代编程基础 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: DVD机在视频输出时,为了保护电视显像管,在待机状态会显示“屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹…

macOS visual studio code 没有读写权限 检查更新报错

问题描述 visual studio code 检查更新&#xff0c;报错&#xff0c;visual studio code没有磁盘读写权限。&#xff08;可能会导致插件安装报错&#xff1f;&#xff09; 报错&#xff1a;The application is on a read-only volume. Please move the application and try a…

【JavaSE】Java基础语法(十一):String、StringBuilder详解

文章目录 &#x1f378;1. String类&#x1f349;&#x1f349;1.1 String概述&#x1f349;&#x1f349;1.2 String类的构造方法&#x1f349;&#x1f349;1.3 创建字符串对象的区别对比&#x1f349;&#x1f349;1.4 字符串的比较1.4.1 字符串的比较 &#x1f349;&#x…

移动云镜像配置BC-Linux --配置centos 6-7-8版本参考

移动云BC linux 也是一个非常不错的镜像站. 可以加速国内下载. 非常好用, 速度比阿里 等那些流行的镜像站快一些. 下面介绍详解操作配置, 供参考 移动云开源镜像站-Linux系统订阅服务 移动云开源镜像站&#xff0c;包含BC-Linux各版本的软件仓库&#xff0c;对外提供软件升级…

sql注入学习-知识点大合集

目录 &#xff08;一&#xff09;sql注入了解&#xff1a; 1.1什么是sql注入 1.2 sql注入的分类 &#xff08;二&#xff09;sql注入详解&#xff1a; 2.1.MySQL注入 2.2.1在MySQL注入中&#xff0c;会用到的知识 2.2.2mysql常用语句与常见 2.2.3msyql注入内容详解 2.2…

【JavaSE】Java基础语法(十三):Java 中的集合(十分全面)

文章目录 List, Set, Queue, Map 四者的区别&#xff1f;集合框架底层数据结构总结ArrayList 和 Vector 的区别ArrayList 与 LinkedList 区别补充内容:RandomAccess 接⼝ArrayList 的扩容机制comparable 和 Comparator 的区别比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同…

JS逆向系列之猿人学爬虫第9题-动态cookie2

文章目录 目标参数流程分析js代码Python调用测试目标 https://match.yuanrenxue.cn/match/9参数流程分析 二次请求cookie携带m 第一次请求响应内容格式化之后是这样的: < body > < script src = "/static/match/safety/match9/udc.js" > <

Office Visio 2007安装教程

哈喽&#xff0c;大家好。今天一起学习的是Visio 2007的安装&#xff0c;这是一个绘制流程图的软件&#xff0c;用有效的绘图表达信息&#xff0c;比任何文字都更加形象和直观。Office Visio 是office软件系列中负责绘制流程图和示意图的软件&#xff0c;便于IT和商务人员就复杂…