ストロベリー・リナックスさんが開発・販売している 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 パッケージをインストールする。

$ sudo aptitude install dkms

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

$ 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

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

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

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

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"

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

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

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

$ 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
+++ 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));
+                          &read_size, msecs_to_jiffies(5000));
 
     DEBUG_INFO("usb_bulk_msg: %d", result);
 

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

  • /etc/initramfs-tools/modules
    usbrh
    udev のルールを以下のように書き換える。
  • /usr/src/usbrh-0.0.8/util/10-usbrh.rules
    # USBRH (http://www2.strawberry-linux.com/products/usbrh/) rules
    # written by Tetsuya KIMATA <kimata@acapulco.dyndns.org>
    # $Id: 10-usbrh.rules 40 2009-09-04 16:13:44Z kimata $
    
    ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1774", ATTR{idProduct}=="1001", RUN+="/sbin/modprobe usbrh"

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

$ 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.

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

$ sudo udevcontrol reload_rules

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

[    0.123927] usbcore: registered new interface driver usbfs

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

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

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

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

deb package を作成する場合

Debian/Package/Original/kernel/module

Debian Lenny の場合

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

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

  • ソースの修正(細かなバグフィックス& udev rule の文法変更への対応)
    $ 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
    +++ 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");
    +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);
    +    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
    +++ 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"
    +BUS=="usb", SYSFS{manufacturer}=="Strawberry Linux Co.,Ltd.", SYSFS{product}=="Hygrometer/Thermometer", NAME=="%k", RUN+="/sbin/modprobe usbrh"
    
    参考:%!zt! diary(2009-07-27)
  • /etc/modprobe.d/options
    usbhid に自動認識されるのを、quirks オプションで防ぐ。
    options usbhid quirks=0x1774:0x1001:0x0004
    参考:MacBookAir1-1/Intrepid - Community Ubuntu Documentation
    dmesg 出力の関連部分の抜粋
    [    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
    DEBUG を定義した場合の cat /proc/usbrh/0/temerature 実行時の出力
    [   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
    一度だけ湿度の小数部がマイナスになる現象が見られた。
    $ cat /proc/usbrh/0/status
    t:31.14 h:86.-49
    $ cat /proc/usbrh/0/status
    t:31.19 h:86.-77

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

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

 $ 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.

バージョンが古いせいか、再起動しても/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 (1788d)