ドライバの開発 レジスタへのアクセス

今ならどうやってデバイスドライバを開発するかな?って考えた時に

ソフトウェアでドライバを構築して、とりあえずPCからデバイスへの値の書き込みを行う

それをNiosIIで確認してコンソールへ出力

こんな感じで行うかなと思います

また、シグナルタップで監視をして、書き込まれた値に変化があったかを確認するのも手かなと思います

 

ですが、このPCI Expressを開発した時は、JTAGの事が全く分かっていませんでした。

なのでFPGAに作成したモジュールを焼き込み、オシロスコープでピンを監視して

レジスタに値が送られているかどうかを見ていました。

こうやって書いていると、我がことながら涙ぐましい努力です

FPGA開発の全体像が見えてきた今から考えると、本当にトンマな事をしていたし

よくもこんなやり方で開発できたなと思います。

無知って罪ですね。

 

今考えるとですが、SOPCビルダー(今はQsys)を使えば、 もう少し便利に開発できたのかなと思いますが、当時はそう言う事が分かっていなかったので

PCI Expressのアドレス信号やイネーブル信号を見て、該当するレジスタ

更新する様にHDLを記述していました。

メモリも使わずにただレジスタを必要個数用意して、ただただ羅列する様に書いていきました。

恐ろしいほど単純で無駄の多い開発工程だった様に思います

ですが、FPGAPCI Expressの基本的な事を勉強しながらやらなければいけなかったので

ちゃんとした開発と言うものに頭を回せる余裕はありませんでした

思えば私の開発は今に至るまでずっとそうです

山ほど案件を抱えて、それらの保守をしながら次の開発をしているので

つぎはぎをしながら毎日クリアしていくので精一杯です

本当は透き通るようなちゃんとした規格に沿って開発をしたいのですが

そうはいきませんでした。

 

ただ、今思うのは、コードを後から見直す事はほとんどない(たまにある)し

その時に読み直して必要な事がちゃんとできていれば、それで良いし

作りたいものは次々に変わっていきます

なので、とりあえず動いたら次、次と進めて行くのは

ある程度の規模まではそれはそれで一つの方法かなと思います

 

ちゃんとやろうとすればするほど準備に時間がかかってやろうとしていた事が陳腐化してしまいます 

 

 

 

 

FPGAのプログラムとドライバの開発

PCI Expressの開発をしていて、一番苦労を感じたのは、デバイスドライバの開発です

私はカメラを作った時からハードウェアのエンジニアになったので、ソフトの方は新卒から6年過ごした会社での経験しかないので、そこからのソフトウェアの知識のアップデートがあまりありません。

なので、デバイスドライバの開発はかなりハードルが高かったし、実際には上澄みを舐めた程度の事しかやっていません。

 

PCIボードを作った時はデバイスドライバを開発していないのに

何故、今になってデバイスドライバを開発する必要が出てきたかと言うと

PCI Expressの頃からWindowsのアップデートが始まります

当初Windows2000だったのですが、このころから徐々にWindowsXPに切り替わっていきます。それを機に、DriverStudioと言うソフトが終息すると、ドライバーを開発してくれていた会社が開発を辞めてしまいました。

次のボードを開発する事が私の食い扶持なので、あの人が辞めたからできませんとか、これが無いからできませんとか言い訳している暇はないので、どの様に開発するかを調べます。

真っ先に頼ったのは、PCI ExpressのIPコアを購入する予定の会社PLD Applicationsさんでした。

ここの営業のKさんは、色々と教えて下さいました。

Windowsのドライバー開発にはWinDriverと言うソフトが必要だという事がわかりました。

 WinDriverを調べて、ダウンロードしました

PLD Applicationsのサンプルコードがあったので、そのまま使って

ところどころ変更しながら見ていく訳ですが

WinDriverの試用期間が1ヶ月しか持ちません

でも1ヶ月でドライバの開発なんて出来る訳もなく

どうしたかと言うと、開発用PCの時計を毎週1週間巻き戻していました

実際にサンプルのカメラが動くようになるまで(1年くらい)ずっと続けました

褒められた手段ではありませんが、最終的にはちゃんと購入したので

許して下さい

 

 

 

 

また黙々と

PCI Expressに着手しましたが、もともと出来合いのボードを買ってきて、FPGAの中をいじれましたと言うところを見せて、開発の許可が降りたところなので

