Armadilloフォーラム

G4 EDIDの固定方法について

nishioka

2023年3月2日 15時12分

Armadillo−Iot-g4にて、EDIDを指定したサイズに固定したいのですが可能でしょうか。
可能であればどのように設定すればいいのか教えてください。

よろしくお願いします。

コメント

溝渕様

以前、そのサイトを参考に進めていたのですが
”3. 作成したバイナリを Rootfs にコピーする”の項目で、”${ROOTFS}/lib/firmaware/” 内にedidが存在せず諦めたのですが...。

私が行った方法は以下の通りです。

"1. menuconfig で CONFIG_DRM_LOAD_EDID_FIRMWARE を有効化してKernel Imageをビルドする"にて、
添付画像のように設定し、"make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j5"でビルド。

"2. Linux Kernel に読み込ませる EDID のバイナリを作成する"にて、
"$ cd ${WORK}/${KERNEL_TREE}/Documentation/EDID/"のディレクトリは存在しませんでした。
edit.resを確認し、"tools/edid/"内に800x600.Sなどのファイルが存在していたため、"tools/edid/"内でmakeし、800x600.binを作成。

この作成したbinを"firmaware/edid"へコピーしようとしたのですが、最初に書いた通り"edid"が存在しませんでした。

以上、よろしくお願いいたします。

> 溝渕です。
>
> > Armadillo−Iot-g4にて、EDIDを指定したサイズに固定したいのですが可能でしょうか。
> > 可能であればどのように設定すればいいのか教えてください。
>
> DRM_LOAD_EDID_FIRMWAREが使えるかもしれません。
> https://qiita.com/tkomagata/items/74a026f5cada3da21d6a
>
> お試しください。
>

ファイル ファイルの説明
1_menuconfig で CONFIG_DRM_LOAD_EDID_FIRMWARE を有効化 .png
edid.txt 拡張子をrstからtxtに変更しています

溝渕です。

> "2. Linux Kernel に読み込ませる EDID のバイナリを作成する"にて、
> "$ cd ${WORK}/${KERNEL_TREE}/Documentation/EDID/"のディレクトリは存在しませんでした。

先に示しましたページで紹介されていますように、

> Kernel v5.7以降は Documentation/admin-guide/edid.rst に変更になりました。

となります。

> edit.resを確認し、"tools/edid/"内に800x600.Sなどのファイルが存在していたため、"tools/edid/"内でmakeし、800x600.binを作成。
>
> この作成したbinを"firmaware/edid"へコピーしようとしたのですが、最初に書いた通り"edid"が存在しませんでした。

まず、ATDEで以下のディレクトリを作成し、

[atde]# mkdir /lib/firmaware/edid/

このディレクトリの中に800x600.binをコピーしてください。

次にLinuxカーネルコンフィギュレーションで、
EXTRA_FIRMWARE
に、
edid/800x600.bin
を追加してみてください。

これで、Linuxカーネルイメージに800x600.binが格納されると思います。

あとは、起動パラメータの設定を行ってみてください。

溝渕様

"mkdir"で/edidを作成後、800x600.binのコピーができました。
ありがとうございます。勝手に作成して良かったんですね。

すみません。また質問ですが。

EXTRA_FIRMWARE に
edid/800x600.bin の追加は、添付写真の設定で問題ないでしょうか。

あと初歩的な質問で申し訳ないのですが、"起動パラメータの設定"とは何でしょうか。

以上、よろしくお願いいたします。

> 溝渕です。
>
> > "2. Linux Kernel に読み込ませる EDID のバイナリを作成する"にて、
> > "$ cd ${WORK}/${KERNEL_TREE}/Documentation/EDID/"のディレクトリは存在しませんでした。
>
> 先に示しましたページで紹介されていますように、
>
> > Kernel v5.7以降は Documentation/admin-guide/edid.rst に変更になりました。
>
> となります。
>
> > edit.resを確認し、"tools/edid/"内に800x600.Sなどのファイルが存在していたため、"tools/edid/"内でmakeし、800x600.binを作成。
> >
> > この作成したbinを"firmaware/edid"へコピーしようとしたのですが、最初に書いた通り"edid"が存在しませんでした。
>
> まず、ATDEで以下のディレクトリを作成し、
>

