QNX スクリーンの概要
QNX SCREEN フレームワークは、QNX が開発したグラフィックス表示およびウィンドウ管理用のソフトウェア フレームワークで、組み込みシステムに高性能で信頼性の高いグラフィックス表示およびユーザー インターフェイス機能を提供します。
QNX SCREEN フレームワークは、次の主な機能を提供します。
-
ディスプレイ管理: SCREEN フレームワークを使用すると、アプリケーションはモニター、タッチ スクリーン、グラフィック アクセラレータなどのグラフィック ディスプレイ デバイスを管理できます。ハードウェア デバイスとの通信インターフェイスを提供し、アプリケーションがディスプレイ デバイスのプロパティ、解像度、リフレッシュ レートなどを取得および制御できるようにします。
-
ウィンドウ管理: SCREEN フレームワークはウィンドウ管理をサポートしており、アプリケーションが複数のウィンドウを作成、管理、制御できるようにします。ウィンドウのレイアウト、フォーカス管理、ウィンドウの重なり順、ウィンドウの移動やサイズ変更などの機能を提供し、柔軟なユーザーインターフェイスを実現します。
-
グラフィックス アクセラレーション: SCREEN フレームワークは、グラフィックス アクセラレータ ドライバーの統合を通じて、ハードウェア アクセラレーションによるグラフィックスのレンダリングおよび描画機能を提供できます。これにより、グラフィックス操作のパフォーマンスと効率が向上し、複雑なグラフィックス効果とアニメーションがサポートされます。
-
マルチスクリーンのサポート: SCREEN フレームワークは、複数の表示画面を処理し、複数の画面の構成および管理機能を提供できます。これにより、アプリケーションが複数のディスプレイ上にウィンドウを作成できるようになり、ディスプレイ間でデータを転送して連携する機能が提供されます。
-
イベント処理: SCREEN フレームワークは、ユーザー入力、タッチ イベント、ウィンドウ イベントなどを処理するためのイベント処理メカニズムを提供します。これにより、アプリケーションはイベント ハンドラーを登録してさまざまなイベントに応答し、ユーザー インターフェイスを更新できるようになります。
-
拡張性: 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
#