【android】rk3588-android-bt

文章目录

    • 蓝牙框架
    • HCI接口
    • 蓝牙VENDORLIB
      • vendorlib是什么
    • 代码层面解读vendorlib
      • 1、 vendorlib实现,协议栈调用
      • 2、协议栈实现,vendorlib调用(回调函数)
        • 2.1、 init函数
        • 2.2、BT_VND_OP_POWER_CTRL对应处理
        • 2.3、BT_VND_OP_USERIAL_OPEN对应处理
        • 2.4、BT_VND_OP_FW_CFG对应处理
        • 2.5、 固件问题

参考:

https://source.android.com/docs/core/connect/bluetooth?hl=zh-cn

https://android.googlesource.com/platform/hardware/interfaces/+/master/bluetooth/

蓝牙框架

在这里插入图片描述

HCI接口

蓝牙整体硬件架构上分为主机(计算机或MCU)和主机控制器(实际蓝牙芯片组)两部分;主机和控制器之间的通信遵循主机控制器接口(HCI),如下所示:

dayu200-bt-01.png

HCI定义了如何交换命令,事件,异步和同步数据包。异步数据包(ACL)用于数据传输,而同步数据包(SCO)用于带有耳机和免提配置文件的语音。

蓝牙VENDORLIB

vendorlib是什么

vendorlib部署在主机侧,可以认为是主机侧对蓝牙芯片驱动层,屏蔽不同蓝牙芯片的技术细节。从代码层面解读,其主要功能有两个:

1、为协议栈提供蓝牙芯片之间的通道(串口的文件描述符)

2、提供特定芯片的具体控制方法

代码层面解读vendorlib

bt_vendor_lib.h 路径:

bluetooth/1.0/default/bt_vendor_lib.h - platform/hardware/interfaces - Git at Google (googlesource.com)

该文件定义了协议栈和vendor_lib交互接口,分为两组:

1、 vendorlib实现,协议栈调用

typedef struct {/*** Set to sizeof(bt_vendor_interface_t)*/size_t size;/*** Caller will open the interface and pass in the callback routines* to the implementation of this interface.*/int (*init)(const bt_vendor_callbacks_t* p_cb, unsigned char* local_bdaddr);/*** Vendor specific operations*/int (*op)(bt_opcode_t opcode, void* param);/*** Closes the interface*/void (*close)(void);
} bt_vendor_interface_t;

协议栈启动时的基本流程如下:

bluetooth/1.0/default/vendor_interface.cc - platform/hardware/interfaces - Git at Google (googlesource.com)

1.1、协议栈动态打开libbt-vendor.so,并调用init函数,初始化vendorlib

1.2、协议栈调用op函数,分别调用BT_VND_OP_POWER_CTRL、BT_VND_OP_USERIAL_OPEN、BT_VND_OP_FW_CFG三个opcode;

2、协议栈实现,vendorlib调用(回调函数)

typedef struct {/** set to sizeof(bt_vendor_callbacks_t) */size_t size;/** Callback and callout functions have implemented in HCI libray* (libbt-hci.so).*//* notifies caller result of firmware configuration request */cfg_result_cb fwcfg_cb;/* buffer allocation request */malloc_cb alloc;/* buffer deallocation request */mdealloc_cb dealloc;/* hci command packet transmit request */cmd_xmit_cb xmit_cb;} bt_vendor_callbacks_t;

fwcfg_cb在BT_VND_OP_FW_CFG完成后调用

alloc/dealloc用于发送HCI消息时申请/释放消息控件

xmit_cb发送HCI Commands

vendor_lib实现的几个重要函数

2.1、 init函数
static int init(const bt_vendor_callbacks_t *p_cb, unsigned char *local_bdaddr)
{/* * ... */userial_vendor_init();upio_init();vnd_load_conf(VENDOR_LIB_CONF_FILE);/* store reference to user callbacks */bt_vendor_cbacks = (bt_vendor_callbacks_t *)p_cb;/* This is handed over from the stack */memcpy(vnd_local_bd_addr, BD_ADDR_LEN, local_bdaddr, 6);return 0;
}