> [atde]# mkdir /lib/firmaware/edid/
> 

> このディレクトリの中に800x600.binをコピーしてください。
>
> 次にLinuxカーネルコンフィギュレーションで、
> EXTRA_FIRMWARE
> に、
> edid/800x600.bin
> を追加してみてください。
>
> これで、Linuxカーネルイメージに800x600.binが格納されると思います。
>
> あとは、起動パラメータの設定を行ってみてください。
>

ファイル ファイルの説明
EXTRA_FIRMWARE_800x600.bin.png

溝渕です。

> EXTRA_FIRMWARE に
> edid/800x600.bin の追加は、添付写真の設定で問題ないでしょうか。

いえ。違います。

"imx/sdma/sdma-imx7d.bin nxp/pcieuart9098_combo_v1.bin"となっている行でEnterを押して末尾に追加します。
"imx/sdma/sdma-imx7d.bin nxp/pcieuart9098_combo_v1.bin edid/800x600.bin"
のようになります。

> あと初歩的な質問で申し訳ないのですが、"起動パラメータの設定"とは何でしょうか。

https://qiita.com/tkomagata/items/74a026f5cada3da21d6a

「4. Kernel の bootargs に "drm_kms_helper.edid_firmware" を追加する」
の手順を実行することです。

以下のドキュメントを参考にして設定してください。
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

drm_kms_helper.edid_firmware=800x600.bin

のようになると思います。

溝渕様

> > あと初歩的な質問で申し訳ないのですが、"起動パラメータの設定"とは何でしょうか。
>
> https://qiita.com/tkomagata/items/74a026f5cada3da21d6a
> の
> 「4. Kernel の bootargs に "drm_kms_helper.edid_firmware" を追加する」
> の手順を実行することです。
>
> 以下のドキュメントを参考にして設定してください。
> https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

のことですが、この作業はATDEではなくArmadilloの方で行うというでしょうか。

溝渕です。

> この作業はATDEではなくArmadilloの方で行うというでしょうか。

そうですね。起動パラメータは主にLinuxカーネルの動作を変更する為に指定します。今回動作を変更したい(EDIDを固定化したい)のはArmadilloなので、Armadilloの起動パラメータを変更する必要があります。

溝渕様

私自身ネットなどで調べた程度の知識しかないためよく理解できていないのですが、ATDEで作成したLinuxカーネルをビルドし、ビルドしたものをSDブートでArmadilloへ。その後、先程伺った作業を行うという流れでいいのでしょうか。

似たようなことを何度もお聞きし申し訳ありませんが、よろしくお願いいたします。

溝渕です。

> 私自身ネットなどで調べた程度の知識しかないためよく理解できていないのですが、ATDEで作成したLinuxカーネルをビルドし、ビルドしたものをSDブートでArmadilloへ。その後、先程伺った作業を行うという流れでいいのでしょうか。

そうですね。SDブートはしてもしなくても良いですが、ビルドしたLinuxカーネルがArmadilloで動作している状態にする必要があります。

ちなみにですが、意図した挙動とならない為に質問されていますか?

そうであれば、

[フォーラムの利用方法]
https://armadillo.atmark-techno.com/guide/site/forum

からリンクされている「技術系メーリングリストで質問するときのパターン・ランゲージ」を参考に、何に困っているかを教えていただけるとアドバイスしやすいです。

溝渕様

> [フォーラムの利用方法]
> https://armadillo.atmark-techno.com/guide/site/forum
> からリンクされている「技術系メーリングリストで質問するときのパターン・ランゲージ」を参考に、何に困っているかを教えていただけるとアドバイスしやすいです。

フォーラムをサポートセンタ等のものと勘違いしておりました。申し訳ございません。

用件: 自動起動時に800x600の顔像度で表示したい。

実行手順&結果:
・local.d/set.start 内にfbsetとコンテナ起動の設定を記述

