Armadilloフォーラム

Armadillo-810で温度センサの使用

godmacchi

2015年11月19日 11時42分

お世話になります。後藤と申します。

Armadillo-810のGPIOにMAXIMのDS18B20という温度センサを接続しようと思っております。
温度センサはGPIO#73に電源、GPIO#74にデータラインを接続し、下記のサイトを参考にしてカーネルの設定を変えてみました。
http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-3_ja-2…

ただし、Armadillo-400とは設定内容が違うようでしたので、下記の項目のみ変更いたしました。
Linux Kernel Configuration
Device Drivers --->
<*> Dallas's 1-wire support ---> ←チェックを入れる
1-wire Bus Masters --->
<*> GPIO 1-wire busmaster ←チェックを入れる
1-wire Slaves --->
<*> Thermal family implementation ←チェックを入れる

温度センサを接続し、上記変更したカーネルで起動してみたのですが、/sys/bus/w1/drivers/の中に温度センサのシリアルらしきフォルダはなく、「w1_master_driver」と「w1_slave_driver」のフォルダのみでした。GPIOのin/out設定もしております。
その後、modprobeでドライバ(w1-gpioとw1-therm)を立ち上げようとしてみたのですがドライバが見つかりませんでした。カーネルのソースを見ると、上記のドライバのソースはあるようですので、何か設定が足りないような気がしています。この温度センサを使用する方法をご存知の方がいればご教示いただきたいです。
宜しくお願いいたします。

コメント

at_kojiro.yamada

2015年12月9日 13時03分

> 何か設定が足りないような気がしています。この温度センサを使用する方法
> をご存知の方がいればご教示いただきたいです。

linux-3.4-at/Documentation/ 以下に
driver の使用方法があるので、まずはそちらを探してみてください。
1-wire 関連の driver の説明は
linux-3.4-at/Documentation/w1/ 以下にあります。

Armadillo-840 で動作確認してみましたが、
GPIO の入出力方向の切り替えに時間がかかりすぎて DS18B20 のタイミング要求が満たせず、
DS18B20 を認識できませんでした。

driver を修正することで、
DS18B20 を認識、温度の取得ができることを確認できましたので、
パッチを添付します。

パッチは以下のようにして適用してください。

[ATDE]$ cd linux-3.4-at/
[ATDE]$ ls A8x0-fix-gpio-for-1wire.patch
A8x0-fix-gpio-for-1wire.patch
[ATDE]$ patch -p1 < A8x0-fix-gpio-for-1wire.patch
ファイル ファイルの説明
A8x0-fix-gpio-for-1wire.patch A800シリーズ GPIO入出力方向の切り替え高速化パッチ

at_kojiro.yamada

2015年12月8日 21時42分

申し訳ありません。

1つ前のレスで添付した
A800シリーズ GPIO入出力方向の切り替え高速化パッチ(A8x0-fix-gpio-for-1wire.patch)
ですが、正常系でエラーメッセージが表示されるバグがありましたので
修正版のパッチを添付します。

ソースコードを一旦パッチ適用前の状態に戻した後で、
以下のようにパッチを適用してください。

[ATDE]$ cd linux-3.4-at/
[ATDE]$ ls A8x0-fix-gpio-for-1wire_fixed.patch
A8x0-fix-gpio-for-1wire_fixed.patch
[ATDE]$ patch -p1 < A8x0-fix-gpio-for-1wire_fixed.patch
ファイル ファイルの説明
A8x0-fix-gpio-for-1wire_fixed.patch A800シリーズ GPIO入出力方向の切り替え高速化パッチ(修正版)

パッチを作成いただきましてありがとうございます。
1つ目のものを適用してリビルドさせたところ、大量のエラーメッセージが出たのでやり方が悪いのかなと思っていた所でした。2つ目のものでエラーメッセージは消えました。

ただ、パッチを当てても依然として温度センサーが認識されませんでした。DQラインに使用しているGPIO73が認識できないのかと思い、w1-gpioのマニュアルを参考にboard-armadillo810.cを編集してみたのですが、今度は起動時に「w1-gpio: probe of w1-gpio failed with error -16」というものが表示されるだけでやはり認識している様子はありませんでした。

