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

news2024/11/14 13:40:04

一:整体说明

高通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.h

typedef 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.coloradmin.cn/o/1527837.html

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

相关文章

一次完整的 HTTP 请求所经历的步骤

1: DNS 解析(通过访问的域名找出其 IP 地址,递归搜索)。 2: HTTP 请求,当输入一个请求时,建立一个 Socket 连接发起 TCP的 3 次握手。如果是 HTTPS 请求,会略微有不同。 3: 客户端向服务器发…

B树B+树,字典树详解,哈夫曼树博弈树

目录 B树&#xff1a;B-Tree B树 字典树&#xff1a;Trie Tree 哈夫曼树 博弈树 B树&#xff1a;B-Tree 多路平衡搜索树 1.M阶B树&#xff0c;就是M叉&#xff08;M个指针&#xff09;。 2.每个节点内记录个数<M-1。 3.根节点记录个数>1。 4.其余节点内记录个数&…

JavaScript之继承

继承 父类与子类 子类是父类的一个子集 比如&#xff1a;人类和医生类&#xff0c;医生类是人类的子集&#xff1b;人类是父类&#xff0c;医生类是子集 父类与子类在特性&#xff08;属性和方法&#xff09;上有什么关系 方法&#xff1a;子类对象可以调用父类原型上的方…

Nadaraya-Watson核回归

目录 基本原理 ​编辑 核函数的选择 带宽的选择 特点 应用 与注意力机制的关系 参考内容 在统计学中&#xff0c;核回归是一种估计随机变量的条件期望的非参数技术。目标是找到一对随机变量 X 和 Y 之间的非线性关系。 在任何非参数回归中&#xff0c;变量 Y 相对于变量…

Jenkins 一个进程存在多个实例问题排查

Jenkins 一个进程存在多个实例问题排查 最近Jenkins升级到2.440.1​版本后&#xff0c;使用tomcat​服务部署&#xff0c;发现每次定时任务总会有3-4个请求到我的机器人上&#xff0c;导致出现奇奇怪怪的问题。 问题发现 机器人运行异常&#xff0c;总有好几个同时请求的服务。…

Selenium 自动化 —— 使用WebDriverManager自动下载驱动

上一篇文章 入门和 Hello World 实例 中&#xff0c;我们提供了一个最简单的 Selenium 上手的例子。 但是某一天&#xff0c;突然发现相同的代码居然运行报错了。这是怎么回事呢&#xff1f; 日志排查 日志中其实提示的很明显了&#xff1a;Chrome浏览器和Chrome WebDriver的…

python中如何解析Html

在最近需要的需求中&#xff0c;需要 python 获取网页内容&#xff0c;并从html中获取到想要的内容。这里记录一下两个比较常用的python库对html的解析。 1. BeautifulSoup 它是一个非常流行的python脚本库&#xff0c;用于解析HTML和XML文档。如果你对 java 很熟悉&#xff…

软件测试教程 自动化测试之Junit框架

文章目录 1. 什么是 Junit &#xff1f;2. 常见的注解2.1 Test2.2 BeforeAll&#xff0c;AfterAll2.3 BeforeEach&#xff0c;AfterEach 3. 测试用例顺序指定4. 参数化4.1 单个参数4.2 多个参数4.3 通过方法生成 5. 测试套件6. 断言6.1 断言相等6.2 断言不相等6.3 断言为空6.4 …

医疗器械经营许可证办理流程及申请流程有哪些?

1、证书内容差异&#xff1a; 1.医疗器械经营许可证应当载明许可证号码、法定代表人、负责人、住所、经营范围、仓库地址、发证部门、日期及有效期、公司名称等事项。 2.医疗器械生产经营管理注册证书应当载明编号、公司产品名称、法定代表人、住所、经营活动场所、业务发展方…

小程序云开发(十六):JavaScript基础

&#x1f517; 运行环境&#xff1a;小程序云开发 &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497…

计算机网络:TCP篇

计网tcp部分面试总结 tcp报文格式&#xff1a; 序列号&#xff1a;通过SYN传给接收端&#xff0c;当SYN为1&#xff0c;表示请求建立连接&#xff0c;且设置序列号初值&#xff0c;后面没法送一次数据&#xff0c;就累加数据大小&#xff0c;保证包有序。 确认应答号&#x…

基于C/C++的easyx图形库教程

文章目录: 一&#xff1a;前言 二&#xff1a;窗口&#xff08;宽高 背景颜色 窗口标题 弹出对话框&#xff09; 三&#xff1a;图形绘制&#xff08;点 线 矩形 圆 椭圆&#xff09; 四&#xff1a;文字&#xff08;颜色 大小 背景 位置 打印 文字居中&#xff09; 五&a…

动态规划(算法竞赛、蓝桥杯)--单调队列优化绿色通道

1、B站视频链接&#xff1a;E45 单调队列优化DP 绿色通道_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N5e410; int n,tim,w[N],f[N],q[N];bool check(int m){int h1,t0;for(int i1; i<n; i){while(h<t && f[q[t]]>f[i-…

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

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

巧用眼精星一键批量识别营业执照为结构化Excel

在现代社会&#xff0c;数字化办公已成为企业管理的重要方式之一。而在处理营业执照等票证文件时&#xff0c;如何高效准确地进行识别和管理也显得尤为重要。眼精星票据识别系统作为一款优秀的OCR识别软件&#xff0c;为用户提供了便捷快速的解决方案。接下来&#xff0c;我们将…

Java安全基础 关键概念过关

Java安全基础 关键概念汇总 文章目录 Java安全基础 关键概念汇总前置知识1.构造器this以及包的使用2.继承3.重写/ 重载 / super4.多态5.区分和equals方法6.toString的使用7.Object的概念8.static,final,代码块static代码块final 9.动态代理10.类的动态加载1)类加载器含义&#…

SpringBoot2.7集成Swagger3

Swagger2已经在17年停止维护了&#xff0c;取而代之的是 Swagger3&#xff08;基于openApi3&#xff09;&#xff0c;所以新项目要尽量使用Swagger3. Open API OpenApi是业界真正的 api 文档标准&#xff0c;其是由 Swagger 来维护的&#xff0c;并被linux列为api标准&#x…

组建公司办公网络

一 认识网络传输介质的分类 网络传输介质主要分为有线传输介质和无线传输介质两大类&#xff0c;它们在网络建设和数据传输中扮演着至关重要的角色。下面是这两类传输介质的详细分类&#xff1a; 有线传输介质 双绞线&#xff08;Twisted Pair&#xff09;&#xff1a;这是最…

作业:基于udp的tftp文件传输实例

#include <head.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <errno.h>#define PORT 69 //服务器绑定的端口号 #define IP "192.168.1.107" //服务器的IP地址int do_download(i…

从WAF到WAAP的研究

对于需要保护Web应用程序和API的企业来说&#xff0c;从WAF到WAAP的转变已成为一种必然趋势。采用WAAP平台可以更为全面和高效地保护Web应用程序和API的安全&#xff0c;同时避免了高昂的维护成本和攻击绕过WAF的风险。 网络安全领域的发展趋势是从WAF到WAAP的转变。WAF作为传…