shimomura2025
2025年8月29日 15時40分
いつもお世話になっております。下村と申します。
現在、Armadillo-X2上でGUIアプリケーションの開発を進めております。コンテナ環境でwestonを用いてディスプレイサーバを起動し、GUIを表示していますが、タッチ操作にズレが生じているため、キャリブレーションの対応を行っています。
ディスプレイ・タッチパネルの環境について
使用しているディスプレイは「TSC-50 DMC」で、抵抗皮膜のタッチパネルです。
当初、デフォルトのカーネルではタッチパネルが認識されませんでしたが、USB Touchscreen Driverを有効にしてカーネルを再ビルドすることで、タッチが正常に認識されるようになりました。
キャリブレーション方法について
タッチパネルのベンダーにもキャリブレーション方法を確認したところ、「Linux標準のパッケージを利用してキャリブレーションを行うように」と案内されました。そのため、現在はwestonの機能とudevルールを組み合わせてキャリブレーションを行っています。
現状の課題
weston-touch-calibratorコマンドでキャリブレーション自体は成功し、一時的にタッチのズレが解消されますが、コンテナやwestonの再起動を行うと設定が消えてしまい、再びタッチのズレが発生します。westonの起動ログを見ると、入力デバイスと出力の紐付けが遅れることでキャリブレーションがスキップされているようです。
westonの起動ログ
[02:01:07.010] input device event2 has no enabled output associated (none named), skipping calibration for now. ... [02:01:07.072] associating input device event2 with output HDMI-A-1 (none by udev)
起動直後は入力デバイスと出力の紐付けができておらず、キャリブレーションがスキップされています。その後、紐付けが完了しますが、キャリブレーションは適用されないままです。
現状の設定内容
- weston.ini
[libinput]セクションでtouchscreen_calibrator=true、save-calibration.shを設定
[output]セクションでtouch-deviceやcalibration値を指定
- Dockerfile
touchscreen.rulesとsave-calibration.shをコンテナ内に配置
- touchscreen.rules
キャリブレーションマトリクスを記述
- save-calibration.sh
キャリブレーション値をtouchscreen.rulesに書き込み、udevをリロード
(各設定内容は末尾に添付しております)
ご相談事項
- westonの仕様上、起動時に入力デバイスと出力の紐付けが遅れることでキャリブレーションがスキップされているようですが、Armadillo-X2でキャリブレーション設定を永続化する方法や、weston起動時に確実にキャリブレーションを適用する方法がございましたらご教示いただけますと幸いです。
- 他に推奨されるキャリブレーション方法や設定手順がございましたら、併せてご案内いただけますと助かります。
ご多忙のところ恐縮ですが、何卒よろしくお願いいたします。
参考情報
https://wiki.st.com/stm32mpu/wiki/How_to_calibrate_the_touchscreen
https://stackoverflow.com/questions/67162466/where-is-the-calibration-m…
現状の設定内容(抜粋)
weston.ini
[libinput] ~省略~ touchscreen_calibrator=true calibration_helper=/usr/bin/save-calibration.sh [output] name=HDMI-A-1 touch-device=/dev/input/event2 mode=1920x1080 calibration=1.106639 0.000150 -0.048482 -0.005233 1.135088 -0.075048 ~省略~
Dockerfile
COPY udev/touchscreen.rules /etc/udev/rules.d/touchscreen.rules COPY udev/save-calibration.sh /usr/bin/save-calibration.sh RUN chmod 777 /usr/bin/save-calibration.sh
touchscreen.rules
SUBSYSTEM=="input", KERNEL=="event[0-9]*", ENV{ID_INPUT_TOUCHSCREEN}=="1", ENV{LIBINPUT_CALIBRATION_MATRIX}="1.106639 0.000150 -0.048482 -0.005233 1.135088 -0.075048"
save-calibration.sh
#!/bin/bash # $1: device, $2-$7: calibration values if [ $# -ne 7 ]; then echo "Usage: $0 device val1 val2 val3 val4 val5 val6" exit 1 fi DEVICE=$1 VALS="$2 $3 $4 $5 $6 $7" RULE='SUBSYSTEM=="input", KERNEL=="event[0-9]*", ENV{ID_INPUT_TOUCHSCREEN}=="1", ENV{LIBINPUT_CALIBRATION_MATRIX}="'$VALS'"' echo "$RULE" > /etc/udev/rules.d/touchscreen.rules udevadm control --reload udevadm trigger exit 0