まだ何も始まっていません。

 

 まずは、買ってきたボードを使って、ボード内部に仮想のカメラを用意して

取り込んだ事にします

そして、それをソフトウェアで表示する様にプログラムを作ります

VisualStudioを使っていたと思います(←あんま覚えていない)

 

実際には、カメラの取り込み口が付いたボードが必要なので

これを設計しなければいけません

回路は私が引きました。一年間カメラを作った事で、回路は何となく引ける様になっていました。見様見真似ですが、必要な回路を方々から参照して切り張りのの様にして仕上げました。

私にはアートワーク(PCBを設計する)の能力が無いので

当時20代の若い子が上司に色々言われて作っていました

全く何をしているか分からなかったのですが

時折、「インピーダンスが・・・」「等長配線・・・」と聞こえてきます

x1レーンのPCI Expressと言うのは、PCIバスに比べて圧倒的に線の本数が少ないので

簡単だろうと考えていました。

電気の線なんて繋がってればなんとかなるだろうと言うのが、当時の私の感想でした。

これは半分は当たっていて、意外にどの信号も繋がってれば動きました。

ですが、それでは痛い目に合う事も多くあります

その場合は全く動作しないのではなく、「動いてるけど時々止まる」等のとても見つけにくい不具合として出てきます。

 1GHzを超える様な信号が通る線を引くには、それなりのルールがあります

この当時は私はそんな事何も知らなくて、上司が全部管理していました。

従業員4人の小さな会社では、その上司のカバーできる範囲もそれなりに制限があり

後から考えるとめちゃくちゃやって来たなと思う事は幾つもあります

 

ともあれ回路を引いてしまえば、アートワークが終るまでには時間があるので

その間にもくもくとFPGAの開発を進めていきます

 

このPCI Expressのボードを設計するまでは、私はJTAGと言うものを良く理解できていませんでした。(上司も良く分かってなかった)

なので、FPGAの回路はPOFファイルを作成してEEPROMに直接焼き込んで

電源を入れなおしてから起動して、オシロスコープで一本一本信号を確認していました。

本当に無知とは罪ですね。

ともあれ、最初に用意したボードは、何といっても最初から動くモジュールのソースが用意されているので、コンパイルすれば動くので、最初は楽でした。

 

 

 

PCIExpressの実験

何とか12万円のボードを購入する事を勝ち取った私は

早速PLDa社からボードを購入しました

当時はまだ海外と言うのはちょっと閾が高いので

ボードが届く瞬間はワクワクしました

今は、毎日のように海外のサイトから部材を購入したりしてしまって

ただただ忙しいだけで、ワクワクとかはないので

あの頃のあの新鮮さが懐かしいです

 

ボードが届いたら、私の場合はまずPCに挿します

文字を読むのがあまり得意ではないので、いちいち説明書を全部読破してから

丁寧に動作確認をしたりはしません

 

大体、ちゃんとした製品をPCの然るべきところに挿すと、ドライバのインストールが求められます。

そしてまあCDの中を探せばそのドライバがあるので、見つかった奴をインストールして

setup.exeを探して実行すればテストプログラムが入る。

だいたいここまでは分かっていようがいまいが手探りでなんとかなります

みんな一緒ですよね?ね?

 

その後は、ソフトウェアのソースを変更します

一定のパターンを作成し、DMAで送り込むプログラムが記述されていて

更にDMAで呼び戻したパターンと一致するかどうかの判定があります

この一部を変更してやるとパターンが一致せずエラーになります

つまり、「間違ったデータをちゃんと送れている」事が確認出来る訳です

 

その後、ソフトウェアを元に戻し、FPGAの中もソースごといじってやります

データを用意している所を見つけ出して、変更してやります

変更した部分がソフトウェア側でエラーとして出てくれば、ソースコード

反映された事になります

 

これで、PCI Expressを作る下地は整いました

他にも学ぶべき事は山ほどあるのですが、とにかく貧乏なので

じっくり時間をかけている暇はないのです

 

まだPCI Expressの仕組みが作れそうだという事が分かった段階ですが

ここで提案書を書きます

PCI Expressを作るにはPLDaのIPコアを買わないといけないのですが

これに300万円程かかります

 当時いた会社はケーブルの試作の3万円が出せない会社だったので