set.start 内容
/--
fbset -xres 800 -yres 600
podman_start container
--/

・解像度800x600のディスプレイにつないだ状態で起動すると、期待通りに800x600で表示されますが、解像度1920x1080のディスプレイにつないだ状態で起動すると、ディスプレイ左上に800x600の解像度で表示されます。

実際に行いたいこと:
・解像度1920x1080のディスプレイに左上ではなくフルサイズで表示させたい。

EDIDの設定方法を伺った経緯:
・local.d/set.startを記述した状態でArmadilloにHDMIケーブルを接続した状態で電源を入れると、[実行手順&結果]で書いた通りディスプレイ左上に表示されました。次に、HDMIケーブルを抜いた状態で電源を入れ、その後数秒経ってからHDMIケーブルを接続すると期待している1920x1080のディスプレイにフルサイズで表示されました。

・色々調べた結果、EDIDが影響しているのではないかと思い質問させていただきました。

私はArmadilloのpdfやネットで調べた程度の知識しかありませんが、改めてよろしくお願いいたします。

溝渕です。

> 実行手順&結果:
> ・local.d/set.start 内にfbsetとコンテナ起動の設定を記述
>
> set.start 内容
> /--
> fbset -xres 800 -yres 600
> podman_start container
> --/
>
> ・解像度800x600のディスプレイにつないだ状態で起動すると、期待通りに800x600で表示されますが、解像度1920x1080のディスプレイにつないだ状態で起動すると、ディスプレイ左上に800x600の解像度で表示されます。

恐らくfbsetで800x600を指定しているのが原因です。

i.MX8M PlusのHDMIの実装では、ディスプレイが対応する解像度(タイミング含む)をEDIDからダイナミックに取得して最大解像度で描画するようになっていたように記憶しています。

> 実際に行いたいこと:
> ・解像度1920x1080のディスプレイに左上ではなくフルサイズで表示させたい。

上記、1920x1080のディスプレイに、800x600の画像を1920x1080にリスケーリングして描画したいとい意味でしょうか? 上記、1920x1080のディスプレイの解像度を800x600に変更して800x600の画像をそのまま描画したいのでしょうか?

溝渕様

> > 実際に行いたいこと:
> > ・解像度1920x1080のディスプレイに左上ではなくフルサイズで表示させたい。
>
> 上記、1920x1080のディスプレイに、800x600の画像を1920x1080にリスケーリングして描画したいとい意味でしょうか? 上記、1920x1080のディスプレイの解像度を800x600に変更して800x600の画像をそのまま描画したいのでしょうか?

1920x1080のディスプレイの解像度を800x600に変更して800x600の画像をそのまま描画したいです。

よろしくお願いいたします。

溝渕です。

ご回答ありがとうございます。

> 1920x1080のディスプレイの解像度を800x600に変更して800x600の画像をそのまま描画したいです。

上記であれば、先に述べました以下の手順でできるのではないかと思います。

https://qiita.com/tkomagata/items/74a026f5cada3da21d6a

(恐らく対応していると思いますが)ディスプレイが800x600に対応しているかどうかは、次のように確認可能です。

Armadilloでedidバイナリを抜き出します。

[armadillo]# cat /sys/class/drm/card1-HDMI-A-1/edid > /tmp/edid

ATDEにedidバイナリを転送してdecodeします。この作業は、Armadillo上でdebianコンテナを利用して行う事も可能です。

[atde]$ apt update
[atde]$ apt install edid-decode
[atde]$ edid-decode [Armadilloからコピしたedidファイル]

溝渕様

手順通り行ってみましたが、変化がありませんでした。
以下に私が行った手順を書きます。

手順:
1. EXTRA_FIRMWARE に edid/800x600.bin を追加し、

[ATDE]~/linux-5.10-5.10.168-r0$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j5

を行ったところ、途中で以下のように表示されました。

