ストロベリー・リナックスさんが開発・販売している USB 温度・湿度測定モジュールUSBRHをUbuntuで使った際のLogページです

環境

USB-RH で遊ぶ - daily dayflowerで紹介されている通り、Linuxで使えるソフトウェアが既に作成されている。

使用Ubuntuは8.04の2.6.24

USBRH on Linux

gcc, libusbの開発用のものが必要だそうなので、インストール

$ sudo aptutide install gcc libusb-dev

USBRH on Linuxのusbrh-0.05.tar.gzを適当なところに保存し、解凍

解凍したフォルダ内に入りmake

$ make

"usbrh"という実行権付きコマンドが作成されるので、これを実行するが・・・

$ ./usbrh
usb_set_configuration error

どうやらプログラム中で使用されているusb_set_configuration関数がerrorを起こしているらしい。

更新(作者Blog?)によると、

USBRH on Linuxの実行時に発生する usb_set_configuration error のエラーの対処としていくつか書き込みがありましたが、以下の方法でもうまくいきました。
232行〜236行に2行追加
if((rc = usb_set_configuration(dh, dev->config->bConfigurationValue))<0){
if( rc = usb_detach_kernel_driver_np(dh, dev->config->interface->altsetting->bInterfaceNumber)<0 ){
puts("usb_set_configuration error");
usb_close(dh);
exit(3);
}
}

この書き換えを実施し、再度"usbrh"をmakeで作成した後、

$ sudo ./usbrh
28.98 50.24

(USB-RH で遊ぶ - daily dayflowerによると、root権限でないとできないことが結構あるらしい)

USBRH driver for Linux

Ubuntu 10.04 の場合

野良ビルドする

この方法は、アップデートによりカーネルのリビジョンが変更される度にモジュールを手動で更新しないといけない。また、usbhid ドライバに先に認識されてしまうため、その手当ても必要である。しかし、非力なマシンでは開発マシンでビルドしたモジュールを展開するだけでよいので、負荷が少なく済むとか、開発環境をインストールしないのでセキュリティ的に安心という利点がある。

基本的には、Debian Squeeze 用の情報ここを参考にして Ubuntu 10.04 用に変更するだけ。

dmks を用いる

この方法は、アップデートによりカーネルのリビジョンが変更された場合でも、自動的にモジュールが更新されるメリットがある。また、オリジナルのソースコードの変更点が少なく済むのも良い感じ。しかし、該当マシンに開発環境がインストールされている必要があるので、非力なマシンでは一時的に負荷がかかってしまうのと、セキュリティ面で開発環境をインストールしたくない場合は不適。

%!zt! diary(2010-05-28)に記載されている通りに実行すればよい。

まず dkms パッケージをインストールする。

pre> $ sudo aptitude install dkms

/pre> ソースは/usr/srcに入れないとダメらしい

pre> $ wget http://green-rabbit.sakura.ne.jp/usbrh/dist/usbrh-0.0.8.tgz $ sudo tar usbrh-0.0.8.tgz -C /usr/src $ cd /usr/src $ sudo chown -R root:src usbrh-0.0.8

/pre> /usr/src/usbrh-0.0.8/dkms.conf を作成。

pre> $ sudo vi /usr/src/usbrh-0.0.8/dkms.conf

/pre> 書く内容は以下の通り(%!zt! diary(2010-05-28)そのまま)

pre> PACKAGE_NAME="usbrh" PACKAGE_VERSION="0.0.8" BUILT_MODULE_NAME[0]="usbrh" BUILT_MODULE_LOCATION[0]="src/" MAKE[0]="make -C $kernel_source_dir M=$dkms_tree/$module/$module_version/build/src" DEST_MODULE_LOCATION[0]="/kernel/../extra/" AUTOINSTALL="yes" REMAKE_INITRD="yes"

/pre>

すでに野良ビルドしたモジュールがある場合、/extra以下を削除しておく

pre> $ sudo rm /lib/modules/`uname -r`/extra/usbrh.ko $ sudo rmdir /lib/modules/`uname -r`/extra

/pre>

Failed to get temperature/humierature と表示されて、温湿度が読み出せない対策をしておく。USBRH driver for Linux のトラブルシューティングによれば、タイムアウト時間を長くすればよいらしい。

pre> $ diff -Nur usbrh-0.0.8.orig usbrh-0.0.8 diff -Nur usbrh-0.0.8.orig/src/usbrh.c usbrh-0.0.8/src/usbrh.c

  • usbrh-0.0.8.orig/src/usbrh.c 2010-04-18 00:00:00.000000000 +0900
  1. usbrh-0.0.8/src/usbrh.c 2011-07-25 20:02:18.920787229 +0900 @@ -149,7 +149,7 @@
        result = usb_bulk_msg(dev->udev,
                              usb_rcvbulkpipe(dev->udev, USBRH_SENSOR_ENDPOINT),
                              value, sizeof(*value),
  • &read_size, msecs_to_jiffies(1000));
  1. &read_size, msecs_to_jiffies(5000));
        DEBUG_INFO("usb_bulk_msg: %d", result);
    

    /pre> initrd が自動更新されるように /etc/initramfs-tools/modules に以下の行を追加する。

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1774", ATTR{idProduct}=="1001", RUN+="/sbin/modprobe usbrh"

