前回に引き続きNANOTE P8の話。
今回はManjaro Linuxをインストールした。おそらくUbuntuでもタッチパネル以外ハマることなく進められると思う。
現在できてること
普通にできた
すこしいじったらできた
- タッチパネル
- PLを15Wにする
わからん
- 加速度センサー(画面回転検知)
- タブレットモード検知
- 音を出す
インストール
注意
この記事は「Linuxをある程度触ったことがある人向け」となっている。「linux-headersを取ってきてgit cloneしてbuildして…」とだけ書かれているのを見てなんとなくわかるくらいじゃないと厳しいと思う。
今回はArch Linux派生のManjaroで行ったが、他のディストリビューションでも読み替えながら実行することができる。コンフィグのファイルパスやパッケージマネージャーのコマンドなど、環境による違いを理解していれば難しいことではないので是非挑戦してみてほしい。
下準備
まずは普通にWindowsを起動して下準備を行う。
バックアップ
誤ってWindowsを削除してしまうとデバイスドライバの入手に苦労することになるのでMacrium Reflectなどでディスクイメージ化するなどしてバックアップを取ること。
「そんなやらかしはしない!したとしてWindowsのインストールくらい自分でできる!」という人「金輪際Windowsに関わらないからどうでもいい!」という人もdism /export-driverでドライバを保管しておこう。
機種固有かつ非PnPなものもあるだろうから忘れずに行う。
タッチパネルドライバを探す
C:\Windows\System32\drivers にあるSileadTouch.sys というファイルが後で必要になるので、あらかじめわかりやすい場所にコピーしておくと便利だ。
ISOを焼く
ほとんどのLinuxディストリビューションはブータブルなisoイメージで配布されているので、これを「消去しても困らないUSBメモリ」に書き込む。個人的にはRufusを使うのがオススメ。
パーティショニング
内蔵eMMCにインストールするなら予め空き領域を作っておく。Windowsが入っているパーティションの縮小も今のうちに行う。Windowsのディスク管理でうまく縮小ができない場合MiniTool Partition Wizardなどを使おう。
筆者はmicroSDにインストールしたので特に何もしなかった。
USBブートしてインストール
特に気をつけなければならない箇所も無いので説明しない。Live USBを挿して起動すれば勝手に立ち上がる。もし、起動しない場合はBIOS設定(起動時にDelete連打)を確認のこと。
インストーラーは画面が90度回転した状態で立ち上がるだろう。ターミナルで
xrandr -o right
と打てば直る。少しの間とはいえ首が辛くないようにやっておこう。
インストール後の設定
インストールが完了したら起動してログインする。
やっぱり画面が縦になっている。とりあえず
xrandr -o right
で向きを変えよう。
画面の回転とDPI設定
一時的な画面の回転はxrandrや設定画面で可能だが、ディスプレイマネージャのログイン画面にも反映したい。文字がやたら大きいのも調整しよう。
/etc/X11/xorg.conf.d/90-monitor.conf を作成し、次の通りにする。
Section "Monitor" Identifier "DSI1" Option "Rotate" "right" # DisplaySize 151 94 # real size DisplaySize 338 211 # 1280x800 EndSection
DisplaySizeのパラメーターはミリメートル単位でディスプレイの大きさを指定するもので、正直に151x94としてしまうと960x600相当の広さになってしまい非常に使いにくい。今回は1280x800相当となるように調整した。
fbconの画面回転(必要な場合だけ)
/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTにfbcon=rotate:1と追加することでCtrl+Alt+F2とかで表示されるテキストコンソールの画面を回転できる。
変更後はsudo grub-mkconfig -o /boot/grub/grub.cfg で反映させる。
タッチパネルを動かす
NANOTE P8でLinux動かす上でたぶん一番めんどくさい。
こちらの記事を参考にした。
EZPad 6 Pro ubuntu18.04のTouchScreen | お空への夢
ファームウェアについて 追記 2021/04/27
gsl-firmware/firmware/rwc/nanote-p8のsilead_ts.fwを/lib/firmware/に置くだけで良い。(gsl-firmwareにマージしていただきました。ありがとうございます。)
git clone https://github.com/onitake/gsl-firmware.git sudo cp gsl-firmware/firmware/rwc/nanote-p8/silead_ts.fw /lib/firmware/
よって、抽出・加工の工程は不要。
本家silead_tsモジュールを使う 追記 2021/04/29
完全な思い込みと他機種の情報からgslx680_ts_acpiを使っていたが、どうやらLinuxに含まれる本家silead_tsでも普通に動くようだ。
筆者の環境では最初から含まれていてロードもされていたのでファームウェアを所定の場所に置くだけで動作した。gslx680_ts_acpi用の加工がされていないサイズが大きい方を使う。
git clone https://github.com/onitake/gsl-firmware.git sudo cp gsl-firmware/firmware/rwc/nanote-p8/firmware.fw /lib/firmware/silead/mssl1680.fw
ファームウェアを配置したらモジュールをロードし直して動くか確認。
sudo modprobe -r silead sudo modprobe silead
触って反応があるならあとは補正を行ってタッチパネルの設定は完了。ずいぶん簡単になったなあ。
このモジュールが無い環境の場合はCONFIG_TOUCHSCREEN_SILEADをyにしてリビルドする必要があるのでgslx680_ts_acpiを使ったほうが楽だ。
ファームウェアの抽出と加工
GitHub - onitake/gsl-firmware: Firmware repository for Silead touchscreen controllers
ファームウェアを抽出・加工するためのツールを取得する。
git clone https://github.com/onitake/gsl-firmware.git
ここで先程見つけたSileadTouch.sysが必要になる。gsl-firmware/tools下にコピーするなり、パスを指定するなりしよう。これを実行するとファームウェアファイルが抽出され、firmware_00.fwといったファイル名で保存される。
cd gsl-firmware/tools ./scanwindrv SileadTouch.sys
このファームウェアファイルを加工して/etc/firmware に配置する。
sudo ./fwtool -c firmware_00.fw -m 1680 -w 1920 -h 1200 -t 10 -f yflip /lib/firmware/silead_ts.fw
-mはチップの型番、-wと-hは解像度、-tはタッチ点数、-fは反転の方向だ。解像度とはデジタイザの解像度であって、液晶画面の解像度とイコールでは無いことがあるそうだ。
今回はこのパラメーターでWindows環境と同じ感覚で操作ができたが、もしかしたら調整が必要になるかもしれない。
カーネルモジュールのビルドとインストール
追記 2021/04/29
silead_tsがある環境ならこちらの方法を選ぶ必要はなさそう。
GitHub - onitake/gslx680-acpi: ACPI/x86 compatible driver for Silead GSLx680 touchscreens
ビルドするにはディストリによりけりだが、build-essentialやlinux-headersみたいな名前のパッケージが必要になるのでインストールしておく。
git clone https://github.com/onitake/gslx680-acpi.git cd gslx680-acpi make sudo cp gslx680_ts_acpi.ko /lib/modules/$(uname -r)/kernel/drivers/
下記を/etc/modules-load.d/modules.conf に追記
gslx680_ts_acpi
sudo depmod sudo modprobe gslx680_ts_acpi
何事もなければこれでタッチ操作に何らかの反応が現れるはずだ。何も反応が無いのであればsudo dmesgでエラーが出ていないか確認しよう。
タッチパネルの補正
触って反応するようになったらちゃんと画面の位置と対応するようにキャリブレーションを行う。xinput_calibratorが必要なのでなければ入れる。なお、古いバージョンでは画面回転周りでコケるので注意すること。
実行するとここをタッチしろと指示が出るのでタッチする。
xinput_calibrator
すると結果が出力される。
Calibrating Libinput driver for "Silead GSLx680 Touchscreen" id=14 current calibration values (from XInput): [1.000000, 0.000000, 0.000000] [0.000000, 1.000000, 0.000000] [0.000000, 0.000000, 1.000000] INFO: width=1920, height=1200 Setting calibration data: {1.048079, 0.002498, -0.006866, 0.019854, 1.135563, -0.139813, 0.000000, 0.000000, 1.000000} --> Making the calibration permanent <-- copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf' (/usr/share/X11/xorg.conf.d/ in some distro's) Section "InputClass" Identifier "calibration" MatchProduct "Silead GSLx680 Touchscreen" Option "CalibrationMatrix" "1.048079 0.002498 -0.006866 0.019854 1.135563 -0.139813 0.000000 0.000000 1.000000 " EndSection
言われた通り/etc/X11/xorg.conf.d/99-calibration.confを作成してSectionからEndSectionまでをコピペしてXorgを再起動すれば設定が反映される。
再起動せずに確認したい場合は
xinput set-float-prop "Silead GSLx680 Touchscreen" "libinput Calibration Matrix" 1.049964 0.002022 -0.011187 0.001284 1.127886 -0.117671 0.000000 0.000000 1.000000
という具合にやれば一時的に反映される(もちろん、デバイス名や数字は先程の実行結果に合わせる)。
以上でタッチパネルが使えるようになった。
トラブルシューティングのヒント 追記 2021/04/29
うまくいかないときに確認すべき項目。Linuxの専門家ではないためはっきりとしたことは言えないが有益なエラーメッセージなどが見られるかもしれない。
ロードされているカーネルモジュールの一覧。
lsmod
メッセージバッファを読む。grepコマンドに渡せば目的の行だけに絞り込める。gslx680_ts_acpiなら"gslx680"、本家sileadなら"silead_ts"で関連するメッセージが見られるはず。
sudo dmesg | grep "gslx680"
入力デバイスの一覧。Silead GSLx680 Touchscreenかsilead_tsみたいなのが居たら認識している証拠。ここに出ているなら操作もできるはずだが……。
xinput
タブレットモードと画面回転について
まだ調査中なのでわかっていることだけ。
加速度センサーはBoschAccelerometer BMA2x2。どうやって取得するのかは不明。これもACPIでアクセスできるのかな。
タブレットモード検知は何でやってるのか不明。Windowsのときみたいに折り返してもキーボードとマウスが生きてる。
xrandrなどで画面回転を行うとタッチパネルがめちゃくちゃになるので、同時にCoordinate Transformation Matrixも変える必要がある。短いスクリプトとショートカットで対応するのが良いだろうか。
TDP制限解除
前回、Windows上でTDP制限を緩めて高性能化を実現した経験から、Linuxでもやってみたくなったので調べてみた。
設定にはmsr-toolsが必要。これを実行すると15Wになる。
sudo wrmsr 0x610 0x00dd8f00
turbostatを使えば反映されたか確認できる。cronなどを使えば起動時に毎回自動で適用できる。
サウンド
音が出なくて困っている。aplay -lしてもHDMIしか出てこない。
追記 2021/04/25
コーデックチップはES8316とのことでこのへんが参考になりそう?
筆者の環境ではカーネルモジュールが足りないのでビルドしなきゃならないっぽい。
最後に
進展したら更新するかも