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

news2024/9/27 23:27:40

目录

一:VirtIO和Passthrough的区别

方法一: passthrough

方法二:virtIO

二:配置逻辑

三:示例Virtio-I2C配置

Virtio-I2C框架

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

配置

测试

步骤二:BE配置 &测试

配置

测试:

步骤三:Hypervisor配置

配置

测试

步骤四:Android侧配置

配置-config相关

        配置-DTS相关

测试


一:VirtIO和Passthrough的区别

在高通8255平台上,Android是Hypervisor虚拟机上的系统,对于GVM(Guest Virtual Decices虚拟机)使用的通信或者其他资源,有两种方法

方法一: passthrough

在hypervisor上直接将资源配置给GVM使用,即GVM可以访问真实的物理资源

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

方法二:virtIO

物理资源在QNX侧使用,

由QNX侧提供BE(BackEnd 后端)程序

Android(GVM)侧提供FE(FrontEnd前端)程序

Hypervisor提供Virtio-FIFO管道,管道可以将FE程序的数据和命令传送给BE端

二:配置逻辑

通过上述描述内容,可以确认以下两点

1 配置逻辑为 QNX IIC资源配置,QNX的BE端程序内容,Hypervisor的配置内容,Android的FE端程序内容

2 资源和控制逻辑还掌握在QNX侧,因此测试逻辑是首先保证QNX资源可用,再保证Android侧可以将数据发送到QNX侧

三:示例Virtio-I2C配置

Virtio-I2C框架

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

配置

正常配置QNX的一路IIC资源,需要修改如下文件

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

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

测试

使用 QNX i2cdbgr 命令 进行测试

该命令位置参照:/SD-QNX4.5.6.0/apps/qnx_ap/AMSS/platform/services/applications/i2cdbgr/i2cdbgr.c

使用方法参照:/SD-QNX4.5.6.0/apps/qnx_ap/AMSS/platform/services/applications/i2cdbgr/i2cdbgr.use

%C : Application to perform i2c read / write

