在另外一篇文章中,我们已经介绍了Hypervisor touch架构中的一种(高通Q+A hypervisor touch框架介绍),这篇文章会介绍另外一种Hypervisor touch方案.

Hypervisor touch Passthrough解决方案

工作的过程

touch驱动工作所需的两个要素i2c/irq,在Guest OS启动之初由QVM passthrough到LA侧。

#QUPv3 QUPV3_1_SE0(QUP_SE_7) I2C Passthroughpass loc mem:0x89C000,0x4000,rw=0x89C000pass intr gic:640=640pass intr gic:241=241

其中:pass loc mem:0x89C000,0x4000,rw=0x89C000,指的是需要passthrough的i2c控制器的寄存器地址,pass intr gic:640=640,指的是i2c控制器的中断号,pass intr gic:241=241指的是direct interrupt的中断号,用于透传GPIO中断。这些值可以通过pinmux和gpio_tlmm_dir_intr_8155.xml配置文件的信息得到。

数据传输链路过程:

1,touch屏幕被触摸产生中断

2,Guest OS la中的touch驱动程序的中断处理函数被触发

3,中断处理函数通过i2c读取触摸数据

4,中断处理函数解析读到的触摸数据,并上报到input子系统

5,上层应用通过event设备节点获取到触摸坐标点

可以看到,这种解决方案与常规的linux驱动的工作方式是一模一样的,区别点只是在于多了一层qvm的passthrough过程。

软件配置

QNX配置

diff --git a/qnx_ap/boards/core/dalconfig/adp_star_sda8155/config/gpio_tlmm_dir_intr_8155.xml b/qnx_ap/boards/core/dalconfig/adp_star_sda8155/config/gpio_tlmm_dir_intr_8155.xmlindex e1f1504..8f58a65 100755--- a/qnx_ap/boards/core/dalconfig/adp_star_sda8155/config/gpio_tlmm_dir_intr_8155.xml+++ b/qnx_ap/boards/core/dalconfig/adp_star_sda8155/config/gpio_tlmm_dir_intr_8155.xml@@ -24,8 +24,8 @@  -  1 - 13 +  0 + 0  1 diff --git a/qnx_ap/target/hypervisor/host/build_files/system.build.tmpl b/qnx_ap/target/hypervisor/host/build_files/system.build.tmplindex 5196c3f..36ded3c 100755--- a/qnx_ap/target/hypervisor/host/build_files/system.build.tmpl+++ b/qnx_ap/target/hypervisor/host/build_files/system.build.tmpl@@ -444,8 +444,13 @@ pass intr gic:617=617 #pass loc mem:0x880000,0x4000,rw=0x880000 #pass intr gic:633=633 +#QUPv3 QUPV3_1_SE0(QUP_SE_7) I2C Passthrough+pass loc mem:0x89C000,0x4000,rw=0x89C000+pass intr gic:640=640+ # Wake up GPIO pass intr gic:248=248+pass intr gic:241=241# PCIe0 pass-through pass loc mem:0x1c00000,0x4000,rw=0x1c00000

android kernel配置

diff --git a/arch/arm64/boot/dts/qcom/sa8155-vm.dtsi b/arch/arm64/boot/dts/qcom/sa8155-vm.dtsiindex 938597bd2..b9bb7e757 100755--- a/arch/arm64/boot/dts/qcom/sa8155-vm.dtsi+++ b/arch/arm64/boot/dts/qcom/sa8155-vm.dtsi@@ -653,5 +653,23 @@ #include "pm8150-vm.dtsi"&tlmm {- dirconn-list = ;+ dirconn-list =,+ ,+ ;+};+&qupv3_se7_i2c {+ status = "ok";+};++&soc {+ atmel_mxt_64lt@4B{+ compatible = "atmel,maxtouch";+ #address-cells = ;+ #size-cells = ;+ reg = ;+ interrupts = ;+ interrupt-names = "atmel_irq";+ atmel,irq-gpio = ;+ status = "okay";+ }; };

i2c的passthrough比较好理解,需要注意的是这里的中断透传使用的是direct interrupt这种方式,而这种方式在8155上最多只有8个中断源,在文件gpio_tlmm_dir_intr_8155.xml中配置.这种direct interrupt的方式一般在早期版本中会使用,随着版本的迭代更新,会支持更多中断的透传,比如gpio转irq的方式。

gpio_tlmm_dir_intr_8155.xml配置

   0   0     0   0     1   15     1   16     1   38     1   97     1   30     0   0   

这里面的配置,每一个节点表示一个中断

两种解决方案的对比

Share-devicesPassthrough
QNX 和LA可同时接收到touch数据只有LA侧能接收到touch数据
数据传输链路更长数据传输链路更短

关于Share-devices 这种方式的触摸延时,我们最近进行了测量,测量方法为:

1,在串行器中断pin脚测量中断触发 t1

2,在android侧接收触摸事件后拉GPIO电平得到 t2

t2 – t1 约为4ms左右,并不是特别长,当然肯定还是不如passthrough的方式快.