自社では開発費は出せないのです

提案書をお客さんに見せて、開発費をもらわねばなりません

 

私が書いた提案書を見せると、お客さんは喜んで承諾してくれました

最初に私が作ったカメラがえらく気に入ったらしく

次の製品を作ってくれるならと、言ってもらえました

なるほど、これが信用の力なんだなと思いました

 

 

 

PCI Expressの勉強を始める

今ふと思うことは、三平方の定理も、微分方程式も、教科書に書いてあるので

なんて楽に学習できる知識だったのだろうと言うことです

PCI EXpressの作り方は、どこにも書いてありませんでした(正確には分厚い英語で書かれた参考書はありましたがちんぷんかんぷんでした)

ともかく動くものを見てみる必要があると考え、FPGAの実装された

実際に動作するボードを手に入れることにしました。

 

当時は既にインターネットで情報が手に入る様になっていたので

PCI Expressをキーワードに検索して、更にそこからキーワードを拾って検索してを繰り返して、情報を集めていきました。

 

とにかく最初に欲しかったのは、どんなシンプルな物でも良いので、フルの転送レートで実際に動くテストボードです。もちろん元になるHDLがあり、カスタマイズできるものを探しました。

 

見つけたのはPLD Applicationsと言う会社でした

当時はフランスの会社だったと思ったのですが

今は買収されてアメリカの会社になった様です

 

ここは、非常にシンプルなPCI Expressのボードを販売していて

勉強用に購入する事ができました。

中に焼き込むプログラムもソースも一式用意されているし

ソフトウェア側も用意されているので、好きな様に改造して

 

試す事が出来ました

 

ボードは12万円くらいでしたが

当時の会社は、とにかくお金に厳しく(乏しく)、随分と渋られました。

私が経験した事のある日本の会社は全部そうだったのですが

予算と言う概念がないんだなぁと思っています

どう言う事かと言うと、一年間を通して、各人が活動する場合に

どうしてもお金が発生します。

今回の開発ボードもそうですが、

部材の購入から、移動費、外注費

それらが存在しない仕事と言うのは存在しないので、どうしてもお金は必要になりますが、その時々でお伺いを立てないと、予算がもらえないのです

上司が出さないと言ったらそこで手を止めるしかないのです

当時であれば、ケーブルの加工とかなんとか、月に三万円とかは、どうしても発生します。12か月で、36万円は、どのみち使う訳です

つまり、私の側から言えば、36万円は最初に設定しておいてもらって

申請なしで使わせて欲しいなあと思いました

 

大企業に行けば、お偉い人は、予算が割り振られますが

例えば平社員でも、結局の所お金は使うので、職位の権限に合わせて

金額の調整はしても、予算はつけて欲しいなと

今も思います

 

 

次はPCIExpress

PCIバスの構成でカメラを作り終えた私は、次はPCI Expressに挑みます

実は当時既にPCIバスは陳腐化しかけていた技術でしたが

PCI Expressは、PCIバスと違い、信号が一本(一対)のラインで送られます

複数のラインであっても、それはパケットを分けて送っているだけで

パラレルに信号を見る事が出来るPCIとは意味合いが違っています

 

なので、ちょっと閾の高い技術になります

今は然るべきFPGAにはPCI ExpressのIPコアが入っていて

開発キットも簡単に手に入るのですが、当時はなかなか大変でした

まず、IPコアがサードパーティになっていて、PHYも外付けでした

そして何より、私が、全体像が全く見えていませんでした。

 

実は先日、今の会社の上司に「出来るかどうかも分からないもの、うちの会社じゃやらせないかんね」と言われたところです。

そう考えると、この潰れかけた会社に来て、無鉄砲にトライする事が出来たのは

実はとても行幸だったのだろうと思います。

経験も知識もない人間が、様々な制限があるとは言え、出来るかどうかも分からない事に挑戦して、現在は”経験者”の地位を手に入れたのだから。

 

さて、 PCI Expressの話です

私は最初にPCIボードを作った訳ですが、当時のPCIボードの転送速度と言うのは、33MHzで32ビットでした132MB/secが転送レートの上限でした

しかもこれは物理的な理想値の話であって、実際にはオーバーヘッドがかかる為

60MB/secとかくらいの製品しか作っていませんでしたが

要求される転送レートはどんどん上がっていきます

