高通8255 Android Virtio Virtio-SPI 配置方法

目录

一:VirtIO和Passthrough的区别

二:配置逻辑

三:配置方法

步骤一:QNX SPI资源配置 & 测试

配置

测试

步骤二:BE配置 &测试

配置

测试

步骤三:Hypervisor配置

配置

测试

步骤四:Android侧配置

配置-config相关

组入config的方法

确认config的方法

配置-DTS相关

测试

参考网站

黑莓官方资料:

通信调试方法:


一:VirtIO和Passthrough的区别

二:配置逻辑

以上章节内容 可参照我的这篇文章,本质上是一样的:

高通8255 Android Virtio Virtio-IIC 配置方法_virtio i2c-CSDN博客

三:配置方法

因为Virtio的逻辑是分 BE(后端) FE(前端),所以依然要先保证QNX配置成功,然后再调试Android侧

步骤一:QNX SPI资源配置 & 测试

配置

正常配置一路QNX spi资源:

SD-QNX4.5.6.0/apps/qnx_ap/boards/core/dalconfig/lemans_rumi/config/spi_props_lemans.xml

SD-QNX4.5.6.0/apps/qnx_ap/boards/core/dalconfig/lemans_rumi/config/pin_config.c

测试

使用 QNX spidbgr 命令 进行测试

测试工具代码路径:/SD-QNX4.5.6.0/apps/qnx_ap/AMSS/platform/services/applications/spidbgr

使用方法参照:spidbgr.use%C :
Usage: spidbgr -m [master_node] -d [slave_id] -M [mode] -f [freqency] -w -l [master_wlen] -o [master_wmsg]  //write onlyspidbgr -s [slave_node] -d [slave_id] -M [mode] -f [freqency] -R -B [slave_rlen]  //read onlyspidbgr -m [master_node] -d [slave_id] -M [mode] -f [freqency] -w -l [master_wlen] -o [master_wmsg] -s [slave_node] -R -B [slave_rlen] //master write and slave readspidbgr -m [master_node] -d [slave_id] -M [mode] -f [freqency] -x -l [master_wlen] -o [master_wmsg] -s [slave_node] -X -L [slave_wlen] -O [slave_wmsg]  //exchange between master and slavecmd list:-m --master                      master portid (range is 1-12)-s --slave                    slave portid (range is 1-12)-d --device                      slaveid (default 0, range is 0-3)-G --setcfg                      set config-M --mode                             mode (default 0x2608)-f --freq                             freq (default 1000000HZ)-w --master_write                master write-W --slave_write               slave write-r --master_read                 master read-R --slave_read                slave read-x --master_xchange            master xchange-X --slave_xchange             slave xchange-c --master_cmdread            master cmdread-C --slave_cmdread             slave cmdread-i --master_cmdwrite           master cmdwrite-I --slave_cmdwrite            slave cmdwrite-g --get_info                  get info-l --master_wlen               master write msg len (default 0)-b --master_rlen               master read msg len (default 0)-L --slave_wlen                slave write msg len (default 0)-B --slave_rlen                slave read msg len (default 0)-o --master_wmsg                 master write message-O --slave_wmsg                  slave write message-v --verbose                     verbose (default disable)-t --timeout_value_set_sec     timeout value set sec(default 5s)-T --timeout_value_set_nsec    timeout value set nsec(default 0ns)-n --timeout_value_get         timeout value get-p --random_data_padding       random data padding-z --iteration_count           iteration_count(default 1)-h --help                        helpThe meaning of each bit of the mode parameter:
0-7   bit    the number of bits in a data frame
8     bit    CPOL, 0:SCLK is low when idle, 1:SCLK is high when idle
9     bit    CPHA, 0:input bit is shifted in first transition edge, 1:output bit is shifted in first transition edge
10    bit    spi bit order, 0:LSB first 1:MSB first
11    bit    spi cs polarity, 0:active low 1:active high
13    bit    cs mode, 0:CS is deasserted after transferring data for N clock cycles 1:CS is asserted as long as the core is in Run state
22-25 bit    inter-word delay(1-15 cycles)
30    bit    SW loopback enable, 0:disable 1:enableEg. Get SPI configurationspidbgr -m 2 -gThis will read back something like :device info, name-A2B SPI / Mercu:mode-0x00002608:clock-5000000Hzdriver info, name-QCOM SPI Master:version-1:feature--2147483648Eg. hw loopback between spi2 and spi9(spi2 write spi9 read)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -w -l 2 -o 0x55 0xaa -s 9 -R -B 2Eg.  spi master write(spi_write)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -w -l 2 -o 0x55 0xaaEg.  spi master read(spi_read)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -r -b 2Eg.  spi master xchange(spi_xchange)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -x -l 2 -o 0x55 0xaaEg.  spi master write and read(spi_cmdread)spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -c -l 2 -o 0x55 0xaa -b 2Eg. spi cmdwrite:spidbgr -d 0 -M 0x2608 -f 2000000 -m 2 -i -l 2 -o 0x55 0xaaNotes:- Port ID range is 1-12. Slave ID range is 0-3.- This debugger can handle at max 64K bytes per transaction.- It can use the random data padding mode through the -p flag, specify the wlen is enough, no need to manually input wmsg in the cmd, such as:spidbgr -m 2 -d 0 -M 0x40002608 -f 1000000 -x -l 500 -p- It can log the transfer info through the -v flag, such as:# spidbgr -m 2 -d 0 -M 0x40002608 -f 1000000 -x -l 10 -p -v=========spi transfer info=========iteration_times: 1master_portid: 2 slave_portid: 0cs_num: 0mode: 0x40002608freq: 1000000HZmaster_wlen: 10 master_rlen: 10slave_wlen: 0 slave_rlen: 0master_cmd: SPI_XCHANGEslave_cmd: Nonemaster_wmsg: 0x28 0xac 0x87 0xda 0x70 0x19 0x9d 0x8c 0xb1 0x1===================================- It can set the timeout value with the -t & -T flags, -t is sec, -T is nsec , such as:spidbgr -m 2 -d 0 -M 0x40002608 -f 100000 -x -l 2 -p  -t 10 -T 1000000- It can get the timeout value with the -n flag, such as:spidbgr -m 2 -d 0 -M 0x40002608 -f 100000 -x -l 2 -p  -t 10 -T 1000000 -n/dev/spi2 timeout_sec is 10s, timeout_nsec is 1000000ns- The iteration count can be specified with the -z flag, such asspidbgr -m 2 -d 0 -M 0x40002608 -f 100000 -x -l 2 -p  -z 5