vendorlib被调用的第一个函数,vendorlib保存好协议栈的callback和mac地址即可。

2.2、BT_VND_OP_POWER_CTRL对应处理

这个操作理论上需要拉高电源管脚电平;该函数中使用rfill设备来处理 通过write->/sys/class/rfkill/rfkill[num]/state

case BT_VND_OP_POWER_CTRL:{int *state = (int *) param;upio_set_bluetooth_power(UPIO_BT_POWER_OFF);if (*state == BT_VND_PWR_ON){ALOGW("NOTE: BT_VND_PWR_ON now forces power-off first");upio_set_bluetooth_power(UPIO_BT_POWER_ON);} else {/* Make sure wakelock is released */hw_lpm_set_wake_state(false);}}break;
2.3、BT_VND_OP_USERIAL_OPEN对应处理
case BT_VND_OP_USERIAL_OPEN:{int (*fd_array)[] = (int (*)[]) param;int fd, idx;fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg);if (fd != -1){for (idx=0; idx < CH_MAX; idx++)(*fd_array)[idx] = fd;retval = 1;}/* retval contains numbers of open fd of HCI channels */}break;

userial_vendor_open函数打开串口设备(UART)并设置(UART)得到文件描述符(fd),通过op的参数param返回该fd

2.4、BT_VND_OP_FW_CFG对应处理

该操作码要求对蓝牙芯片进行初始化,具体要进行的处理和蓝牙芯片强相关。以本次调测的AP6275pr3芯片为例,初始化过程中主要是下发蓝牙固件。

初始化结束后,必须调用init_cb回调函数(参见bt_vendor_callbacks_t)通知协议栈初始化结果,否则会阻塞协议栈线程导致蓝牙相关功能无法正常使用。协议栈的具体处理如下:

协议栈调用BT_VND_OP_FW_CFG后会等待信号量,该信号量由init_cb函数置位

2.5、 固件问题

开发时一定要关注芯片固件,有些蓝牙芯片可能无需升级固件,有些则必须升级固件;固件下发时需要注意如下两点:

5.1、对于AP6275芯片,因为蓝牙芯片内并没有类似flash存储,要求芯片上下电后必须重新下发

5.2、按照芯片本身的要求处理,最好能找到厂商的参考代码;以Broadcom系列芯片为例,其固件下发过程比较复杂,通过一个状态机驱动;共如下9个状态

/ Hardware Configuration State */
enum {HW_CFG_START = 1,HW_CFG_SET_UART_CLOCK,HW_CFG_SET_UART_BAUD_1,HW_CFG_READ_LOCAL_NAME,HW_CFG_DL_MINIDRIVER,HW_CFG_DL_FW_PATCH,HW_CFG_SET_UART_BAUD_2,HW_CFG_SET_BD_ADDR,HW_CFG_READ_BD_ADDR
};

在收到BT_VND_OP_FW_CFG后初始化状态机,然后发送HCI_REST命令,切换状态为HW_CFG_START;

void hw_config_start(void)
{HC_BT_HDR *p_buf = NULL;uint8_t *p;hw_cfg_cb.state = 0;hw_cfg_cb.fw_fd = -1;hw_cfg_cb.f_set_baud_2 = FALSE;if (bt_vendor_cbacks) {p_buf = (HC_BT_HDR *)bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE +HCI_CMD_PREAMBLE_SIZE);}if (p_buf) {p_buf->event = MSG_STACK_TO_HC_HCI_CMD;p_buf->offset = 0;p_buf->layer_specific = 0;p_buf->len = HCI_CMD_PREAMBLE_SIZE;p = (uint8_t *)(p_buf + 1);UINT16_TO_STREAM(p, HCI_RESET);*p = 0;hw_cfg_cb.state = HW_CFG_START;bt_vendor_cbacks->xmit_cb(HCI_RESET, p_buf);} else {if (bt_vendor_cbacks) {HILOGE("vendor lib fw conf aborted [no buffer]");bt_vendor_cbacks->init_cb(BTC_OP_RESULT_FAIL);}}
}

