高通 8255 基本通信(QUP)Android侧控制方法说明

一:整体说明

高通8255芯片中,SPI IIC UART核心统一由QUP V3 进行控制
QUP V3为可编程模块,可以将不同通道配置为SPI IIC UART通路,此部分配置在QNX侧
QUP 资源可以直接被QNX使用,Android侧可以通过两种方法使用QUP资源

二:QUP资源示意图

在8255上共有 4组 QUP资源,每组对应不同通信通道和对应的gpio,各资源对应关系图如下:

上图中,我们可以得到信息例如:

  • 所有通道都支持 UART(64B FIFO模式)
  • QUP1_SE_6不支持API了master功能
  • QUP0_SE_0 对应的gpio_pin是20 21 22 23 
  • ...

上图中对于QUP lane 对应gpio的关系如下

例如  QUP0_SE_0 对应的gpio_pin是20 21 22 23 ,

如果设置为UART模式的话,pin20为CTS  pin21为RFR  pin22为TX pin23 为RX

三:Android 控制使用QUP的方法

如果要在Android侧使用 QUP相关资源有两种方法

参考网页:

- Architecture (qnx.com)


方法1:virtual devices


QUP在QNX侧配置相关驱动,通过hypervisor提供虚拟的devices节点给Android侧使用

此方法中大致逻辑如下:

1 硬件device通过Hypervisor 由 PVM(即QNX)直接使用driver控制

2 PVM(QNX侧)通过Hypervisor提供VirtoBE(BackEnd后端)向GVM(即Android侧)提供接口,这样GVM使用VirtoIOFE(FrontEnd前端) 来间接使用PVM的driver

核心逻辑:QNX直接使用QUP资源,Hypervisor作为桥梁,QNX提供driver的后端程序,Android提供driver的前端程序,即Android侧间接使用QUP资源

        相关网页:

- Virtual devices (qnx.com)

- Configuring vdevs (qnx.com)

- Configuring guests (qnx.com)

- Configuring the hypervisor host (qnx.com)


方法2:pass-through


QUP资源通过hypervisor直接映射到Android侧,Android侧配置相关驱动使用真实的资源

 此方法中大致逻辑如下:

1 QUP资源通过Hypervisor 直接提供给GVM(Android)侧使用

即 Android需要提供完整的QUP驱动程序

相关网页:

- Configuring the hypervisor host (qnx.com)

总结:

上述两种方法其实包含三部分内容

1 Android配置

2 QNX 配置 (需要注意的是方法2 看似没有使用QNX,但因为QNX为主系统,不使用QNX应该理解为不使用VirtoDev的形式,所以对于QUP资源来说只要这路资源使用了,就需要在QNX进行配置。)

3 Hypervisor配置

四: pass-through配置示例

示例要求:将gpio91 92 93 94 配置成一路passthrough的 蓝牙Uart通道

通过上述资源图:可以确认要使用 QUP2 :QUP2_SE_3的qup资源

QNX配置:

代码路径:/SD-AMSS4.5.5.0-ES2/tz/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/lemans/QUPAC_Access.c

