[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);
}