Introducción al acceso directo a la arquitectura táctil del hipervisor

En otro artículo, presentamos una de las arquitecturas táctiles de hipervisor ( Introducción al marco táctil de hipervisor Q+A de Qualcomm ), este artículo presentará otra solución táctil de hipervisor.

Solución Hypervisor Touch Passthrough

Proceso de trabajo

Los dos elementos i2c/irq necesarios para que funcione el controlador táctil se pasan desde QVM al lado LA al comienzo del inicio del sistema operativo invitado.

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

pass intr gic:241=241

Entre ellos: pass loc mem:0x89C000,0x4000,rw=0x89C000, se refiere a la dirección de registro del controlador i2c que necesita passthrough, pass intr gic:640=640, se refiere al número de interrupción del controlador i2c, pass intr gic:241=241 se refiere al número de interrupción de interrupción directa, que se utiliza para la transmisión transparente de interrupciones GPIO. Estos valores se pueden obtener de los archivos de configuración pinmux y gpio_tlmm_dir_intr_8155.xml.

Proceso de enlace de transmisión de datos:

1. La pantalla táctil se interrumpe al tocar

2. Se activa la función de manejo de interrupciones del controlador táctil en Guest OS la

3. La función de procesamiento de interrupciones lee los datos táctiles a través de i2c

4. La función de procesamiento de interrupciones analiza los datos táctiles leídos y los informa al subsistema de entrada

5. La aplicación de la capa superior obtiene las coordenadas táctiles a través del nodo del dispositivo de eventos

Se puede ver que esta solución funciona exactamente igual que el controlador de linux convencional, la única diferencia es que hay una capa adicional del proceso de transferencia qvm.

configuración de software

Configuración 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.xml
index 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 @@
 <driver name="tlmm_drv">
 
    <device id=DALDEVICEID_GPIOINT_DIR_CON_0>
-     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       1   </props>
-        <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         13   </props>
+     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       0   </props>
+        <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         0       </props>
    </device>
    <device id=DALDEVICEID_GPIOINT_DIR_CON_1>
      <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       1   </props>
diff --git a/qnx_ap/target/hypervisor/host/build_files/system.build.tmpl b/qnx_ap/target/hypervisor/host/build_files/system.build.tmpl
index 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

configuración del núcleo androide

diff --git a/arch/arm64/boot/dts/qcom/sa8155-vm.dtsi b/arch/arm64/boot/dts/qcom/sa8155-vm.dtsi
index 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 = <37 216 1>;
+       dirconn-list =  <37 216 1>,
+                       <13 209 1>,
+                       <66 210 1>;
+};
+&qupv3_se7_i2c {
+       status = "ok";
+};
+
+&soc {
+       atmel_mxt_64lt@4B{
+               compatible = "atmel,maxtouch";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x4b 1>;
+               interrupts = <0 782 0x0>;
+               interrupt-names = "atmel_irq";
+               atmel,irq-gpio = <&tlmm 14 0x0>;
+               status = "okay";
+       };
 };

El paso de i2c es más fácil de entender. Cabe señalar que la transmisión transparente de interrupción aquí utiliza el método de interrupción directa, y este método solo tiene un máximo de 8 fuentes de interrupción en el 8155, que se configuran en el archivo gpio_tlmm_dir_intr_8155.xml. Este método de interrupción directa generalmente se usa en versiones anteriores. Con la actualización iterativa de la versión, se admitirá más transmisión transparente de interrupción, como la forma de gpio a irq.

Configuración de gpio_tlmm_dir_intr_8155.xml

<driver name="tlmm_drv">

   <device id=DALDEVICEID_GPIOINT_DIR_CON_0>
     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       0   </props>
     <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         0   </props>
   </device>
   <device id=DALDEVICEID_GPIOINT_DIR_CON_1>
     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       0   </props>
     <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         0   </props>
   </device>
   <device id=DALDEVICEID_GPIOINT_DIR_CON_2>
     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       1   </props>
     <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         15   </props>
   </device>
   <device id=DALDEVICEID_GPIOINT_DIR_CON_3>
     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       1   </props>
     <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         16   </props>
   </device>
   <device id=DALDEVICEID_GPIOINT_DIR_CON_4>
     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       1   </props>
     <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         38   </props>
   </device>
   <device id=DALDEVICEID_GPIOINT_DIR_CON_5>
     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       1   </props>
     <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         97   </props>
   </device>
   <device id=DALDEVICEID_GPIOINT_DIR_CON_6>
     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       1   </props>
     <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         30   </props>
   </device>
   <device id=DALDEVICEID_GPIOINT_DIR_CON_7>
     <props name="IRQ_ENABLED" type=DALPROP_ATTR_TYPE_UINT32>       0   </props>
     <props name="TLMM_GPIO" type=DALPROP_ATTR_TYPE_UINT32>         0   </props>
   </device>
   
</driver>

En la configuración aquí, cada nodo representa una interrupción

Comparación de dos soluciones

Dispositivos compartidos Pasar por
QNX y LA pueden recibir datos táctiles al mismo tiempo Solo el lado LA puede recibir datos táctiles
El enlace de transmisión de datos es más largo El enlace de transmisión de datos es más corto

Con respecto al retraso táctil del método Share-devices, recientemente realizamos una medición, y el método de medición es:

1. Mida el disparador de interrupción t1 en el pin de interrupción del serializador

2. Después de recibir el evento táctil en el lado de Android, suba el nivel GPIO para obtener t2

t2 - t1 es de aproximadamente 4 ms, no particularmente largo, por supuesto, definitivamente no es tan rápido como el método de transferencia.

Supongo que te gusta

Origin blog.csdn.net/kill150/article/details/130196371
Recomendado
Clasificación