/pre>

ここから、インストール始まり

pre> $ sudo dkms add -m usbrh -v 0.0.8

Creating symlink /var/lib/dkms/usbrh/0.0.8/source ->

                /usr/src/usbrh-0.0.8

DKMS: add Completed. $ sudo dkms build -m usbrh -v 0.0.8

Kernel preparation unnecessary for this kernel. Skipping...

Building module: cleaning build area.... make KERNELRELEASE=2.6.32-33-generic -C /lib/modules/2.6.32-33-generic/build M=/var/lib/dkms/usbrh/0.0.8/build/src.... cleaning build area....

DKMS: build Completed. $ sudo dkms install -m usbrh -v 0.0.8 usbrh.ko: Running module version sanity check.

- Original module
  - No original module exists within this kernel
- Installation
  - Installing to /lib/modules/2.6.32-33-generic/updates/dkms/

depmod....

Updating initrd Making new initrd as /boot/initrd.img-2.6.32-33-generic (If next boot fails, revert to the .bak initrd image) update-initramfs.....

DKMS: install Completed.

/pre>

以下のコマンドを発行して udev のルールの再読み込みをさせる。

pre> $ sudo udevcontrol reload_rules

/pre> USB-RH を抜き差しすると,以後自動的に usbrh ドライバがバインドされるようになる。

pre> [ 0.123927] usbcore: registered new interface driver usbfs

/pre> また、/proc/usbrh/0 に以下のファイルが作成されて入ればよい。

pre> $ ls /proc/usbrh/0/ heater humidity led status temperature

/pre> 温湿度を同時に取得する。

pre> $ cat /proc/usbrh/0/status t:36.13 h:41.39

/pre>

deb package を作成する場合

Debian/Package/Original/kernel/module

Debian Lenny の場合

2009/09/05 に ver. 0.0.8 がリリースされ、以下の修正は不要になった。(2009-09-08)

Debian Lenny では以下のようにすれば、うまく動いた。

  • ソースの修正(細かなバグフィックス& udev rule の文法変更への対応)

    pre> $ diff -Nur usbrh-0.0.7.orig usbrh-0.0.7 diff -Nur usbrh-0.0.7.orig/src/usbrh.c usbrh-0.0.7/src/usbrh.c

    • usbrh-0.0.7.orig/src/usbrh.c 2008-12-29 00:00:00.000000000 +0900
    1. usbrh-0.0.7/src/usbrh.c 2009-08-13 07:15:09.000000000 +0900 @@ -23,7 +23,7 @@
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("USBRH driver");
  • MODULE_VERSION("0.0.5");
  1. MODULE_VERSION("0.0.7");
    MODULE_AUTHOR("Tetsuya Kimata, kimata@acapulco.dyndns.org");
#define USBRH_NAME              "usbrh"

@@ -579,7 +579,7 @@

    usbrh_create_proc(dev);
  • info("USBRH device now attached to /dev/usbrh%d", interface->minor);
  1. info("USBRH device now attached to /dev/usbrh%d", dev->index);
        return 0;
 error:

diff -Nur usbrh-0.0.7.orig/util/10-usbrh.rules usbrh-0.0.7/util/10-usbrh.rules

  • usbrh-0.0.7.orig/util/10-usbrh.rules 2008-12-29 00:00:00.000000000 +0900
  1. usbrh-0.0.7/util/10-usbrh.rules 2009-08-13 07:16:57.000000000 +0900 @@ -2,5 +2,5 @@
    # written by Tetsuya KIMATA <kimata@acapulco.dyndns.org>
    # $Id: 10-usbrh.rules 36 2008-07-28 18:13:16Z svn $
  • BUS="usb", SYSFS{manufacturer}="Strawberry Linux Co.,Ltd.", SYSFS{product}="Hygrometer/Thermometer", NAME="%k", RUN+="/sbin/modprobe usbrh"
  1. BUS=="usb", SYSFS{manufacturer}=="Strawberry Linux Co.,Ltd.", SYSFS{product}=="Hygrometer/Thermometer", NAME=="%k", RUN+="/sbin/modprobe usbrh"