收到芯片返回的HCI_RESET完成事件后,继续切换到下一个状态机并发送下一个COMMAND,一直到状态机完成固件下发。

详细实现请参见hw_config_cback函数。

参考:

https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/porting-dayu200-on_standard-demo.md#hci%E6%8E%A5%E5%8F%A3

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

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

相关文章

5.1 内容管理模块 - 课程预览、提交审核

内容管理模块 - 课程预览、提交审核 文章目录 内容管理模块 - 课程预览、提交审核一、课程预览1.1 需求分析1.2 freemarker 模板引擎1.2.1 Maven 坐标1.2.2 freemaker 相关配置信息1.2.3 添加模板 1.3 测试静态页面1.3.1 部署Nginx1.3.2 解决端口问题被占用问题1.3.3 配置host文…

紫光展锐T770安卓核心板_展锐T770 5G核心板规格参数

紫光展锐T770安卓核心板是一款高性能的5G安卓智能模块&#xff0c;拥有先进的6nm制程工艺和强大的性能。板载8GB Ram 256GBROM的内存单元&#xff0c;支持4K H.265/ H.264视频编解码&#xff0c;搭载Android 13以上操作系统&#xff0c;功能丰富。除了支持5G NSA和SA双模式向下…

我的NPI项目之设备系统启动(三) -- CDT的一个实例

上面说了这么多&#xff0c;这里就添加一个CDT的使用实例和简单的代码解析。 首先生成cdt_configure.xml配置文件&#xff0c;然后执行如下命令&#xff1a; python cdt_generator.py cdt_configure.xml CDT.bin; 就可以生成对应的CDT.bin文件。同时也会生成, 我们会利用ha…

『 C++ 』AVL树详解 ( 万字 )

&#x1f988;STL容器类型 在STL的容器中,分为几种容器: 序列式容器&#xff08;Sequence Containers&#xff09;: 这些容器以线性顺序存储元素&#xff0c;保留了元素的插入顺序。 支持随机访问&#xff0c;因此可以使用索引或迭代器快速访问任何位置的元素。 主要的序列式…

DBA技术栈(三):MySQL 性能影响因素

文章目录 前言一、影响MySQL性能的因素1.1 商业上的需求1.2 应用架构规划1.3 查询语句使用方式1.4 Schema的设计1.5 硬件环境 总结 前言 大部分人都一致认为一个数据库应用系统&#xff08;这里的数据库应用系统概指所有使用数据库的系统&#xff09;的性能瓶颈最容易出现在数…

MOSS 混元 巅峰对话!2024大模型发展都在这里

引言 2023 年&#xff0c;各大厂商争先投入 LLM 研发&#xff0c;一年内&#xff0c;在国内累计就有 200 余个大模型正式发布。尽管很多大模型并不完善&#xff0c;但行业内的研究专家及产业领袖都在为大模型的突破甚至 AGI 的发展&#xff0c;做着不懈探索。 但同时&#xff0…

基于Java (spring-boot)的停车场管理系统

一、项目介绍 基于Java (spring-boot)的停车场管理系统、预订车位系统、停车缴费系统功能&#xff1a; 登录、注册、后台首页、用户信息管理、车辆信息管理、新增车辆、车位费用设置、停泊车辆查询、车辆进出管理、登录日志查询、个人中心、预定停车位、缴费信息。 适用人群&…

Windows系统缺失api-ms-win-crt-runtime-l1-1-0.dll的修复方法

“在Windows操作系统环境下&#xff0c;用户经常遇到丢失api-ms-win-crt-runtime-l1-1-0.dll文件的问题&#xff0c;这一现象引发了广泛的关注与困扰。该dll文件作为Microsoft Visual C Redistributable Package的重要组成部分&#xff0c;对于系统内许多应用程序的正常运行起着…

C++ λ表达式

λ表达式提供了函数对象的另一种编程机制。 在 C 11 和更高版本中&#xff0c;Lambda 表达式&#xff08;通常称为 Lambda&#xff09;是一种在被调用的位置或作为参数传递给函数的位置定义匿名函数对象&#xff08;闭包&#xff09;的简便方法。 Lambda 通常用于封装传递给算法…

