QNX SCREEN アーキテクチャの基本概要

QNX スクリーンの概要

QNX SCREEN フレームワークは、QNX が開発したグラフィックス表示およびウィンドウ管理用のソフトウェア フレームワークで、組み込みシステムに高性能で信頼性の高いグラフィックス表示およびユーザー インターフェイス機能を提供します。

QNX SCREEN フレームワークは、次の主な機能を提供します。

  1. ディスプレイ管理: SCREEN フレームワークを使用すると、アプリケーションはモニター、タッチ スクリーン、グラフィック アクセラレータなどのグラフィック ディスプレイ デバイスを管理できます。ハードウェア デバイスとの通信インターフェイスを提供し、アプリケーションがディスプレイ デバイスのプロパティ、解像度、リフレッシュ レートなどを取得および制御できるようにします。

  2. ウィンドウ管理: SCREEN フレームワークはウィンドウ管理をサポートしており、アプリケーションが複数のウィンドウを作成、管理、制御できるようにします。ウィンドウのレイアウト、フォーカス管理、ウィンドウの重なり順、ウィンドウの移動やサイズ変更などの機能を提供し、柔軟なユーザーインターフェイスを実現します。

  3. グラフィックス アクセラレーション: SCREEN フレームワークは、グラフィックス アクセラレータ ドライバーの統合を通じて、ハードウェア アクセラレーションによるグラフィックスのレンダリングおよび描画機能を提供できます。これにより、グラフィックス操作のパフォーマンスと効率が向上し、複雑なグラフィックス効果とアニメーションがサポートされます。

  4. マルチスクリーンのサポート: SCREEN フレームワークは、複数の表示画面を処理し、複数の画面の構成および管理機能を提供できます。これにより、アプリケーションが複数のディスプレイ上にウィンドウを作成できるようになり、ディスプレイ間でデータを転送して連携する機能が提供されます。

  5. イベント処理: SCREEN フレームワークは、ユーザー入力、タッチ イベント、ウィンドウ イベントなどを処理するためのイベント処理メカニズムを提供します。これにより、アプリケーションはイベント ハンドラーを登録してさまざまなイベントに応答し、ユーザー インターフェイスを更新できるようになります。

  6. 拡張性: SCREEN フレームワークはプラグインと拡張機能をサポートしているため、開発者は特定のニーズに応じてカスタム関数やドライバーを追加できます。これにより、フレームワークはさまざまなハードウェア プラットフォームやアプリケーション シナリオに適応できるようになります。

QNX スクリーンのアーキテクチャ

スクリーンのソースコード

スクリーン サービスのソース コードはオープン ソースではありません。忘れてください。

画面の開始

screen サービスは通常、コマンドscreen -c /lib64/graphics.confによって開始されます。QNX システムでは、このアクションは通常、startupmanager によって開始されます。関連するソース コードは、ソース コード ファイル filesets/launcher_scripts/disp.c で見つけることができます。

static const char* screen_arg [] = { 
    "screen",
    "-c",
    "/lib64/graphics.conf",
    NULL
};

static const struct aaction screen = { 
    .type = TYPE_CMD,
    .c = { 
        .flags = FLAG_BACKGROUND,
        .path = "screen",
        .arg = screen_arg,
        .secpol_type = "screen_t",
        .uid=SCREEN_UID,
        .gid=SCREEN_GID,
        .rmasks = 0xFE,
    },  
};

screen サービスの初期化は openwfd 表示フレームワークに依存するため、起動シーケンスは wfd サービスの後に行う必要があります。

   32795 wfd_server -U 70:70,33,21 
   32797 wfd_be 5 
   32798 screen -c /lib64/graphics.conf

画面の初期化は GPU に依存しないため、GPU ドライバーの前に初期化することもできますが、画面インターフェイスの通常の使用は GPU ドライバー (特に GPU 関連の操作) の初期完了後に行う必要があることに注意してください。

SCREEN debug方法

/dev/screen ディレクトリ

screen サービスが正常に起動すると、/dev/ ディレクトリに screen フォルダーが生成されます。

# ls /dev/screen/
0                         9711657                   mtouch
1196133                   buffers                   qvm
487478                    gpus                      requests
495671                    input                     ssplash
766018                    life_cycle_man_demo
823370                    lpms
# 

0: このディレクトリには、ディスプレイ構成情報やフレームバッファ構成情報などの画面構成の主要な情報が含まれます。

# ls
blt-1              dpy-2              str-2
blt-2              framebuffer1       str-4
ctx-0              framebuffer2       win-0
dpy-1              globals            win-1
# pwd
/dev/screen/0
# 

バッファ: ディレクトリは、現在の画面に表示されているバッファ データの内容を取得できます。

$PID: ディレクトリには、ウィンドウ情報、バッファ情報、screen_ctx など、プロセスで使用される画面に関連する情報が含まれています。

# find ./
./
./ctx-1
./ssn-0
./str-0
./str-0/str-0
./str-0/str-0-1
./win-2
# ls ./str-0/str-0-1/
buf-62         buf-62.bmp     buf-62.data
# pwd
/dev/screen/9711657
# 

スクリーンコマンド

これはウィンドウのプロパティを設定および変更するために使用されます。驚くべきことに、これはリアルタイムで有効になり、その効果はコードを変更した場合と同じです。