测试示例:

spidbgr -d 0 -M 0x2608 -f 10000000 -m 3 -w -l 1 -o 0xaaspidbgr -d 0 -M 0x2608 -f 10000000 -m 3 -w -l 1 -o 0xaa

QNX 测试 结果 OK 

步骤二:BE配置 &测试

配置

Virtio机制是BE以.so形式进行加载运行,所以要求确保上述使用的文件生成so并再车机中运行。

因此在此文件中追加相关内容,将so推送到机器中

SD-QNX4.5.6.0/apps/qnx_ap/target/hypervisor/host/build_files/system.build.tmpl

测试

确认 /mnt/lib64/dll 中存在此

测试结果:ok

步骤三:Hypervisor配置

配置

/SD-QNX4.5.6.0/apps/qnx_ap/target/filesets/secpol/gvm_la.txt

/SD-QNX4.5.6.0/apps/qnx_ap/target/hypervisor/gvm/ivi/lemans/la/linux-la.config

 #virtio-SPI Tunervdev vdev-virtio-spi.so loc 0x1cd12000 intr gic:111 verbose 3 device spi1 cs_num 4

上述代码简要描述

  1. vdev vdev-virtio-spi.so   步骤二中提到的 .so,用于将此so提供给Android侧使用

  2. loc 0x1cd12000 intr gic:111   给Android侧虚拟的一段地址和中断号,这两个参数随意编写即可,但不要和其他资源地址和中断号发生重复和覆盖,同时要和后续步骤四中DTS描述匹配

  3. verbose 3:设置日志输出级别为3(较详细的调试信息,可以不必过多关注)

  4. device spi1:指定关联的QNX配置的 SPI设备为spi1,因为上述qnx配置的是/dev/spi1 所以这里要配置spi1 

  5. cs_num 4:设置芯片选择(CS)信号 固定配置不用关心

