Sony Clie PEG-T665C and Linux

หลังจากรอเช็คเงินเดือนมาเกือบปี วันนี้เงินเดือนออกแล้ว.. ว่าแล้วก็เรื่องไปใช้จ่ายเสียจนได้สิ.. อยากได้ Sony Clie มานานแล้ว ได้เวลาเปลี่ยนปาล์มของผมเสียที .. วันนี้น้องโน้ตก็เลยได้เพื่อนใหม่ชื่อ “น้องเอ้” เดาได้ไม่ยาก ชื่อนี้มาจาก “Clie” นั่นล่ะครับ แต่ของบอก .. วันแรกๆ ไม่รู้สองหล่อนนี่เป็นไง ไม่ยอมคุยกันเลย ผมปวดหัวตั้งนานกว่าจะทำให้สองสาวนี้คุยกันได้.. เรื่องมันก็มีอยู่ว่า…Sony Clie ใช้ USB cradle ในขณะที่น้องโน้ตติดตั้งลินุกซ์ทะเลเอาไว้ .. เริ่มเห็นเค้าความลำบากของผมแล้วใช่ไหม .. นั่นล่ะๆๆ ลินุกซ์ทุกตัวเวลานี้จะ HotSync กับ Clie, Visor, Palm 50x ผ่าน USB cradle ไม่ได้ง่ายๆ หรอกครับ เพราะมันไม่มี Palm Desktop/HotSync ให้นี่นะ งานนี้ก็เลยต้องออกแรงกันหน่อย

สำรวจกันก่อนซักรอบ

งานนี้หวั่นใจว่าจะได้ recompile kernel ยังไงชอบกล.. หลังจากค้นๆ ด้วย google ก็พบว่ากุญแจมันอยู่ที่ USB Serial ครับ ซึ่งมันมีอยู่ใน kernel 2.4 รุ่นหลังๆ อยู่แล้ว ลินุกซ์หลายๆ ตัวก็ compile default kernel ให้สนับสนุน USB Serial แล้วด้วย ดังนั้นสำรวจก่อนเลยว่า kernel สนับสนุน USB แล้วหรือยัง โดยดู message ที่ขึ้นตอน boot เครื่อง (จะ more /var/log/messages หรือ dmesg | more ก็ได้ ตามสะดวก) ถ้า kernel สนับสนุน USB แล้วควรจะปรากฏข้่อความประมาณนี้

Aug 28 23:28:57 admin kernel: usb.c: registered new driver usbdevfs
Aug 28 23:28:57 admin kernel: usb.c: registered new driver hub
Aug 28 23:28:57 admin kernel: usb-uhci.c: $Revision: 1.275 $ time 00:28:04 Aug 24 2002
Aug 28 23:28:57 admin kernel: usb-uhci.c: High bandwidth mode enabled
Aug 28 23:28:57 admin kernel: PCI: Found IRQ 11 for device 00:1d.2
Aug 28 23:28:57 admin kernel: PCI: Setting latency timer of device 00:1d.2 to 64
Aug 28 23:28:57 admin kernel: usb-uhci.c: USB UHCI at I/O 0xa800, IRQ 11
Aug 28 23:28:57 admin kernel: usb-uhci.c: Detected 2 ports
Aug 28 23:28:57 admin kernel: usb.c: new USB bus registered, assigned bus number 1
Aug 28 23:28:57 admin kernel: hub.c: USB hub found
Aug 28 23:28:57 admin kernel: hub.c: 2 ports detected
Aug 28 23:28:57 admin kernel: usb-uhci.c: v1.275:USB Universal Host Controller Interface driver

อาจจะไม่เหมือนเป๊ะๆ แต่ถ้าไม่ฟ้อง error อะไรเกี่ยวกับ USB ก็คงถือได้ว่า kernel สนับสนุน USB แล้ว .. ขั้นต่อไปก็ต้องหา USB serial driver กันล่ะ สำหรับ Clie ก็จะใช้ kernel module ชื่อ visor.o ดังนั้น ลอง modprobe visor กันเลย ..