この時PCI Expressでは、既に2.5Gbpsと言う転送レートで

送受信が干渉せずに転送できると言う事が分かっていました

これは250MB/sec(理想値)での転送が可能になると言うものでした

そしてレーン数をx2, x4と増やす事で2倍4倍の転送速度になっていきます

x1レーンのPCIExpressは、転送速度が大体160MB/secで使っていたので

x4レーンだと、600MB/sec以上出る計算になります。

むぅ、これはやるしかない

とか思いました。

 

f:id:info-akiron-com:20210312085814p:plain

PCIPCI Express

けどまあ、どうやって作るのか分からなかった私は、インターネットで色々と探しました。

そして、上記の様にIPコアを使う必要があると言うところまでは突き止め連絡をとりました。

当時私が見つける事が出来たIPコアの会社はPLDaと言うフランス(当時)の会社で、営業の人は熱心に(メールで)説明してくれました。

英語もPCI Expressの知識もちんぷんかんぷんだったので、一生懸命理解しながら進めていきます。

 

 

人間関係

古い情報ですが、仕事を辞める理由の一位は人間関係だそうです

私も人間関係は随分悩まされました。

 

私が見たところ、エンジニアと営業を比べるとやはり営業の方が人付き合いが上手で

更に言うと、ハードウェアエンジニアの方がその名前の通り柔軟性がないと思います

 

さて、私はカメラを完成させたところで、上司と揉め事を起こします

今考えれば私が悪いと自分でも思うのですが、当時の私はカメラを作ったばかりで、こう思っていました「せっかく稼げるもの作ったんだから、褒めてくれ・・・とは言わないまでも、一人前に扱ってくれ」

いつまで経っても褒めてもらえる事はなく、次の仕事の話になりました

次は光ファイバーです

画像信号を光ファイバーを通して延長して届ける仕組みです

みなさんどうですか?光ファイバーの仕組みを作れよって言われたらどう思います?

私は何から手をつけていいかわからずにパニックでした

会議を進める上司は、基板はできてるから2ヶ月で作れと言います

私はブチギレました、今日まで何を見てきたんだ、カメラ一つ作るのに1年かかったものを、こんなもん2ヶ月なんかでできるわけないだろう

私を無視して上司は会議を続けますが、言うことを聞いてもらえない私は私で上司を罵り続けました。

この事がもとで、15年くらいこの上司からは冷遇されます。

まあ自業自得なので、それ自体は仕方ないのですが

じゃあこの時どうすればよかったかと言うと、ただ聞いていれば良かったんですね

「なるほどなるほど」と言いながら。

 

私はこの当時、約束した以上は工期は守らなければいけないと思っていたので、その工期があまりにも非現実的だったので、頭に血が上がりました。

しかし、人間(この場合は上司)と言うのは、約束した納期が守れない事よりも、その場で自分に逆らった事の方が許せないのです。

結局、この上司とは反目したままで、自分が全てやっているプロジェクトであるにもかかわらず、ケースの設計の時すら、声もかけられずに進めていきました。

それから15年くらい、一緒に仕事をしていますが、ともかく私のやりにくい方へと進めていきます

ケーブルの試作をしたいと言っても予算を出さなかったので3万円自費で持ち出した事もあります(その程度のいじめで私は手を止めません)

仕様の検討も独自で行い、決して歩調を合わせる事をしませんでした

 

当時私は、この潰れかけた会社に力を貸すつもりで来ていました

実際に従業員4人程度の小さな会社にとって、私はあらゆる面で力になっていた自負がありました。

いつまでここにいるかもわからなかったので、未来の事まで考えながら行動してはいませんでした。

だから、その場で起きた事への怒りはその場で表現してきました。

嫌われる事も虐められることも大丈夫でした。

 

結果として私は15年、この上司の下で冷や飯を食うはめになります

 それも別に大丈夫でした、生きてるだけで特に文句はなかったので。

 

ですが、今は反省しています

世の為人の為に自分の力を使いたいなら

今と未来を両方勘案して、少なくとも最善手を打つべきだったと思っています

上司が賞賛を欲しているなら、それはそうしてあげれば良かったと思います

 

結局人間関係を潤滑にするのも仕事の能力の一つで

大きな仕事をしたいのであれば、そういう所も気を使って 

行く必要があるなと思います