测试


对于hypervisor参照QNX log即可,如果QNX和Android侧配置都OK后,QNX启动时没有提示异常log ,暂且认为此处配置正常。(基于高通的base代码,hypervisor需要修改的配置并不多,所以如果配置出现明显错误,例如上述提到的地址或者资源不正确,会有相关明显报错信息) 测试结果: 无异常log  OK

步骤四:Android侧配置

配置-config相关

首先保证Android侧 IIC可用,前提是 Android kernel的三个config需要打开,需要配置为 y或者m

CONFIG_SPI_MSM_GENI=m
CONFIG_SPI_SPIDEV=m
CONFIG_VIRTIO_SPI=m

组入config的方法

修改/SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/arch/arm64/configs/vendor/autogvm_GKI.config

在 高通流程中,defconfig位于   /SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/arch/arm64/configs/gki_defconfig

从Android编译相关log可以看到,高通处理过程中会将上述autogvm_GKI.config merge 到  gki_defconfig中,所以不建议直接更新gki_defconfig。

log如下:

Using msm-kernel/arch/arm64/configs/gki_defconfig as baseMerging msm-kernel/arch/arm64/configs/vendor/autogvm_GKI.config

确认config的方法

在build out文件中确认当前config值build out文件路径:/SD-HQX4.5.6.0/lagvm/LINUX/android/out/target/product/gen4_gvm/obj/DLKM_OBJ/kernel_platform/msm-kernel/.config

确认结果  OK

上述config 我是以模块形式进行的加载(m),所以还需要更新文件   /SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/autogvm.bzl 使得启动时,自动加载相关 .ko文件 

这几个.ko文件路径参照相关driver编译路径和makefile即可

例如  /SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/drivers/spi/Makefile 中

obj-$(CONFIG_SPI_SPIDEV) += spidev.o所以路径为 drivers/spi/spidev.ko

配置-DTS相关

按照正常DTSI配置 SPI节点即可

/SD-HQX4.5.6.0/apps_kernel/kernel_platform/qcom/proprietary/devicetree/qcom/lemans-vm-la.dtsi    

        aliases {

                  spi1 = &virtio_spi;           // virtio-spi

            };

        

     

/SD-HQX4.5.6.0/apps_kernel/kernel_platform/qcom/proprietary/devicetree/qcom/quin-vm-common.dtsi

    virtio_spi:virtio_spi@1cd12000{

        compatible = "virtio,mmio";

        reg = <0x1cd12000 0x1000>;

        interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;

        virtio,id = <0xC009>;

        status = "ok";

          spidev@0 {

                compatible = "qcom,spi-msm-codec-slave";

                reg = <0>;

                spi-max-frequency = <10000000>;

                spi-cpha;

                // qcom,disable-dma;

                status = "ok";

            };

    };

这里需要注意两点

1  DTSI中的节点地址和中断号要和 上述步骤三中 la.config一致, PS:中断号一致不是数值一样,而是符合linux规则,软件中断号和硬件中断号相差32,即对应关系 是 79+32=111

        这两个数值在这两处一致即可,可任意编写,但不要和其他数值冲突  PS:建议同时比对 la.config (现状不冲突)和 DTS中其他值(防止和未来某项冲突)

2 本身希望生成的设备节点和QNX一致为 /dev/spi1 ,但由于高通base设计

  virtio,id = <0xC009>; 这个数值是怎么来的

需要阅读 /SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/drivers/spi/virtio-spi.c 代码

   从这基本能看到 Virtio-spi的加载逻辑,通过 module_virtio_drviver加载了对应模块,再通过id_table查找对应设备,而设备ID的宏值 VIRTIO_ID_SPI 定义如下 49161

通过HEX转换,即为C009

测试

spidev_test 命令

详细参考:/SD-HQX4.5.6.0/lagvm/LINUX/android/kernel_platform/msm-kernel/tools/spi/spidev_test.c

spidev_test -D /dev/spidev1.0 -H 1 -p '\x7c\x50'

测试结果 OK

(●'◡'●)~,此方法简要描述了配置和测试方法, 是不是很简单!。

点到为止,举一反三!

参考网站

黑莓官方资料:

- VirtIO (qnx.com)

- Physical devices (qnx.com)- vdev ioapic (qnx.com)