screencmd setiv win-8 SCREEN_PROPERTY_SIZE 400,400
screencmd setiv win-8 SCREEN_PROPERTY_ROTATION  90
screencmd setiv win-4 SCREEN_PROPERTY_ZORDER 1000

これを使用する場合は、どのウィンドウを修復するかを知っておく必要があります。この情報は、/dev/screen/$pid/ ディレクトリにあります。

# ls /dev/screen/
0                         9711657                   mtouch
1196133                   buffers                   qvm
487478                    gpus                      requests
495671                    input                     ssplash
766018                    life_cycle_man_demo
823370                    lpms
# ls /dev/screen/9711657/
ctx-1    ssn-0    str-0    win-2
# 

レイヤ情報をダンプします

実行: echo surfacedump=0xFF > /dev/displaylog

ダンプされたレイヤー ファイルは /tmp ディレクトリで取得できます。

# ls /tmp/displog_surface_dump_*
/tmp/displog_surface_dump_8_[00:00:39.085]_1920x1080_argb8888.rgb

この方法は実際には wfd のデバッグ方法であり、各パイプライン上に表示される画像データをダンプすることができ、ダンプによって出力されるデータは生の rgb データであり、yuv player などのツールで直接開くことができます。もちろん、displaylog の機能はこれに限定されません。

# cat /tmp/displog_help 
Input Commands:
        echo ? > /dev/displaylog --> help
        echo s > /dev/displaylog --> status
        echo ll=n > /dev/displaylog --> change log level (default=0x8A)
                0x00000000 NONE
                0x00000001 API_TYPE
                0x00000002 ERROR_INFO_TYPE
                0x00000004 PROFILE_TYPE
                0x00000008 CRITICAL_ERROR_TYPE
                0x00000010 INFO_TYPE
                0x00000020 KERNEL_TRACK_TYPE
                0x00000040 ISR_ERROR_INFO_TYPE
                0x00000080 CRITICAL_INFO_TYPE
                0x00000100 BACK_TRACE_TYPE
                0X00000200 WARNING_INFO_TYPE
                0x00000400 API_PERF_INFO_TYPE
        echo rd=n [submodule] [submodule ID]> /dev/displaylog --> register dump
                1: MDP
                        [submodule]
                         1: SWI
                         2: CTL
                         3: VIG
                         4: VIG_SSPP
                         5: RGB
                         6: RGB_SSPP
                         7: DMA
                         8: DMA_SSPP
                         9: CURSOR_SSPP
                        10: LAYER_MIXER
                        11: DSPP
                        12: WB
                        13: INTF
                        14: PP
                        15: ENCR_NS
                        16: ENCR_S
                        17: AADC
                        18: CDM
                        19: DSC
                        20: QDSS
                2: DSI0
                3: DSI1
                        [submodule]
                        1: CTRL
                        2: PHYREG
                        3: PHY
                        4: PHYPLL
                4: EDP
                5: DP0
                6: DP1
                        [submodule]
                        0: AHBCLK
                        1: AUXCLK
                        2: LCLK
                        3: PCLK
        echo surfacedump=n [m] > /dev/displaylog --> dump input surfaces to /tmp/*
                1: RGB0   5: VG0   t9:  DMA0   13: CURSOR0
                2: RGB1   6: VG1   t10: DMA1   14: CURSOR1
                3: RGB2   7: VG2   t11: DMA2   15: CURSOR2
                4: RGB3   8: VG3   t12: DMA3   16: CURSOR3
                0xFF: dump valid surfaces attached to all mdp pipes
                [m]: Number of frames to dump for multiframe option
        echo apibtenable=n > /dev/displaylog --> API backtrace enable
                0: disable
                1: enable
        echo apibtdump > /dev/displaylog --> Dump API backtrace to file
        echo smmudump > /dev/displaylog --> dump SMMU info to /tmp/*
        echo md > /dev/displaylog --> dump Mutex info to /tmp/*
        echo wfd ?>/dev/displaylog --> dump wfd help info to /tmp/
        echo forcereset=n > /dev/displaylog --> forcefully reset a display module
                1: PRIMARY
                2: EXTERNAL
                3: WRITEBACK
        echo dpauxread [module] [aux_addr] [len] --> To read the DPCD registers
                module:
                         4: EDP
                         5: DP0
                         6: DP1
                aux_addr: DPCD address
                len: number of DPCD registers to be read
        echo dpTPG [module] [stream] [enable] [pattern]
                module:
                         4: EDP
                         5: DP0 
                         6: DP1
                stream:
                         0: stream 0
                         1: stream 1
                enable:
                         0: disable
                         1: enable
                TPG pattern:
                        0: CHECKERED_RECTANGLE_PATTERN[default]
                        1: BASIC_COLOR_CHANGING_PATTERN
                        2: COLOR_SQUARE
                        3: BLACK_WHITE_VERTICAL_LINES
                        4: GRAYSCALE_RAMP
        echo dsiTPG [module] [enable] [pattern]
                module:
                        2: DSI0
                        3: DSI1
                Enable:
                        0: Disable
                        1: Enable
                pattern:
                        0: CHECKERED_RECTANGLE_PATTERN[default]
                        1: BASIC_COLOR_CHANGING_PATTERN
                        2: COLOR_SQUARE
                        3: BLACK_WHITE_VERTICAL_LINES
                        4: GRAYSCALE_RAMP

Reading Outputs:
        cat /dev/displaylog
# 

おすすめ

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