目录
一: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)