/pre> 参考:%!zt! diary(2009-07-27)

  • /etc/modprobe.d/options
    usbhid に自動認識されるのを、quirks オプションで防ぐ。

    pre> options usbhid quirks=0x1774:0x1001:0x0004

    /pre> 参考:MacBookAir1-1/Intrepid - Community Ubuntu Documentation
    dmesg 出力の関連部分の抜粋

    pre> [ 6.514052] usb 1-2: configuration #1 chosen from 1 choice [ 6.518696] usb 1-2: New USB device found, idVendor=1774, idProduct=1001 [ 6.518709] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 6.518715] usb 1-2: Product: Hygrometer/Thermometer [ 6.518719] usb 1-2: Manufacturer: Strawberry Linux Co.,Ltd. [ 8.183053] udevd version 125 started [ 10.894848] usbrh: USBRH device now attached to /dev/usbrh0 [ 10.894883] usbcore: registered new interface driver usbrh [ 11.399380] usbcore: registered new interface driver hiddev [ 11.399416] usbcore: registered new interface driver usbhid [ 11.399422] usbhid: v2.6:USB HID core driver

    /pre> DEBUG を定義した場合の cat /proc/usbrh/0/temerature 実行時の出力

    pre> [ 86.304296] usbrh: usb_control_msg: 7 [ 86.556641] usbrh: usb_bulk_msg: -110 [ 86.558544] usbrh: usb_control_msg: 7 [ 86.605093] usbrh: usb_bulk_msg: 0 [ 86.607182] usbrh: usb_control_msg: 7 [ 86.860637] usbrh: usb_bulk_msg: -110 [ 86.862567] usbrh: usb_control_msg: 7 [ 86.909112] usbrh: usb_bulk_msg: 0

    /pre> 一度だけ湿度の小数部がマイナスになる現象が見られた。

    pre> $ cat /proc/usbrh/0/status t:31.14 h:86.-49 $ cat /proc/usbrh/0/status t:31.19 h:86.-77

    /pre>

Ubuntu 8.04 の場合

Ubuntuでは、USBRH driver for Linuxで紹介されている方法ではusbrhドライバが作成されなかったので、%!zt! diary(2009-01-09)を参考にドライバをインストールしてみた。

この方法ではdkmsなるものが必要らしいのでインストール

$ sudo aptitude install dkms

ソースは/usr/srcに入れないとダメらしい

$ sudo cp usbrh-0.0.7.tgz /usr/src
$ cd /usr/src
$ sudo tar xf usbrh-0.0.7.tgz 
$ sudo chown -R root:root usbrh-0.0.7
$ cd usbrh-0.0.7/
$ sudo vi dkms.conf

書く内容は以下の通り(%!zt! diary(2009-01-09)そのまま)

PACKAGE_NAME="usbrh"
PACKAGE_VERSION="0.0.7"
BUILT_MODULE_NAME[0]="usbrh"
BUILT_MODULE_LOCATION[0]="src/"
MAKE[0]="make -C $kernel_source_dir M=$dkms_tree/$module/$module_version/build/src"
DEST_MODULE_LOCATION[0]="/kernel/../extra/"
AUTOINSTALL="yes"
REMAKE_INSTALL="yes"

すでに/lib/modules/2.6.24-24-generic/extra/usbrh.koがある場合(例えば、USBRH driver for Linuxを先に行なっていた場合)、/extra以下を削除しておく

$ sudo rm /lib/modules/2.6.24-24-generic/extra/usbrh.ko 
$ sudo rmdir /lib/modules/2.6.24-24-generic/extra

ここから、インストール始まり

pre>

$ sudo dkms add -m usbrh -v 0.0.7
Creating symlink /var/lib/dkms/usbrh/0.0.7/source ->
                /usr/src/usbrh-0.0.7
DKMS: add Completed.
$ sudo dkms build -m usbrh -v 0.0.7
Kernel preparation unnecessary for this kernel.  Skipping...
Building module:
cleaning build area....
make KERNELRELEASE=2.6.24-24-generic -C /lib/modules/2.6.24-24-generic/build M=/var/lib/dkms/usbrh/0.0.7/build/src....
cleaning build area....
DKMS: build Completed.
$ sudo dkms install -m usbrh -v 0.0.7
Running module version sanity check.
usbrh.ko:
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/2.6.24-24-generic/updates/dkms/
depmod....
DKMS: install Completed.

/pre>

バージョンが古いせいか、再起動しても/proc/usbrhは作成されるものの中身がなかった。

USBRH driver for Linuxのトラブルシューティングにある 「USBRH ドライバではなく USB HID ドライバがロードされてしまっている」と同様に、

$ dmesg
hiddev96hidraw0: USB HID v1.00 Device [Strawberry Linux Co.,Ltd. Hygrometer/Termometer] on usb-0000:00:06.0-1

となっていたため、USB温湿度計を外してから

$ sudo rmmod usbhid
$ sudo modprobe usbhid

をしてUSB温湿度計を付けたところ、

$ ls /proc/usbrh/
0
$ ls /proc/usbrh/0/
heater  humidity  led  status  temperature

と、それぞれのファイルが作成された

が、

$ sudo cat /proc/usbrh/0/humidity 
Failed to get humidity
$ sudo cat /proc/usbrh/0/temperature 
Failed to get temperature
$ sudo cat /proc/usbrh/0/status 
Failed to get temperature/humierature

なぜか温度、湿度を取得できない。

キーワードは、usbhid とか quirk になるのでしょうか? (2011-07-25 USBRH driver for Linux の Q&A に解決策あり。タイムアウト時間を長くすればよいらしい。)

OpenWrt の場合

グラフ化

リンク


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-08-04 (木) 16:02:16 (2267d)