通信调试方法:

高通 8255 基本通信(QUP)Android侧控制方法说明_高通8255-CSDN博客

高通8255 Uart IIC SPI 测试方法_i2cdbgr-CSDN博客

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

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

相关文章

从零手写红黑树(C++实现详解)

目录 一、红黑树概述 二、红黑树节点设计 (1)枚举红黑 &#xff08;2&#xff09;红黑树的节点设计 三、红黑树核心实现:Insert 1.首先将节点遍历到对应位置创建对应节点并插入到二叉搜索树对应的位置 2.本文重点的重点 &#xff08;1&#xff09;parent为黑时直接插入即…

【黄山派-SF32LB52】—硬件原理图学习笔记

目录 一、硬件介绍 二、芯片主控 1.模组介绍 2.原理图介绍 3.模组供电电路 三、电源转换部分 1.OVP过压保护电路 2.CHG充电电路 3.系统电源桥接电路 4.LDO电路 四、Debug电路 1.一键下载电路 五、QSPI屏幕 六、SD卡 七、AUDIO音频 八、GPIO电路 1.按键部分…

从五次方程到计算机:数学抽象如何塑造现代计算

引言 数学的发展往往始于一个具体的问题&#xff0c;而后在寻求解答的过程中&#xff0c;催生出深刻的抽象理论。从五次方程的求解到抽象代数&#xff0c;再到范畴论和λ演算&#xff0c;最终影响图灵机和现代计算机的设计&#xff0c;这一历程展现了数学如何从实际问题演变为通…

剧本杀小程序开发:科技赋能,重塑推理娱乐新形态

在科技飞速发展的今天&#xff0c;各个行业都在积极探索与科技的融合&#xff0c;以实现创新发展。剧本杀行业也不例外&#xff0c;剧本杀小程序的开发&#xff0c;正是科技赋能传统娱乐的生动体现&#xff0c;它重塑了推理娱乐的新形态&#xff0c;为玩家带来了前所未有的游戏…

机器学习sklearn入门:归一化和标准化

bg&#xff1a;归一化&#xff08;Normalization&#xff09;通常指将数据按比例缩放至某个特定范围&#xff0c;但具体范围并不一定是固定的 0到1。标准化是将数据转换成均值为0&#xff0c;标准差为1的分布。使用场景&#xff1a;用归一化&#xff1a;需要严格限定范围&#…

【Project】kafka+flume+davinci广告点击实时分析系统

一、项目需求分析 某电商平台需实现广告实时点击分析系统&#xff0c;核心需求为实时统计以下内容的Top10&#xff1a; 各个广告的点击量各个省份的广告点击量各个城市的广告点击量 通过实时掌握广告投放效果&#xff0c;为广告投放策略调整和大规模投入提供依据&#xff0c;以…

JAVA后端开发——success(data) vs toAjax(rows): 何时用

toAjax(int rows)用途&#xff1a;用于不返回任何数据的 “写” 操作&#xff08;增、删、改&#xff09;。工作原理&#xff1a;它只接收一个 int 类型的参数&#xff08;通常是数据库操作影响的行数&#xff09;。它只关心这个数字是不是大于0&#xff0c;然后返回一个通用的…

pdf格式怎么提取其中一部分张页?

想从PDF里提取几个页面&#xff0c;办法还挺多的&#xff0c;下面给你唠唠常见的几种&#xff0c;保准你一看就懂。一、用专业PDF编辑软件提取 像Adobe Acrobat&#xff0c;这可是PDF编辑界的“老手”了。你先把要处理的PDF文件在Adobe Acrobat里打开&#xff0c;接着找到菜单栏…

Spring监听器

1、监听器的原理 ApplicationListener<T>是Spring框架中基于观察者模式实现的事件监听接口&#xff0c;用于监听应用程序中特定类型的事件。该接口是一个函数式接口&#xff0c;从Spring 4.2开始支持Lambda表达式实现。 接口定义如下&#xff1a; FunctionalInterface …

基于Rust游戏引擎实践(Game)

Rust游戏引擎推荐 以下是一些流行的Rust游戏引擎,适用于不同开发需求: Bevy 特点:数据驱动、模块化设计,支持ECS架构,适合初学者和复杂项目。 适用场景:2D/3D游戏、原型开发。 Amethyst 特点:成熟的ECS框架,支持多线程,社区活跃。 适用场景:大型游戏或高性能应用。…