modprobe visor

ถ้ามีไม่แจ้ง error อะไร ลองสั่ง lsmod จะเห็น

[root@admin data]# lsmod
Module                  Size  Used by    Not tainted
visor                  11936   0  (unused)
usbserial              19264   0  [visor]
<code>
ถ้า {{tail /var/log/messages}} จะเจอข้อความประมาณนี้
<code>
Aug 29 02:38:12 admin kernel: usb.c: registered new driver serial
Aug 29 02:38:12 admin kernel: usbserial.c: USB Serial support registered for Generic
Aug 29 02:38:12 admin kernel: usbserial.c: USB Serial Driver core v1.4
Aug 29 02:38:12 admin kernel: usbserial.c: USB Serial support registered for Handspring Visor
Aug 29 02:38:12 admin kernel: usbserial.c: USB Serial support registered for Palm 4.0
Aug 29 02:38:12 admin kernel: usbserial.c: USB Serial support registered for Sony Cli้ 3.5
Aug 29 02:38:12 admin kernel: usbserial.c: USB Serial support registered for Sony Cli้ 4.x
Aug 29 02:38:12 admin kernel: visor.c: USB HandSpring Visor, Palm m50x, Sony Cli้ driver v1.5

ข้างบนนี้แปลว่าเรา load USB serial driver สำเร็จแล้ว พร้อมใช้งาน ว่าแล้วก็ลองเอาเจ้าเอ้ขึ้นแท่น กดปุ่ม HotSync ตู้มมม… สั่ง tail /var/log/messages ดูอีกที สิ่งที่ปรากฏเพิ่มขึ้นมาก็คือ

Aug 29 02:38:41 admin kernel: hub.c: USB new device connect on bus1/2, assigned device number 2
Aug 29 02:38:41 admin kernel: usbserial.c: Sony Cli้ 4.x converter detected
Aug 29 02:38:41 admin kernel: visor.c: Sony Cli้ 4.x: Number of ports: 2
Aug 29 02:38:41 admin kernel: visor.c: Sony Cli้ 4.x: port 1, is for Generic use and is bound to ttyUSB0
Aug 29 02:38:41 admin kernel: visor.c: Sony Cli้ 4.x: port 2, is for HotSync use and is bound to ttyUSB1
Aug 29 02:38:41 admin kernel: usbserial.c: Sony Cli้ 4.x converter now attached to ttyUSB0 (or usb/tts/0 for devfs)
Aug 29 02:38:41 admin kernel: usbserial.c: Sony Cli้ 4.x converter now attached to ttyUSB1 (or usb/tts/1 for devfs)

นี่แสดงว่าลินุกซ์พบตัวน้องเอ้แล้วผ่านทาง USB serial device สองตัวคือ /dev/usb/ttyUSB0 และ /dev/usb/ttyUSB1 (หรือ usb/tts/0 กับ 1 ในกรณีที่ใช้ devfs) … ถ้าทำได่้ตามนี้ก็ข้ามขั้นตอน recompile kernel ไปได้เลย :D

Recompile kernel

ถ้า kernel ยังไม่สนับสนุน USB และ/หรือ USB Serial ก็ต้อง recompile kernel กันล่ะครับ ไม่ต้องคิดมาก เอา kernel-source ล่าสุดมาเลย จะได้มั่นใจได้ว่าใช้กับ PalmOS 4.1 ได้ด้วย ผมใช้ 2.4.18-10 สิ่งที่ต้อง config ลงไปใน kernel ใหม่เพื่อให้มันทำ USB sync ได้ก็มีดังนี้ครับ

CONFIG_USB=y
CONFIG_USB_UHCI=y หรือ CONFIG_USB_OHCI=y ขึ้นกับ Chipset ของ mainboard
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_VISOR=m

บรรทัดแรกนี่เป็นการตั้งให้สนับสนุน USB บรรทัดที่สองเป็นตัวเลือก USB controller (UHCI หรือ OHCI) board ของผมใช้ Intel chipset ก็จะเลือกเป็น UHCI … บรรทัดที่สามทำให้ใช้ USB Serial ได้ และบรรทัดที่สี่เป็น Serial driver สำหรับ Visor, Clie, และ Palm 50x .. config แล้วก็ตามด้วย

