corega の USB シリアルケーブルを Mac OS X でも使えるようにする - Lion版

corega の USB シリアルケーブルを Mac OS X でも使えるようにする | Weboo! Returns. さんの記事を参考に、
同じくhttp://www.amazon.co.jp/dp/B000E6UWH6iMacに繋げようとしてみましたが…

$ sudo touch /System/Library/Extensions        # => 増えない
$ sudo kextcache -k /System/Library/Extensions # => -k オプションはLionでは使えない

以下のようにすると

$ sudo kextunload -bundle-id com.prolific.driver.PL2303
$ sudo kextload -bundle-id com.prolific.driver.PL2303
$ ls /dev/tty.usb*
/dev/tty.usbserial

認識しました。

参考にしたブログ記事にあるXMLですが

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
     :
  <key>IOKitPersonalities</key>
  <dict>
    <key>067B_2303</key>
    <dict>
      : (元々あるエントリ)
    </dict>

    <!-- corega CG-USBRS232R -->
    <key>07aa_002a</key>
    <dict>
      <key>CFBundleIdentifier</key>
      <string>com.prolific.driver.PL2303</string>
      <key>IOClass</key>
      <string>com_prolific_driver_PL2303</string>
      <key>IOProviderClass</key>
      <string>IOUSBInterface</string>
      <key>bConfigurationValue</key>
      <integer>1</integer>
      <key>bInterfaceNumber</key>
      <integer>0</integer>
      <key>idProduct</key>
      <integer>42</integer>
      <key>idVendor</key>
      <integer>1962</integer>
  </dict>
     :

この "07aa_002a" は
システム情報 - USB - ... - USB-Serial Controller D の

  • 0x002a : 製品ID
  • 0x07aa : 製造元ID

を連結したものです。

pkg-configメモ

これのために MacPorts が要る・・・のかな? 検証できてません。

$ pkg-config --cflags --libs opencv
 -I/usr/local/include/opencv -I/usr/local/include \ 
 -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui \
 -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d \
 -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann

動作確認

動作確認コード。

#include <cv.h>
#include <highgui.h>

using namespace cv;

int main(int argc, char* argv[])
{
    VideoCapture cap(0);
    if(!cap.isOpened()) {
        return -1;
    }

    namedWindow("sample", CV_WINDOW_AUTOSIZE);
    for(;;) {
        Mat frame;
        cap >> frame;
        imshow("sample", frame);
        if(waitKey(30)>=0) break;
    }
    return 0;
}

そしてコンパイルと実行。

$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
$ g++ -O3 -Wall -o sample sample.cpp `pkg-config --cflags --libs opencv`
$ ./sample

動きました\(゚∀゚)/

LionにopenCVをいれてみる

id:tamakiii:20091125 さんの記事を参考にしながらインストールしようとしたのですが、多少状況が違うようなのでメモ。

一番の違いは「MacPorts が不要っぽい」という点でしょうか。

  • /usr/bin/xcodebuild のパスが合わないので修正
    • Xcode4.3 から Xcode の場所が変わったのでそれに対応。
$ sudo /usr/bin/xcode-select -switch /Applications/Xcode.app/Contents/Developer/
$ tar jxf OpenCV-2.3.1a.tar.bz2
$ mkdir OpenCV_build
$ cd OpenCV_build
  • cmake で設定
    • C++コンパイラを/usr/bin/c++から/usr/bin/g++へ変更
      • `No matching constructor for initialization of 'cvflann::LshIndexParams'` のようなエラーが出るのでこれを抑制。
      • これだけはGUI版のcmakeでは指定できませんでした。GUIからEntryを追加しても消されてしまうのです。
    • libjpeg, libpng, libtiff をOpenCV付属のものを利用するように変更
      • シンボル _png_set_gray_1_2_4_to_8 が無い旨のエラーになるのでこれを抑制。libpngのバージョンチェックに失敗している様です。
$ cmake -D CMAKE_CXX_COMPILER:FILE_PATH=/usr/bin/g++ -D OPENCV_BUILD_3RDPARTY_LIBS:BOOL=YES ../OpenCV-2.3.1
  • make && make install
$ make
$ sudo make install

D25HW用大容量バッテリをHW-01Cで使う

e-mobile Pocket WiFi D25HW用の大容量バッテリ(バスタブとか呼ばれているアレ)をDoCoMo HW-01C で使えるかについて。

結論から書くと、使えます。

詳細は以下のとおりです。

  • 電池の端子の位置などは全く同一でした。
  • D25HWは白色、HW-01Cは黒色なので、バスタブケースを付けるとパンダになります。
  • microSDカードスロット位置/サイズは変わりません。
  • ストラップホールはそのまま使えます。
  • USB端子がminiB(D254HW)からmicroB(HW-01C)になるため、バスタブケースのUSB端子穴が微妙にずれています。ギリギリ挿入できますが気になる人は気になるかも。
  • 本体右側のボタンの数が違います(D25HW=3個、HW-01C=1個)。が、D25HWのケースの穴の方が大きいため干渉等はありません。

最後の2件は、「D25HW用のバスタブケースはHW-01Cに使えるが、HW-01C用のバスタブケースはD25HWには使えない」ことを意味します。お気を付けください。削れば良いんですけどね。

