ハイパーバイザー タッチ アーキテクチャ - パススルーの導入

別の記事でハイパーバイザー タッチ アーキテクチャの 1 つを紹介しました ( Qualcomm Q+A ハイパーバイザー タッチ フレームワークの紹介)。この記事では別のハイパーバイザー タッチ ソリューションを紹介します。

ハイパーバイザータッチパススルーソリューション

作業過程

タッチ ドライバーが動作するために必要な 2 つの要素 i2c/irq は、ゲスト OS の起動開始時に QVM から LA 側にパススルーされます。

#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

その中で、 pass loc mem:0x89C000,0x4000,rw=0x89C000 は、パススルーが必要な i2c コントローラーのレジスタ アドレスを指します。 pass intr gic:640=640 は、i2c コントローラーの割り込み番号を指します。 pass intr gic:241=241 は、GPIO 割り込みの透過的な送信に使用される直接割り込みの割り込み番号を指します。これらの値は、pinmux および gpio_tlmm_dir_intr_8155.xml 構成ファイルから取得できます。

データ伝送リンクプロセス:

1. タッチスクリーンがタッチによって中断される

2. ゲストOS 1aのタッチドライバの割り込み処理機能が起動される

3. 割り込み処理機能はi2c経由でタッチデータを読み込みます。

4. 割り込み処理機能は、読み取られたタッチ データを解析し、入力サブシステムに報告します。

5. 上位層アプリケーションはイベントデバイスノードを通じてタッチ座標を取得します

このソリューションは従来の Linux ドライバーとまったく同じように機能することがわかりますが、唯一の違いは、qvm パススルー プロセスの追加レイヤーがあることです。

ソフトウェア構成

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

アンドロイドカーネル設定

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";
+       };
 };

i2c のパススルーは比較的理解しやすいです。ここでの割り込み透過送信は直接割り込み方式を使用していることに注意してください。この方式では、8155 には最大 8 個の割り込みソースしかなく、ファイル gpio_tlmm_dir_intr_8155.xml で構成されています。この直接割り込み方式は通常、初期のバージョンで使用されます。バージョンの反復更新により、gpio から irq への方法など、より多くの割り込み透過送信がサポートされるようになります。

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>

ここの構成では、各ノードが割り込みを表します

2 つのソリューションの比較

デバイスの共有 パススルー
QNX と LA は同時にタッチ データを受信できます LA側のみタッチデータを受信可能
データ伝送リンクが長い データ伝送リンクが短い

シェアデバイス方式のタッチ遅延については、最近測定を実施しました。測定方法は次のとおりです。

1.シリアライザの割り込みピンで割り込みトリガーt1を測定します。

2. Android 側でタッチ イベントを受信した後、GPIO レベルをプルしてt2を取得します

t2 - t1 は約 4ms で、特に長くはありません。もちろん、パススルー方式ほど高速ではありません。

おすすめ

転載: blog.csdn.net/kill150/article/details/130196371