2012-01-12 10 views
2

シンプルなcharデバイスドライバを書き込もうとしたら、Beagleboardなどの組み込みLinuxボードのGPIOピンにアクセスするcharデバイスドライバを書きたいと思っています。私はモジュール"mygpiomodule"を書くことに興味があります。ロードすると、ユーザ空間からの読み取り、書き込みがGPIOにアクセスするように、/dev/mygpiomoduleに表示する必要があります。私はユーザー空間からGPIOにアクセスしたくありません。私は、いくつかの周辺機器とインターフェースできるモジュールを書くための私の最初の試みとしてそれをしたいと思います。私はポートにいくつかのLEDを貼り付け、それらをオンまたはオフにしようとします。カーネルスペースからのGPIOアクセス

どうすればよいですか?このフォーラムの中に教えることができるやや超えるものの、幸いなLinuxドライバを書く

おかげ
ミール

答えて

5

は、過度に複雑ではありません。しかし、良いニュースは、あなたがしたいことを正確に説明する上で非常に良い仕事をするウェブ上で利用可能な多くの情報源があるということです。ここで私が使用したのはほんのわずかです(GPIO/LED制御ドライバを作ることさえあります)。そして、彼らは動作し、ドライバのベースとして使用できるソースコードを提供します。

Free Software Magazine article

Linux Documentation Project article

O'Reilly Linux Drivers book

Linux Journal article

のLinuxの非常に "TinkerToy" 性質は、多くの柔軟性を提供します。たとえば、ドライバを「/ proc」ファイルシステムに接続する(create_proc_entry()APIを使用する)ことも考えられます。この方法で、単に「echo YOU​​RSTRING>/proc」という専用のアプリケーションを作成することなくドライバにアクセスできます/ mygpiomodule "文字列をドライバに渡します。ドライバから読み込むには "cat/proc/mygpiomodule"を使います。上記のリンクにも、これを行う例が含​​まれています。これは、テストや、起動スクリプトを使ってドライバにアクセスする必要がある場合に役立ちます。

私は上記の記事や書籍を見直してください。また、必要に応じてもっとGoogleのために確かに検討してください。すぐにダイブして、いくつかの例をコンパイルして実行してください。そうすれば、スピードが上がります。

0

Linuxカーネルでは、GPIOを簡単に「再生」することができます。

のGPIOを操作するためのファイルを含めるあります:現在の実装では、この要件を強制しませんが

#include <linux/gpio.h> 

のGPIOは、使用前に割り当てておく必要があります。基本的な配分機能は次のとおりです。ラベルは、後のsysfsに表示されることができ、それを文字列を関連付けながら

int gpio_request(unsigned int gpio, const char *label); 

GPIOパラメータは、GPIOが必要とされているかを示します。通常の規約が適用されます。ゼロ戻りコードは成功を示します。それ以外の場合、戻り値は負のエラー番号になります。

void gpio_free(unsigned int gpio); 

一部のGPIOは出力用、その他は入力用に使用されています。いずれかのモードでは、適切に有線で接続されたGPIOを使用できますが、同時に1つの方向だけがアクティブになります。カーネルコードは、GPIOコアに回線の使用方法を通知する必要があります。

int gpio_direction_input(unsigned int gpio); 
int gpio_direction_output(unsigned int gpio, int value); 

いずれの場合も、gpioはGPIO番号です。出力の場合、GPIO(ゼロまたは1)の値も指定する必要があります。それに応じてGPIOがコールの一部として設定されます。どちらの関数でも、戻り値はゼロまたは負のエラー番号です。 (適切に機能する)GPIOの方向は、いつでも変更することができます。入力のGPIOについて

、電流値を用いて読み取ることができる。

int gpio_get_value(unsigned int gpio); 

この機能は提供GPIOの値を返します。エラーコードを返す手段はありません。 gpio_direction_input()が呼び出されたときにエラーが検出されると仮定されているので、その関数からの戻り値をチェックすることが重要です。出力のGPIOの値を設定

は常に)(gpio_direction_outputを使用して行うことができ、しかし、GPIOが既に出力モードであることが知られている場合、gpio_set_value()はビットより効率的であってもよい。

void gpio_set_value(unsigned int gpio, int value); 

詳細については、次のリンクを参照してください:enter link description here

0

カーネルドライバからいくつかのGPIOビットを切り替えるだけの場合は、ユーザーが「omotto」と指定したgpio_xxx APIを使用しないことをお勧めしますほとんどの場合、他のドライバが名前でGPIOにアクセスし、ユーザスペースにアクセスできるようにします。 davroslyradのすばやく汚れたソリューションは、あなたにとってより適切です。

関連する問題