make dep
make bzImage
make modules

ถ้าไม่มี error ก็ต่อด้วย

make install
make modules_install

จากนั้นก็ แก้ lilo.conf หรือ grub.conf ให้ใช้ kernel ตัวใหม่ที่ติดตั้งไป (ปกติมันจะทำให้อยู่แล้วแต่ก็ควรจะตรวจสอบให้ชัวร์ๆ อีกที) ..แล้วก็ reboot .. ตู้มม .. หลังจาก reboot แล้วก็ทดลองทำอย่างข้างบนดู ถ้าทุกอย่างเป็นไปด้วยดี ก็ load visor.o ซะให้เรียบร้อย ขั้นตอนต่อไปเราก็จะมา sync ข้อมูลกันล่ะ

HotSync เย็นๆ

ก่อนจะเปลี่ยนมาใช้ Clie ผมใช้ LinuxDA มาก่อน (มันก็คือ Palm IIIxe นั่นล่ะ) ซึ่งมัน HotSync ผ่าน serial port หรือ IrDA ได้ง่ายๆ ด้วย pilot-link ซึ่งทำ HotSync ด้วยโปรแกรม pilot-xfer ก็ได้ หรือจะใช้ frontend อย่าง J-Pilot หรือ gnome-pilot ก็ได้ .. แต่ข่าวร้ายก็คือ pilot-link version ที่มีอยู่มันไม่ยอม HotSync กับ USB ครับ ทำตามคนอื่นๆ ที่เค้าว่าได้ ก็ไม่เห็น work เหมือนเค้าเลย .. ซวยสิงานนี้.. ว่าแล้วก็ท่องยุทธจักรกูเกิ้ลอีกรอบ.. แล้วก็พบว่า หมัดเด็ดของเรื่องนี้คือแพคเกจชื่อตรงข้ามกับ HotSync นั่นก็คือ “ColdSync” ..

เจ้า ColdSync นี่มันไม่มีให้มากับ TLE 4.1 Rel 2 หรือแม้แต่ RedHat ก็ไม่มี .. แต่ก็ยังดีที่ Mandrake ทำเป็น rpm ไว้ให้ งานนี้ไม่ต้องคิดมาก download, rpm -Uvh กันเลย … เสร็จเรียบร้อยแล้วก็ถึงคราวต้องคอนฟิก ColdSync เสียก่อน .. configuration files ของมันก็คือ $HOME/.coldsyncrc ครับ ถ้าไม่มีก็สร้างขึ้นมาใหม่ได้เลย เริ่มแรก ใส่ไปห้าบรรทัดก่อน

listen serial {
    protocol: net;
    device: /dev/usb/ttyUSB0;
    transient;
}

เสร็จแล้วก็สั่ง coldsync -mI กดปุ่ม HotSync ที่ cradle หรือสั่งจากโปรแกรม HotSync บน Clie ก็ได้ .. ถ้ามันทำงานได้ coldsync จะให้ config สำหรับ Clie ออกมาก เช่น

[kitt@admin kitt]$ coldsync -mI
Please press the HotSync button.

This Palm already has user information that matches neither what's in your
configuration file, nor the defaults. Please edit your .coldsyncrc and
reinitialize.

Your .coldsyncrc should contain something like the following:

pda {
    snum: "HXXXXXXXXXXX-X";
    username: "Kitt Tientanopajai";
    userid: 30920;
}

ให้ก๊อปปี้ไปใส่ใน ~.coldsyncrc เลยครับ ตัวอย่าง ~.coldsyncrc ของผมคือ

listen serial {
    protocol: net;
    device: /dev/usb/ttyUSB0;
    transient;
}

pda "My Clie" {
    snum: "HXXXXXXXXXXX-X";
    username: "Kitt Tientanopajai";
    userid: 30920;
    directory: "/home/kitt/data/clie";
    default;
}

