手元では Ubuntu 16.10 で試していますが,他の linux でも認識しない場合の原因は同様かなと思います.対処方法はそれぞれのディストリビューションによって異なるかと思いますので,それぞれ用に各自アレンジしてください.
えーっと,キングジムポータブック XMC10 ですけど linux をインストールすると usbhid と i2c_hid のロード順番によって,付属キーボードが認識されたりされなかったりするようです.usbhid を先に読み込んで i2c_hid を後で読み込めば大丈夫みたい.ということでこの順番になるように固定化しましょう.
/etc/modules や initramfs 中でゴニョゴニョしてみても,ロード順番までは制御できないみたいなので無理やりスクリプト制御することにします.
過去互換を考えて rc.local に設定する方法と,systemd のサービスとして登録する方法の2種類の方法について書いてみたいと思います.どちらかだけで良いです.両方行う必要はありません.
1. /etc/rc.local に記載する方法
Ubuntu では systemd が採用されていますが,過去互換(?)を考えてか,/etc/rc.local ファイルがあれば,それを読み込んで実行されるようになっています.条件としては rc.local が存在して,実行属性が付いていることと,start/stop 引数を受け付けることです.start/stop 引数は rc.local 中で無視していてもオッケーです.
ということで,rc.local を作成.すでにある場合には同様の記述を付け加える形で良いでしょう.
% vi /etc/rc.local
#!/bin/bash
/sbin/lsmod | grep -o -e ^usbhid -e ^i2c_hid | xargs /sbin/rmmod
sleep 1
/sbin/modprobe usbhid
sleep 1
/sbin/modprobe i2c_hid
sleep 1
Exit 0
sleep 入れていたり,一旦両方のモジュールを rmmod しているのは念のためです.sleep 入れるとその分起動時に遅くなっちゃうんだけどね.start/stop 引数は無視しています.で,実行属性を
% chmod a+x /etc/rc.local
でつけて,再起動.
2. systemd で XCM10 用のサービスを追加する方法
systemd なのに rc.local があるのは気持ち悪いなと思う場合には XMC10 用の処理をまとめて記述するためのスクリプトを systemd の service として登録しましょう.
% vi /usr/sbin/set_xmc10
#!/bin/bash
/sbin/lsmod | grep -o -e ^usbhid -e ^i2c_hid | xargs /sbin/rmmod
sleep 1
/sbin/modprobe usbhid
sleep 1
/sbin/modprobe i2c_hid
sleep 1
Exit 0
上記内容は 1. の場合と同じ.ファイル名と置き場所が違うだけです.置き場所が気に入らない場合には適宜好きな場所にどうぞ.1. と同様にこのファイルに実行属性をつけておきます.
% chmod a+x /usr/sbin/set_xmc10
次,systemd のサービスを登録します.
% vi /etc/systemd/system/xmc10.service
[Unit]
Description = xcm10 daemon
[Service]
ExecStart = /usr/sbin/set_xmc10
Restart = no
Type = oneshot
[Install]
WantedBy = multi-user.target
こっちも置き場所は適宜変更してもらってよいかと思います.各種パラメータもお好きに変更をどうぞ.ループ実行さえしないようにしておけば問題ないかと思います.
% systemctl enable xmc10
でサービス自動起動 ON にして再起動.
上記,1. 2. の場合でそれぞれ試してみましたが,これで付属キーボードは動作しているみたいです.
一応,/etc/initramfs-tools/modules を編集して update-initramfs したり,/etc/modules を編集してみる方法でも試してみましたが,そっちではやっぱりダメでしたね.
まぁ,ほかにも色々と方法はあるかと思いますが,主に使われそうなものを紹介してみました.
以上,参考まで.