yasuda0108
2022年4月19日 15時47分
Armadillo-G4のOS起動時間ですが、現状電源起動~コンテナ起動までに約15s程度要しております。
以下リンク先でも記載いただいている通り、主にBaseOSの起動時間かと思いますが、こちらの時間を短縮する方法はございますでしょうか。
https://armadillo.atmark-techno.com/forum/armadillo/11408#comment-10987
目標は起動時間10s以内程度です。
以下想定するボードの用途とデバイス情報です。
【使用用途】
eMMCに保存した画像を、LVDSを介してLCDへ表示する
【使用IF】
PWR, UART, CAN, LVDS, USB, LAN(開発時のみ)
【使用コンテナ】
//LCD表示用 armadillo:~# cat /etc/atmark/containers/qt-auto.conf image="localhost/gk_moni:v0.02" volumes="/sys:/sys /dev:/dev /run/udev:/run/udev /opt/firmware:/opt/firmware" devices="/dev/dri /dev/fb0" readonly=false autostart=yes append_args --env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu append_args --env=QT_QPA_PLATFORM=linuxfb append_args -w /home/MONI set_command ./MONI //GPIO設定用 armadillo:~# cat /etc/atmark/containers/io-auto.conf image="localhost/gk-ioctrl:v0.00" volumes="/sys:/sys /dev:/dev /run/udev:/run/udev" devices="/dev/dri" readonly=false autostart=yes append_args -w /home set_command ./initIO.sh
コメント
yasuda0108
> 今推測したら、以下の時間隊になっています(大幅):
> on: 0
> uboot prompt ("Hit any key to stop autoboot"): 2s
> linux ("Starting kernel..."): 5s
> baseos start ("OpenRC ... is starting up Linux"): 10s
> container start ("podman-atmark | [ok]"): 15s
起動ログの構成と秒数の調査ありがとうございます。
> uboot の promptまでにあまり設定の余地がないので、このままにします。
> Starting kernelまでのほぼの時間はpromptの待ってる2秒がほとんどで、imx-boot/uboot-imx/configs/x2_defconfigに「CONFIG_BOOTDELAY=0」を設定すればスキップされます。
> 公式バージョンでdelayがないと使いにくいとおもいますので、恐らくそのままになってしまいますがチームで話します。対応が決まったらまた連絡します。
確かにprompt待機時間がありますね。
こちらの設定を変更したいのですが、ディレクトリ「imx-boot」はどこに存在しておりますでしょうか。
> 次に、baseos startまでの5秒の半分ぐらいはシリアルのメッセージの量の影響で遅くなりますので、ubootでsetenv optargs quiet; saveenv(更新したらコードで更新の必要があります)で2.5秒ぐらい早くなります。
> こちらはデフォルトにしようと思いますが、同じく後ほど連絡します。
ubootの設定変更が必要という事ですね。
Armadillo-G4でのU-Boot設定変更の方法について、ご教示いただけますと幸いです。
> このステップでこれ以上の早くするには機能を無効にするしかないと思うので、すぐにできません。
> (いずれやりたいと思います)
承知いたしました。
>
> 最後にinitが起動してから、コンテナの立ち上がる時間までですが、すでにrc_parallelを有効にしたので簡単な設定はないですね…
> 少しみたらudevとpodman自体も遅いように見えますが、そちらはもうちょっと時間かけて改善したいと思います。
rc_parallelとはどのようなものになりますでしょうか?
改善の程お待ちしております。
at_dominique.m…
> 確かにprompt待機時間がありますね。
> こちらの設定を変更したいのですが、ディレクトリ「imx-boot」はどこに存在しておりますでしょうか。
すみません、imx-bootはブートローダのソースツリーのことです。
こちらにあります:
https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4…
ビルド手順はマニュアルにありますが、今言ったdefconfigの変更は説明されてないので相談の結果によって足します。
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
試しにu-bootのプロンプトに「setenv bootdelay 0; saveenv」を打てば同じ結果になりますが、更新の時に設定なくなりますのでいずれ何かの対応が必要です。
> > 次に、baseos startまでの5秒の半分ぐらいはシリアルのメッセージの量の影響で遅くなりますので、ubootでsetenv optargs quiet; saveenv(更新したらコードで更新の必要があります)で2.5秒ぐらい早くなります。
> > こちらはデフォルトにしようと思いますが、同じく後ほど連絡します。
>
> ubootの設定変更が必要という事ですね。
> Armadillo-G4でのU-Boot設定変更の方法について、ご教示いただけますと幸いです。
書いた「setenv optargs quiet; saveenv」はu-bootのプロンプトのコマンドで、これもビルドしなくても試すことができます。
永続化にビルドの時にimx-boot/uboot-imx/include/configs/armadillo_x2.h に設定できますが、それも対応を決めてからマニュアルに載せたいので少しお待ちください。
> > 最後にinitが起動してから、コンテナの立ち上がる時間までですが、すでにrc_parallelを有効にしたので簡単な設定はないですね…
> > 少しみたらudevとpodman自体も遅いように見えますが、そちらはもうちょっと時間かけて改善したいと思います。
>
> rc_parallelとはどのようなものになりますでしょうか?
すみません、わざわざ話すことでもなかったと思いますが、alpineのinit(openrc)の平行実行設定です。以前もっと遅くて、平行に実行させることで数秒をすでにこちらで稼ぎました。
他の便利な設定がないかなと考えて指からすべりました、失礼しました。
> 改善の程お待ちしております。
承知しました。来月にそれに時間をとります。
よろしくお願いします。
yasuda0108
> すみません、imx-bootはブートローダのソースツリーのことです。
> こちらにあります:
> https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4…
>
> ビルド手順はマニュアルにありますが、今言ったdefconfigの変更は説明されてないので相談の結果によって足します。
> https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
>
> 試しにu-bootのプロンプトに「setenv bootdelay 0; saveenv」を打てば同じ結果になりますが、更新の時に設定なくなりますのでいずれ何かの対応が必要です。
>
> > > 次に、baseos startまでの5秒の半分ぐらいはシリアルのメッセージの量の影響で遅くなりますので、ubootでsetenv optargs quiet; saveenv(更新したらコードで更新の必要があります)で2.5秒ぐらい早くなります。
> > > こちらはデフォルトにしようと思いますが、同じく後ほど連絡します。
> >
> > ubootの設定変更が必要という事ですね。
> > Armadillo-G4でのU-Boot設定変更の方法について、ご教示いただけますと幸いです。
>
> 書いた「setenv optargs quiet; saveenv」はu-bootのプロンプトのコマンドで、これもビルドしなくても試すことができます。
>
> 永続化にビルドの時にimx-boot/uboot-imx/include/configs/armadillo_x2.h に設定できますが、それも対応を決めてからマニュアルに載せたいので少しお待ちください。
>
ご回答ありがとうございます。
①u-bootのプロンプトを、試しで実行する方法についてお教え頂けますでしょうか。
②2種類の起動時間短縮方法(bootdelay=0, コンソールログ非表示)について、設定および永続化のやり方について、ご連絡お待ちしております。
> > > 最後にinitが起動してから、コンテナの立ち上がる時間までですが、すでにrc_parallelを有効にしたので簡単な設定はないですね…
> > > 少しみたらudevとpodman自体も遅いように見えますが、そちらはもうちょっと時間かけて改善したいと思います。
> >
> > rc_parallelとはどのようなものになりますでしょうか?
>
> すみません、わざわざ話すことでもなかったと思いますが、alpineのinit(openrc)の平行実行設定です。以前もっと遅くて、平行に実行させることで数秒をすでにこちらで稼ぎました。
> 他の便利な設定がないかなと考えて指からすべりました、失礼しました。
>
> > 改善の程お待ちしております。
>
> 承知しました。来月にそれに時間をとります。
なるほど、内容承知いたしました。
詳細迄お教えいただきありがとうございます。
引き続きよろしくお願いいたします。
yasuda0108
下記2点の内容につきまして、ご状況いかがでしょうか。
> ①u-bootのプロンプトを、試しで実行する方法についてお教え頂けますでしょうか。
> ②2種類の起動時間短縮方法(bootdelay=0, コンソールログ非表示)について、設定および永続化のやり方について、ご連絡お待ちしております。
また、OS起動高速化と併せて、電源起動時に画像を描画したいと考えております。
(fbsplash以前/起動後3s以内ぐらいであればベストです。)
以前別のフォーラムでU-BootのHDMIドライバ開発が必要なため難しいと伺っておりますが、
LVDS/LCD制御IOにてモニタ表示の場合でも、起動時の画像描画は厳しいでしょうか?
https://armadillo.atmark-techno.com/forum/armadillo/11194#comment-10743
at_dominique.m…
yasuda0108さん、
> 下記2点の内容につきまして、ご状況いかがでしょうか。
> > ①u-bootのプロンプトを、試しで実行する方法についてお教え頂けますでしょうか。
> > ②2種類の起動時間短縮方法(bootdelay=0, コンソールログ非表示)について、設定および永続化のやり方について、ご連絡お待ちしております。
すみません、返事が遅くなりました。
① に付いては以前以前書いたと思いますが、「setenv」というコマンドで設定できます。
ubootも二重化されてますので、別の物をアップデートを起こしたら設定が一回なくなります。ubootを更新する場合にも変数をなくすので試しだけです。
Hit any key to stop autoboot: 0 <---- ここで何かを入力して止めます u-boot=> setenv optargs quiet u-boot=> setenv bootdelay 0 u-boot=> saveenv Saving Environment to MMC... Writing to MMC(2)... OK u-boot=> reset
か起動された linux から
armadillo:~# fw_setenv bootdelay 0 Environment OK, copy 0 armadillo:~# fw_setenv optargs quiet Environment OK, copy 1 armadillo:~# reboot
bootdelay 0 でもタイミングよく入力すればpromptをもらえるのでセキュリティではないですが、また変更が必要でしたら linux から 「fw_setenv bootdelay 2」などで戻せます。
② 永続化に付いてはもうちょっと難しいですね。
「quiet」の方は話した結果、今月のブートローダーのアップデートでデフォルトになりますが、bootdelay の方はこのままになりましたので、
今のところはご自分でコンパイルしていただくしかありません…
https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4… から「ブートローダー ソース」を取得して、
atmark@atde9:~$ tar xf imx-boot-2020.04-at6.tar.gz atmark@atde9:~$ cd imx-boot-2020.04-at6 atmark@atde9:~/imx-boot-2020.04-at6$ echo "CONFIG_BOOTDELAY=0" >> uboot-imx/configs/x2_defconfig atmark@atde9:~/imx-boot-2020.04-at6$ sed -i -e 's/optargs=/optargs=quiet/' uboot-imx/include/configs/armadillo_x2.h atmark@atde9:~/imx-boot-2020.04-at6$ make imx-boot_armadillo_x2 ...
コンパイルしなくても変数だけを swupdate で指定できるかを検討ちゅうですが、すぐにはできません。
(アットマークテクノが用意している baseos の swu に uboot も含まれてますので、baseos をこの swu で更新しましたら uboot も更新されることになります。baseos の tar アーカイブから自分の baseos.swu を /usr/share/mkswu/examples/OS_update.desc を参考にして作る必要があります…)
> また、OS起動高速化と併せて、電源起動時に画像を描画したいと考えております。
> (fbsplash以前/起動後3s以内ぐらいであればベストです。)
> 以前別のフォーラムでU-BootのHDMIドライバ開発が必要なため難しいと伺っておりますが、
> LVDS/LCD制御IOにてモニタ表示の場合でも、起動時の画像描画は厳しいでしょうか?
> https://armadillo.atmark-techno.com/forum/armadillo/11194#comment-10743
そうですね、こちらで u-boot の LVDS のコードを確認してないので何ともいえません。
HDMI より楽に操作できるだと思いますが、テスト済みのコードはなさそうなのでやはりそれでも開発が必要になると思います…
よろしくお願いします。
yasuda0108
ご回答ありがとうございます。
>「quiet」の方は話した結果、今月のブートローダーのアップデートでデフォルトになりますが、bootdelay の方はこのままになりましたので、
今のところはご自分でコンパイルしていただくしかありません…
ご教示いただいた方法で、imx-boot-2020.04-at6のコンパイルを実行しました。
生成されたimx-boot_armadillo_x2をswuに組み込んでアップデートする流れの認識ですが、ブートローダアップデートのdesc記述は下記で問題ないでしょうか。
# boot image can be generated with atmark imx-boot script swdesc_boot imx-boot_armadillo_x2
また、ubootをimx-boot_armadillo_x2の内容から更に変更した場合は、imx-boot_armadillo_x2と異なる名称でmakeし、swuアップデートの流れで宜しいでしょうか。
atmark@atde9:~/imx-boot-2020.04-at6$ make imx-boot_armadillo_x2_***
> そうですね、こちらで u-boot の LVDS のコードを確認してないので何ともいえません。
> HDMI より楽に操作できるだと思いますが、テスト済みのコードはなさそうなのでやはりそれでも開発が必要になると思います…
承知いたしました。
起動時画面描画は、是非実行したい機能ですので、こちらで一度ブートローダ開発を試みてみます。
流れとしては、quietと同様、imx-boot-2020.04-at6コーディング→ATDE9にてビルド→descswuアップデートでよろしいでしょうか。
※もし、開発に際して何かヒントになるような情報ございましたら、ご共有頂けますと幸いです。
以上よろしくお願いします。
at_dominique.m…
> # boot image can be generated with atmark imx-boot script > swdesc_boot imx-boot_armadillo_x2
すみません、先に説明するべきでした。
これであってますが、バージョンを指定しないと自動的に imx-boot_armadillo_x2 から取られますので、「boot 2020.04-at6」がすでにインストールされたら更新されないことになってしまいます。
~/imx-boot-2020.04-at6/uboot-imx/localversion のファイルに違うバージョンを記載するか、 「swdesc_boot --version boot 2020.04-myversion imx-boot_armadillo_x2」で指定する必要があります。
他のバージョンと違って、boot のバージョンは異なる場合にインストールされますので、自由に設定しても問題ないと思います(他のバージョンは上がる時だけインストールしますが、boot だけは違います)
> また、ubootをimx-boot_armadillo_x2の内容から更に変更した場合は、imx-boot_armadillo_x2と異なる名称でmakeし、swuアップデートの流れで宜しいでしょうか。
さらに更新したらまた localversion の変更で管理してください。
> 起動時画面描画
> 流れとしては、quietと同様、imx-boot-2020.04-at6コーディング→ATDE9にてビルド→descswuアップデートでよろしいでしょうか。
流れはこれであってます。
申し訳ないですが、個人的に uboot のビデオを使った事がないのでヒントはあまりできないと思いますが、困ることがあったらまた聞いてください。コンフィグファイルは quiet / bootdelay で変更した二つと、uboot-imx/board/atmark-techno/armadillo_x2/board.c に初期のコードがありますのでドライバーを有効にしたらそちらに対応を入れるといいです。
よろしくお願いします。
yasuda0108
> ~/imx-boot-2020.04-at6/uboot-imx/localversion のファイルに違うバージョンを記載するか、 「swdesc_boot --version boot 2020.04-myversion imx-boot_armadillo_x2」で指定する必要があります。
内容承知しました。
~/imx-boot-2020.04-at6/uboot-imx/localversion のバージョン変更にてbootのアップデートデートを試してみます。
> > 起動時画面描画
> > 流れとしては、quietと同様、imx-boot-2020.04-at6コーディング→ATDE9にてビルド→descswuアップデートでよろしいでしょうか。
>
> 流れはこれであってます。
> 申し訳ないですが、個人的に uboot のビデオを使った事がないのでヒントはあまりできないと思いますが、困ることがあったらまた聞いてください。コンフィグファイルは quiet / bootdelay で変更した二つと、uboot-imx/board/atmark-techno/armadillo_x2/board.c に初期のコードがありますのでドライバーを有効にしたらそちらに対応を入れるといいです。
初期コード/コンフィグファイルについて、ご情報ありがとうございます。
かなり探りながらになるかと思いますので、、また不明点がありましたら質問させていただきます。
いつもご丁寧にありがとうございます。
引き続きよろしくお願いいたします。
yasuda0108
> ~/imx-boot-2020.04-at6/uboot-imx/localversion のファイルに違うバージョンを記載するか、 「swdesc_boot --version boot 2020.04-myversion imx-boot_armadillo_x2」で指定する必要があります。
こちらを元にアップデートを試みましたが、エラーが出現してしまいました。
//エラー armadillo:~# swupdate -i /mnt/gkboot_v1.swu Swupdate v2021.04.0 Licensed under GPLv2. See source distribution for detailed copyright notices. [INFO ] : SWUPDATE started : Software Update started ! [ 867.697946] EXT4-fs (mmcblk2p2): mounted filesystem with ordered data mode. Opts: (null) [ 867.746016] EXT4-fs (mmcblk2p2): mounted filesystem with ordered data mode. Opts: (null) [ 868.156005] EXT4-fs (mmcblk2p2): mounted filesystem with ordered data mode. Opts: (null) [ERROR] : SWUPDATE failed [0] ERROR : image io-auto in /target/etc/atmark/containers/io-auto.conf not found in image store ! [ERROR] : SWUPDATE failed [0] ERROR : ---------------------------------------------- [ERROR] : SWUPDATE failed [0] ERROR : /!\ cleanup of old images failed: mismatching configuration/container update? [ERROR] : SWUPDATE failed [0] ERROR : ---------------------------------------------- [ERROR] : SWUPDATE failed [0] ERROR : Command failed: sh -c 'sh $1 ' -- /var/tmp//swupdate_post.sh.zst.enc [ERROR] : SWUPDATE failed [0] ERROR : Error streaming swupdate_post.sh.zst.enc [ERROR] : SWUPDATE failed [1] Image invalid or corrupted. Not installing ... [INFO ] : No SWUPDATE running : Waiting for requests... armadillo:~# ls /target/etc/atmark/containers/ ls: cannot access '/target/etc/atmark/containers/': No such file or directory //G4状態 armadillo:~# podman_switch_storage --status Currently in tmpfs mode, run with --disk to switch armadillo:~# podman images REPOSITORY TAG IMAGE ID CREATED SIZE R/O localhost/gk_moni v0.10 ccaade076438 Less than a second ago 1.91 GB true armadillo:~# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES df504b4af6b5 localhost/gk_moni:v0.10 ./initIO_v2.sh 20 minutes ago Exited (137) 7 minutes ago qt-auto armadillo:~# ls /etc/atmark/containers/ README io-auto.conf qt-auto.conf armadillo:~# cat /etc/atmark/containers/qt-auto.conf image="localhost/gk_moni:v0.10" volumes="/sys:/sys /dev:/dev /run/udev:/run/udev /opt/firmware:/opt/firmware" devices="/dev/dri /dev/galcore /dev/fb0" readonly=no autostart=yes add_args --env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu add_args --env=QT_QPA_PLATFORM=linuxfb add_args --cap-add=NET_ADMIN add_args --net=host append_args -w /home set_command ./initIO_v2.sh #append_args -ti #set_command /bin/bash armadillo:~# cat /etc/atmark/containers/io-auto.conf #image="localhost/gk_ioctrl:v0.02" #volumes="/sys:/sys /dev:/dev /run/udev:/run/udev" #devices="/dev/dri" #readonly=no #autostart=yes #add_args --cap-add=NET_ADMIN #add_args --net=host #append_args -w /home #set_command ./bin/bash //desc atmark@atde9:~/mkswu/update-boot$ cat gkboot_v1.desc swdesc_boot --version boot 2020.04-gk1 imx-boot_armadillo_x2
エラー内容から見ると、前回アップデートを実施した際に、io-auto.confにて自動起動するImageを削除したことが原因でしょうか。。
io-auto.confは使用しない予定ですので、削除する方法もお教えいただけるとありがたいです。
at_dominique.m…
yasuda0108さん、
> [ERROR] : SWUPDATE failed [0] ERROR : image io-auto in /target/etc/atmark/containers/io-auto.conf not found in image store ! > [ERROR] : SWUPDATE failed [0] ERROR : /!\ cleanup of old images failed: mismatching configuration/container update?
このエラーは imx-boot の更新と関係なく、恐らく podman_switch_storage --tmpfs の状態で初めて行ったアップデートではないでしょうか?
--disk では、イメージが rw の方にもあるかもしれないので、イメージを見つからない場合でもエラーしません。
--tmpfs の場合に自動起動と設定されてるコンフィグファイルがあれば、必ずイメージもあることを実施します。
具体的に、エラーに書いてある io-auto.conf ですね:
> armadillo:~# cat /etc/atmark/containers/io-auto.conf > #image="localhost/gk_ioctrl:v0.02" > #volumes="/sys:/sys /dev:/dev /run/udev:/run/udev" > #devices="/dev/dri" > #readonly=no > #autostart=yes > #add_args --cap-add=NET_ADMIN > #add_args --net=host > #append_args -w /home > #set_command ./bin/bash
分かりにくいと思いますが:
- autostart を指定しないと、 autostart=yes のデフォルトになります。
- image も、ファイル名と言うデフォルトがありますので、今回は「io-auto」と言うイメージを実行しようとしています。
シリアルコンソールで起動時のログか podman_start -a を実行したら、何かのエラーが出るのではないでしょうか?
解決方法としてはただ autostart=no を指定すれば podman_start も swupdate もエラーしないはずですが、いかがでしょうか?
(あるいかファイルを削除してしまえばそれでもいいんですが、autostart=noで残しても問題ないです)
よろしくお願いします。
at_dominique.m…
> 解決方法としてはただ autostart=no を指定すれば podman_start も swupdate もエラーしないはずですが、いかがでしょうか?
> (あるいかファイルを削除してしまえばそれでもいいんですが、autostart=noで残しても問題ないです)
連続ですみません。
削除する方法を書き忘れました。
persist_file でファイルの保存と同じく、削除もできます。(-d (--delete)でファイルを直接に消すか、普通にrmで消してからpersist_file -r (--recurse) でディレクトリの方をsyncできいます)
swupdate の場合は「swdesc_command rm -f /etc/atmark/containers/io-auto.conf」でもできます。
よろしくお願いします。
yasuda0108
> > 解決方法としてはただ autostart=no を指定すれば podman_start も swupdate もエラーしないはずですが、いかがでしょうか?
> > (あるいかファイルを削除してしまえばそれでもいいんですが、autostart=noで残しても問題ないです)
>
> 連続ですみません。
>
> 削除する方法を書き忘れました。
> persist_file でファイルの保存と同じく、削除もできます。(-d (--delete)でファイルを直接に消すか、普通にrmで消してからpersist_file -r (--recurse) でディレクトリの方をsyncできいます)
>
> swupdate の場合は「swdesc_command rm -f /etc/atmark/containers/io-auto.conf」でもできます。
>
> よろしくお願いします。
persist_file -hに記載がありますね。。すみません、確認不足でした。
swupdateでも削除ができるのですね。覚えておきます。
いつもご丁寧にありがとうございます。
引き続きよろしくお願いいたします。
yasuda0108
> --disk では、イメージが rw の方にもあるかもしれないので、イメージを見つからない場合でもエラーしません。
> --tmpfs の場合に自動起動と設定されてるコンフィグファイルがあれば、必ずイメージもあることを実施します。
>
> 具体的に、エラーに書いてある io-auto.conf ですね:
>
>
> > armadillo:~# cat /etc/atmark/containers/io-auto.conf > > #image="localhost/gk_ioctrl:v0.02" > > #volumes="/sys:/sys /dev:/dev /run/udev:/run/udev" > > #devices="/dev/dri" > > #readonly=no > > #autostart=yes > > #add_args --cap-add=NET_ADMIN > > #add_args --net=host > > #append_args -w /home > > #set_command ./bin/bash >
>
> 分かりにくいと思いますが:
> - autostart を指定しないと、 autostart=yes のデフォルトになります。
> - image も、ファイル名と言うデフォルトがありますので、今回は「io-auto」と言うイメージを実行しようとしています。
>
> シリアルコンソールで起動時のログか podman_start -a を実行したら、何かのエラーが出るのではないでしょうか?
>
> 解決方法としてはただ autostart=no を指定すれば podman_start も swupdate もエラーしないはずですが、いかがでしょうか?
> (あるいかファイルを削除してしまえばそれでもいいんですが、autostart=noで残しても問題ないです)
なるほど、エラーの要因について理解できました。
コメントアウトではデフォルトのyesとなってしまうので、autostart=noと指定する必要があるのですね。
ご指摘の方法で正しくアップデートされ、起動時間を10s程度にすることができました。
引き続きよろしくお願いいたします。
yasuda0108
at_dominique.m…
yasuda0108さん
> こちらのボードの初期化をしたいのですが、何か方法はございますでしょうか。
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro… を参考にすればできると思います。
何か分からないところありましたら聞いたください
yasuda0108
失礼しました。記述がありましたね・・・
参考にさせて頂きます。
また、SDブートの作成を試みておりますが、baseos-x2-[VERSION].imgが生成されません。
どこか問題点がありますでしょうか。
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
atmark@atde9:~/build-rootfs-v3.15-at.6$ ./build_image.sh --boot imx-boot_armadillo_x2 use default(board=yuakushima-board) /usr/bin/podman use default(outdir=/home/atmark/build-rootfs-v3.15-at.6) use default(output=baseos-x2-ATVERSION.tar.zst) 'repositories' -> '/etc/apk/repositories' fetch https://download.atmark-techno.com/alpine/v3.15/atmark/aarch64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/main/aarch64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/community/aarch64/APKINDEX.tar.gz atmark [https://download.atmark-techno.com/alpine/v3.15/atmark] v3.15.4-166-g5cc862983b [https://dl-cdn.alpinelinux.org/alpine/v3.15/main] v3.15.4-165-gf31a770f5f [https://dl-cdn.alpinelinux.org/alpine/v3.15/community] OK: 15765 distinct packages available 【省略】 > Cleaning-up rootfs (1/1) Purging .make-alpine-make-rootfs (20220526.051450) OK: 211 MiB in 189 packages ERROR: No such package: .make-alpine-make-rootfs WARNING: Ignoring https://download.atmark-techno.com/alpine/v3.15/atmark: No such file or directory WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.15/main: No such file or directory WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.15/community: No such file or directory build-alpine.sh done /tmp/alpine-build-rootfs.c6K2wC/rootfs.tar : 29.41% (222679040 => 65492813 bytes, /tmp/alpine-build-rootfs.c6K2wC/rootfs.tar.zst) ============================================ footprint[byte] tarball[byte] packages 221284000 65492813 alpine-base coreutils chrony e2fsprogs openssh shadow iptables rng-tools eudev btrfs-progs mmc-utils i2c-tools gptfdisk sgdisk util-linux curl openssl swupdate@atmark libubootenv@atmark dosfstools atmark-x2-base@atmark emmc-sref@atmark buttond@atmark linux-at@atmark busybox-chattr@atmark crun cni-plugins@atmark conmon@atmark podman networkmanager modemmanager@atmark wpa_supplicant ppp-daemon atmark-wwan-utils@atmark ============================================ done. use default(outdir=/home/atmark/build-rootfs-v3.15-at.6) use default(output=baseos-x2-3.15.4-at.6.20220526.img) ./build_image.sh: 218: sgdisk: not found atmark@atde9:~/build-rootfs-v3.15-at.6$ ls README.md atmark-version baseos-x2-3.15.4-at.6.20220526.package_list.txt build_rootfs.sh imx-boot_armadillo_x2 README.org ax1 baseos-x2-3.15.4-at.6.20220526.tar.zst dist.sh qemu alpine-version ax2 build_image.sh footprint.csv submodules
at_dominique.m…
> また、SDブートの作成を試みておりますが、baseos-x2-[VERSION].imgが生成されません。
https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4… をそのまま使ってもいいと思いますが、
以下のトレースでは sgdisk のコマンドを見つからなかったようです:
> atmark@atde9:~/build-rootfs-v3.15-at.6$ ./build_image.sh --boot imx-boot_armadillo_x2 >... > ./build_image.sh: 218: sgdisk: not found
debian のユーザーのパスに /usr/sbin をいれてないので、マニュアルでは sudo ./build_image.sh で実行します。
よろしくお願いします
yasuda0108
yasuda0108
お世話になっております。
無事に初期化→swuアップデート実施できました。
LVDS動作について、uboot-imx\board\atmark-techno\armadillo_x2\board.cの中で、
uboot-imx\drivers\video\nxp\imx\imx8_lvds.cに定義されているimx8_ldb_enable関数の使用を試みているのですが、
make時にエラーが出現します。解決方法が判りましたら、ご教示頂けますと幸いです。
//ビルドログ(videoで検索結果:\drivers\video\nxp\imx\imx8_lvds.oがリンクされていない) LD drivers/video/bridge/built-in.o LD drivers/video/nxp/imx/hdmi/built-in.o LD drivers/video/nxp/imx/built-in.o LD drivers/video/nxp/layerscape/built-in.o LD drivers/video/nxp/built-in.o LD drivers/video/sunxi/built-in.o LD drivers/video/built-in.o //エラー aarch64-linux-gnu-ld.bfd: board/atmark-techno/armadillo_x2/built-in.o: in function `setup_lvds': /home/atmark/imx-boot-2020.04-at6/uboot-imx/armadillo_x2/../board/atmark-techno/armadillo_x2/board.c:767: undefined reference to `imx8_ldb_enable' Segmentation fault
x2_defconfigは下記の通り設定しております。
CONFIG_ARM=y CONFIG_POST=y CONFIG_SPL_SYS_ICACHE_OFF=y CONFIG_SPL_SYS_DCACHE_OFF=y CONFIG_ARCH_IMX8M=y CONFIG_SYS_TEXT_BASE=0x40200000 CONFIG_SPL_GPIO_SUPPORT=y [省略] # logs to mmc CONFIG_DM_RTC=y CONFIG_RTC_RV8803=y CONFIG_LOG_FILE=y CONFIG_LOG=y # add new config CONFIG_BOOTDELAY=0 CONFIG_VIDEO_IMX8_LVDS=y //make通すために追加
makefile,Konfigの中身は、初期状態から変更しておりません。
//uboot-imx\drivers\video\nxp\imx\Makefile # SPDX-License-Identifier: GPL-2.0+ # # (C) Copyright 2000-2007 # Wolfgang Denk, DENX Software Engineering, wd@denx.de. obj-$(CONFIG_VIDEO_IPUV3) += mxc_ipuv3_fb.o ipu_common.o ipu_disp.o obj-$(CONFIG_VIDEO_IMXDPUV1) += imxdpuv1.o imx8_dc.o obj-$(CONFIG_VIDEO_IMX8_LVDS) += imx8_lvds.o obj-$(CONFIG_VIDEO_IMX8M_DCSS) += imx8m_dcss.o obj-$(CONFIG_VIDEO_SEC_MIPI_DSI) += sec_mipi_dsim.o obj-$(CONFIG_VIDEO_IMX_SEC_DSI) += sec_dsim_imx.o obj-$(CONFIG_VIDEO_IMX_LCDIFV3) += imx_lcdifv3.o obj-$(CONFIG_VIDEO_NW_MIPI_DSI) += mipi_dsi_northwest.o obj-$(CONFIG_VIDEO_IMX_NW_DSI) += nw_dsi_imx.o obj-y += hdmi/ //uboot-imx\drivers\video\nxp\imx\Kconfig [省略] config VIDEO_IMX8_LVDS bool "i.MX8 LDVS bridge support" default n depends on IMX8 && DM_VIDEO select DISPLAY select VIDEO_LINK help Support for i.MX8 LDVS bridge controller for i.MX8 processors. [省略]
以上よろしくお願いいたします。
at_dominique.m…
yasuda0108さん、
お世話になっています。
マルティネです。
> //ビルドログ(videoで検索結果:\drivers\video\nxp\imx\imx8_lvds.oがリンクされていない)
ビルドされていませんですね。
x2_defconfig では分かりにくいですが、
uboot-imx/armadillo_x2 のディレクトリに入って 「make menuconfig」を実行すればメニューを使えます。
そこで 「? IMX8_LVDS」を入力して、以下の通りです:
│ Symbol: VIDEO_IMX8_LVDS [=n] │ Type : bool │ Prompt: i.MX8 LDVS bridge support │ Location: │ -> Device Drivers │ (2) -> Graphics support │ Defined at drivers/video/nxp/imx/Kconfig:17 │ Depends on: IMX8 [=n] && DM_VIDEO [=y] │ Selects: DISPLAY [=n] && VIDEO_LINK [=n]
そこで、 IMX8 =n になってますので、Armadillo G4 にはこのまま使えないということになります。
G4 では IMX8M と IMX8MP を使えますが、ただの「IMX8」は別物です。
違うチップでもある程度使えるかもしれませんので、 Kconfig の depends の部分を直して進めるかもしれないですが、ちょっとみたところ:
- DM_VIDEO なので、uboot-imx/arch/arm/dts/armadillo_x2.dts (と imx8mp.dtsi)にも ldb の部分を追加しないとコンパイルしても runtime で使えません。
- linux カーネルの imx8mp.dtsi の ldb には「compatible fsl,imx8mp-ldb」になってますが、今のドライバは確かに違います。linux では fsl,imx8qm-ldb (現在のubootのドライバ)と違うドライバになってますので、そのまま使えない可能性も高いです。uboot のドライバと linux のドライバは同じものではないので、uboot のシンプルな実装なら動くかもしれませんが、起動する前にその差を確認した方がいいです。
よろしくお願いします
yasuda0108
ありがとうございます。
> G4 では IMX8M と IMX8MP を使えますが、ただの「IMX8」は別物です。
IMX8は別物である旨承知しました。
> 違うチップでもある程度使えるかもしれませんので、 Kconfig の depends の部分を直して進めるかもしれないですが、ちょっとみたところ:
> - DM_VIDEO なので、uboot-imx/arch/arm/dts/armadillo_x2.dts (と imx8mp.dtsi)にも ldb の部分を追加しないとコンパイルしても runtime で使えません。
> - linux カーネルの imx8mp.dtsi の ldb には「compatible fsl,imx8mp-ldb」になってますが、今のドライバは確かに違います。linux では fsl,imx8qm-ldb (現在のubootのドライバ)と違うドライバになってますので、そのまま使えない可能性も高いです。
> uboot のドライバと linux のドライバは同じものではないので、uboot のシンプルな実装なら動くかもしれませんが、起動する前にその差を確認した方がいいです。
もしかしたら使用できるかもしれないとのことで、armadillo_x2.dtsとimx8mp.dtsiにldbを追加しました。
※Linuxのドライバを参考に、G4にマッチするであろう形に変更しています。
下記のimx8_ldb_enable()を使用するため、udevice *dev引数を用意する必要があり、
uclass_first_device()にてudeviceを取得しようと考えております。
uclass_first_device()は、uclass_idでデバイスを認識できるようなのですが、追加した「ldb」はuclass_idと紐づける事は可能でしょうか。
#imx8_ldb_enable() #~\imx-boot-2020.04-at6\uboot-imx\drivers\video\nxp\imx\imx8_lvds.c int imx8_ldb_enable(struct udevice *dev, int panel_bpp, const struct display_timing *timing) { struct imx8_ldb_priv *priv = dev_get_priv(dev); int ret; if (dev->platdata == NULL) { imx8_ldb_soc_setup(dev, timing->pixelclock.typ); imx8_ldb_configure(dev); } else { display_enable(dev->parent, panel_bpp, &priv->timings); if (IS_ENABLED(CONFIG_VIDEO_BRIDGE)) { if (priv->conn_dev && device_get_uclass_id(priv->conn_dev) == UCLASS_VIDEO_BRIDGE) { ret = video_bridge_set_backlight(priv->conn_dev, 80); if (ret) { dev_err(dev, "fail to set backlight\n"); return ret; } } } } return 0; } #uclass_first_device() #~\imx-boot-2020.04-at6\uboot-imx\include\dm\uclass.h /** * uclass_first_device() - Get the first device in a uclass * * The device returned is probed if necessary, and ready for use * * This function is useful to start iterating through a list of devices which * are functioning correctly and can be probed. * * @id: Uclass ID to look up * @devp: Returns pointer to the first device in that uclass if no error * occurred, or NULL if there is no first device, or an error occurred with * that device. * @return 0 if OK (found or not found), other -ve on error */ int uclass_first_device(enum uclass_id id, struct udevice **devp); #uclass_id #~\imx-boot-2020.04-at6\uboot-imx\include\dm\uclass-id.h enum uclass_id { [省略] /* These are used internally by driver model */ /* U-Boot uclasses start here - in alphabetical order */ UCLASS_ACPI_PMC, /* (x86) Power-management controller (PMC) */ UCLASS_ADC, /* Analog-to-digital converter */ UCLASS_AHCI, /* SATA disk controller */ UCLASS_AUDIO_CODEC, /* Audio codec with control and data path */ UCLASS_AXI, /* AXI bus */ UCLASS_BLK, /* Block device */ UCLASS_BOARD, /* Device information from hardware */ UCLASS_BOOTCOUNT, /* Bootcount backing store */ UCLASS_CACHE, /* Cache controller */ UCLASS_CLK, /* Clock source, e.g. used by peripherals */ UCLASS_CPU, /* CPU, typically part of an SoC */ UCLASS_CROS_EC, /* Chrome OS EC */ UCLASS_DISPLAY, /* Display (e.g. DisplayPort, HDMI) */ UCLASS_DSI_HOST, /* Display Serial Interface host */ UCLASS_DMA, /* Direct Memory Access */ UCLASS_DSA, /* Distributed (Ethernet) Switch Architecture */ UCLASS_EFI, /* EFI managed devices */ UCLASS_ETH, /* Ethernet device */ UCLASS_ETH_PHY, /* Ethernet PHY device */ UCLASS_FIRMWARE, /* Firmware */ UCLASS_FS_FIRMWARE_LOADER, /* Generic loader */ UCLASS_GPIO, /* Bank of general-purpose I/O pins */ UCLASS_HWSPINLOCK, /* Hardware semaphores */ UCLASS_I2C, /* I2C bus */ UCLASS_I2C_EEPROM, /* I2C EEPROM device */ UCLASS_I2C_GENERIC, /* Generic I2C device */ UCLASS_I2C_MUX, /* I2C multiplexer */ UCLASS_I2S, /* I2S bus */ UCLASS_IDE, /* IDE device */ UCLASS_IRQ, /* Interrupt controller */ UCLASS_KEYBOARD, /* Keyboard input device */ UCLASS_LED, /* Light-emitting diode (LED) */ UCLASS_LPC, /* x86 'low pin count' interface */ UCLASS_MAILBOX, /* Mailbox controller */ UCLASS_MASS_STORAGE, /* Mass storage device */ UCLASS_MDIO, /* MDIO bus */ UCLASS_MDIO_MUX, /* MDIO MUX/switch */ UCLASS_MISC, /* Miscellaneous device */ UCLASS_MMC, /* SD / MMC card or chip */ UCLASS_MOD_EXP, /* RSA Mod Exp device */ UCLASS_MTD, /* Memory Technology Device (MTD) device */ UCLASS_NOP, /* No-op devices */ UCLASS_NORTHBRIDGE, /* Intel Northbridge / SDRAM controller */ UCLASS_NVME, /* NVM Express device */ UCLASS_P2SB, /* (x86) Primary-to-Sideband Bus */ UCLASS_PANEL, /* Display panel, such as an LCD */ UCLASS_PANEL_BACKLIGHT, /* Backlight controller for panel */ UCLASS_PCH, /* x86 platform controller hub */ UCLASS_PCI, /* PCI bus */ UCLASS_PCI_EP, /* PCI endpoint device */ UCLASS_PCI_GENERIC, /* Generic PCI bus device */ UCLASS_PHY, /* Physical Layer (PHY) device */ UCLASS_PINCONFIG, /* Pin configuration node device */ UCLASS_PINCTRL, /* Pinctrl (pin muxing/configuration) device */ UCLASS_PMIC, /* PMIC I/O device */ UCLASS_POWER_DOMAIN, /* (SoC) Power domains */ UCLASS_PWM, /* Pulse-width modulator */ UCLASS_PWRSEQ, /* Power sequence device */ UCLASS_RAM, /* RAM controller */ UCLASS_REGULATOR, /* Regulator device */ UCLASS_REMOTEPROC, /* Remote Processor device */ UCLASS_RESET, /* Reset controller device */ UCLASS_RNG, /* Random Number Generator */ UCLASS_RTC, /* Real time clock device */ UCLASS_SCSI, /* SCSI device */ UCLASS_SERIAL, /* Serial UART */ UCLASS_SIMPLE_BUS, /* Bus with child devices */ UCLASS_SMEM, /* Shared memory interface */ UCLASS_SOUND, /* Playing simple sounds */ UCLASS_SPI, /* SPI bus */ UCLASS_SPI_FLASH, /* SPI flash */ UCLASS_SPI_GENERIC, /* Generic SPI flash target */ UCLASS_SPMI, /* System Power Management Interface bus */ UCLASS_SYSCON, /* System configuration device */ UCLASS_SYSRESET, /* System reset device */ UCLASS_TEE, /* Trusted Execution Environment device */ UCLASS_THERMAL, /* Thermal sensor */ UCLASS_TIMER, /* Timer device */ UCLASS_TPM, /* Trusted Platform Module TIS interface */ UCLASS_UFS, /* Universal Flash Storage */ UCLASS_USB, /* USB bus */ UCLASS_USB_DEV_GENERIC, /* USB generic device */ UCLASS_USB_HUB, /* USB hub */ UCLASS_USB_GADGET_GENERIC, /* USB generic device */ UCLASS_VIDEO, /* Video or LCD device */ UCLASS_VIDEO_BRIDGE, /* Video bridge, e.g. DisplayPort to LVDS */ UCLASS_VIDEO_CONSOLE, /* Text console driver for video device */ UCLASS_VIDEO_OSD, /* On-screen display */ UCLASS_VIRTIO, /* VirtIO transport device */ UCLASS_W1, /* Dallas 1-Wire bus */ UCLASS_W1_EEPROM, /* one-wire EEPROMs */ UCLASS_WDT, /* Watchdog Timer driver */ UCLASS_COUNT, UCLASS_INVALID = -1, };
的外れな質問でしたら申し訳ございません。
ご回答よろしくお願いいたします。
at_dominique.m…
yasuda0108さん、
> 下記のimx8_ldb_enable()を使用するため、udevice *dev引数を用意する必要があり、
> uclass_first_device()にてudeviceを取得しようと考えております。
> uclass_first_device()は、uclass_idでデバイスを認識できるようなのですが、追加した「ldb」はuclass_idと紐づける事は可能でしょうか。
imx8_ldb_enable() は直接に呼ぶ関数ではなく、
DM で登録されたデバイスがあればコンフィグレーションにしたがって自動的に呼ばれます
(`struct dm_display_ops imx8_ldb_ops = { .enable = imx8_ldb_enable }` の部分から)
テスト用では、確かに uclass_*device* の関数でもらえますが、その時はドライバの登録の U_BOOT_DRIVER() の .id をみて、UCLASS_DISPLAY になりますね。DISPLAY を試しに enable しても、その後は多分使えないと思いますので、順番でみてみましょう。
* dts と c ファイルの "compatible" の部分が一致すれば、.probe() が自動的に呼ばれ、成功すればデバイスが作成されます。その probe() で printf を入れて、動作確認をすれば大丈夫でしたか? video の init が早すぎたら printf メッセージがまだ表示されない可能性もありますが、多分使えます。
* 次は恐らく UCLASS_VIDEO のデバイスを通す必要があると思います。
linux の imx8mp.dtsi を参考にしたら、ldb (lvds) の操作は「lcdif2」で行ってます。幸い、そちらは uboot でも実装していますので、dts と drivers/video/nxp/imx/imx_lcdifv3.c の compatible の部分だけ直せば使えると思います (de_invert だけ特別扱いありますが、uboot では display の DE flags をみてないので影響がないかもしれません)。CONFIG_VIDEO_IMX_LCDIFV3=yも必要です。
* ここまでくれば、common/stdio.c の共通コードで UCLASS_VIDEO のデバイスすべてを init して、 uclass_first_device(UCLASS_VIDEO)/uclass_next_device ですべてのビデオドライバを一回取得することで init されると思いますが、どうでしょうか?
そのすぐ後にsplash_displayでも使って画面に画像を移れるはずですが、ドライバに適合性が大丈夫でもすぐには使えないと思いますので、最初はドライバのどれかの probe, enable に printf を入れて、どこがどこから呼ばれるなどの確認してください。
申し訳ないですが、今ちょっとみただけで詳しくないところですので、何かを間違ったところもあるかもしれません。そこまでくればこちらで再現してみないと分からないところが多いです。
これからはあまり助言できないかもしれませんがまた何かあったらまた聞いてください。
よろしくお願いします。
yasuda0108
ご回答ありがとうございます。
いくつか質問がございますので、長文でお手数ですが、ご対応よろしくお願い致します。
>
> imx8_ldb_enable() は直接に呼ぶ関数ではなく、
> DM で登録されたデバイスがあればコンフィグレーションにしたがって自動的に呼ばれます
> (`struct dm_display_ops imx8_ldb_ops = { .enable = imx8_ldb_enable }` の部分から)
imx8_ldb_enable() の動作について、内容承知しました。
>
> テスト用では、確かに uclass_*device* の関数でもらえますが、その時はドライバの登録の U_BOOT_DRIVER() の .id をみて、UCLASS_DISPLAY になりますね。DISPLAY を試しに enable しても、その後は多分使えないと思いますので、順番でみてみましょう。
>
> * dts と c ファイルの "compatible" の部分が一致すれば、.probe() が自動的に呼ばれ、成功すればデバイスが作成されます。その probe() で printf を入れて、動作確認をすれば大丈夫でしたか? video の init が早すぎたら printf メッセージがまだ表示されない可能性もありますが、多分使えます。
dtsとcファイルの一致させるcompatibleですが、下記のような記述で問題ありませんでしょうか?
ちなみに、probe()にprintfを入れましたが、ログが出力されておりません。
#imx8_lvds.c static const struct udevice_id imx8_ldb_ids[] = { { .compatible = "fsl,imx8qm-ldb" }, { .compatible = "fsl,imx8qxp-ldb", .data = FLAG_COMBO, }, /* 追加 */ { .compatible = "fsl,imx8mp" }, /* 追加 */ { } }; #imx8mp.dtsi compatible引用箇所 // SPDX-License-Identifier: (GPL-2.0+ OR MIT) /* * Copyright 2019 NXP */ #include <dt-bindings/clock/imx8mp-clock.h> #include <dt-bindings/reset/imx8mq-reset.h> #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/input/input.h> #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/thermal/thermal.h> #include <dt-bindings/reset/imx8mp-mediamix.h> #include "imx8mp-pinfunc.h" / { compatible = "fsl,imx8mp"; 以下略
>
> * 次は恐らく UCLASS_VIDEO のデバイスを通す必要があると思います。
こちらは、UCLASS_DISPLAYではなく、UCLASS_VIDEOでよろしいのでしょうか?
>
> linux の imx8mp.dtsi を参考にしたら、ldb (lvds) の操作は「lcdif2」で行ってます。幸い、そちらは uboot でも実装していますので、dts と drivers/video/nxp/imx/imx_lcdifv3.c の compatible の部分だけ直せば使えると思います
ubootのdtsには「lcdif1」の記述しかありませんでしたので、linuxのimx8mp.dtsiを参考に、下記の通り記述をしておりますが問題ありませんでしょうか。
#linuxのdtsiを参考に、ubootのimx8mp.dtsiを作成 aliases { ethernet0 = &fec; ethernet1 = &eqos; [省略] spi0 = &flexspi; video0 = &lcdif1; /* 追加 */ video1 = &lcdif2; display0 = &ldb; /* 追加 */ }; [省略] /* 追加 */ display-subsystem { compatible = "fsl,imx-display-subsystem"; // ports = <&lcdif1_disp>, // <&lcdif2_disp>, // <&lcdif3_disp>; ports = <&lcdif2_disp>; }; /* 追加 */ [省略] lcdif1: lcd-controller@32e80000 { #address-cells = <1>; #size-cells = <0>; compatible = "fsl,imx8mp-lcdif1"; reg = <0x32e80000 0x10000>; clocks = <&clk IMX8MP_CLK_MEDIA_DISP1_PIX_ROOT>, <&clk IMX8MP_CLK_MEDIA_AXI_ROOT>, <&clk IMX8MP_CLK_MEDIA_APB_ROOT>; clock-names = "pix", "disp-axi", "disp-apb"; assigned-clocks = <&clk IMX8MP_CLK_MEDIA_DISP1_PIX>, <&clk IMX8MP_CLK_MEDIA_AXI>, <&clk IMX8MP_CLK_MEDIA_APB>; assigned-clock-parents = <&clk IMX8MP_VIDEO_PLL1_OUT>, <&clk IMX8MP_SYS_PLL2_1000M>, <&clk IMX8MP_SYS_PLL1_800M>; assigned-clock-rates = <594000000>, <500000000>, <200000000>; interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>; blk-ctl = <&mediamix_blk_ctl>; power-domains = <&mediamix_pd>; status = "disabled"; lcdif_disp0: port@0 { reg = <0>; lcdif_to_dsim: endpoint { remote-endpoint = <&dsim_from_lcdif>; }; }; }; /* linux imx8mp.dtsiのclocks = 部分をU-bootビルドが成立するよう変更し追加 */ lcdif2: lcd-controller@32e90000 { #address-cells = <1>; #size-cells = <0>; compatible = "fsl,imx8mp-lcdif2"; reg = <0x32e90000 0x10000>; clocks = <&clk IMX8MP_CLK_MEDIA_DISP2_PIX_ROOT>, <&clk IMX8MP_CLK_MEDIA_AXI_ROOT>, <&clk IMX8MP_CLK_MEDIA_APB_ROOT>; clock-names = "pix", "disp-axi", "disp-apb"; assigned-clocks = <&clk IMX8MP_CLK_MEDIA_DISP2_PIX>, <&clk IMX8MP_CLK_MEDIA_AXI>, <&clk IMX8MP_CLK_MEDIA_APB>; assigned-clock-parents = <&clk IMX8MP_VIDEO_PLL1_OUT>, <&clk IMX8MP_SYS_PLL2_1000M>, <&clk IMX8MP_SYS_PLL1_800M>; assigned-clock-rates = <0>, <500000000>, <200000000>; interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>; power-domains = <&mediamix_pd>; status = "disabled"; lcdif2_disp: port@0 { #address-cells = <1>; #size-cells = <0>; reg = <0>; lcdif2_disp_ldb_ch0: endpoint@0 { reg = <0>; remote-endpoint = <&ldb_ch0>; }; lcdif2_disp_ldb_ch1: endpoint@1 { reg = <1>; remote-endpoint = <&ldb_ch1>; }; }; }; /* 追加 */ mediamix_blk_ctl: blk-ctl@32ec0000 { compatible = "fsl,imx8mp-mediamix-blk-ctl", "syscon"; reg = <0x32ec0000 0x10000>; }; /*追加 */ ldb: ldb@32ec005c { #address-cells = <1>; #size-cells = <0>; compatible = "fsl,imx8mp-ldb"; clocks = <&clk IMX8MP_CLK_MEDIA_LDB_ROOT>; clock-names = "ldb"; assigned-clocks = <&clk IMX8MP_CLK_MEDIA_LDB>; assigned-clock-parents = <&clk IMX8MP_VIDEO_PLL1_OUT>; gpr = <&mediamix_blk_ctl>; power-domains = <&mediamix_pd>; status = "disabled"; lvds-channel@0 { #address-cells = <1>; #size-cells = <0>; reg = <0>; phys = <&ldb_phy1>; phy-names = "ldb_phy"; status = "disabled"; port@0 { reg = <0>; ldb_ch0: endpoint { remote-endpoint = <&lcdif2_disp_ldb_ch0>; }; }; }; lvds-channel@1 { #address-cells = <1>; #size-cells = <0>; reg = <1>; phys = <&ldb_phy2>; phy-names = "ldb_phy"; status = "disabled"; port@0 { reg = <0>; ldb_ch1: endpoint { remote-endpoint = <&lcdif2_disp_ldb_ch1>; }; }; }; }; ldb_phy: phy@32ec0128 { compatible = "fsl,imx8mp-lvds-phy"; #address-cells = <1>; #size-cells = <0>; gpr = <&mediamix_blk_ctl>; clocks = <&clk IMX8MP_CLK_MEDIA_APB_ROOT>; clock-names = "apb"; power-domains = <&mediamix_pd>; status = "disabled"; ldb_phy1: port@0 { reg = <0>; #phy-cells = <0>; }; ldb_phy2: port@1 { reg = <1>; #phy-cells = <0>; }; }; /* 追加 */ #armadillo_x2.dts追加部 /*追加*/ &ldb { status = "okay"; lvds-channel@0 { fsl,data-mapping = "spwg"; fsl,data-width = <24>; status = "okay"; /delete-node/ port@1; port@1 { reg = <1>; lvds_out: endpoint { remote-endpoint = <&panel_lvds_in>; }; }; }; }; &ldb_phy { status = "okay"; }; /*追加*/ #imx_lcdifv3.c compatible static const struct udevice_id lcdifv3_video_ids[] = { { .compatible = "fsl,imx8mp-lcdif1" }, /* 追加 */ { .compatible = "fsl,imx8mp" }, /* 追加 */ { /* sentinel */ } };
>
> (de_invert だけ特別扱いありますが、uboot では display の DE flags をみてないので影響がないかもしれません)。CONFIG_VIDEO_IMX_LCDIFV3=yも必要です。
de_invertについて、検索に引っかからなかったのですが、どこに記述がありますでしょうか?
>
> * ここまでくれば、common/stdio.c の共通コードで UCLASS_VIDEO のデバイスすべてを init して、 uclass_first_device(UCLASS_VIDEO)/uclass_next_device ですべてのビデオドライバを一回取得することで init されると思いますが、どうでしょうか?
こちらは、x2_defconfigにて、CONFIG_DM_VIDEO=yとすることで、common/stdio.cのUCLASS_VIDEOデバイスがinitされ、ビデオドライバの取得が実行される認識でよろしいでしょうか?
また、ビデオドライバが取得→initされることを確認する方法はございますでしょうか?
> そのすぐ後にsplash_displayでも使って画面に画像を移れるはずですが、ドライバに適合性が大丈夫でもすぐには使えないと思いますので、最初はドライバのどれかの probe, enable に printf を入れて、どこがどこから呼ばれるなどの確認してください。
こちらにつきましては、ドライバが正常に取得出来次第試してみます。
>
> 申し訳ないですが、今ちょっとみただけで詳しくないところですので、何かを間違ったところもあるかもしれません。そこまでくればこちらで再現してみないと分からないところが多いです。
> これからはあまり助言できないかもしれませんがまた何かあったらまた聞いてください。
>
> よろしくお願いします。
ご丁寧に助言頂き、大変ありがとうございます。
引き続きよろしくお願いいたします。
at_dominique.m…
yasuda0108さん、
> > * dts と c ファイルの "compatible" の部分が一致すれば、.probe() が自動的に呼ばれ、成功すればデバイスが作成されます。その probe() で printf を入れて、動作確認をすれば大丈夫でしたか? video の init が早すぎたら printf メッセージがまだ表示されない可能性もありますが、多分使えます。
>
> dtsとcファイルの一致させるcompatibleですが、下記のような記述で問題ありませんでしょうか?
はい、大丈夫そうです。
> ちなみに、probe()にprintfを入れましたが、ログが出力されておりません。
そこは気になりますね。
恐らくですが、以下に書いたように UCLASS_VIDEO のデバイスで DISPLAY を初期化するように見えるので、VIDEO デバイスがまだない状態で単に probe がまだ呼ばれてない可能性もあります。
> > * 次は恐らく UCLASS_VIDEO のデバイスを通す必要があると思います。
>
> こちらは、UCLASS_DISPLAYではなく、UCLASS_VIDEOでよろしいのでしょうか?
はい、みたところ splash のコードは VIDEO を使っていて、VIDEO が DISPLAY を使ってます。
> ubootのdtsには「lcdif1」の記述しかありませんでしたので、linuxのimx8mp.dtsiを参考に、下記の通り記述をしておりますが問題ありませんでしょうか。
実際にこちらで試してみないと何とも言えませんが、
- imx8mp.dtsi はよさそうだと思います。
- armadillo_x2.dts に panel_lvds_in を使ってますが、そちらも追加しましたか?後、linux の dts に lvds-reset もありますが、そのままコピーしても使われないと思いますが何か指定する必要がありそうですね…
- lcdifv3.cに追加するべき compatible は恐らく fsl,imx8mp-lcdif2 だと思います。
> > (de_invert だけ特別扱いありますが、uboot では display の DE flags をみてないので影響がないかもしれません)。CONFIG_VIDEO_IMX_LCDIFV3=yも必要です。
>
> de_invertについて、検索に引っかからなかったのですが、どこに記述がありますでしょうか?
linux のドライバ(drivers/gpu/imx/lcdifv3/lcdifv3-common.c) の .data をみて、lcdif1/2 の差をみただけです。
> こちらは、x2_defconfigにて、CONFIG_DM_VIDEO=yとすることで、common/stdio.cのUCLASS_VIDEOデバイスがinitされ、ビデオドライバの取得が実行される認識でよろしいでしょうか?
こちらで実行してないので確信がないですが、昨日みたところそう思うようになりました。
> また、ビデオドライバが取得→initされることを確認する方法はございますでしょうか?
printfを足してちゃんと順番通りに実行されてるかを確認するしかないですね…
(printf を使える確認のため、common/stdio.cやdrivers/core/{device,uclass}.cの方にもいくつか足してみてください。ドライバーモデルはデバグしにくいですが、順番で確認すれば一歩ずつ進めます…)
よろしくお願いします。
yasuda0108
ご回答ありがとうございます。
質問内容を記載しますので、ご確認よろしくお願い致します。
> > ちなみに、probe()にprintfを入れましたが、ログが出力されておりません。
>
> そこは気になりますね。
> 恐らくですが、以下に書いたように UCLASS_VIDEO のデバイスで DISPLAY を初期化するように見えるので、VIDEO デバイスがまだない状態で単に probe がまだ呼ばれてない可能性もあります。
printfでログを表示しておりましたが、CONFIG_DM_VIDEO=yとしても、関数内に入れていないようです。
こちらについて、何か解決方法はございますでしょうか。
〇x2_defconfig # 追加 CONFIG_BOOTDELAY=0 CONFIG_VIDEO_IMX8_LVDS=y CONFIG_DM_VIDEO=y CONFIG_POWER_DOMAIN=y CONFIG_IMX8=y CONFIG_VIDEO_IMX_LCDIFV3=y CONFIG_SPLASH_SOURCE=y CONFIG_SPLASH_SCREEN=y CONFIG_CMD_BMP=y 〇stdio.cソースコード [省略] /************************************************************************** * SYSTEM DRIVERS ************************************************************************** */ static void drv_system_init (void) { struct stdio_dev dev; /* 追加 */ printf("TEST drv_system_init\n"); /* 追加 */ [省略] #ifdef CONFIG_DM_VIDEO /** * stdio_probe_device() - Find a device which provides the given stdio device * * This looks for a device of the given uclass which provides a particular * stdio device. It is currently really only useful for UCLASS_VIDEO. * * Ultimately we want to be able to probe a device by its stdio name. At * present devices register in their probe function (for video devices this * is done in vidconsole_post_probe()) and we don't know what name they will * use until they do so. * TODO(sjg@chromium.org): We should be able to determine the name before * probing, and probe the required device. * * @name: stdio device name (e.g. "vidconsole") * id: Uclass ID of device to look for (e.g. UCLASS_VIDEO) * @sdevp: Returns stdout device, if found, else NULL * @return 0 if found, -ENOENT if no device found with that name, other -ve * on other error */ static int stdio_probe_device(const char *name, enum uclass_id id, struct stdio_dev **sdevp) { struct stdio_dev *sdev; struct udevice *dev; int seq, ret; /* 追加 */ printf("TEST config DM_VIDEO\n"); /* 追加 */ [省略] 〇Linux起動ログ [省略] Loading Environment from MMC... *** Warning - bad CRC, using default environment Fail to setup video link TEST splash_display TEST drv_system_init ← stdio.c内のログ表示。"TEST config DM_VIDEO\n"は出力されていない。 In: serial Out: serial Err: serial [省略] 〇menu config ┌──────────────────────────────────────────────── Search Results ─────────────────────────────────────────────────┐ │ Symbol: DM_VIDEO [=n] │ │ Type : bool │ │ Prompt: Enable driver model support for LCD/video │ │ Location: │ │ -> Device Drivers │ │ (1) -> Graphics support │ │ Defined at drivers/video/Kconfig:7 │ │ Depends on: DM [=y] │ │ Selected by [n]: │ │ - TARGET_KOSAGI_NOVENA [=n] && <choice> │ │ - VIDEO_DE2 [=n] && ARM [=n] && ARCH_SUNXI [=n] && SUNXI_DE2 [=n] │ │ Implied by [n]: │ │ - X86 [=n] && <choice> │ │ Symbol: VIDEO_IMX8_LVDS [=n] │ │ Type : bool │ │ Prompt: i.MX8 LDVS bridge support │ │ Location: │ │ -> Device Drivers │ │ (1) -> Graphics support │ │ Defined at drivers/video/nxp/imx/Kconfig:17 │ ※IMX8→IMX8MにKconfigを変更 │ Depends on: IMX8M [=n] && DM_VIDEO [=n] │ │ Selects: DISPLAY [=n] && VIDEO_LINK [=n]
>
> 実際にこちらで試してみないと何とも言えませんが、
> - imx8mp.dtsi はよさそうだと思います。
> - armadillo_x2.dts に panel_lvds_in を使ってますが、そちらも追加しましたか?
panel_lvds_inについて、下記の通り記述しておりますが問題ありませんでしょうか。
〇armadillo_x2.dts /* 追加 */ lvds_panel { compatible = "panel-lvds"; data-mapping = "vesa-24"; width-mm = <226>; height-mm = <128>; panel-timing { /* NL10276BC24-21 */ clock-frequency = <65000000>; hactive = <1024>; vactive = <768>; hfront-porch = <160>; hsync-len = <136>; hback-porch = <24>; vfront-porch = <3>; vsync-len = <6>; vback-porch = <29>; de-active = <1>; }; port { panel_lvds_in: endpoint { remote-endpoint = <&lvds_out>; }; }; }; /* 追加 */
>
> 後、linux の dts に lvds-reset もありますが、そのままコピーしても使われないと思いますが何か指定する必要がありそうですね…
現状lvds-resetについては、ビルドエラーとなりましたので、追加しておりませんが、追加が必要でしょうか。
> - lcdifv3.cに追加するべき compatible は恐らく fsl,imx8mp-lcdif2 だと思います。
>
> こちら変更致しました。
> printfを足してちゃんと順番通りに実行されてるかを確認するしかないですね…
> (printf を使える確認のため、common/stdio.cやdrivers/core/{device,uclass}.cの方にもいくつか足してみてください。ドライバーモデルはデバグしにくいですが、順番で確認すれば一歩ずつ進めます…)
かしこまりました。printfにてデバッグしながら進めていきます。
以上よろしくお願いいたします。
yasuda0108
前回質問時点からいくつか進展がありましたので補足致します。
CONFIG_DM_VIDEO=yとしても、関数内に入れていない件ですが、そもそもudevice devに、lcd関係の情報が入っていなかったようです。
imx8mp.dtsiのlcd関係のstatus="disable"をコメントアウトすることで、devの認識はなされました。
しかしながら、video_link.cのvideo_link_get_video_device()にてprobe video device failed, ret -19が出力されます。
err-19はENODEV /* No such device */のため、device_probe()にてデバイスがないとされているようです。
引き続きprintfにてデバッグ作業を実施していきますが、もし何かヒントになるような情報がありましたらお教えいただけると幸いです。
本件、前回および今回追記分の質問を、最終の質問といたします。
ご丁寧にご対応頂き誠にありがとうございました。
〇前回Linux起動ログ [省略] Loading Environment from MMC... *** Warning - bad CRC, using default environment Fail to setup video link ←video linkに失敗 TEST splash_display TEST drv_system_init ← stdio.c内のログ表示。"TEST config DM_VIDEO\n"は出力されていない。 [省略] 〇今回Linux起動ログ [省略] Loading Environment from MMC... *** Warning - bad CRC, using default environment name:lcd-controller@32e90000, driver_data:0, flags:80 [*]-Video Link 0 video_links:lcd-controller@32e90000 ← devの受け渡しは出来てそう? probe video device failed, ret -19 ← video_link_get_video_device()のログ。device_prove()で失敗しENODEVの戻り値。 [0] lcd-controller@32e90000, video ←list_videolink()のログ [省略] 〇list_videolink() static void list_videolink(bool current_only) { ulong index = 0; int j; bool match; /* dump the link */ debug("video link number: %lu\n", video_links_num); for (index = 0; index < video_links_num; index ++) { match = false; if (curr_video_link == index) match = true; else if (current_only) continue; printf("[%c]-Video Link %lu", (match)? '*':' ', index); if (match) { struct udevice *video_dev = video_link_get_video_device(); if (video_dev) { printf(" (%u x %u)", video_get_xsize(video_dev), video_get_ysize(video_dev)); } } printf("\n"); for (j = 0; j < video_links[index].dev_num; j++) { printf("\t[%d] %s, %s\n", j, video_links[index].link_devs[j]->name, dev_get_uclass_name(video_links[index].link_devs[j])); } } } 〇video_link_get_video_device() struct udevice *video_link_get_video_device(void) { int ret; if (video_off) return NULL; if (curr_video_link >= video_links_num) return NULL; if (video_links[curr_video_link].dev_num == 0) return NULL; ret = device_probe(video_links[curr_video_link].link_devs[0]); if (ret) { /* 追記 */ printf("\nvideo_links:%s\n", video_links[curr_video_link].link_devs[0]->name); /* 追記 */ printf("\nprobe video device failed, ret %d\n", ret); return NULL; } return video_links[curr_video_link].link_devs[0]; }
at_dominique.m…
yasuda0108さん、
お世話になっています。マルティネです。
順番で答えさせていただきます。
> panel_lvds_inについて、下記の通り記述しておりますが問題ありませんでしょうか。
申し訳ないですが、これも実際に試してみないと何ともいえません。
これで問題点は見てないですが、とりあえず何かが必要と思いました:lvds-channel@0 の「remote-endpoint」として使われてる以上、drivers/video/video_link.c の video_link_add_node に使われてると思いますので、何も設定されてない場合に使用できないかと思いました。
> lvds-reset[の]追加が必要でしょうか。
結果的に必要かどうかは分かりませんが、gpio3_00のピンに操作が必要かもしれないと言う注意だけのつもりでした。
Linux ではこのブロックで起動時一回リセットされるようになってますので、単にgpioとしてでも panel を ON にするが必要だと思いました。
そうですね、他のデバイスを参考にしたら、board/freescale/imx8qm_mek/imx8qm_mek.c の lvds_enable が一番近いではないでしょうか?
> CONFIG_DM_VIDEO=yとしても、関数内に入れていない件ですが、そもそもudevice devに、lcd関係の情報が入っていなかったようです。
> imx8mp.dtsiのlcd関係のstatus="disable"をコメントアウトすることで、devの認識はなされました。
なるほど。この場合は imx8mp.dtsi から disable を削除するのではなく、armadillo_x2.dts の方にノードを入れて status = "okay"にしますが結果的に同じです。
Linux の armadillo_iotg_g4.dts を参考にしたら以下の部分ですね:
&lcdif2 { status = "okay"; }
> しかしながら、video_link.cのvideo_link_get_video_device()にてprobe video device failed, ret -19が出力されます。
> err-19はENODEV /* No such device */のため、device_probe()にてデバイスがないとされているようです。
> 引き続きprintfにてデバッグ作業を実施していきますが、もし何かヒントになるような情報がありましたらお教えいただけると幸いです。
そうですね、 imx_lcdifv3.c の lcdifv3_video_probe をみたら失敗するときに必ず printf や dev_err でログを残すはずですが、video_link_get_video_deviceのログだけが表示されてますので別のところで失敗しますね。
clock や power domain も probe_device() に init されますので、また printf で probe_device のどの部分が失敗するのを確認してみてください。
特定できればこれも一歩ずつ対応するしかないですね…
> TEST drv_system_init ← stdio.c内のログ表示。"TEST config DM_VIDEO\n"は出力されていない。
そうですね、その時はシリアルコンソールがまだなさそうです。stdio_add_devices() でさえ出力ができたら大丈夫と思いますが、
ログまだできない時にメッセージを表示必要があれば arch/arm/mach-k3/common.c の early_console_init() を真似すれば何とかなるかもしれません?
本来であればその場合に JTAG が必要になると思いますが、ビデオのためには必要ないはずです。(必要の場合は CON7 に出してますが、簡単に使えないのでおすすめしません。printf ができる範囲は printf で見ましょう)
> 本件、前回および今回追記分の質問を、最終の質問といたします。
> ご丁寧にご対応頂き誠にありがとうございました。
最後まで対応できなくてすみません。
これからは printf の引き続きのと、imx8qm を参考にできればと思います。こちらで動作確認を行ったことはないですが、NXP
のフォーラムをみたら動いてるそうです:
https://community.nxp.com/t5/i-MX-Processors/iMX8-Problems-bringing-up-…
説明した通り,lvds_enable 以外は完全に自動です:
- configs/imx8qm_mek_defconfig にドライバが有効になっていて、
- dts (arch/arm/dts/fsl-imx8qm-mek.dts + arch/arm/dts/fsl-imx8qm.dtsi) の "compatible" の部分でそのドライバがロードされて、
- stdio/splash で使用可能になっていると思います。
動作できましたらぜひ教えてください!
よろしくお願いします。
yasuda0108
お世話になっております。
LVDSを使用したU-boot起動の件、別開発案件にて保留しておりましたが、
先日開発を再開し、無事起動時の画面描画が出来ました!
添付のpatchファイルにて、情報共有させて頂きます。
また、画面起動について、いくつか質問がございます。
もし開発のヒントになるような情報をご存知でしたらお教え頂ますと幸いです。
【現在の起動状況】
①0s : 電源ON
②1s~3s : U-BOOTにてLCDにロゴを表示
③3s~4s : Starting kernel ... 時点でロゴ消灯
④4s~10s : 画面左上に白色バーが点滅表示
⑤10s~ : コンテナAPP起動によりLCD表示
⑥12s : armadillo loginコンソールが表示されるタイミングでLCDにも一瞬loginコンソールが表示される
【質問内容】
・U-BOOTにてLVDS LCD表示後、③でロゴが消灯しますが、こちらのロゴを表示させ続けることは可能なのでしょうか?
・ロゴが消灯する際に、ロゴの消え方がじわっと消えるのですが(0.5sくらいかけて消えていくイメージ)、すぐに消灯させる方法はありますでしょうか?
・④にて左上に白色バーが表示されますが、こちらの内容を変更することは可能でしょうか?
※例えば、白色バーが画面右方向増えていって、ロード中のような表示になる等々
・⑥について、ATDEコンソール上でWelcome to ~ armadillo login:が表示されるタイミングで、LCDにも一瞬Welcome to ~ armadillo login:の文字が表示されてしまいます。
こちらを表示しないようにする方法はありますでしょうか?
お忙しいところ恐縮ですが、よろしくお願いいたします。
ファイル | ファイルの説明 |
---|---|
U-BOOT-LVDS.patch |
at_dominique.m…
yasuda0108さん、
お世話になっています。
> LVDSを使用したU-boot起動の件、別開発案件にて保留しておりましたが、
> 先日開発を再開し、無事起動時の画面描画が出来ました!
> 添付のpatchファイルにて、情報共有させて頂きます。
できましたね!おめでとうございます(であってるかどうかは分かりませんが、よかったです。)
パッチもありがとうございます。今のところは取り入れることも難しいですので約束はできませんが、時間を見つけたら取り入れたいと思います。
> また、画面起動について、いくつか質問がございます。
> もし開発のヒントになるような情報をご存知でしたらお教え頂ますと幸いです。
これも、試さないと分からない項目が多いですが、できる範囲で答えさせていただきます。
> 【現在の起動状況】
> ①0s : 電源ON
> ②1s~3s : U-BOOTにてLCDにロゴを表示
> ③3s~4s : Starting kernel ... 時点でロゴ消灯
> ④4s~10s : 画面左上に白色バーが点滅表示
> ⑤10s~ : コンテナAPP起動によりLCD表示
> ⑥12s : armadillo loginコンソールが表示されるタイミングでLCDにも一瞬loginコンソールが表示される
>
> 【質問内容】
> ・U-BOOTにてLVDS LCD表示後、③でロゴが消灯しますが、こちらのロゴを表示させ続けることは可能なのでしょうか?
対象がちょっと違いますが、NXPのフォーラムではlinuxを起動させるときに lcdif の電源を落とすように見えます:
https://community.nxp.com/t5/i-MX-Processors/How-to-keep-logo-from-uboo…
そちらのパッチが使えないですが、 drivers/video/nxp/imx/imx_lcdifv3.c の lcdifv3_video_remove() から lcdifv3_power_down を外せばどうにかなりますか?
> ・ロゴが消灯する際に、ロゴの消え方がじわっと消えるのですが(0.5sくらいかけて消えていくイメージ)、すぐに消灯させる方法はありますでしょうか?
これは恐らく同じものだと思いますが、lcdifv3の電源だけではなかったら綺麗に黒い画像を表示できると思います。できれば表示されるままがいいんですが、どうしてもできなかったら bmp というコマンドを booti の前に実行すれば画面を黒くできます。電源の操作も出きるかもしれません。あまりおすすめできないので、とりあえず消さない方法を探しましょう…
> ・④にて左上に白色バーが表示されますが、こちらの内容を変更することは可能でしょうか?
> ※例えば、白色バーが画面右方向増えていって、ロード中のような表示になる等々
これはなんでしょうね。linux が tux(ペンギン)のロゴを表示する時でしょうか?それであればロゴの変更は可能ですが、そもそもコンソールを表示させない方がいいでしょうね。
https://developer.toradex.com/linux-bsp/how-to/boot/splash-screen-on-th…
によると、とりあえずoptargs に vt.global_cursor_default=0 を足せば多少よくなるかもしれません。
console の部分はすでに console=ttymxc1,115200 になってるはずですので、dmesg などのカーネルメッセージが表示されないはずです。
> ・⑥について、ATDEコンソール上でWelcome to ~ armadillo login:が表示されるタイミングで、LCDにも一瞬Welcome to ~ armadillo login:の文字が表示されてしまいます。
> こちらを表示しないようにする方法はありますでしょうか?
こちらは /etc/inittab から tty1::respawn:/sbin/getty の行を消せば表示されなくなると思います。
よろしくお願いします。
yasuda0108
> できましたね!おめでとうございます(であってるかどうかは分かりませんが、よかったです。)
ありがとうございます!
質問内容について、ご回答誠にありがとうございます。
下記件試みております中で、いくつか質問があります。
> > 【質問内容】
> > ・U-BOOTにてLVDS LCD表示後、③でロゴが消灯しますが、こちらのロゴを表示させ続けることは可能なのでしょうか?
>
> 対象がちょっと違いますが、NXPのフォーラムではlinuxを起動させるときに lcdif の電源を落とすように見えます:
> https://community.nxp.com/t5/i-MX-Processors/How-to-keep-logo-from-uboo…
>
> そちらのパッチが使えないですが、 drivers/video/nxp/imx/imx_lcdifv3.c の lcdifv3_video_remove() から lcdifv3_power_down を外せばどうにかなりますか?
>
lcdifv3_power_downをコメントアウトしましたが、ロゴは消灯しました。
但し、ロゴがじわっと消える件はこれで解消されました。
また、 lcdifv3_video_remove() のlcdifv3_power_downと併せてdevice_removeもコメントアウトしてみましたが、ロゴは消灯しました。
> これはなんでしょうね。linux が tux(ペンギン)のロゴを表示する時でしょうか?それであればロゴの変更は可能ですが、そもそもコンソールを表示させない方がいいでしょうね。
>
> https://developer.toradex.com/linux-bsp/how-to/boot/splash-screen-on-th…
>
> によると、とりあえずoptargs に vt.global_cursor_default=0 を足せば多少よくなるかもしれません。
>
vt.global_cursor_default=0を追加することで、白色バー点滅がtuxの表示に変わりました。
こちらの追加に伴って、起動ログのquietが無効となってしまいました。
optargsに追加する際の記述方法はどのような形になりますでしょうか?
以下現状追加した記述内容です。
"optargs=quiet; vt.global_cursor_default=0\0" /* addition */\
> こちらは /etc/inittab から tty1::respawn:/sbin/getty の行を消せば表示されなくなると思います。
上記対応でloginちらつきは解消されました。
こちらについては、下記の通りswuに組み込めば良いでしょうか?
'atmark@atde9:~/mkswu$ tree test test └── etc └── inittab #desc swdesc_files --extra-os test
以上よろしくお願いします。
at_dominique.m…
> optargsに追加する際の記述方法はどのような形になりますでしょうか?
> 以下現状追加した記述内容です。
> "optargs=quiet; vt.global_cursor_default=0\0" /* addition */\
linux カーネルのコマンドラインはスペースで parsing されてますので、「optargs=quiet vt.global_cursor_default=0\0」で正しく動くと思います。
あの「;」でquietを認めてくれなかったと思います。
> 上記対応でloginちらつきは解消されました。
> こちらについては、下記の通りswuに組み込めば良いでしょうか?
> 'atmark@atde9:~/mkswu$ tree test > test > └── etc > └── inittab > > #desc > swdesc_files --extra-os test
そうですね、これでファイルを送る分には問題ないです。
ただし、 /etc/inittab も baseos のファイルなので、アップデートの際にデフォルトに戻ります。
この対応はややっこしいですみませんが、「/usr/share/mkswu/examples/kernel_update_plain.desc」を参考にできると思います
試してませんですが、以下の変更で /etc/swupdate_preserve_files に追加されるはずです。
$ cp /usr/share/mkswu/examples/update_preserve_files.sh . #desc swdesc_files --extra-os test swdesc_script --extra-os update_preserve_files.sh -- \ "POST /etc/inittab"
yasuda0108
ご回答ありがとうございます。
> linux カーネルのコマンドラインはスペースで parsing されてますので、「optargs=quiet vt.global_cursor_default=0\0」で正しく動くと思います。
> あの「;」でquietを認めてくれなかったと思います。
スペースを使用するのですね。
下記の通り変更しましたら、白色バー点滅は無くなりましたが、tuxの表示も消えてしまいました。
"optargs=quiet vt.global_cursor_default=0\0" /* addition */\
ログのOpenRC 0.44.7.10dab8bfb7~以降(約5s~10s)の挙動ですが、以下の通りになっています。
#① OpenRC~ 白色バー点滅・quiet有効 "optargs=quiet\0"\ #② OpenRC~ tux表示・quiet無効 #記述ミス版 vt.gloval~のみ認識? "optargs=quiet; vt.global_cursor_default=0\0" /* addition */\ #③ OpenRC~ 白色バー消灯にて画面表示何もなし・quiet有効 "optargs=quiet vt.global_cursor_default=0\0" /* addition */\
②のように、Starting Kernel …終了後OpenRC~ 画像表示され、かつ起動ログがquietの状態が理想的です。
以前お教えいただいたsplash.ppmの方法での表示を試してみようと思います。
何か情報がありましたらご連絡お願い致します。
> そうですね、これでファイルを送る分には問題ないです。
> ただし、 /etc/inittab も baseos のファイルなので、アップデートの際にデフォルトに戻ります。
> この対応はややっこしいですみませんが、「/usr/share/mkswu/examples/kernel_update_plain.desc」を参考にできると思います
>
> 試してませんですが、以下の変更で /etc/swupdate_preserve_files に追加されるはずです。
>
> $ cp /usr/share/mkswu/examples/update_preserve_files.sh . > > #desc > swdesc_files --extra-os test > swdesc_script --extra-os update_preserve_files.sh -- \ > "POST /etc/inittab" >
>
承知しました。
お教えいただいた方法で、試してみます。
yasuda0108
連投失礼いたします。
> ②のように、Starting Kernel …終了後OpenRC~ 画像表示され、かつ起動ログがquietの状態が理想的です。
> 以前お教えいただいたsplash.ppmの方法での表示を試してみようと思います。
こちらにつきまして、fbsplashの仕組みを使用することで、求めていた起動の状態にすることが出来ました。
【現状の起動状態】
①0s : 電源ON
②1s~4.5s : U-BOOTにてLCDにロゴを表示
※lcdifv3_video_remove()のコメントアウトによって、Starting kernel ...以降もしばらくロゴ表示され、時間が3s→4.5sに伸びています。
③4.5s~6s :消灯
④6s~10s : fbsplash表示
⑤10s~ : containerAPP実行 APP画面表示
違和感なく起動できるようになりましたので、起動画面に関しましてはこちらの内容で行きたいと思います。
追加で一点質問があります。
・fbsplashに関しての情報保存は下記のイメージでしょうか?
#永続化内容 persist_file -vP /etc/init.d/fbsplash /boot/splash.ppm /etc/runlevels/sysinit/fbsplash atmark@atde9:~$ tree test test ├── boot │ └── splash.ppm └── etc ├── atmark │ └── containers │ └── auto.conf └── etc ├── inittab ├── init.d │ └── fbsplash └── runlevels └── sysinit └── fbsplash #desc swdesc_files --extra-os test $ cp /usr/share/mkswu/examples/update_preserve_files.sh . #desc swdesc_files --extra-os test swdesc_script --extra-os update_preserve_files.sh -- \ "POST /etc/inittab" \ "POST /boot/splash.ppm" \ # その他パスも追加 # 正式な記述方法をお教え頂ければ幸いです。
yasuda0108
下記の方法を試す中で、「ERROR: ソースファイル update_preserve_files.sh が存在しません。」とエラーが発生しました。
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
update_preserve_files.shはどこにありますでしょうか?
yasuda0108
度々連投失礼致します。
update_preserve_files.shですが、/usr/share/mkswu/examples/ から取得できました。
大変失礼いたしました。
初期化後、下記の通りアップデートをかけましたが、fbsplashが起動しません。
各ディレクトリには保存できているようですが。。何か原因はわかりますでしょうか。
#desc swdesc_files --extra-os start swdesc_script --extra-os update_preserve_files.sh -- \ "POST /boot/splash.ppm" \ "POST /etc/inittab" \ "POST /etc/init.d/fbsplash" \ "POST /etc/runlevels/sysinit/fbsplash" \ "POST /etc/atmark/containers/qt-auto.conf" \ #アップデート後の各種ファイル状態 armadillo:~# cat /etc/init.d/fbsplash #!/sbin/openrc-run name="splash screen" start() { fbsplash -s /boot/splash.ppm } armadillo:~# cat /etc/runlevels/sysinit/fbsplash #!/sbin/openrc-run name="splash screen" start() { fbsplash -s /boot/splash.ppm } armadillo:~# ls /boot Image armadillo_iotg_g4-nousb.dtbo armadillo.dtb armadillo_iotg_g4-sw1-wakeup.dtbo armadillo_iotg_g4-at-dtweb.dtb armadillo_iotg_g4.dtb armadillo_iotg_g4-con10-arducam.dtbo splash.ppm armadillo_iotg_g4-con10-imx219.dtbo imx8mp-evk.dtb armadillo_iotg_g4-con10-ox01f10.dtbo yakushima-eva.dtb armadillo_iotg_g4-lte-ext-board.dtbo
at_dominique.m…
yasuda0108さん
> 下記の方法を試す中で、「ERROR: ソースファイル update_preserve_files.sh が存在しません。」とエラーが発生しました。
ご自分で分りましたが、確かにマニュアルにコピーのことを書いていませんですね。指摘ありがとうございます、今後のアップデートで修正します。
> 初期化後、下記の通りアップデートをかけましたが、fbsplashが起動しません。
> 各ディレクトリには保存できているようですが。。何か原因はわかりますでしょうか。
以下の内容であれば起動するはずですね。
いくつか確認してもらえますか?
(実行権利の確認) # ls -l /etc/init.d/fbsplash /etc/runlevels/sysinit/fbsplash /sbin/fbsplash (起動しようとしたが失敗しなかったかの確認) # rc-status -a | grep fbsplash (試し起動) # podman stop -a # rc-service fbsplash restart
よろしくお願いします
yasuda0108
下記の通りコマンド試してみました。
ご確認よろしくお願い致します。
armadillo:~# ls -l /etc/init.d/fbsplash /etc/runlevels/sysinit/fbsplash /sbin/fbsplash -rw-r--r-- 1 root root 90 Jan 1 1970 /etc/init.d/fbsplash -rw-r--r-- 1 root root 90 Jan 1 1970 /etc/runlevels/sysinit/fbsplash lrwxrwxrwx 1 root root 12 Apr 27 2022 /sbin/fbsplash -> /bin/busybox #何も表示なし armadillo:~# rc-status -a | grep fbsplash armadillo:~# #APP停止 armadillo:~# podman stop -a 4b9e367370361ee69f9e0cb90e0e724047d4c845a80e3007f571fd6930622f05 #メッセージが表示され、特に画面に変化なし armadillo:~# rc-service fbsplash restart * rc-service: Permission denied
at_dominique.m…
> armadillo:~# ls -l /etc/init.d/fbsplash /etc/runlevels/sysinit/fbsplash /sbin/fbsplash > -rw-r--r-- 1 root root 90 Jan 1 1970 /etc/init.d/fbsplash > -rw-r--r-- 1 root root 90 Jan 1 1970 /etc/runlevels/sysinit/fbsplash
問題はこちらですね。
最後の rc-service にも「permission denied」でエラーしますが、本来であればこういう風になってるはずです(違うサービスですが)
armadillo:~# ls -l /etc/init.d/podman-atmark /etc/runlevels/default/podman-atmark -rwxr-xr-x 1 root root 679 Jun 24 13:00 /etc/init.d/podman-atmark lrwxrwxrwx 1 root root 25 Jul 3 08:40 /etc/runlevels/default/podman-atmark -> /etc/init.d/podman-atmark
試しに、手動で直したら動くかどうかを確認してもらえますか?
- /etc/init.d の方に「 chmod +x /etc/init.d/fbsplash 」で rc-service のコマンドを実行できるようになります
- 「 rc-update del fbsplash sysinit; rc-update add fbplash sysinit 」で /etc/runlevels の方を直せます
- 「 persist_file /etc/init.d/fbsplash /etc/runlevels/sysinit/fbsplash 」で保存します
そこで、原因なんですが、swdesc_files でファイルを転送する場合に ATDE のディレクトリの制限をこのまま使ってますので、
ATDEでも直して mkswu を再び実行すれば使えるようになります(同じArmadilloに試したい場合にバージョンも上げてください)
init.dの方も「 chmod +x 」でいいんですが、runlevelsの方は作り直しましょう:「 rm -f /etc/runlevels/sysinit/fbsplash; ln -s /etc/init.d/fbsplash /etc/runlevels/sysinit/fbsplash 」
ファイルを Armadillo からコピーした時にどうコピーしましたか?
USB メモリを使ってコピーする場合に tar アーカイブに入れておいた方がいいかもしれません。(ネットワークの場合に scp で保存されるはずです)
よろしくお願いします。
yasuda0108
ご回答ありがとうございます。
ATDEで作成した権限情報を引き継ぐ仕様なのですね。
内容承知いたしました。
ご教示頂いた方法で修正しましたが、アップデートに失敗してしまいます。
ln -s シンボリックリンクの指定が上手くいっていないことが原因だと考えられますが、、
解決方法はありますでしょうか?
以下詳細です。
#ATDEにて権限付与とシンボリックリンク作成 atmark@atde9:~/mkswu/start$ ls -l etc/init.d/fbsplash etc/runlevels/sysinit/fbsplash ←/etcとしたいが出来ない。。 -rwxr-xr-x 1 atmark atmark 90 1月 1 1980 etc/init.d/fbsplash lrwxrwxrwx 1 atmark atmark 19 7月 11 09:34 etc/runlevels/sysinit/fbsplash -> etc/init.d/fbsplash #ボードswuアップデート後 fbsplash起動失敗 armadillo:~# ls -l /etc/init.d/fbsplash /etc/runlevels/sysinit/fbsplash -rwxr-xr-x 1 root root 90 Jan 1 1970 /etc/init.d/fbsplash lrwxrwxrwx 1 root root 19 Jan 1 1970 /etc/runlevels/sysinit/fbsplash -> etc/init.d/fbsplash ←/etcとなるべきでは #手動rc-update add後、再起動 fbsplash起動成功 armadillo:~# ls -l /etc/init.d/fbsplash /etc/runlevels/sysinit/fbsplash -rwxr-xr-x 1 root root 90 Jan 1 09:03 /etc/init.d/fbsplash lrwxrwxrwx 1 root root 20 Jan 1 09:11 /etc/runlevels/sysinit/fbsplash -> /etc/init.d/fbsplash #desc内容 swdesc_embed_container "moni_v012.tar" swdesc_files --extra-os start swdesc_script --extra-os update_preserve_files.sh -- \ POST /boot/splash.ppm \ POST /etc/inittab \ POST /etc/init.d/fbsplash \ POST /etc/runlevels/sysinit/fbsplash \ POST /etc/atmark/containers/qt-auto.conf \
at_dominique.m…
yasuda0108さん、
> ご教示頂いた方法で修正しましたが、アップデートに失敗してしまいます。
> ln -s シンボリックリンクの指定が上手くいっていないことが原因だと考えられますが、、
> 解決方法はありますでしょうか?
>
>
> #ATDEにて権限付与とシンボリックリンク作成 > atmark@atde9:~/mkswu/start$ ls -l etc/init.d/fbsplash etc/runlevels/sysinit/fbsplash ←/etcとしたいが出来ない。。 > -rwxr-xr-x 1 atmark atmark 90 1月 1 1980 etc/init.d/fbsplash > lrwxrwxrwx 1 atmark atmark 19 7月 11 09:34 etc/runlevels/sysinit/fbsplash -> etc/init.d/fbsplash
お察しの通り、/ を含めて /etc/init.d/fbsplash へのリンクにしないと Armadillo に転送された時に /etc/runlevels/sysinit/etc/init.d/fbsplash を探すことになって、失敗します。
こちらで試しましたが、問題なくアップデートを作成できましたので、なぜできないかとを詳しく教えていただけませんでしょうか?
以下はこちらで試したコンソールログです。
atmark@atde9:~$ cd mkswu/ atmark@atde9:~/mkswu$ mkdir test atmark@atde9:~/mkswu$ cd test/ atmark@atde9:~/mkswu/test$ mkdir -p files/etc/runlevels/sysinit/ atmark@atde9:~/mkswu/test$ ln -s /etc/init.d/fbsplash files/etc/runlevels/sysinit/ atmark@atde9:~/mkswu/test$ ls -l files/etc/runlevels/sysinit/fbsplash lrwxrwxrwx 1 atmark atmark 20 7月 11 10:44 files/etc/runlevels/sysinit/fbsplash -> /etc/init.d/fbsplash # こちらは赤く表示されてますが、大丈夫です。ATDEでリンク先が存在しないだけの情報です。 atmark@atde9:~/mkswu/test$ mkdir files/etc/init.d atmark@atde9:~/mkswu/test$ echo test > files/etc/init.d/fbsplash atmark@atde9:~/mkswu/test$ cat > test.desc swdesc_option version=1 swdesc_files --extra-os files atmark@atde9:~/mkswu/test$ mkswu test.desc test.swu を作成しました。 atmark@atde9:~/mkswu/test$ tar -tvf .test/files____728c08f5c5c6d87d5df98593a44b30a0fa0830b9.tar drwxr-xr-x atmark/atmark 0 2022-07-11 10:44 ./ drwxr-xr-x atmark/atmark 0 2022-07-11 10:44 ./etc/ drwxr-xr-x atmark/atmark 0 2022-07-11 10:44 ./etc/runlevels/ drwxr-xr-x atmark/atmark 0 2022-07-11 10:44 ./etc/runlevels/sysinit/ lrwxrwxrwx atmark/atmark 0 2022-07-11 10:44 ./etc/runlevels/sysinit/fbsplash -> /etc/init.d/fbsplash drwxr-xr-x atmark/atmark 0 2022-07-11 10:44 ./etc/init.d/ -rw-r--r-- atmark/atmark 5 2022-07-11 10:44 ./etc/init.d/fbsplash
よろしくお願いします。
yasuda0108
お教えいただいた内容でアップデート成功しました。
初歩的なミスで失敗しておりました。失礼いたしました。。。
#ディレクトリの指定でエラー atmark@atde9:~/mkswu/test$ ln -s /etc/init.d/fbsplash /etc/runlevels/sysinit/ #私の修正ミス(-s 次の第一引数の/etcも、/を外す必要があると考えてしまっておりました。) atmark@atde9:~/mkswu/test$ ln -s etc/init.d/fbsplash etc/runlevels/sysinit/ #成功パターン atmark@atde9:~/mkswu/test$ ln -s /etc/init.d/fbsplash etc/runlevels/sysinit/
アップデートが成功しましたので、おかげさまで、OS起動に関する開発が無事終了となりました。
大変ご丁寧にご対応頂き、誠にありがとうございました!
引き続きよろしくお願いいたします。
at_dominique.m…
2022年4月19日 18時03分
yasuda0108さん、
お世話になっています。
そうですね、私も、起動時間が長いと思っていました。
今推測したら、以下の時間隊になっています(大幅):
on: 0
uboot prompt ("Hit any key to stop autoboot"): 2s
linux ("Starting kernel..."): 5s
baseos start ("OpenRC ... is starting up Linux"): 10s
container start ("podman-atmark | [ok]"): 15s
uboot の promptまでにあまり設定の余地がないので、このままにします。
Starting kernelまでのほぼの時間はpromptの待ってる2秒がほとんどで、imx-boot/uboot-imx/configs/x2_defconfigに「CONFIG_BOOTDELAY=0」を設定すればスキップされます。
公式バージョンでdelayがないと使いにくいとおもいますので、恐らくそのままになってしまいますがチームで話します。対応が決まったらまた連絡します。
次に、baseos startまでの5秒の半分ぐらいはシリアルのメッセージの量の影響で遅くなりますので、ubootでsetenv optargs quiet; saveenv(更新したらコードで更新の必要があります)で2.5秒ぐらい早くなります。
こちらはデフォルトにしようと思いますが、同じく後ほど連絡します。
このステップでこれ以上の早くするには機能を無効にするしかないと思うので、すぐにできません。
(いずれやりたいと思います)
最後にinitが起動してから、コンテナの立ち上がる時間までですが、すでにrc_parallelを有効にしたので簡単な設定はないですね…
少しみたらudevとpodman自体も遅いように見えますが、そちらはもうちょっと時間かけて改善したいと思います。
よろしくお願いします。