บรรทัด directory เป็นการคอนฟิก directory ที่จะ backup ข้อมูลไว้ครับ ถ้าไม่ใส่ก็ไม่มีปัญหาครับ ค่า default ของ coldsync จะเก็บไว้ใน $HOME/.palm ให้ครับ ส่วนบรรทัดสุดท้ายเอาไว้ระบุว่าเป็น default entry .. เอาล่ะทีนี้ก็ลอง sync กันเลยครับ สั่ง coldsync รอ แล้วก็กด HotSync ที่ cradle จากนั้นมันก็จะ synchronize ข้อมูลให้ ง่ายเจงๆ ..

Sync กับ IrDA

หากต้องการจะ sync ผ่าน IrDA ก็ย่อมได้ครับ .. ไม่ต้องคิดมาก ลุยเลยดีกว่า…

service irda start
coldsync -p /dev/ircomm0

แบบนี้จะเป็นการสั่งให้ coldsync เชื่อมต่อกับ clie ผ่าน /dev/ircomm0 (ircomm protocol, irda port) แทนการเชื่อมต่อที่กำหนดไว้ใน $HOME/.coldsyncrc

ข้อดีของ IrDA ก็เห็นจะเป็นเรื่องไม่ต้องพก cradle ไปไหนมาไหนด้วยตลอดเวลา และยังใช้งานกับโปรแกรมอื่นๆ นอกจาก coldsync ได้ เช่น ใช้กับ pilot-link ก็สั่งงานเป็น

pilot-xfer -p /dev/ircomm0 -s /home/kitt/data/clie/backup

ถ้าต้องการใช้งาน IrDA กับ pilot-link เป็นเรื่องเป็นราวก็ทำอย่างนี้ครับ

ln -sf /dev/ircomm0 /dev/pilot
export PILOTPORT=/dev/pilot
export PILOTRATE=115200

จากนั้นก็สั่ง pilot-xfer -s /path/to/sync/data

ก็ลองใช้ดู โดยส่วนตัวถ้าจะ sync ข้อมูลผมชอบ coldsync มากกว่า pilot-link เพราะใช้งานกับ USB และ IrDA ได้แน่นอนกว่า แต่ pilot-link เองก็ใช่ว่าจะไม่มีประโยชน์นะครับ งานบางงาน เช่น อ่าน/บันทึก memo, todo, databook จาก/ลง clie หรือใช้ install database จำนวนน้อยๆ (2-3 files) ใช้ pilot-link สะดวกกว่า เพราะมีคำสั่งเตรียมไว้ให้ใช้งานครบ สั่งปุ๊ปก็ทำงานทันทีเป็นอย่างๆ ไป โดยไม่ต้องเสียเวลารอ sync ข้อมูลอื่นๆ ที่ไม่เกี่ยวข้อง .. สรุปก็คือ สำหรับ Clie ถ้าต้องการ sync ใช้ coldsync จะดีกว่า แต่ถ้าใช้งานจิปาถะอื่นๆ pilot-link จะมีเครื่องมือพร้อมกว่า .. ก็เลือกใช้ตามความเหมาะสม (หรือไม่ก็ความชอบส่วนตัว) ก็แล้วกันครับ ..

อื่นๆ..

ผมเขียน shell script ง่ายๆ สำหรับเช็คและติดตั้ง kernel module ให้ก่อนจะ coldsync .. ก๊อปไปใส่ใน $HOME/bin ได้เลย จะ sync ทีก็สั่ง cliesync เคาะ enter ก็พอ..

[kitt@admin bin]$ more cliesync
#!/bin/sh
if [ "`lsmod | grep visor | grep -v usbserial | cut -d' ' -f1`" = "" ]; then
    sudo modprobe visor
    echo Insert visor.o module
fi
coldsync -I

