[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mhc:01582] Re: Palm



舟橋と申します。

  Toyonobu Sawada <non@xxxxxxxxxxxx>
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
> こ> 白井さんに PEG-T650C
> こ> http://www.jp.sonystyle.com/peg/Store/Clie/T650c/index.html
> こ> あたりを買ってもらって色々やってもらって、できた結果を聞こうかな。:-)
> 賛成!!

昨日、CLIE PEG-T650C を入手したので mhc2palm, palm2mhcが
Linux(Vine-2.5)上で動かないか、試行錯誤してみました。

結論から言いますと、CLIE でも USB 接続で mhc2palm, palm2mhc ができました。
pilot-link-0.10.99 + mhc_pilib.c への patch という組合わせで解決しました。

CLIE で pilot-link を使う方法は
http://browncat.org/palm/clie.html
が非常に参考になりました。

上記URLに記述されている通りに
/usr/src/linux/drivers/usb/serial/visor.h にpatchをあてて、
kernel module を make install しました。

その後、

  # ln -s /dev/ttyUSB0 /dev/pilot

として /dev/pilot にリンクをはり、pilot-link-0.10.99 の
pilot-xfer を以下の手順で実行しました。

    1. クレードルのHotSyncボタンを押す。
    2. % pilot-xfer -l
       No $PILOTPORT specified and no -p <port> given.
       Defaulting to '/dev/pilot'

         Listening to port: /dev/pilot

         Please press the HotSync button now... Connected

       Reading list of databases in RAM...
       ATD2Lrn
       ATD2Engn
       ...
      と、Clie に入っているファイルが表示されました。

jpilot-0.99.2 もうまく動作しましたが、mhc2palm, palm2mhc は
pilot-link-0.9.3 を元にしているのでうまく動きませんでした。

そこで jpilot-0.99.2 の source を元に mhc_pilib.c への
patch を作成して mhc_pilib.so を作り直したところ、うまくいきました。

patch (mhc_pilib.c.usb.diff) をこのメールに添付します。
本日 CVS で取ってきた mhc-current に対応しています。
以下の通りに patch をあててください。

    % cd mhc/ruby-ext
    % patch < mhc_pilib.c.usb.diff
    % cd ..
    % ruby configure.rb
    % ruby make.rb
    # ruby make.rb install

mhc_pilib.c.usb.diff は

 o pilot-link-0.10.99 対応
 o USB デバイス対応

となっているはずです。本patch適応後も、元の pilot-link-0.9.3、
シリアルクレードルでのコンパイル、動作に影響はないはずです。
お試しいただけたら幸いです。
-- 
Akira Funahashi/舟橋 啓
[funa@xxxxxxxx]
--- mhc_pilib.c.dist	Mon May 29 23:59:25 2000
+++ mhc_pilib.c	Wed Jun 19 22:42:26 2002
@@ -24,6 +24,20 @@
 #include "pi-address.h"
 #include "pi-appinfo.h"
 
+/* Try to determine if version of pilot-link > 0.9.x */
+#ifdef USB_PILOT_LINK
+# undef USB_PILOT_LINK
+#endif
+
+#if PILOT_LINK_VERSION > 0
+# define USB_PILOT_LINK
+#else
+# if PILOT_LINK_MAJOR > 9
+#  define USB_PILOT_LINK
+# endif
+#endif
+
+
 VALUE mPiLib;
 
 /*************************************************************/
@@ -34,7 +48,10 @@
 static VALUE rpi_sock_open(VALUE obj, VALUE dev)
 {
   int sd;
+  int i, ret;
+  int dev_usb;
   struct pi_sockaddr addr;
+  char link[256], dev_str[256], dev_dir[256], *Pc;
 
   Check_Type(dev, T_STRING);
 
@@ -42,13 +59,78 @@
     return Qnil;
 
   strcpy(addr.pi_device, STR2CSTR(dev));
-  addr.pi_family = PI_AF_SLP;
 
+  /* pilot-link > 0.9.5 needed for many USB devices */
+#ifdef USB_PILOT_LINK
+  /* Newer pilot-link */
+  addr.pi_family = PI_AF_PILOT;
+  if (!(sd = pi_socket(PI_AF_PILOT, PI_SOCK_STREAM, PI_PF_DLP)))
+    return Qnil;
+#else
+  /* 0.9.5 or older */
+  addr.pi_family = PI_AF_SLP;
   if (!(sd = pi_socket(PI_AF_SLP, PI_SOCK_STREAM, PI_PF_PADP)))
     return Qnil;
+#endif
 
-  if (pi_bind(sd, (struct sockaddr*)&addr, sizeof(addr)) < 0)
-    return Qnil;
+  /* This is for USB, whose device doesn't exist until the cradle is pressed
+   * We will give them 5 seconds */
+  dev_str[0]='\0';
+  link[0]='\0';
+  strncpy(dev_str, STR2CSTR(dev), 255);
+  strncpy(dev_dir, STR2CSTR(dev), 255);
+  dev_str[255]='0';
+  dev_dir[255]='0';
+  dev_usb=0;
+  for (Pc=&dev_dir[strlen(dev_dir)-1]; Pc>dev_dir; Pc--) {
+	if (*Pc=='/') *Pc='\0';
+	else break;
+  }
+  Pc = strrchr(dev_dir, '/');
+  if(Pc) {
+    *Pc = '\0';
+  }
+  for (i=10; i>0; i--) {
+   	  ret = readlink(dev_str, link, 256);
+	  if (ret>0) {
+		  link[ret]='\0';
+      } else {
+     if (strstr(dev_str, "usb") || strstr(dev_str, "USB")) {
+        dev_usb=1;
+     }
+     break;
+      }
+      if (link[0]=='/') {
+     strcpy(dev_str, link);
+     strcpy(dev_dir, link);
+     for (Pc=&dev_dir[strlen(dev_dir)-1]; Pc>dev_dir; Pc--) {
+        if (*Pc=='/') *Pc='\0';
+        else break;
+     }
+     Pc = strrchr(dev_dir, '/');
+     if (Pc) {
+        *Pc = '\0';
+     }
+      } else {
+     snprintf(dev_str, 255, "%s/%s", dev_dir, link);
+     dev_str[255]='\0';
+      }
+      if (strstr(link, "usb") || strstr(link, "USB")) {
+     dev_usb=1;
+     break;
+      }
+   }
+
+  if (dev_usb) {
+	  for (i=7; i>0; i--) {
+		  ret = pi_bind(sd, (struct sockaddr*)&addr, sizeof(addr));
+		  if (ret!=-1) break;
+		  sleep(1);
+	  }
+  } else {
+	  ret = pi_bind(sd, (struct sockaddr*)&addr, sizeof(addr));
+  }
+  if (ret == -1) return Qnil;
 
   return INT2FIX(sd);
 }