2018年4月9日月曜日

kona linux 4.0 jack リアルタイムカーネル (RTLinux) を試す (3) パラレルポート

今回はパラレルポートをトグルして遊びます.RTLinuxだと時間精度が良いかどうかを確かめます.

その準備で死に掛かりましたが崖っぷちで踏みとどまりました.

死に掛かったのは、CH382というICが載ったパラレルポート増設PCIeカードのドライバが、Linux Kernel4.xに対応していないため動かなかった.module sourceを書き換えることで使えるようになりました.

なお、当情報により貴殿がいかなる損害を受けてもわたしは知らんのであった.

【経緯】
ある日のこと、¥5000ぐらいの小型中古PCを買おうと秋葉へ出かけました.RTLinuxをインストするマシンとして使うためです.
一昨年ごろには、企業が除却した小型PCが秋葉のJUNK屋でたくさん売られていました.¥5000ぐらいで.
しかし今では、そういうお手ごろな中古PCは売られてないですね.想像ですけど、途上国へ大量に流れてるんじゃないかな.北海道の港で見かけるロシア向け国産自動車みたいに.

「安いPCがないー、どこにもないー」と徘徊し、じゃんぱらにて、食指の動くブツを発見しました.
GATEWAY/Celeron G540 2.50GHz
MEM4GB/HDD1TB/DVD不調/KBDなし
USB3.0/埃なし美品/¥4900(税込)
どーせDVDは使わないのでそれでもいいやと日比谷線でハンドキャリーしました.DVDの不調はトレイ機構がたまに引っかかる程度でした.ま、いいか.

RTLinuxの記事はそのマシンで遊んだ成果を記したものです.

その後、parallel portを弄って遊ぼうと思いマシンのリアパネルを見て「パラレルがないー、どこにもないー」とアタマを抱えてしまいました.というのは嘘で、今時のマシンにはシリアルもパラレルも無いのがフツーですから動揺なぞしません.
そこで、parallel portを追加するPCIeカードを中華通販で買いました.WCH社のCH382というICが載っています.流通量は多いようです.¥600ぐらいだったかな.

ところがこのカードがわたしのLinuxマシンで動かないでやんの.
・ネットの情報によると、このページはkernel4.xでは使えなかったと書いています
・その一方で、Kernel4.1.19への対応方法というページもある.これを書いている時点で最新のKernel4.14.29には同ページの変更が反映されている

だとすると、CH382のカードはKernel4.14.29で使えてもいいじゃないかと思われますが、、、症状は、、、
・/dev/parport0も/dev/lp0も存在しない.mknodしても焼け石
・dmesgに、lp: driver loaded but no devices found という不吉な文字がある
・lsmodによると、ppdevは動いている
・lspciによると、カードは認識できている
これらから、デバドラは起動しているが、デバドラがカードを認識してないような気がします.


【試行】
CH382パラレルカードに付属のCDROMにLinux用デバドラが入っています.ところが、それはKernel3.xまでしか対応していません.悪い状況.

謎のサイトからCH382のドライバをDLしてみたけど、Kernel2.6までしか対応してません.もっと悪い状況.

Kernel4.14.29 sourceを探すとそれらしいファイルなら在ります.
   /usr/src/linux-4.14.29/drivers/parport/parport_serial.c
この中に、こういう記述があります.
   { 0x1c00, 0x3250, 0x1c00, 0x3250, 0, 0, wch_ch382_2s1p}
この行はCH382カードを識別するPCI-IDと思われます.

一方で、lspciで表示される同カードの情報はこうなっています.
   01:00.0 Serial controller: Device 1c00:3050 (rev 10)  (prog-if 05 [16850])
1c00:3050の部分が、vendor id/device idを意味していると思われ、sourceとは3050の部分が食い違っています.これは怪しい.

試しに、parport_serial.c をこのように書き換え、Kernelをビルドします.
   { 0x1c00, 0x3050, PCI_ANY_ID, PCI_ANY_ID, 0, 0, wch_ch382_2s1p}
RT Kernelビルドのやり方は、本連載その1に記した流れで行います.RT patchも当てます.


【結果】
/dev/parport0が作られました.
dmesgに、パラレルポートが認識されたような表示が出ました.
   parport0: PC-style at 0xe100, irq 16 [PCSPP,TRISTATE]
   lp0: using parport0 (interrupt-driven)
うまくいったかんじー.


【アプリ走行】
こちらを参考にして、簡単なプログラムを作りました.sourceをここに置きました.

このプログラムは、50usec毎にパラレルポート出力データの1→0を入れ替えてる(トグル)つもりの動作をします.

ビルドは、gcc pp.c でOKでした.ライブラリoptionは不要.

a.outを動かします.パラレルポートをオシロで観測します.
↓なんじゃーこりゃぁ、、、全然100usecじゃないよ.1周期226usecになっちゃってる.それだけじゃなくて波形がチラチラしているのは周期が跳んでるからです.でもこの低性能はscheduler設定をなにもやってないので無理もありません.
↓次にschedulerを最強にして動かします.chrt -r 99 a.out というコマンドを使います.chrtはscheduler優先度を変えて実行する作用があります.周期が119usecになり、周期跳びも少し減りました.リアルタイム性が改善しました.
RTでもこんな程度かと少しがっかりしました.


【まとめ】
・使えなくてお金をムダにしたかと思ったパラレルカードを使えました
・パラレルポートをトグルするプログラムを書きました
・scheduler優先度を強化することによりRTLinuxの性能を発揮できたようです

その2へ

かしこ

1 件のコメント: