Raspberry Piを使用したLinuxドライバー開発の学習


13

実際のハードウェアデバイス用のLinuxデバイスドライバーを作成したいと思います。どのRaspberry Pi周辺機器が適していますか?基本的に次のものが必要です。

  1. 初心者には十分な大きさでなければなりません(せいぜい数ヶ月、より良い数週間)。

  2. データシートが利用可能でなければなりません。最初はUSB-Ethernetアダプターについて考えていましたが、データシートが非常に限られているようです。

何か案は?GPIO上でシリアルコンソールを動作させるようなものでしょうか?


2
Linuxドライバーはカーネルモジュールであり、技術的にはハードウェアとはまったく関係がないため、最初に試すことはcharデバイスインターフェイス、つまりcharデバイスファイルを提供するものです。些細な目的のために(procのものと同じように)読み書きされます。
goldilocks

私はそれをすべて行い、チュートリアルを完了し、擬似デバイス用のカーネルモジュールを作成し、カーネル/ドライバー開発に関する本を読みました。これはすべて良いことですが、今では実際のハードウェアで作業したいと思います。
ivan13年

Greg KHはしばらく前にこれを書きました(いくつかの点で少し時代遅れかもしれません):linuxjournal.com/article/7353だから、周りに公開データシートがあるUSBデバイスがあります。彼はそこにリバースエンジニアリングのヒントをいくつか持っています(あまりにも複雑なものでそれをやりたくないでしょう)。GPIOピンに関するものは、一般に既存のI2Cなどのドライバーを使用して動作すると思いますが、それを無視して自分で何かをすることができます。
goldilocks

回答:


4

複雑なデバイスおよび/または複雑なバスとインターフェイスする場合、ドライバーの作成を学ぶのは難しい場合があります。そのため、マイクロコントローラで通常使用されるI²C/ SPIデバイスのような、いくつかの単純でよく知られたデバイス(カーネル内のドライバの既存の実装を無視)を使用することをお勧めします。たとえば、Arduinoコミュニティで「サポート」されているデバイス(ライブラリ/ドキュメントがあることを意味します)を見つけて、RaspberryPiで使用してみてください。

それだけでは不十分な場合や、あまり多くのハードウェアを購入したくない場合は、自分でハードウェアを作成できます。マイクロコントローラー(atmegaなど)を入手し、デバイスになるプログラムを作成してから、Linuxドライバーを使用してインターフェイスに接続してみてください。これにより、さまざまなクラスのデバイスをエミュレートするプログラムを簡単に作成できます。また、「ファームウェア」を自分で作成するため、問題のデバッグに役立ちます。

そのためにはマイクロコントローラのプログラミングスキルが必要ですが、Arduinoでプログラミングを習得するのは難しくなく、ドライバープログラマにとっても有益な知識だと思います。


GPIOピンを介してソフトウェアにシリアル通信を実装するのはどうですか?たとえば、シリアルをPCに接続し、少なくとも何かをコンソールに出力しようとします。実行可能ですか?
イヴァン

@ivan:その権利を理解したかどうかはわかりません。シリアルとはUART / rs232を意味し、ソフトウェアとはビットバンギングを意味する場合、タイミングの制約のために不可能です。一方、RaspberryPi UARTハードウェアを使用してLinuxシリアルデバイスを(再)実装することを意味する場合は、もちろん実行可能です。このハードウェアについて必要な情報はすべてBCM2835 ARM Peripheralsドキュメントに記載されていると思います。ただし、それを使用するには、まずカーネル内の既存のドライバーを無効にする必要があることに注意してください。
クシシュトフアダムスキー

ありがとう、しかし、ビットバンギングUARTが不可能であることは確かですか?私はこのリンクを見つけました:ganssle.com/articles/auart.htmそれは低いボーレートのために潜在的に実行可能であるように見え、少なくとも送信部分だけを実装するためにより簡単です。
イヴァン

@ivan:この記事は、Linuxなどの汎用オペレーティングシステムを搭載したシステムに関するものではないようです。UARTには、リアルタイムオペレーティングシステムなしでは満たすのが非常に難しい、実際の厳密なタイミング制約があります。そうは言っても、低いボーレートでこれを行うことは可能かもしれませんが、それは本当に信頼できないかもしれません。
レジストフアダムスキー

あなたは正しいようです: raspberrypi.stackexchange.com/questions/1987/…(ただし、興味深い解決策があります)。ご協力ありがとうございます。
イヴァン

3

個人的には、GPIOピンに直接接続された1つまたは複数のLEDなど、非常に単純なデバイスから始めます。

プラグイン可能なデバイスを購入するか、独自のデバイスを配線します。

これをお勧めする理由は、ドライバーのデバッグは一般に通常のプログラムよりもはるかに難しいため、開始するための簡単なチャレンジが有用であり、そのコードをより複雑なデバイスのデバッグ方法として使用できることですオシロスコープに接続するGPIOピン)タイミングが重要な場合。

興味があるなら、カーネルドライバーがあります LedBorgのここから入手できます。ソースは、GPIOピンを定期的に駆動するための合理的な単純な例です。


こんにちは@PiBorg。GPIOピンに直接接続された1つまたは複数のLEDなどのデバイス用の単純なドライバーのコーディングを学ぶのに役立つリソースを教えてください。
サガル

0

ハードウェアドライバーを作成できる最も単純な「デバイス」は(ハードウェアドライバーの開発が必要な場合)、LEDのように単純な場合もあります(技術的にはLEDはデバイスではないが、 @PiBorgが示唆したように。

他の選択肢は、フォトレジスター、受動赤外線センサー(略称:PIR)、温度センサー、PCファン(できれば、モニターだけでなく、 RPM)、LEDドットマトリックスなど。基本的に、このようなシンプルなデバイスを使用すると、ハードウェアを最小限に抑えることができ(実際に達成したことを確認して操作できます)、同時に、より複雑なデバイスで使用される多くのトピックについて学ぶことができます。複雑さは、主に使用するプロトコルに起因しています。

また、カーネルモジュールを掘り下げる必要はありません。もちろん、あなたがそれをしたいなら、誰もあなたを止めません。:)

パッシブ赤外線センサーとのインターフェイス例を次に示します(PIRが配信されたらすぐにテストします:3)。これを利用して、Linuxカーネルの世界をさらに掘り下げて、たとえばPIRで動作するカーネルドライバーを作成する方法を確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.