อ่อ.. เกือบลืม วิธีติดตั้ง prc, pdb database ของปาล์มผ่าน ColdSync ง่ายมากครับ แค่ก๊อบไปไว้ใน $HOME/.palm/install หรือใน directory ที่ระบุใน .coldsyncrc (ตัวอย่างจากคอนฟิกของผมจะเป็น /home/kitt/data/clie/install) มันจะติดตั้งให้เองอัตโนมัติเวลาทำ HotSync เหมือนกับบนวินโดวส์นั่นล่ะ ColdSync มันจะตรวจสอบว่า database ที่ต้องการติดตั้งนั้น มีอยู่ใน Clie แล้วหรือยัง ถ้าไม่มีมันจะติดตั้งให้เลย ถ้ามีอยู่แล้วมันจะเลือกเอาตัวที่ใหม่กว่า ถ้าต้องการบังคับให้ติดตั้งโดยไม่สนว่ามันใหม่กว่าหรือเก่ากว่าก็ต้องสั่ง coldsync -I (อย่างในบรรทัดสุดท้ายของ shell script นั่นล่ะ)

ถ้าสั่ง coldsync แล้วมันไม่ยอมทำงาน ลองแก้ ~.coldsyncrc ดูครับ เพราะกว่าผมจะใช้ได้ ก็มั่วจนแทบจะหนีไปใช้ Palm Desktop บนวินโดวส์เสียให้รู้แล้วรู้รอด บรรทัดที่แก้แล้วอาจจะทำงานได้ก็คือตรง protocol ครับ มันมีหลายแบบนะ ที่ผมใช้คือ net .. ถ้าไม่ work ลองเปลี่ยนเป็น default, full, simple ดู

กรณีสั่งงานแล้วมี error เกี่ยวกับ permission .. เช็ค owner และ permission ของ /dev/usb/ttyUSB* ปกติ owner จะเป็น root:uucp ดังนั้นจะต้องเปลี่ยน permission ให้เป็น 666 เพื่อให้ users ทั่วไปใช้งานได้ .. หรือจะให้ดีและปลอดภัยกว่าก็แก้ /etc/security/console.perms บรรทัด ให้มี /dev/usb/ttyUSB*

<pilot>=/dev/pilot /dev/usb/ttyUSB*

วิธีหลังนี้ owner ของ /dev/usb/ttyUSB* จะเป็นตัว users ที่ login จึงใช้ permission 600 ได้

ลินุกซ์สามารถเชื่อมกับ Memory Stick ของ Clie ได้ด้วย โดย mount เป็น USB storage . เริ่มจากเรียกใช้ MSImport บน Clie แล้วสั่ง modprobe usb-storage บนลินุกซ์ แล้วตามด้วย mount /dev/sda1 /mnt ถ้าทุกอย่างเป็นไปด้วยดีก็จะเชื่อมกับ Memory Stick ผ่าน /mnt .. จะก๊อปปี้ ลบ ย้าย ข้อมูลอะไรก็ได้ตามสะดวกครับ เสร็จแล้วก็อย่าลืม umount /mnt ด้วยก่อนจะ disconnect MSImport

Update !! – pilot-link ก็ sync ผ่าน USB ได้แล้ว :D

pilot-link version หลังๆ สนับสนุน USB แล้วครับ ผมใช้เวอร์ชั่น 0.11.2 การใช้งานก็เหมือนกับการ sync ผ่าน Serial port หรือ IrDA เพียงแต่ต้อง load visor.o แล้วก็ระบุ port เป็น /dev/usb/ttyUSB{0|1} เท่านั้นล่ะ อย่างเช่น

pilot-xfer -p /dev/usb/ttyUSB0 -u /home/kitt/data/clie/backup

เท่าที่ลอง transfer rate ก็พอๆ กับ ColdSync .. และก็เช่นเดียวกับ ColdSync คือเวลา sync ให้กด HotSync ที่ Clie ก่อน แล้วค่อยสั่งคำสั่งบนลินุกส์ครับ …

เรื่อง Clie กับ ลินุกซ์ก็จบแล้ว .. แบคอัพข้อมูลน้องเอ้ … เข้านอน .. ราตรีสวัสดิ์ Zz…z…