论文笔记(三十九)Learning Human-to-Robot Handovers from Point Clouds

Learning Human-to-Robot Handovers from Point Clouds 文章概括摘要1. 介绍2. 相关工作3. 背景3.1. 强化学习3.2. 移交模拟基准 4. 方法4.1. Handover Environment4.2. 感知4.3. 基于视觉的控制4.4. 师生两阶段培训 (Two-Stage Teacher-Student Training) 5. 实验5.1. 模拟评估…

CSS实现平行四边形

1、为什么实现平行四边形 在日常开发过程中&#xff0c;有些时候我们可以会遇到一种情况&#xff0c;如可视化大屏中要求我们横线实现对应的进度条&#xff0c;但进度条的内容是由无数个平行四边形组装类似于进度条的形式&#xff0c;那么我们就需要使用CSS来进行对应的实现。 …

OPT(erlang)打造一套缓存系统(一)

缓存的设计 这个简易缓存存储的是键/值对&#xff0c;其中键与键之间不得重复&#xff0c;并且每个键只能映射到一个值。这个设计背后的核心思想是为写人缓存的每一个值都分配一个独立的存储进程再将对应的键映射至该进程。你可能会对这种为每个值分配一个进程的设计感到惊讶&…

20240114-寻找零损失或一损失的玩家

题目要求 给定一个整数数组 matches&#xff0c;其中 matches[i] [winneri, Loseri] 表示玩家 Winneri 在一场比赛中击败了玩家 Loseri。 返回大小为 2 的列表答案&#xff0c;其中&#xff1a; answer[0] 是所有未输掉任何比赛的玩家的列表。answer[1] 是仅输掉一场比赛的…

京东年度数据报告-2023全年度笔记本十大热门品牌销量(销额)榜单

2023年度&#xff0c;在电脑办公市场整体销售下滑的环境下&#xff0c;笔记本市场的整体销售也不景气。 根据鲸参谋平台的数据显示&#xff0c;京东平台上笔记本的年度销量为650万&#xff0c;同比下滑约16%&#xff1b;销售额约为330亿&#xff0c;同比下滑约19%。同时&#…

71.网游逆向分析与插件开发-角色数据的获取-修复角色名与等级显示问题

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;自动化助手UI显示角色数据-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;0049452c079867779…

微软Office 2021 批量许可版

软件介绍 微软办公软件套件Microsoft Office LTSC 2021 专业增强版2024年1月批量许可版更新推送&#xff01;Office2021正式版和Windows11系统同时于2021年10月份正式推出&#xff0c;Office LTSC 2021相比 Office2019正式版变化不太&#xff0c;最主要强化了LOGO设计趋势&…

电商物流查询:未来的发展方向

在电商日益繁荣的时代&#xff0c;物流信息查询不仅关乎消费者体验&#xff0c;更影响着电商运营的效率。快速、准确地追踪物流信息至关重要。本文将简述物流信息快速追踪的价值&#xff0c;并重点介绍固乔快递查询助手这一高效查询工具及其批量查询功能。 一、物流信息快速追踪…

arcgis javascript api4.x加载天地图wgs84(wkid:4326)坐标系

需求&#xff1a; 使用arcgis javascript api4.x以basetilelayer方式加载天地图wgs84&#xff08;wkid&#xff1a;4326&#xff09;坐标系 效果&#xff1a; 代码&#xff1a; 提示&#xff1a;&#xff08;下述三个文件放同一个文件夹下&#xff09; 4326.js define([ex…

python毕设选题 - 基于时间序列的股票预测于分析

文章目录 1 简介2 时间序列的由来2.1 四种模型的名称&#xff1a; 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 简介 Hi&#xff0c;大家好&#xff0c;今天向大家介绍一个大数据项目…

QTday6作业

思维导图: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase>//数据库管理类 #include <QSqlQuery>//执行sql语句类 #include <QSqlRecord>//数据库记录类 #include <QSqlError>//数据库错误类 #include …