Usage: i2cdbgr -D [node] -s [slave addr] -r -b [byte size] -o [offset] -i [# bytes to read] -n [speed in KHz (100/400/1000)]
       i2cdbgr -D [node] -s [slave addr] -w -b [byte size] -o [offset] -x [value] -n [speed in KHz (100/400/1000)]

where
    [node] is of form "/dev/i2cX".
    [byte size] is 1, or 2. The value has no effect for read. For write, if the
        byte size is 1, then the offset is ignored, and only [value] is written.
        If the byte size if 2, then i2cdbgr will write [offset value].

The i2cdbgr uses 8-bit addressing, 8-bit data to read or write from
    /dev/i2cX (fd) using i2c_client.h using default frequency.

Examples:
    For read:
        i2cdbgr -D /dev/i2c1 -s 0x77 -r -b 1 -o 0x4 -i 1 <- read 1 byte from slave addr 0x77
            offset 0x4
        i2cdbgr -D /dev/i2c1 -s 0x77 -r -b 1 -o 0x4 -i 5 <- read 5 bytes from slave addr
            0x77 offset 0x4

    For write:
        i2cdbgr -D /dev/i2c1 -s 0x77 -w -b 1 -o 0x0 -x 0xa <- write 1 byte to slave addr
            0x77 with no offset due to 1 byte size value 0xa
        i2cdbgr -D /dev/i2c1 -s 0x77 -w -b 2 -o 0x1 -x 0xb <- write 2 bytes to slave addr
            0x77 with offset + value bytes [0x1 0xb]

	For Aardvark:
		[Setup aardvark in slave mode with address 0x40]
		i2cdbgr -D /dev/i2c3 -s 0x40 -r -b 1 -i 1 -n 100 -v	 //Speed set to 100KHz
		i2cdbgr -D /dev/i2c3 -s 0x40 -r -b 1 -i 1 -n 400 -v	 //Speed set to 400KHz
		i2cdbgr -D /dev/i2c3 -s 0x40 -r -b 1 -i 1 -n 1000 -v //Speed set to 1000KHz

测试 示例:  i2cdbgr -D /dev/i2c6 -s 0x0c -r -b 1 -o 0x0 -i 0x1 -n 100

测试结果:OK

步骤二:BE配置 &测试

配置

确认后端程序,这个程序是高通提供的无需修改,有需要时查看即可

/SD-QNX4.5.6.0/apps/qnx_ap/AMSS/platform/vm/vdev/vdev-virtio-i2c-safety/vdev-virtio-i2c.c 

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

vdev vdev-virtio-i2c-safety.so loc 0x1cd10000 intr gic:109 verbose 3 controller i2c6 slave 0x0c version 1

上述代码简要描述

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

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

verbose 3 controller i2c6 slave 0x0c version 1  这几个参数都可参考 vdev-virtio-i2c.c程序,

   verbose 和version指的是log等级和版本等级,可以不必过多关注

   controller是 需要QNX侧配置的 iic设备,因为上述配置和测试是i2c6,所以这里也要写i2c6

   slave 是允许使用的slave地址,因为我的设备地址是0x0c,所以我这里写的是0x0c 

测试

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

测试结果: 无异常log  OK

步骤四:Android侧配置

配置-config相关

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

CONFIG_I2C_CHARDEV
CONFIG_I2C_MSM_GENI
CONFIG_I2C_VIRTIO

确认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

组入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 base

Merging msm-kernel/arch/arm64/configs/vendor/autogvm_GKI.config

config最终确认结果

zhd@27:~/27_code/SD-HQX4.5.6.0/lagvm/LINUX/android/out/target/product/gen4_gvm/obj/DLKM_OBJ/kernel_platform/msm-kernel$ grep -inr CONFIG_I2C_CHARDEV .config 
2979:CONFIG_I2C_CHARDEV=m
zhd@27:~/27_code/SD-HQX4.5.6.0/lagvm/LINUX/android/out/target/product/gen4_gvm/obj/DLKM_OBJ/kernel_platform/msm-kernel$ grep -inr CONFIG_I2C_MSM_GENI .config 
3031:CONFIG_I2C_MSM_GENI=m
zhd@27:~/27_code/SD-HQX4.5.6.0/lagvm/LINUX/android/out/target/product/gen4_gvm/obj/DLKM_OBJ/kernel_platform/msm-kernel$ grep -inr CONFIG_I2C_VIRTIO .config 
3051:CONFIG_I2C_VIRTIO=m

上述config 我是以模块形式进行的加载,所以还需要更新文件   /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/i2c/Makefile 中

obj-$(CONFIG_I2C_CHARDEV) += i2c-dev.o

所以路径为 drivers/i2c/i2c-dev.ko

配置-DTS相关

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

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

        aliases {

                i2c5=  &virtio_i2c_DisplayB;        // virtio-iic 

            };

/home/zhd/27_code/SD-HQX4.5.6.0/apps_kernel/kernel_platform/qcom/proprietary/devicetree/qcom/quin-vm-common.dtsi

        virtio_i2c_DisplayB:virtio_i2c_DisplayB@1cd10000{

                compatible = "virtio,mmio";

                #address-cells = <1>;

                #size-cells = <1>;

                reg = <0x1cd10000 0x1000>;

                interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;

                status = "okay";

        };

这里需要注意两点

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

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

2本身希望生成的设备节点和QNX一致为 /dev/i2c-6 ,但由于高通base设计,alises中 如果写 i2c6,生成的节点为 /dev/i2c-7  所以这里写的是 i2c5

    PS:QNX设备节点 也不一定非要和Android 完全一致。按照自己设计要求做就行。

测试

使用i2cdetect 命令和 i2cdump 命令进行确认,可以看到 i2c-6为 Virtio,并且slave地址支持0x0c

同时 也能看到输出波形

PS:如果尝试给其他slave发送数据,会发现无法发送,因为 la.config配置中仅配置了 slave地址为0x0c

测试结果: ok

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

点到为止,举一反三!

参考资料

i2c --tools 工具:

嵌入式Linux下 i2c-tool工具的使用方法 包括i2cdetect、i2cget、i2cset、i2cdump、i2ctransfer-CSDN博客

Linux下的I2C工具:i2c_tools_i2cdetect-CSDN博客

hypervisor Virtio-i2c配置:

05-SA8155 QNX Hypervisor 之 Virtio-i2c虚拟I2C_sa8155规格书-CSDN博客

05-SA8155 QNX Hypervisor 之 Virtio-i2c虚拟I2C_qnx i2c驱动_村里小码农的博客-CSDN博客

05-SA8155 QNX Hypervisor MultiTouch多点触摸_村里小码农的博客-CSDN博客

村里小码农_Android系统开发,Android驱动开发,SA8155P平台开发-CSDN博客

sa8155 & qnx开发笔记之一设备共享_qcom,use-pdc-interrupts_punmpkin的博客-CSDN博客

05-SA8155 QNX Hypervisor 之 Pass-through直通模式_qnx hypervisor passthrough device_村里小码农的博客-CSDN博客

05-SA8155 QNX通过QUB配置GPIO/INT/SPI/I2C/SPI等_i2cdbgr_村里小码农的博客-CSDN博客

SA8155P平台开发_村里小码农的博客-CSDN博客

黑莓官方资料:

- VirtIO (qnx.com)

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

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

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

相关文章

干货整理: 什么软件能够监控电脑? 六大好用监控电脑软件抢手推荐

如何保障电脑的安全是许多企业用户关注的焦点。 除了常见的杀毒软件外&#xff0c;电脑监控软件也是一道重要的防线。 这些软件能够实时监控电脑的各项运行状况&#xff0c;及时发现并处理潜在的安全威胁&#xff0c;确保电脑的正常运行和用户数据的安全。 接下来&#xff0…

优思学院|防呆法的十大原理

防呆法&#xff08;Poka-Yoke&#xff09;&#xff0c;又称防错法&#xff08;Mistake-Proofing&#xff09;&#xff0c;是一种通过预防错误的发生来提高工作效率&#xff0c;也是精益管理、六西格玛中常用的管理工具。以下就是防呆法的十大原理&#xff1a; 1. 断根原理 断…

算法_链表专题---持续更新

文章目录 前言两数相加题目要求题目解析代码如下 两两交换链表中的结点题目要求题目解析代码如下 重排链表题目要求题目解析代码如下 合并K个升序链表题目要求题目解析 K个一组翻转链表题目要求题目解析代码如下 前言 本文将记录leetcode链表算法题解&#xff0c;包含题目有&a…

Why Memory Matters?(记忆力为何如此重要?)

What is memory? The general consensus is that memory is a multitude of cognitive systems which allow us to store information for certain periods of time so that we can learn from our past experiences and predict the future. 什么是记忆?人们普遍的共识是&am…

《PostgreSQL 数据库在国内的发展前景》

从DB-engines这张2024年8月的最新排名图上可以看出&#xff0c;PostgreSQL数据库的发展趋势还是非常好的&#xff0c;在国内&#xff0c;PostgreSQL数据库也展现出令人振奋的发展前景&#xff0c;非常明显的一种表现就是腾讯云、人大金仓、阿里云、华为等众多厂商都有基于Postg…

推荐一个uniapp选择文件上传的插件

插件地址&#xff1a;文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 支持 H5 / App / 微信小程序

警惕!SCI投稿也有“假网址”!3秒教你查询正确的期刊官网网址

【SciencePub学术】很多没有发表过SCI论文的学者&#xff0c;对于投稿是非常陌生的。首先第一步&#xff0c;对于寻找正确的SCI/SSCI期刊官网都是一项难题。 01 假网站泛滥 • 目前市面上很多假的期刊官网&#xff0c;甚至于界面都所差无几&#xff0c;但是网址仅仅相差一个“…

【两周年纪念日】我将竭尽全力,只为和最美丽的自己早日汇合

​ 您好&#xff0c;我是程序员小羊&#xff01; 存在有其原因&#xff0c;经历有其始终&#xff0c;年华有其始末&#xff0c;拼搏要有结果。 2023来去匆匆&#xff0c;2024奋斗始终&#xff0c;献出一份感情&#xff0c;收获一份心情&#xff0c;拼出一段经验&#xff0c;收获…

两个方法 搞定伦敦金涨跌预测

受美联储降息预期和地缘局势紧张的关系影响&#xff0c;近期伦敦金价格再次出现了强势的上涨&#xff0c;盘中攀升超过30美元。这波涨势的出现&#xff0c;实在是在很多人的意料之外&#xff0c;那么下一步投资者就要开始考虑伦敦金的上涨的终点在哪里&#xff1f;实际上这就是…

计算机组成原理 - 中央处理器

中央处理器 考纲内容 CPU的功能和基本结构指令执行过程数据通路的功能和基本结构控制器的功能和工作原理异常和中断机制 异常和终端的基本概念&#xff1b;异常和中断的分类&#xff1b;异常和中断的检测与响应指令流水线 指令流水线的基本概念&#xff1b;指令流水线的基本实…

动态规划:买卖股票系列

目录 1. 买卖股票的最佳时机1-只能买卖一次(LeetCode121) 解法1&#xff1a;暴力解法 解法2&#xff1a;贪心算法 解法3&#xff1a;动态规划 2. 买卖股票的最佳时机2-可以买卖多次(LeetCode122) 解法1&#xff1a;贪心算法 解法2&#xff1a;动态规划 3. 买卖股票的最…

【架构设计】软件设计原则中的7种耦合和内聚(详解)

文章目录 一、前言二、内聚1、定义2、7 种内聚类型及其描述3、设计要求 三、耦合1、定义2、7 种耦合类型及其描述3、设计要求 四、总结 一、前言 耦合&#xff08;Coupling&#xff09;和内聚&#xff08;Cohesion&#xff09;是衡量软件模块设计质量的两个非常重要的概念。高…

2024实验班选拔考试(热身赛)

比赛传送门 邀请码&#xff1a;2024wksyb A. 简单的数列问题 签到&#xff0c;记得开long long。 #include<bits/stdc.h> #define rep(i,a,b) for (int ia;i<b;i) #define per(i,a,b) for (int ia;i>b;--i) #define se second #define fi first #define endl …

linux进程篇总结——实战——自定义shell

前言&#xff1a;经过过去两章十二篇文章的学习&#xff0c;我们已经知道了进程的基本概念以及进程的控制方法。 本篇内容就是使用过去学习的内容自己写一个功能简单的shell外壳程序&#xff0c; 也就是我们使用的bash命令行。 本篇内容是过去进程知识的集大成者。 我们在这个实…

智慧能源管理:助力公共机构节能增效

一、背景&#xff1a; 在全球倡导绿色发展、节能减排的时代浪潮下&#xff0c;公共机构作为社会服务的重要提供者&#xff0c;能源消耗量大&#xff0c;特别是在照明方面能源消耗问题尤为突出。从政府办公楼的日常照明&#xff0c;到学校教室的学习照明&#xff0c;再到医院走…

计算机组成原理 - 存储系统

存储系统 考纲内容 存储器的分类层次化存储器的基本结构半导体随机存储器(RAM) SRAM、DRAM、Flash存储器主存储器 DRAM芯片和内存条、多模块存储器、主存储器和CPU之间的连接外部存储器 磁盘存储器、固态硬盘(SSD)高速缓冲存储器(Cache) Cache的基本原理&#xff1a;Cache和主…

解读智慧车间生产线的智慧大脑:ARMxy 工业计算机边缘控制器

在现代工业制造中&#xff0c;智慧车间生产线的建设已成为提高生产效率、降低成本、提升产品质量的关键。而 ARMxy 工业计算机边缘控制器作为智慧车间生产线的智慧大脑&#xff0c;正发挥着越来越重要的作用。 ARMxy 工业计算机边缘控制器是一种基于 ARM 架构的嵌入式工业计算机…

JavaWeb基础1:HTML/CSS/JS/HTTP

JavaWeb基础1&#xff1a;HTML/CSS/JS/HTTP (qq.com)

C-sharp-console-gui-framework:C#控制台应用程序的GUI框架

推荐一个.Net开源项目&#xff0c;方便我们基于控制台创建图形用户界面&#xff08;GUI&#xff09;应用程序。 01 项目简介 ConsoleGUI是一个简单的布局驱动.NET框架&#xff0c;用于创建基于控制台的GUI应用程序。 核心功能&#xff1a; **布局驱动&#xff1a;**与WPF或H…

WCN7851 WIFI7适配RK3588实战

一、平台信息 平台:触觉智能IDO-EVB3588-V1 WIFI模组:欧飞信O7851PM Kernel版本:GNU/Linux 5.10.110 aarch64 系统版本:Ubuntu 20.04.6 LTS 搭载RK3588高性能SOC,集成了四核Cortex-A76和四核Cortex-A55 CPU,主频高达2.4G O7851PM与开发板连接实物图如下,模块通过M.2转…