技术标签: qnx virtio SA8155P平台开发 virtio qnx vdev sa8155 virtio-i2c
virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化Hypervisor 中的一组通用 I/O 设备的抽象。提供了一套上层应用与各 Hypervisor 虚拟化设备(KVM,Xen,VMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率。
在完全虚拟化的解决方案中,guest VM 要使用底层 host 资源,需要 Hypervisor 来截获所有的请求指令,然后模拟出这些指令的行为,这样势必会带来很多性能上的开销。半虚拟化通过底层硬件辅助的方式,将部分没必要虚拟化的指令通过硬件来完成,Hypervisor 只负责完成部分指令的虚拟化,要做到这点,需要 guest 来配合,guest 完成不同设备的前端驱动程序,Hypervisor 配合 guest 完成相应的后端驱动程序,这样两者之间通过某种交互机制就可以实现高效的虚拟化过程。
图:ACRN Kernel Land Virtio Framework
参考:
virtio 简介 - bakari - 博客园 (cnblogs.com)
上图,QNX 虚拟机管理程序 2.0 概述,介绍虚拟机以及Guest访问虚拟或者物理设备的一些方式。
虚拟设备可以模拟物理设备,也可以是半虚拟化设备(不存在完全对应的物理设备的虚拟设备)。虚拟设备(vdev)仅存在于虚拟化环境中。它们是在虚拟机管理程序层运行的软件代码,可以模拟物理设备,也可以提供物理设备提供的功能,而无需模拟任何特定的物理设备。若要使用 vdev,Guest OS需要驱动程序,就像需要驱动程序在非虚拟化环境中使用物理设备一样。
VM(虚拟机) 定义虚拟硬件(Virtual devices),并将其和直通硬件(Pass-through devices)呈现给Guest OS,Guest OS不需要知道它是在VM 中运行还是在硬件直接定义的环境中运行。
代码路径:qnx_ap/AMSS/platform/vm/vdev
目录结构:
.├── Makefile
├── vdev-glink-ssr
│ ├── aarch64
│ ├── common.mk
│ ├── Makefile
│ ├── pinfo.mk
│ ├── protected
│ ├── vdev.c
│ └── vdev.use
├── vdev-io
│ ├── 8155
│ ├── common.mk
│ ├── inc
│ ├── main.c
│ ├── Makefile
│ └── protected
├── vdev-minidump
│ ├── aarch64
│ ├── common.mk
│ ├── Makefile
│ ├── vdev-minidump.c
│ └── vdev-minidump.use
├── vdev-mmu-s2
│ ├── aarch64
│ ├── common.mk
│ ├── main.c
│ ├── Makefile
│ ├── pinfo.mk
│ ├── protected
│ └── vdev-mmu-s2.use
├── vdev-msm
│ ├── aarch64
│ ├── common.mk
│ ├── Makefile
│ ├── vdev-msm.c
│ └── vdev-msm.use
├── vdev-virtio-clock
│ ├── aarch64
│ ├── common.mk
│ ├── Makefile
│ ├── vdev-virtio-clock.c
│ └── vdev-virtio-clock.use
├── vdev-virtio-fastrpc
│ ├── aarch64
│ ├── common.mk
│ ├── inc
│ ├── Makefile
│ ├── src
│ └── vdev-virtio-fastrpc.use
├── vdev-virtio-i2c
│ ├── aarch64
│ ├── common.mk
│ ├── Makefile
│ ├── vdev-virtio-i2c.c
│ └── vdev-virtio-i2c.use
├── vdev-virtio-keyboard
│ ├── aarch64
│ ├── common.mk
│ ├── inc
│ ├── Makefile
│ ├── vdev-virtio-keyboard.c
│ └── vdev-virtio-keyboard.use
├── vdev-virtio-regulator
│ ├── aarch64
│ ├── common.mk
│ ├── Makefile
│ ├── vdev-virtio-regulator.c
│ └── vdev-virtio-regulator.use
└── vdev-virtio-spmi
├── aarch64
├── common.mk
├── Makefile
├── vdev-virtio-spmi.c
└── vdev-virtio-spmi.use
看Code可以看出Vdev 基本带着Virtio,这俩是如胶似漆啊。  ̄□ ̄||
原理与Linux实现类似,不做过多介绍,详细看QNX官网开发手册。
GusetOS与Hardware之间数据传递实现方式://下图,通过virtqueues
图:数据从GuestOS中的虚拟队列传递到硬件,GuesOS和qvm进程共享相同的地址空间。
详细: QNX Vdev-VirIO
问题://带着问题分析。
virtio - I2C提供了一个虚拟I2C适配器,支持将多个本机I2C适配器下的多个从设备映射到一个virtio I2C适配器。从设备的地址没有改变。Virtio-i2c还提供了一个为从设备添加acpi节点的接口,这样客户操作系统中的从设备驱动程序就不需要更改了。
英文原文:Virtio-i2c provides a virtual I2C adapter that supports mapping multiple slave devices under multiple native I2C adapters to one virtio I2C adapter. The address for the slave device is not changed. Virtio-i2c also provides an interface to add an acpi node for slave devices so that the slave device driver in the guest OS does not need to change.
简单理解:Guest OS/User OS(座舱:Android) i2c设备驱动该咋写就咋写,不需要因为是virtio-i2c而改变驱动。
下图为:Virtio-i2c 架构(Hypervisor 为ARCN)
Hypervisor 技术不同,但是virtio-i2c技术确是一致的。 以virtio作为桥梁,实现HOST OS的BE与GestOS FE之间的通讯。
经过梳理框架图绘制如下:
FE i2c driver <-> BE i2c driver <--> i2c client <-> i2c resource manager <-> i2c phsyical driver
依据3.1.2 框架图,梳理SA8155 virtio-i2c代码实现。
QNX: //BE
qnx_ap/AMSS/platform/vm/vdev/vdev-virtio-i2c/vdev-virtio-i2c.c
注册接口:
static void __attribute__((constructor)) vio_i2c_register(void)
{
static const char * const vio_i2c_options[] = { "verbose", "device", NULL };
static struct vdev_factory vio_i2c_factory = {
.next = NULL, // patched
.control = vio_i2c_control,
.vread = vio_i2c_vread,
.vwrite = vio_i2c_vwrite,
.option_list = vio_i2c_options,
.name = NULL, // patched
.factory_flags = VFF_NONE,
.acc_sizes = 1u << sizeof(uint32_t),
.extra_space = sizeof(vio_i2c_dev_t),
.safety = VDEV_SAFETY_SELECTED,
};
vdev_register_factory(&vio_i2c_factory, QVM_VDEV_ABI);
}
open:
vio_i2c_control->i2c_open
write/read
void *i2c_transfer(void * arg) {
...
case DESC_IDX_BUF:
if (!req) {
QVM_LOG(VIOLOG_ERROR, dev,"request pointer is NULL");
ret = -1;
break;
}
if (req->len == 0) {
QVM_LOG(VIOLOG_ERROR, dev,"request len is zero");
ret = -1;
break;
}
switch (req->type) {
case VIO_I2C_READ:
ret = i2c_read(dev->fd, (void*)src, req->len);
break;
case VIO_I2C_WRITE:
ret = i2c_write(dev->fd, (void*)src, req->len);
break;
case VIO_I2C_RDWR:
ret = i2c_combined_writeread(dev->fd, (void*)src, req->len, \
(void*)src + req->len, req->total_len - req->len);
break;
default:
QVM_LOG(VIOLOG_ERROR, dev,"invalid request type");
break;
}
break;
...
}
LA(Android): FE
android/kernel/drivers/i2c/busses/virtio-i2c.
上面也说了,GustOS 使用Vdev时候无需关注这个device在什么环境运行的,就像使用常规设备一样使用。
问题回答:
- 依照VirtIO框架,是否Hypervisor Host OS 与 Guset OS都需要virtio-i2c Driver?
A: 需要
- 如果都集成了Driver,那么Gust OS driver跟Host OS driver 有直接联系? 比如接口以及数据结构一致性
A: 接口以及数据存在一致性。(都是基于VirtIO)
- 依照VirtIO框架,是否Hypervisor Host OS 与 Guset OS都需要i2c device Driver?(某个设备)
A: 不需要,既然i2c已经虚拟了,GuestOS 添加I2C 设备直接使用即可,该怎么用就怎么 用,无需关注该I2C是虚拟还是实质的。
- 如果只配置了Guest OS I2C及驱动,Guest OS是否可以与硬件通讯?
A: 除非设置了直通模式,或者是Vhsot-user模式,否则不行。
TODO
以IMU Sensor芯片st_asm330lhh 为例。
纠正描述: 上图为QUP_SE10
查询规格书获悉:st_asm330lhh 芯片i2c地址为0x6a
那么读写寄存器看看:
# i2cdbgr /dev/i2c3 0x6a read 1 0x02 1
addr: 0x2 data : 0x3f
# i2cdbgr /dev/i2c3 0x6a read 1 0x0f 1
addr: 0xf data : 0x6b
#
读取数据正确。
首先要明白Vdev的原理,Vdev说白了就是虚拟设备---对GVM而言,但是对于PVM来讲他是一个实际的物理设备,VirtIO的作用就是将PVM的物理设备在GVM中虚拟一个设备出来。虚拟设备与物理设备的之间通讯是跨OS的,通讯桥梁是VirtIO
如下图所示:
虚拟I2C 同样拿st_asm330lhh sensor i2c为例。
保证QNX环境下I2C3 功能是OK的。具体操作按照<4.1 QNX I2C设备实际操作>步骤来。
确保:
配置文件:/vm/images/linux-la.config
添加内容如下:
vdev vdev-virtio-i2c.so loc 0x1c270000 intr gic:100 verbose 3 device i2c3
大概描述下:
vdev-virtio-i2c.so //QNX自带的code,编译成so
loc 0x1c270000 //vdev地址 -- 与GVM绑定的,自行定义,只要不冲突就可以
intr gic:100 //虚拟中断号,自行定义,只要不冲突就可以
verbose 3 device i2c3 //参数 --- 具体看vdev-virtio-i2c.c代码
i2c3 就是需要虚拟的实际设备 /dev/i2c3
编译输出后的路径:
qnx_ap/install/aarch64le/lib/dll/vdev-virtio-i2c.so
devicetree 路径:android/vendor/qcom/proprietary/devicetree
搜索发现virtio 配置文件是 quin-vm-common.dtsi
./qcom/sa8155-vm.dtsi:#include "quin-vm-common.dtsi"
找到恰当的位置添加如下内容:
方便大家copy,贴code
i2c_bus: virtio-i2c@1c270000 {
compatible = "virtio,mmio";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x1c270000 0x100>;
interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
status = "okay";
};
查看log信息:如下,内核log可以看出,virtio-i2c驱动注册OK
查看设备
验证通讯
O(∩_∩)O哈哈~, 是不是很简单!。首先要理解原理。代码配置只不过就是流程化工作。
点到为止,举一反三,其他virtio 设备一样!
欢迎后期订阅 <智能座舱核心技术开发> 专栏。Thanks♪(・ω・)ノ
文章浏览阅读2.7w次,点赞5次,收藏21次。STM32简介STM32是一款高性能,低功耗,低成本的嵌入式ARM芯片,其家族产品大致划分如图STM32型号说明,以STM32F103ZET6芯片为例:STM32F103ZET6ARM Cortex-M内核32位微控制器芯片系列增强型席系列引脚数,Fash容量封装类型工作温度范围引脚数取值说明取值引脚数T引脚数位36R引脚数位64V引脚数位144I引脚数位176Flash容量取值说明取值_stm32最小系统示例
文章浏览阅读2k次。【代码】vue element-ui悬浮显示。_elementui 悬浮窗
文章浏览阅读2.4k次。【问题背景】基于XML配置开发AspectJ和基于注解开发AspectJ时报错:error at ::0 formal unbound in pointcut【问题分析】切点绑定失败,必然是AspectJ相关配置出现问题。【问题解决】逐一查看配置,包括每个切点的定义,切面配置,通知配置。经排查,发现是“异常通知”配置有误,没有将异常throwing出去。修改前: <aop:after-throwing method="exceptAdvice" pointcut-re_error at ::0 formal unbound in pointcut
文章浏览阅读2.3w次,点赞28次,收藏117次。用户附近位置计算经纬度与物理距离介绍经纬度是经度与纬度的合称组成一个坐标系统,称为地理坐标系统,它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。在一定误差范围内,通常情况下,经纬线和米的换算为:经度或者纬度0.00001度,约等于1米。以下表格列出更细致的换算关系:在纬度相等的情况下在经度相等的情况下经度每隔0.00001度,距离相差约1米;每隔0.0001度,距离相差约10米;每隔0.001度,距离相差约100米;每隔0.01度,距离_geohash
文章浏览阅读799次。完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547第30章 STM32F429复数浮点FFT(支持单精度和双精度)本章主要讲解复数浮点FTT,支持单精度和双精度。目录30.1 初学者重要提示30.2 复数浮点FFT说明30.2.1 功能描述30.2.2 浮点FFT30.3 单精度函数arm_cfft_f32的使用(含幅频和相频)30.3.1 函数说明30.3.2 使用举..._1024 fft 旋转因子
文章浏览阅读6.1k次,点赞4次,收藏2次。【题目链接】ybt 2030:【例4.16】找素数【题目考点】1. 枚举2. 质数质数的因数只有1和它本身。判断数a是否是质数:循环变量i从2开始循环到a\sqrt{a}a,若存在a能整除的数字(即a的因数),那么a不是质数。否则a是质数。bool isPrime(int a)//判断a是否是质数,已知a >= 2{ for(int i = 2; i <= sqrt(a); i++) { if(a % i == 0) _信息学奥赛一本通2030:【例4.16】找素数
文章浏览阅读9.6k次,点赞29次,收藏238次。水杯:装水、喝水...注册场景:注册 + 登录想象日常使用中的注册场景有哪些功能。等价类是分块/分区的概念。将需求的输入划分若干个等价类,从等价类中选出一个测试用例,如果这个测试用例通过,则认为这整个等价类就通过。(因果图法)通过输入条件和输出动作之间的关系,设定判定表,再根据判定表编写测试用例。通过构造正交表编写测试用例。_测试用例设计
文章浏览阅读3.2k次,点赞9次,收藏42次。最小生成树(MST)是图的一个子集。本文将介绍两种常用的算法:Kruskal和Prim来寻找最小生成树。_mst最小生成树
文章浏览阅读1.7k次,点赞20次,收藏21次。它们用于定位代码中的特定位置,支持宽字符的处理,并提供行索引和字符编码相关的功能。综上所述,rust/src/tools/tier-check/src/main.rs这个文件的主要作用是实现"tier-check"工具,用于检查Rust编译器的编译层级,并提供有关Rust构建系统编译层级的信息。文件rust/src/tools/rust-analyzer/lib/line-index/src/lib.rs是Rust语言的语法分析器rust-analyzer的一个核心组件,用于处理代码的行列信息。
文章浏览阅读467次。一、环境概述:一台装有fedora13的pc,使用vmware workstation搭建了一个solaris cluster环境,使用的os是solaris10u9。装有oracle 10g RAC。两节点的名称及IP对应如下:其中fedora13是装有netbackup 7.0.1服务端以及media server端,node04和node05是客户端。目前各个实例已经处于onli..._oracle rac netbackup
文章浏览阅读2k次,点赞2次,收藏13次。上一篇做了安装oracle一些系统配置安装oracle12c单实例数据一、安装oracle的配置1.修改内核参数①编辑内核参数文件vim /etc/sysctl.conf②将内核配置粘贴到该文件中fs.file-max = 6815744kernel.sem = 250 32000 100 128kernel.shmmni = 4096kernel.shmall = 1073741824kernel.shmmax = 4398046511104kernel.panic_on_oops_linuxoracle-清理软件重装12c
文章浏览阅读2.8w次,点赞26次,收藏168次。三维模型可以表示任何现实世界中存在的物体,自然也可以表示任何游戏世界中存在的物体,比如地面,山川河流,花草树木,建筑,人物,都需要使用三维模型来表示。一般我们使用一些建模软件来建出游戏中需要的模型,然后导入到Unity中使用,本篇就来介绍介绍,一整个的3D模型制作导入流程以及需要注意的问题。_unity导入3d模型