Ubuntu 10.10/i686 + VMWareFusion 3.1.1 でモジュールビルド失敗

vsock-only.cがダメでした。先のパッチとも微妙に違うので添付しておきます。

diff -Naur vsock-only.org//linux/af_vsock.c vsock-only//linux/af_vsock.c
--- vsock-only.org//linux/af_vsock.c	2010-08-02 01:22:17.000000000 +0900
+++ vsock-only//linux/af_vsock.c	2010-12-01 17:04:10.626652052 +0900
@@ -3221,7 +3221,7 @@
     * a notification of an error.
     */
    timeout = sock_sndtimeo(sk, flags & O_NONBLOCK);
-   compat_init_prepare_to_wait(sk->compat_sk_sleep, &wait, TASK_INTERRUPTIBLE);
+   compat_init_prepare_to_wait(compat_sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
 
    while (sk->compat_sk_state != SS_CONNECTED && sk->compat_sk_err == 0) {
       if (timeout == 0) {
@@ -3244,7 +3244,7 @@
          goto outWaitError;
       }
 
-      compat_cont_prepare_to_wait(sk->compat_sk_sleep, &wait, TASK_INTERRUPTIBLE);
+      compat_cont_prepare_to_wait(compat_sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
    }
 
    if (sk->compat_sk_err) {
@@ -3256,7 +3256,7 @@
    }
 
 outWait:
-   compat_finish_wait(sk->compat_sk_sleep, &wait, TASK_RUNNING);
+   compat_finish_wait(compat_sk_sleep(sk), &wait, TASK_RUNNING);
 out:
    release_sock(sk);
    return err;
@@ -3316,7 +3316,7 @@
     * upon connection establishment.
     */
    timeout = sock_sndtimeo(listener, flags & O_NONBLOCK);
-   compat_init_prepare_to_wait(listener->compat_sk_sleep, &wait, TASK_INTERRUPTIBLE);
+   compat_init_prepare_to_wait(compat_sk_sleep(listener), &wait, TASK_INTERRUPTIBLE);
 
    while ((connected = VSockVmciDequeueAccept(listener)) == NULL &&
           listener->compat_sk_err == 0) {
@@ -3332,7 +3332,7 @@
          goto outWait;
       }
 
-      compat_cont_prepare_to_wait(listener->compat_sk_sleep, &wait, TASK_INTERRUPTIBLE);
+      compat_cont_prepare_to_wait(compat_sk_sleep(listener), &wait, TASK_INTERRUPTIBLE);
    }
 
    if (listener->compat_sk_err) {
@@ -3366,7 +3366,7 @@
    }
 
 outWait:
-   compat_finish_wait(listener->compat_sk_sleep, &wait, TASK_RUNNING);
+   compat_finish_wait(compat_sk_sleep(listener), &wait, TASK_RUNNING);
 out:
    release_sock(listener);
    return err;
@@ -3464,7 +3464,7 @@
    sk = sock->sk;
    vsk = vsock_sk(sk);
 
-   poll_wait(file, sk->compat_sk_sleep, wait);
+   poll_wait(file, compat_sk_sleep(sk), wait);
    mask = 0;
 
    if (sk->compat_sk_err) {
@@ -4104,7 +4104,7 @@
       goto out;
    }
 
-   compat_init_prepare_to_wait(sk->compat_sk_sleep, &wait, TASK_INTERRUPTIBLE);
+   compat_init_prepare_to_wait(compat_sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
 
    while (totalWritten < len) {
       Bool sentWrote;
@@ -4141,7 +4141,7 @@
             goto outWait;
          }
 
-         compat_cont_prepare_to_wait(sk->compat_sk_sleep,
+         compat_cont_prepare_to_wait(compat_sk_sleep(sk),
                                      &wait, TASK_INTERRUPTIBLE);
       }
 
@@ -4194,7 +4194,7 @@
    if (totalWritten > 0) {
       err = totalWritten;
    }
-   compat_finish_wait(sk->compat_sk_sleep, &wait, TASK_RUNNING);
+   compat_finish_wait(compat_sk_sleep(sk), &wait, TASK_RUNNING);
 out:
    release_sock(sk);
    return err;
@@ -4428,7 +4428,7 @@
       goto out;
    }
 
-   compat_init_prepare_to_wait(sk->compat_sk_sleep, &wait, TASK_INTERRUPTIBLE);
+   compat_init_prepare_to_wait(compat_sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
 
    while ((ready = VSockVmciStreamHasData(vsk)) < target &&
           sk->compat_sk_err == 0 &&
@@ -4468,7 +4468,7 @@
          goto outWait;
       }
 
-      compat_cont_prepare_to_wait(sk->compat_sk_sleep, &wait, TASK_INTERRUPTIBLE);
+      compat_cont_prepare_to_wait(compat_sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
    }
 
    if (sk->compat_sk_err) {
@@ -4534,7 +4534,7 @@
    err = copied;
 
 outWait:
-   compat_finish_wait(sk->compat_sk_sleep, &wait, TASK_RUNNING);
+   compat_finish_wait(compat_sk_sleep(sk), &wait, TASK_RUNNING);
 out:
    release_sock(sk);
    return err;