2017-05-03 4 views
1

私はpca9570 i2c GPOエクスパンダ用のドライバを作成しています。 (これは、その値はそのI2Cアドレスに簡単な1バイトの書き込みによって設定された4つの出力ビットを持っています。)私は現在、GPIOを設定していカーネルモジュールのGPIOを常に出力にする

次のように:どのようにこのモジュール

struct gpio_chip *gc = &chip->gpio_chip; 

gc->set = pca9570_gpio_set_value; 
gc->get = pca9570_gpio_get_value; 
gc->direction_output = pca9570_gpio_direction_output; 
gc->direction_input = pca9570_gpio_direction_input; 

gc->can_sleep = true; 

gc->base = gpio_start; 
gc->ngpio = PCA9570_GPIO_COUNT; 
gc->label = chip->client->name; 
gc->owner = THIS_MODULE; 

gc->dev = &chip->client->dev; 

をカーネルにデータだけを出力できることを伝えますか?すなわち、ユーザー空間[email protected]:/sys/class/gpio/gpio508# cat directionの結果をoutにしたいのですが、現在はinではありません。

私はこのドライバが、初期化時に出力として方向を設定するために、そしてユーザがそれらを入力として設定しようとするたびに、クライアントサイドのgpio呼び出しを追加する必要があると考えています。これは正しい方法ですか?

コピーできる既存の「出力専用」gpioドライバはありますか?

+0

*「?これはそれを行うための正しい方法です」* - いいえリソース制御を適切に使用しているコード(例えば 'gpio_request()')があれば、あなたのドライバはGPIOピンを所有し、その方向を変えようとする人はいません。 – sawdust

+0

@sawdust、 'gpio_request()'はかなり古いAPIなので、メンテナーは後者を使うのをやめてしまうので、 'gpiod_get()'を意味すると思います。 – 0andriy

+0

データシートhttp://www.nxp.com/documents/data_sheet/PCA9570.pdfによると、エクスパンダは入力と出力をサポートしています。したがって、ドライバーに何かを強制する必要はありません。これは発信者の忙しさです。あなたのものではありません。 – 0andriy

答えて

2

データシートによるhttp://www.nxp.com/documents/data_sheet/PCA9570.pdfPCA9570は低電圧プロセッサとハンドヘルドバッテリ駆動のモバイルアプリケーションで4ビットの汎用パラレル出力(GPO)拡張を提供するCMOSデバイスです。

コードに記載されているように、Linuxカーネル内のドライバが->get_direction()->direction_input()コールバックを実装してはいけません、この要件を満たすために:

  if (chip->get_direction) { 
      ... 
      } else if (!chip->direction_input) { 
        /* 
        * If the chip lacks the .direction_input callback 
        * we logically assume all lines are outputs. 
        */ 
        set_bit(FLAG_IS_OUT, &desc->flags); 
+0

多くのおかげで、明日これをテストします。 – fadedbee

+0

P.セクション7.1のデータシートは、そのi2cアドレスが0x48であると言います - 実際には0x24です。データシート*に示されている7ビットのバイナリ値は* 0x24です。 – fadedbee

+0

あなたの答えはほとんどがうまくいきます。 gpioをエクスポートした後、0と1を 'value'にエコーしてモジュールの' gc-> set'メソッドに渡します。しかし、私はgpioをユーザー空間から読み取ることができます(常に '0'を返します)。 – fadedbee

関連する問題