PyTorch 数据加载实战:从 CSV 到图像的全流程解析

目录 一、PyTorch 数据加载的核心组件 1.1 Dataset 类的核心方法 1.2 DataLoader 的作用 二、加载 CSV 数据实战 2.1 自定义 CSV 数据集 2.2 使用 TensorDataset 快速加载 三、加载图像数据实战 3.1 自定义图像数据集 3.2 使用 ImageFolder 快速加载 四、加载官方数据…

程序人生,开启2025下半年

时光匆匆&#xff0c;2025年已然过去一半。转眼来到了7月份。 回望过去上半年&#xff0c;可能你也经历了职场的浮沉、生活的跌宕、家庭的变故。 而下半年&#xff0c;生活依旧充满了各种变数。 大环境的起起伏伏、生活节奏的加快&#xff0c;都让未来的不确定性愈发凸显。 在这…

在 .NET Core 中创建 Web Socket API

要在 ASP.NET Core 中创建 WebSocket API&#xff0c;您可以按照以下步骤操作&#xff1a;设置新的 ASP.NET Core 项目打开 Visual Studio 或您喜欢的 IDE。 创建一个新的 ASP.NET Core Web 应用程序项目。 选择API模板&#xff0c;因为这将成为您的 WebSocket API 的基础。在启…

Python 之地址编码识别

根据输入地址&#xff0c;利用已有的地址编码文件&#xff0c;构造处理规则策略识别地址的编码。 lib/address.json 地址编码文件&#xff08;这个文件太大&#xff0c;博客里放不下&#xff0c;需要的话可以到 gitcode 仓库获取&#xff1a;https://gitcode.com/TomorrowAndT…

kafka的部署

目录 一、kafka简介 1.1、概述 1.2、消息系统介绍 1.3、点对点消息传递模式 1.4、发布-订阅消息传递模式 二、kafka术语解释 2.1、结构概述 2.2、broker 2.3、topic 2.4、producer 2.5、consumer 2.6、consumer group 2.7、leader 2.8、follower 2.9、partition…

小语种OCR识别技术实现原理

小语种OCR&#xff08;光学字符识别&#xff09;技术的实现原理涉及计算机视觉、自然语言处理&#xff08;NLP&#xff09;和深度学习等多个领域的融合&#xff0c;其核心目标是让计算机能够准确识别并理解不同语言的印刷或手写文本。以下是其关键技术实现原理的详细解析&#…

GPT:让机器拥有“创造力”的语言引擎

当ChatGPT写出莎士比亚风格的十四行诗&#xff0c;当GitHub Copilot自动生成编程代码&#xff0c;背后都源于同一项革命性技术——**GPT&#xff08;Generative Pre-trained Transformer&#xff09;**。今天&#xff0c;我们将揭开这项“语言魔术”背后的科学原理&#xff01;…

LeetCode|Day19|14. 最长公共前缀|Python刷题笔记

LeetCode&#xff5c;Day19&#xff5c;14. 最长公共前缀&#xff5c;Python刷题笔记 &#x1f5d3;️ 本文属于【LeetCode 简单题百日计划】系列 &#x1f449; 点击查看系列总目录 >> &#x1f4cc; 题目简介 题号&#xff1a;14. 最长公共前缀 难度&#xff1a;简单…

安全事件响应分析--基础命令

----万能密码oror1 or # 1or11 1 or 11安全事件响应分析------***windoes***------方法开机启动有无异常文件 【开始】➜【运行】➜【msconfig】文件排查 各个盘下的temp(tmp)相关目录下查看有无异常文件 &#xff1a;Windows产生的 临时文件 可以通过查看日志且通过筛…

基于C#+SQL Server实现(Web)学生选课管理系统

学生选课管理系统的设计与开发一、项目背景学生选课管理系统是一个学校不可缺少的部分&#xff0c;传统的人工管理档案的方式存在着很多的缺点&#xff0c;如&#xff1a;效率低、保密性差等&#xff0c;所以开发一套综合教务系统管理软件很有必要&#xff0c;它应该具有传统的…