drivers/staging/media/imx/imx8-mipi-csi2-sam.c: In function ‘csis_priv_ioctl’:
drivers/staging/media/imx/imx8-mipi-csi2-sam.c:1414:3: warning: ignoring return value of ‘copy_from_user’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
 1414 |   copy_from_user(arg, arg_user, sizeof(TYPE));\
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/staging/media/imx/imx8-mipi-csi2-sam.c:1449:3: note: in expansion of macro ‘USER_TO_KERNEL’
 1449 |   USER_TO_KERNEL(struct csi_sam_format);
      |   ^~~~~~~~~~~~~~
drivers/staging/media/imx/imx8-mipi-csi2-sam.c:1414:3: warning: ignoring return value of ‘copy_from_user’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
 1414 |   copy_from_user(arg, arg_user, sizeof(TYPE));\
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/staging/media/imx/imx8-mipi-csi2-sam.c:1454:3: note: in expansion of macro ‘USER_TO_KERNEL’
 1454 |   USER_TO_KERNEL(bool);
      |   ^~~~~~~~~~~~~~

ですが、問題なく「Image」と「armadillo_iotg_g4.dtb」が作成されていました。

2. 以下を参考に作成したLinuxカーネルをArmadilloへ書き込みました。
https://armadillo.atmark-techno.com/blog/10899/10733

#update-kernel.desc
 
# set version once for all below swdesc elements unless
# forced with --version
swdesc_option component=extra_os.kernel version=5.10.82-1
 
# write over files in /boot
swdesc_files --dest /boot "Image" "armadillo_iotg_g4.dtb"

3. /boot/uboot_env.d/ 内にno_promptを作成しました。

#no_prompt
 
bootdelay=-2
drm_kms_helper.edid_firmware=800x600.bin

その後以下のコマンドを実行し再起動をしましたが、変化がありませんでした。

[armadillo]# persist_file -v /boot/uboot_env.d/no_prompt
 
[armadillo]# fw_setenv -s /boot/uboot_env.d/no_prompt

以上、よろしくお願いいたします。

ファイル ファイルの説明
800x600の追加.png

溝渕です。

いちおうの確認ですが、以下のように表示されていますか?

[armadillo]# zcat /proc/config.gz | grep DRM_LOAD_EDID_FIRMWARE
CONFIG_DRM_LOAD_EDID_FIRMWARE=y

また、正しくEDIDをloadできた場合、以下何かしらのログが表示されると思いますが、どのような結果になりますか?

[armadillo]# dmesg | grep "EDID base block"

溝渕様

> いちおうの確認ですが、以下のように表示されていますか?
>
>

> [armadillo]# zcat /proc/config.gz | grep DRM_LOAD_EDID_FIRMWARE
> CONFIG_DRM_LOAD_EDID_FIRMWARE=y
> 

表示されています。

> また、正しくEDIDをloadできた場合、以下何かしらのログが表示されると思いますが、どのような結果になりますか?
>
>

> [armadillo]# dmesg | grep "EDID base block"
> 

>

確認したところ、ログは何も表示されませんでした。

ファイル ファイルの説明
スクリーンショット (137).png 結果

溝渕です。

ログを送っていただきありがとうございます。

> >

> > [armadillo]# dmesg | grep "EDID base block"
> > 

> >
>
> 確認したところ、ログは何も表示されませんでした。

これが原因ですね。

https://qiita.com/tkomagata/items/74a026f5cada3da21d6a
> Kernel v5.10.41 では "drm_kms_helper.edid_firmware" ではなく、"drm.edid_firmware"になるようです。

なので、"/boot/uboot_env.d/"以下の内容を、

drm.edid_firmware=800x600.bin

のように修正してみていただけますか?

また、再起動後、次のようにコマンドを実行して、意図した起動パラメータが設定されている事を確認してみてください。

armadillo:~# cat /proc/cmdline

溝渕様

armadillo:~# cat /boot/uboot_env.d/no_prompt
botdelay=-2
drm.edid_firmware=800x600.bin
 
#再起動後
armadillo:~# cat /proc/cmdline
console=ttymxc1,115200 root=/dev/mmcblk2p2 rootwait ro quiet