board-armadillo810.c編集前の起動時のログを添付いたします。ドライバが認識しようとしているように見えるので、もう少しboard-armadillo810.cをいじってみようかと思っております。もしログの中で気になるところがあれば教えていただけると助かります。

ファイル ファイルの説明
dmesg_新パッチ.log 起動時のログ(新パッチ当て後)

at_kojiro.yamada

2015年12月9日 11時37分

Armadillo-840 で動作確認した時のソースコードの変更点を添付します。

参考にどうぞ。

ファイル ファイルの説明
A840-1wire-support.diff Armadillo-840 1 Wire 対応時の変更点

> w1-gpio: probe of w1-gpio failed with error -16
これは、at_kojiro.yamada が例に書いているgpio_reserve()が足りなかったのだと思います。

gpio_reserve()しておかないと、gpioは文字通り汎用のgpioとしてreserveされて
w1-gpioから使う事ができなくなります。(この場合/sys/class/gpioからアクセスできます。)

この時、w1-gpioのデバイスドライバの probe で request_gpio() を呼ぶと、
その実装である pfc-wrapper-r8a7740.h::pinmux_request_wrapper() で汎用のgpioにreserved
だと判断して -EBUSY(= -16) を返してprobeが中断し、このメッセージがでます。

at_ohsawa様

解説ありがとうございます。

> これは、at_kojiro.yamada が例に書いているgpio_reserve()が足りなかったのだと思います。
現在ビルド中のものがgpio_reserve()を入れていたので、これでうまくいっていたのかもしれませんね。
.is_open_drainの違いもあったので、一旦ビルドをキャンセルしてリビルド中です。終了したらまた報告いたします。

at_kojiro.yamada様 at_ohsawa様

おかげさまでうまくいきました!
起動ログに「Family 28 for 28.00000723b13d.b9 is not registered.」というものが現れるのですが、温度は読めますし他のサイトで気にしなくて良い旨の書き込みもあったので、このままで良いかなと思っております。

いくつか迷った点もあったので、今後同じことをやる方のために使用方法を以下にまとめたいと思います。
なお、私はDS18B20をArmadillo810拡張ボードCON2のGPIO75(pin#10)にDQ、3.3V(pin#11)にVDD、GND(pin#12)にGNDを繋げておりますので、以下はその接続用になっています。

1. make menuconfigから以下の項目を修正する。
 Linux Kernel Configuration
 Device Drivers --->
  <*> Dallas's 1-wire support ---> ←チェックを入れる
  1-wire Bus Masters --->
  <*> GPIO 1-wire busmaster ←チェックを入れる
  1-wire Slaves --->
  <*> Thermal family implementation ←チェックを入れる

2. at_kojiro.yamada様が作成された「A8x0-fix-gpio-for-1wire_fixed.patch」を適用する。

3. 「/linux-3.4-at16/arch/arm/mach-shmobile/board-armadillo810.c」を添付のdiffファイルを参考に修正する。
  <注記>
  - DS18B20~End DS18B20はa810_init(void)よりも上であればどこでも良いと思います。
  - 先頭の構造体の「.pin」の値はDQに使用するGPIO番号にする。
  - a810_ds18b20_init()内で重要なのは、gpio_reserve()とplatform_device_register()だけなのですが、
   私はat_kojiro.yamada様のを真似してエラーログを表示させるようにしています。
  - a810_init(void)内のa810_ds18b20_init()はa810_ext_gpio_init()よりも上にないとうまく認識しなかったです。
  - linux/w1-gpio.hのincludeを忘れないでください。

4. カーネルをリビルドし、Armadilloに書き込む

5. DS18B20を接続してArmadilloを起動する。

6. Arnadilloの/sys/bus/w1/devices内にDS18B20のシリアル番号を示すフォルダがあると思うので、
 その中のw1_slaveを表示すると2行目のt=以降に温度が表示されています。1000倍にすると「℃」の単位になります。

以上です。どうもありがとうございました。

ファイル ファイルの説明
board-armadillo810.diff board-armadillo810修正箇所

ありがとうございます。
.is_open_drainの値だけ違っていました。0にして再度試してみます。