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

news2024/11/29 11:34:21

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了。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

离散数学_十章-图 ( 4 ):图的表示和图的同构

&#x1f4f7;10.4 图的表示和图的同构 1. 图的表示1.1 邻接表1.1.1 简单图的邻接表1.1.2 有向图的邻接表 1.2 邻接矩阵❗在邻接表和邻接矩阵之间取舍1.3 关联矩阵 2. 图同构3. ⚡判断两个简单图是否同构 图的表示方式有很多种&#xff0c;选择最方便的表示有助于对图的处理~ …

Navicat 面向 PostgreSQL 查询超时的工具解决方案

文章目录 Navicat 面向 PostgreSQL 查询超时的工具解决方案查询超时的必要性应用场景 查询分析器 | Navicat Monitor在数据库级别设置为特定用户设置查询超时 结语 Navicat 面向 PostgreSQL 查询超时的工具解决方案 早前&#xff0c;我们发表过一篇《PostgreSQL 与 Navicat &am…

Datax ftp写入hive

这是一个巨大的坑&#xff0c;网上对这块的完整描述真的很少&#xff0c;新手真的会很迷茫&#xff01;&#xff01;&#xff01; 插件 选择插件 reader插件选择&#xff1a;ftpread write插件选择&#xff1a;hdfswrite 参数配置 reader参数 "parameter": {/…

干货|SpringCloud全家桶微服务初探

SpringCloud的从整体架构上看&#xff0c;相对来说是完整的、庞大的。它不仅仅是一个基础性架构工具&#xff0c;它为微服务架构提供了一个“全家桶”的套餐。每一个模块关注各自的职能&#xff0c;并且能够很好地配合与协作&#xff0c;能够帮助入门者快速搭建起一套微服务架构…

前后端联调跨域问题

文章目录 什么是同源策略如何判断是否同源&#xff1f;跨域资源共享(CORS)如何解决跨域问题 什么是同源策略 同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。 如何判断是否同源&#xff1f; 如果…

从中国人民大学与加拿大女王大学金融硕士的学员构成,了解金融行业都有哪些职位

金融行业最受欢迎的岗位莫过于券商、银行、基金公司、私募市场、体制内&#xff08;监管部门、交易所等&#xff09;、信托、大企业投资部、保险、管理咨询、资产管理。在当下如果要选择工作&#xff0c;想找就业率第一、薪酬排名第一的行业&#xff0c;那一定是金融工作。中国…

03 redis新类型bitmap/hyperloglgo/GEO

亿级系统中常见的四种统计 聚合统计 统计多个集合元素的聚合结果&#xff0c;就是前面讲解过的交差并等集合统计交并差集和聚合函数的应用 排序统计 抖音视频最新评论留言的场景&#xff0c;请你设计一个展现列表。考察你的数据结构和设计思路设计案例和回答思路以抖音vcr最…

3.java高级之GUI编程

1.gui (graphical user interface) awt sun公司最早的gui,不美观,不兼容各平台swing : awt升级2.顶层容器(只有一个)(其他的只能放这里)Jframe Jdialog对话框 Jwindow(x) //在main方法写fnew Jframe(); f.setSize(300,300); //设置大小f.setTitle("hello"); //设置…

java条件语句

文章目录 一、java条件语句1、Java 条件语句 - if...else2、Java switch case 语句 总结 一、java条件语句 1、Java 条件语句 - if…else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法…

你真的了解kotlin中协程的suspendCoroutine原理吗?

文章目录 什么是协程suspendCoroutineUninterceptedOrReturnsuspendCoroutineUninterceptedOrReturn存在的问题suspendCoroutinesuspendCancellableCoroutine ​ 引言&#xff1a; 在Kotlin协程中&#xff0c;如何让一个suspned 函数挂起&#xff1f;如何让挂起协程恢复&#…

STM32G4 比较器COMPx(寄存器开发)

目录 1. 特性1.1 框图1.2 比较器输入信号SEL1.3 比较器滞回选择HYST1.4 比较器的输出1.5 LOCK机制 2. 编程2.1 初始化步骤2.2 举例 STM内部的比较器是模拟量的比较器&#xff0c;其与APB2时钟同步&#xff0c;在RCC时钟控制器中没有COMx时钟使能标志位&#xff0c;其时钟的使能…

前端自学要多久?自学前端一般多久可以找到差不多的工作?

好程序员今天给各位同学分享自学前端的高效率路径&#xff0c;最快4个月&#xff0c;平均6个月&#xff01; 一、html, CSS (1月) 1.基本语法, 2.做2-3个项目实战 3.刷面试题 二、JavaScript (1.5月) 1.基本语法 2.实际案例练习融合HTML, Css项目实战 3.刷题面试题 三、Vue/Rea…

Java 高级应用-多线程-(三)实现 Callable 接口与使用线程池创建线程

实现 Callable 接口 • 与使用 Runnable 相比&#xff0c; Callable 功能更强大些 – 相比 run()方法&#xff0c;可以有返回值 – 方法可以抛出异常 – 支持泛型的返回值&#xff08;需要借助 FutureTask 类&#xff0c;获取返回结果&#xff09; • Future 接口&#xff08;…

游戏研发项目管理

基于阶段模式进行游戏新产品研发过程&#xff0c;以及基于这种研发过程Leangoo 领歌提供的项目模板。 二、游戏产品开发流程 通常开发一款新游戏大体上会按照如下流程来进行&#xff1a; 1&#xff09; 概念阶段 – Concept 主策根据产品创意&#xff0c;确定游戏策划草案&a…

C++中的内存空间管理详解【C++】

文章目录 C/C内存分布C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/freeC内存管理方式new/delete操作内置类型new和delete操作自定义类型 operator new与operator delete函数重载operator new与operator deletenew和delete的实现原理内置类型自定义类型 定位new表…

使用tomcat可能遇到的问题

问题一&#xff1a;窗口一闪而过 如果双击startup.bat&#xff0c;启动tomcat&#xff0c;命令窗口一闪而过&#xff1b;或者用命令窗口执行startup.bat命令&#xff0c;未能启动tomcat&#xff0c;而是提示下面的文字&#xff1b; 说明可能是java的环境变量配置错误&#xf…

让ChatGPT谈谈科技发展

ChatGPT谈科技发展 讲讲科技发展的那些事儿谈谈ChatGPT对科技发展的影响谈谈你对ChatGPT的看法ChatGPT对科技发展的负面影响ChatGPT的存在是利是弊&#xff1f;关于全国科技者工作日 讲讲科技发展的那些事儿 谈谈ChatGPT对科技发展的影响 谈谈你对ChatGPT的看法 ChatGPT对科技发…

pdf怎么合并成一个文件?高效工具分享

PDF是一种非常常用的文档格式&#xff0c;许多人经常需要合并多个PDF文件为一个文件。这是因为有时候我们需要将多个PDF文件打包成一个文件&#xff0c;以便于共享或归档。在本文中&#xff0c;我们将介绍如何使用电脑或手机合并PDF文件。 以下是常见的合并PDF的软件&#xff1…

以太坊Layer 2即将爆发!加密巨头入场布局,或将迎来“百链大战”!

眼下&#xff0c;以太坊Layer 2发展势头强劲。在数十条Rollup Layer 2异彩纷呈之际&#xff0c;Coinbase、ConsenSys等加密巨头也开始下场参与竞争&#xff0c;部署原生Layer 2网络。 截至2022年底&#xff0c;Layer 2解决方案的日均交易数在持续增加&#xff0c;甚至超过了以太…

牛客网语法篇刷题(C语言) — 基本类型

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言—语法篇》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;…