对于结构体  QUPv3_se_security_permissions_type 各项定义:(大致含义
PeriphID(外设ID):指定要进行通信的外设的唯一标识符或地址。每个外设都有一个对应的唯一ID
ProtocolID(协议ID):指定要在 QUP 上使用的通信协议,例如 UART、I2C 或 SPI。
Mode(模式):指定 QUP 的工作模式。常见的模式有主机模式、从设备模式、循环模式等。
NsOwner(命名空间所有者):确定外设的命名空间所有者。它用于指示访问特定功能或资源的权限。
bAllowFifo(是否启用FIFO):指示是否允许在数据传输过程中使用 FIFO(先进先出缓冲区)。当启用 FIFO 时,数据将被缓存,以提高传输效率。
bLoad(是否加载):用于指示当前操作是否涉及加载配置或固件。
bModExcl(是否独占模式):指示外设是否以独占模式进行访问。当以独占模式打开外设时,其他程序无法访问该外设。

关于ProtocolID
SD-AMSS4.5.5.0-ES2/tz/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/interface/QupACCommonIds.h
/** QUPv3 protocols */
typedef enum
{
QUPV3_PROTOCOL_NONE = 0,
QUPV3_PROTOCOL_SPI = 1,
QUPV3_PROTOCOL_UART = 2,
QUPV3_PROTOCOL_UART_2W = QUPV3_PROTOCOL_UART,
QUPV3_PROTOCOL_I2C = 3,
QUPV3_PROTOCOL_I3C = 4,
QUPV3_PROTOCOL_SPI_SLAVE = 5,
QUPV3_PROTOCOL_AFC = 6,
QUPV3_PROTOCOL_SPMI = 7,
QUPV3_PROTOCOL_QSPI_HID = 8,
QUPV3_PROTOCOL_QSPI = 9,
QUPV3_PROTOCOL_Q2SPI = 0xE,
QUPV3_PROTOCOL_UFCS = 0xD,
QUPV3_PROTOCOL_I3C_IBI = 0x104,
QUPV3_PROTOCOL_UART_4W = QUPV3_PROTOCOL_UART + 16,
QUPV3_PROTOCOL_I2C_MM = QUPV3_PROTOCOL_I2C + 16,
QUPV3_PROTOCOL_UINT32 = 0x7fffffff
} QUPv3_protocol_type;
关于Mode
/** QUPv3 FIFO/DMA access modes */
SD-AMSS4.5.5.0-ES2/tz/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/interface/QupACCommonIds.htypedef enum
{
QUPV3_MODE_FIFO = 0,
QUPV3_MODE_CPU_DMA = 1,
QUPV3_MODE_GSI = 2,
QUPV3_MODE_MAX,
QUPV3_MODE_UINT32 = 0x7fffffff
} QUPv3_mode_type;
关于NsOwner
SD-AMSS4.5.5.0-ES2/tz/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/interface/QupACCommonIds.h
/** Defines for QUP access ids */
#define AC_NONE 0
#define AC_TZ 1
#define AC_HLOS_GSI 2
#define AC_HLOS 3
#define AC_HYP 4
#define AC_SSC_Q6_ELF 5
#define AC_ADSP_Q6_ELF 6 // Single
#define AC_SSC_HLOS 7 // ??, may be we combine this with other SSC one //
#define AC_CP_TOUCH 8
#define AC_CP_BITSTREAM 9
#define AC_CP_PIXEL 10
#define AC_CP_NON_PIXEL 11
#define AC_VIDEO_FW 12
#define AC_CP_CAMERA 13
#define AC_HLOS_UNMAPPED 14
#define AC_MSS_MSA 15
#define AC_MSS_NONMSA 16
#define AC_UNMAPPED 17
#define AC_LPASS 18
#define AC_NON_SECURE 19 // Use this ID to assign a SE to HLOS & ADSP with QUPV3_MODE_FIFO.
// The mode of operation can be either GSI or FIFO.
// But not CPU DMA.
#define AC_HLOS_MODEM 20 // For SEs assigned with AC_HLOS_MODEM
// 1. Set to FIFO mode, if there are any UEFI use cases and if UEFI driver support only FIFO mode.
// 2. Set to GSI mode, if there are UEFI use cases and UEFI driver supports GSI mode.
// SW will take care of assigning this SE to GSI mode after the FW loading is done at the end of UEFI.
#define AC_GVM_TUI 21 // Assigned to TUI GVM
#define AC_SPSS_SP 22
#define AC_OEM 23
#define AC_NON_SECURE_MODEM 24
#define AC_HOST 25
#define AC_GVM1 26
#define AC_GVM2 27
#define AC_GVM3 28
#define AC_GVM4 29
#define BLSP_AC_LAST 30
#define AC_DEFAULT 0xFF// Default as in retain whatever in SMMU static config table

Hypervisor配置:

 相关代码路径:

①   /SD-QNX4.5.5.0/apps/qnx_ap/target/hypervisor/gvm/ivi/la/linux-la.config 

②    /SD-HQX4.5.5.0-ES2/apps_kernel/kernel_platform/qcom/proprietary/devicetree/qcom/lemans-vm-qupv3.dtsi    

 代码解读:

Hypervisor代码路径是 ①  ,需要配置的主要资源是 中断号QUP资源

这两项内容对应的值可以从datasheet中取得,但查询比较麻烦,

因为Android的DTS高通厂商已经把基本信息填写好了,所以从DTS中取得更加方便,DTS路径如②

因此可以确认

中断号: 585

QUP的资源Memory地址: 0x88c000 范围是0x4000

可能疑问: 为什么DTS中锁定节点 qupv3_se17_4uart呢?

解答:建议查看一下dts中的节点包含关系

lemans-vm-qupv3.dtsi    源码节点包含关系如下:

&soc {/* QUPv3_0  wrapper  instance */qupv3_0: qcom,qupv3_0_geni_se@9c0000 {...status = "ok";qupv3_se0_i2c: i2c@980000 {...status = "disabled";};qupv3_se0_spi: spi@980000 {...status = "disabled";};qupv3_se1_i2c: i2c@984000 {...status = "disabled";};qupv3_se1_spi: spi@984000 {...status = "disabled";};qupv3_se2_i2c: i2c@988000 {...status = "disabled";};qupv3_se2_spi: spi@988000 {...status = "disabled";};qupv3_se3_i2c: i2c@98c000 {...status = "disabled";};qupv3_se3_spi: spi@98c000 {...status = "disabled";};qupv3_se4_i2c: i2c@990000 {...status = "disabled";};qupv3_se4_spi: spi@990000 {...status = "disabled";};qupv3_se5_i2c: i2c@994000 {...status = "disabled";};qupv3_se5_spi: spi@994000 {...status = "disabled";};qupv3_se5_2uart: qcom,qup_uart@994000 {...status = "disabled";};};/* QUPv3_1  wrapper  instance */qupv3_1: qcom,qupv3_1_geni_se@ac0000 {...status = "ok";qupv3_se7_i2c: i2c@a80000 {...status = "disabled";};qupv3_se7_spi: spi@a80000 {...status = "disabled";};qupv3_se8_i2c: i2c@a84000 {...status = "disabled";};qupv3_se8_spi: spi@a84000 {...status = "disabled";};qupv3_se9_i2c: i2c@a88000 {...status = "disabled";};qupv3_se9_spi: spi@a88000 {...status = "disabled";};/* Debug UART Instance for RUMI*/qupv3_se9_2uart: qcom,qup_uart@a88000 {...status = "disabled";};qupv3_se10_i2c: i2c@a8c000 {...status = "disabled";};qupv3_se10_spi: spi@a8c000 {...status = "disabled";};/* Debug UART Instance */qupv3_se10_2uart: qcom,qup_uart@a8c000 {...status = "disabled";};qupv3_se11_i2c: i2c@a90000 {...status = "disabled";};qupv3_se11_spi: spi@a90000 {...status = "disabled";};qupv3_se12_i2c: i2c@a94000 {...status = "disabled";};qupv3_se12_spi: spi@a94000 {...status = "disabled";};qupv3_se12_2uart: qcom,qup_uart@a94000 {...status = "disabled";};qupv3_se13_i2c: i2c@a98000 {...status = "disabled";};};/* QUPv3_2  wrapper  instance */qupv3_2: qcom,qupv3_2_geni_se@8c0000 {...status = "ok";qupv3_se14_i2c: i2c@880000 {...status = "disabled";};qupv3_se14_spi: spi@880000 {...status = "disabled";};qupv3_se15_i2c: i2c@884000 {...status = "disabled";};qupv3_se15_spi: spi@884000 {...status = "disabled";};qupv3_se16_i2c: i2c@888000 {...status = "disabled";};qupv3_se16_spi: spi@888000 {...status = "disabled";};qupv3_se17_i2c: i2c@88c000 {...status = "disabled";};qupv3_se17_spi: spi@88c000 {...status = "disabled";};/* BT UART Instance */qupv3_se17_4uart: qcom,qup_uart@88c000 {...status = "disabled";};qupv3_se18_i2c: i2c@890000 {...status = "disabled";};qupv3_se18_spi: spi@890000 {...status = "disabled";};qupv3_se19_i2c: i2c@894000 {...status = "disabled";};qupv3_se19_spi: spi@894000 {...status = "disabled";};qupv3_se20_i2c: i2c@898000 {...status = "disabled";};qupv3_se20_spi: spi@898000 {...status = "disabled";};};/* QUPv3_3  wrapper  instance */qupv3_3: qcom,qupv3_3_geni_se@bc0000 {...status = "ok";qupv3_se21_i2c: i2c@b80000 {...status = "disabled";};qupv3_se21_spi: spi@b80000 {...status = "disabled";};};
};

我这里总结了一下各节点和QUP资源的对应关系 如下:

QUP serial engineAndroid DTS KeyWord
QUP0_SE0qupv3_se0_xxxxx
QUP0_SE1qupv3_se1_xxxxx
QUP0_SE2qupv3_se2_xxxxx
QUP0_SE3qupv3_se3_xxxxx
QUP0_SE4qupv3_se4_xxxxx
QUP0_SE5qupv3_se5_xxxxx
QUP1_SE0qupv3_se7_xxxxx
QUP1_SE1qupv3_se8_xxxxx
QUP1_SE2qupv3_se9_xxxxx
QUP1_SE3qupv3_se10_xxxxx
QUP1_SE4qupv3_se11_xxxxx
QUP1_SE5qupv3_se12_xxxxx
QUP1_SE6qupv3_se13_xxxxx
QUP2_SE0qupv3_se14_xxxxx
QUP2_SE1qupv3_se15_xxxxx
QUP2_SE2qupv3_se16_xxxxx
QUP2_SE3qupv3_se17_xxxxx
QUP2_SE4qupv3_se18_xxxxx
QUP2_SE5qupv3_se19_xxxxx
QUP2_SE6qupv3_se20_xxxxx
QUP3_SE0qupv3_se21_xxxxx

Android侧配置:

对于Android侧的配置基本上就和Linux配置一样了

基本配置逻辑如下:

① 针对uart 的gpio的normal 和 sleep模式下的 Function及 config设定

② 上述 qup.dtsi中 qup节点信息设定

③ 需要特别注意的是,上面qup.dtsi中各子节点状态都是 disable,当需要使用的时候需要将状态更改为ok,同时便于使用需要在aliases节点中增加子节点描述

Android侧最终使用效果:

在Android侧最终会生成一个ttyHS0的device节点,其他操作正常通过该节点使用正常的linux或Android方法即可进行

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

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

相关文章

uniapp+vue3+setup语法糖开发微信小程序时不能定义globalData的解决方法

在使用 uniapp 开发小程序的时候, 发现使用了setup 语法糖 ,定义 globalData 时,要不是定义不了, 要不就是使用 getApp()取不到,后来想到一个不伦不类的方法解决了, 这个方法有点难看, 但是解决…

WPF连接MySqldemo

界面总要管理数据嘛,于是便学习了一下WPF与MySql的基本连接. 运行结果: 环境配置 需要下载安装Mysql,网上教程很多,不详说,创建的工程需要下载或者引入相关的包(MySql.Data) 连接的部分直接看具体的代码即可 xaml代码(只放置了一个按钮和文本框) <Grid><Button x:Name…

mybatis-plus 的saveBatch性能分析

Mybatis-Plus 的批量保存saveBatch 性能分析 目录 Mybatis-Plus 的批量保存saveBatch 性能分析背景批量保存的使用方案循环插入使用PreparedStatement 预编译优点&#xff1a;缺点&#xff1a; Mybatis-Plus 的saveBatchMybatis-Plus实现真正的批量插入自定义sql注入器定义通用…

【C语言】猜数字游戏

代码如下&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h> void game() {int r rand() % 100 1;int guess 0;while (1){printf("请猜数字>:");scanf("%d", &guess…

【神经网络 基本知识整理】(激活函数) (梯度+梯度下降+梯度消失+梯度爆炸)

神经网络 基本知识整理 激活函数sigmoidtanhsoftmaxRelu 梯度梯度的物理含义梯度下降梯度消失and梯度爆炸 激活函数 我们知道神经网络中前一层与后面一层的连接可以用y wx b表示&#xff0c;这其实就是一个线性表达&#xff0c;即便模型有无数的隐藏层&#xff0c;简化后依旧…

【目标检测】YOLOv2 网络结构(darknet-19 作为 backbone)

上一篇文章主要是写了一些 YOLOv1 的原版网络结构&#xff0c;这篇文章一样&#xff0c;目标是还原论文中原版的 YOLOv2 的网络结构&#xff0c;而不是后续各种魔改的版本。 YOLOv2 和 YOLOv1 不一样&#xff0c;开始使用 Darknet-19 来作为 backbone 了。论文中给出了 Darkne…

springboot280基于WEB的旅游推荐系统设计与实现

旅游推荐系统设计与实现 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装旅游推荐系统软件来发挥其高效地信息处理…

5-隐藏层:神经网络为什么working

声明 本文章基于哔哩哔哩付费课程《小白也能听懂的人工智能原理》。仅供学习记录、分享&#xff0c;严禁他用&#xff01;&#xff01;如有侵权&#xff0c;请联系删除 目录 一、知识引入 &#xff08;一&#xff09;隐藏层 &#xff08;二&#xff09;泛化 &#xff08;三…

java算法题每日多道

274. H 指数 题目 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Ellipse)

椭圆绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Ellipse(options?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0…

数据结构知识Day1

数据结构是什么&#xff1f; 数据结构是计算机存储、组织数据的方式&#xff0c;它涉及相互之间存在一种或多种特定关系的数据元素的集合。数据结构反映了数据的内部构成&#xff0c;即数据由哪些成分数据构成&#xff0c;以何种方式构成&#xff0c;以及呈现何种结构。这种结…

LeetCode讲解算法1-排序算法(Python版)

文章目录 一、引言问题提出 二、排序算法1.选择排序&#xff08;Selection Sort&#xff09;2.冒泡排序3.插入排序&#xff08;Insertion Sort&#xff09;4.希尔排序&#xff08;Shell Sort&#xff09;5.归并排序&#xff08;Merge Sort&#xff09;6.快速排序&#xff08;Qu…

【Node.js从基础到高级运用】十三、NodeJS中间件高级应用

在现代web开发中&#xff0c;Node.js因其高效和灵活性而备受青睐。其中&#xff0c;中间件的概念是构建高效Node.js应用的关键。在这篇博客文章中&#xff0c;我们将深入探讨Node.js中间件的高级应用&#xff0c;包括创建自定义中间件、使用第三方中间件等。我们将从基础讲起&a…

AJAX-原理XMLHttpRequest

定义 使用 查询参数 定义&#xff1a;浏览器提供给服务器的额外信息&#xff0c;让服务器返回浏览器想要的数据 语法&#xff1a;http://xxxx.com/xxx/xxx?参数名1值1&参数名2值2

ChatGPT编程Python小案例(拿来就用)—解压zip压缩文件

ChatGPT编程Python小案例&#xff08;拿来就用&#xff09;—解压zip压缩文件 今天撸一本书&#xff0c;其中书中提供一个zip压缩文件的资料。下载之后&#xff0c;没有解压软件&#xff0c;&#xff08;也可能该文件可以自解压&#xff09;。这段时间已经深刻体会到AI编程带来…

爬虫 Day2

resp.close()#关掉resp 一requests入门 &#xff08;一&#xff09; 用到的网页&#xff1a;豆瓣电影分类排行榜 - 喜剧片 import requestsurl "https://movie.douban.com/j/chart/top_list" #参数太长&#xff0c;重新封装参数 param {"type": "…

【Unity每日一记】unity中的内置宏和条件编译(Unity内置脚本符号)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

EDI在汽车主机厂配送流程中的应用

汽车主机厂的汽车配送流程始于汽车 “生产结束 ” &#xff0c;止于 “交付给经销商 ” 。在这个流程中&#xff0c;企业作为主机厂的下游供应商&#xff0c;与主机厂的物流服务供应商之间的信息交换将会变得十分重要。 配送流程&#xff1a;运输订单以及报告 汽车主机厂提供预…

【linux驱动】定时器的使用

【linux驱动】定时器的使用 文章目录 【linux驱动】定时器的使用1.介绍1.1相关名词1.2配置HZ的方法 2.API3.示例4.调试 1.介绍 1.1相关名词 HZ、jiffies、tick Linux系统启动后&#xff0c;每隔固定周期就会发出timer interrupt(IRQ 0)&#xff0c;HZ用来定义每一秒发生多少…

【机器学习】经典目标检测算法:RCNN、Fast RCNN、 Faster RCNN 基本思想和网络结构介绍

文章目录 三者的比较&#xff1a;RCNN、Fast RCNN、 Faster RCNN一、框架的对比1.三者都是二阶算法&#xff0c;网络框架比较&#xff1a;2.三者的优缺点比较&#xff1a; RCNN一、RCNN系列简介二、RCNN算法流程的4个步骤三、RCNN存在的问题四、论文解析补充1.R-CNN提出了两个问…