となりました。
申し訳ありません。再起動後にコマンド実行で表示された内容が理解できていないのですが、
これは設定できていないということでしょうか。

よろしくお願いいたします。

溝渕です。

> 申し訳ありません。再起動後にコマンド実行で表示された内容が理解できていないのですが、
> これは設定できていないということでしょうか。

そうですね。U-Boot環境変数の"optargs"に設定する必要があります。ご指摘できずにすみません。

溝渕様

> そうですね。U-Boot環境変数の"optargs"に設定する必要があります。ご指摘できずにすみません。

「U-Boot環境変数の"optargs"に設定」とはどのような設定でしょうか。

溝渕です。

https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

上記で行っているのは、U-Boot環境変数の設定です。

Linuxカーネル起動時パラメータを示すU-boot環境変数は、"optargs"です。マニュアルの手順に従う場合は次のようになると思います。

[armadillo]# vi /boot/uboot_env.d/edid
optargs=quiet drm.edid_firmware=800x600.bin
[armadillo]# persist_file /boot/uboot_env.d/edid
[armadillo]# fw_setenv -s /boot/uboot_env.d/edid
[armadillo]# reboot
 :snip
[armadillo]# cat /proc/cmdline                                                  
console=ttymxc1,115200 root=/dev/mmcblk2p1 rootwait ro quiet drm.edid_firmware=800x600.bin

溝渕様
>
> https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
>
> 上記で行っているのは、U-Boot環境変数の設定です。
>
> Linuxカーネル起動時パラメータを示すU-boot環境変数は、"optargs"です。マニュアルの手順に従う場合は次のようになると思います。
>
>

> [armadillo]# vi /boot/uboot_env.d/edid
> optargs=quiet drm.edid_firmware=800x600.bin
> [armadillo]# persist_file /boot/uboot_env.d/edid
> [armadillo]# fw_setenv -s /boot/uboot_env.d/edid
> [armadillo]# reboot
>  :snip
> [armadillo]# cat /proc/cmdline                                                  
> console=ttymxc1,115200 root=/dev/mmcblk2p1 rootwait ro quiet drm.edid_firmware=800x600.bin
> 

>

ありがとうございます。
上記の通りに行い再起動したところ

armadillo:~# cat /proc/cmdline
console=ttymxc1,115200 root=/dev/mmcblk2p1 rootwait ro quiet drm.edid_firmware=800x600.bin

と表記されるようになりました。しかし、

armadillo:~# dmesg | grep "EDID base block"
armadillo:~#

では、何も表示されませんでした。

再起動した際に気になる点がありました。

[    1.156315] mdio_bus stmmac-1: MDIO device at address 0 is missing.
[    1.183948] [drm:edid_load] *ERROR* Requesting EDID firmware "800x600.bin" failed (err=-2)

とエラーが発生していたのですが、armadilloの"/lib/firmware/edid"内にも"800x600.bin" が必要なのでしょうか。

以上、よろしくお願いいたします。

at_dominique.m…

2023年3月9日 11時47分

nishiokaさん、

横からすみません、
マルティネです。

> [    1.156315] mdio_bus stmmac-1: MDIO device at address 0 is missing.
> [    1.183948] [drm:edid_load] *ERROR* Requesting EDID firmware "800x600.bin" failed (err=-2)

> とエラーが発生していたのですが、armadilloの"/lib/firmware/edid"内にも"800x600.bin" が必要なのでしょうか。

EXTRA_FIRMWARE で入れたものは armadillo に不要ですが、drm.edid_firmwareedid/ のパスの部分も必要です。
パラメターを drm_kms_helper.edid_firmware=edid/800x600.bin に直して見てください。

よろしくお願いします。

マルティネ様、溝渕様

> EXTRA_FIRMWARE で入れたものは armadillo に不要ですが、drm.edid_firmwareedid/ のパスの部分も必要です。
> パラメターを drm_kms_helper.edid_firmware=edid/800x600.bin に直して見てください。

パラメータを変更したところ、期待していた動きになりました。
ありがとうございます。