Tag Archives: clie

Sync ปาล์ม / คลีเอ้ผ่านพอร์ตอินฟราเรด (IrDA) บนลินุกซ์

ขั้นตอน config

เริ่มแรกก็ตรวจสอบก่อนว่าเคอร์เนลมองเห็นพอร์ตอินฟราเรดแล้วหรือยัง โดยดูได้จากรายชื่อของพอร์ตสื่อสารที่ปรากฏใน dmesg:

[kitt@peorth kitt]$ dmesg | grep ttyS
ttyS00 at 0x03f8 (irq = 4) is a 16550A
ttyS01 at 0x02f8 (irq = 3) is a 16550A

หนึ่งในนั้นควรจะเป็นพอร์ตอินฟราเรด เช่น เครื่องที่ผมใช้ ttyS01 (หรือ COM2) คือพอร์ตที่เป็นอินฟราเรด เวลาใช้งานพอร์ตนี้ก็จะติดต่อผ่านดีไวซ์ /dev/ttyS1 เมื่อรู้ว่าใช้ดีไวซ์ตัวไหนแล้วก็ไปตั้งใน/etc/sysconfig/irda อย่างนี้

[kitt@peorth kitt]$ cat /etc/sysconfig/irda
IRDA=yes
DEVICE=/dev/ttyS1
DISCOVERY=yes

มาถึงตรงนี้ก็เป็นอันเสร็จขั้นตอนการ config พอร์ตอินฟราเรดสำหรับลินุกซ์ หากรีบูตระบบหรือสั่ง service irda start ลินุกซ์ก็พร้อมที่จะติดต่อกับพอร์ตอินฟราเรดแล้ว :)

แต่ต้องทำความเข้าใจอีกนิดว่าพอร์ตอินฟราเรดนั้นสามารถทำงานได้หลายรูปแบบขึ้นกับว่าใช้โปรโตคอลในการสื่อสารแบบไหน .. กรณีปาล์ม/คลีเอ้จะเชื่อมต่อด้วยโปรโตคอลแบบเดียวกับพอร์ตสื่อสาร (ircomm-tty) ซึ่งจะทำงานผ่านดีไวซ์ /dev/ircomm0 ครับ .. หาก sync ปาล์ม/คลิเอ้ผ่านอินฟราเรดเป็นประจำก็ควรทำ symlink จาก /dev/pilot ไปที่ /dev/ircomm0 ไว้เลยครับ เพราะโปรแกรมส่วนใหญ่จะใช้ /dev/pilot เป็นดีไวซ์ในการสื่อสารโดยปริยาย

(as root)
[kitt@peorth kitt]# ln -sf /dev/ircomm0 /dev/pilot

ทีนี้เราก็พร้อมจะเริ่ม sync กันแล้ว :D

วิธี synchronize ข้อมูล

โปรแกรมพื้นฐานที่สุดในการนี้ก็คือ pilot-xfer (หากไม่มี ให้ติดตั้งแพคเกจ pilot-link) การ backup/sync/restore/install ใช้คำสั่งนี้เพียงคำสั่งเดียวเลย

  • pilot-xfer -b สำหรับ backup (ทุก file)
  • pilot-xfer -s สำหรับ sync (backup เฉพาะ update ที่มีการ update)
  • pilot-xfer -r สำหรับ restore
  • pilot-xfer -i foo.prc สำหรับติดตั้ง foo.prc ลงในเครื่องปาล์ม/คลีเอ้

หากสั่งงานเหมือนข้างบนนี้ pilot-xfer จะใช้ดีไวซ์ /dev/pilot ในการเชื่อมกับปาล์ม/คลีเอ้ และเก็บข้อมูลลง $HOME/.pilot ซึ่งเป็น default directory ที่ใช้เก็บข้อมูล .. รายละเอียดอื่นๆ (อีกเยอะ) ดูได้ด้่วยการสั่ง man pilot-xfer ครับ มันมีโปรแกรมสำหรับ อ่าน/เขียน todo, memo, datebook, etc. ด้วย

อื่นๆ

Diagram การเชื่อมต่อจะประมาณนี้ครับ:

pilot-link -> /dev/pilot -> /dev/ircomm0 -> [ircomm-tty -> ircomm -> irda] ->
/dev/irda0 -> Hardware IrDA device -> palm

ข้างใน [ … ] คือส่วนของเคอร์เนลครับ ถ้า compile irda เป็น kernel module แล้ว lsmod ดูจะเห็นว่ามี

ircomm-tty             38528   0  (autoclean)
ircomm                 18252   0  [ircomm-tty]
irtty                  10048   2  (autoclean)
irda                  191872   0  (autoclean) [ircomm-tty ircomm irtty]

กรณีที่ compile kernel เองและต้องการใช้พอร์ดอินฟราเรดตรวจดูตามนี้ครับ

CONFIG_IRDA=m
CONFIG_IRLAN=m
CONFIG_IRNET=m
CONFIG_IRCOMM=m
CONFIG_IRDA_ULTRA=y
CONFIG_IRDA_CACHE_LAST_LSAP=y
CONFIG_IRDA_FAST_RR=y
CONFIG_IRDA_DEBUG=y
CONFIG_IRTTY_SIR=m
CONFIG_IRPORT_SIR=m

ส่วน Dongle / FIR ก็ config ตามฮาร์ดแวร์ที่มีอยู่ครับ

บางระบบจะไม่ probe ircomm-tty อัตโนมัติ ถ้าเจอกรณีนี้ก็ต้อง modprobe/insmod เองครับ โดย

(as root)
[kitt@peorth kitt]# modprobe ircomm-tty

จากนั้นค่อยเริ่ม pilot-xfer

มี palm หลายๆ รุ่น (หรืออาจจะทุกรุ่น ?) ที่จำเป็นต้องตั้ง flow control ของ IR เป็น off ด้วย ไม่งั้น

มันไม่ sync ครับ วิธีตั้งก็

HotSync -> Options -> Connection Setup -> IR to a PC/Handheld ->
Edit ... -> Details ... -> Flow Ctl: -> Off

ถ้าติดปัญหาเรื่อง permission เช็คที่ /etc/security/console.perm ควรจะมีสองบรรทัดนี้

<pilot>=/dev/pilot /dev/usb/ttyUSB* /dev/ircomm*
....
<console> 0600 <pilot>      0660 root.uucp

ถ้าไม่มี หรือมีแต่ไม่เหมือน ก็แก้ไขให้ได้ตามนี้ครับ จากนั้นก็ logout แล้ว login เข้ามาใหม่

Clie networking with Linux – พาน้องเอ้ท่องอินเทอร์เน็ต

วันนี้เกิดคึกอะไรขึ้นมาก็ไม่ทราบได้ อยากลองต่อ Clie เชื่อมอินเทอร์เน็ตผ่าน USB ดูว่าจะทำได้มั้ย วิธีการที่คิดไว้ก็คือใช้ PPP ผ่าน USB Serial ครับ … ก่อนอื่นก็ต้องเซ็ตค่าน้องเอ้ก่อน

Pref ==> Network:
Service: My Network
User Name: ไม่ต้องใส่
Password: ไม่ต้องใส่
Connection: Cradle/Cable

[Details...]
Connection type: PPP
Idle timeout: Never
Query DNS: Checked
IP Address: Checked Automatic

[Script...]
บรรทัดแรก เลือก End:

ส่วนของลินุกซ์ ..

ความต้องการพื้นฐานทางฝั่งลินุกซ์นี่แบ่งได้เป็นสองส่วนครับ ส่วนแรกคือส่วนของ USB Serial ซึ่งจำลอง USB เป็นดีไวซ์แบบซีเรียลเหมือน /dev/ttyS0 ทำให้เราใช้ PPP บน USB connection ได้ .. ส่วนที่สองก็คือส่วนของ PPP protocol .. มาเริ่มที่ USB Serial ก่อน .. ตรวจสอบเคอร์เนลตามนี้ครับ

CONFIG_USB_SERIAL=y or m
CONFIG_USB_SERIAL_GENERIC=y or m
CONFIG_USB_SERIAL_VISOR=y or m

อันสุดท้ายไม่เกี่ยวกับงานนี้เท่าไหร่ แต่จะได้ใช้แน่ๆ ถ้าต้องการ sync ข้อมูลระหว่าง Clie กับลินุกซ์ก็เลยเอามารวมไว้ด้วย .. ส่วนของ PPP ก็มี:

Network device support
CONFIG_DUMMY=y or m
CONFIG_PPP=y or m
CONFIG_PPP_ASYNC=y or m
CONFIG_PPP_DEFLATE=y or m
CONFIG_PPP_BSDCOMP=y or m

หลังจากเคอร์เนลสนับสนุน USB Serial และ PPP แล้วทีนี้ก็มาทดสอบกัน

กรณีของผม peorth ใช้ไอพีแอดเดรส 192.41.170.215 อยู่ในเครือข่าย 192.41.170.0/24 ผมแอบขโมยไอพี 192.41.170.217 มาใช้กับ Clie เป็นการชั่วคราว .. ส่วน Yggdrasil (192.41.170.225) เอาไว้ทดสอบการเชื่อมต่อ .. ก่อนอื่นต้อง enable IP Forwarding เสียก่อนด้วยการสั่ง

[root@peorth root]# echo "1" > /proc/sys/net/ipv4/ip_forward

เราจำเป็นต้องใช้ IP Forwarding เพราะว่าแพคเก็ตจะต้องส่งข้ามอินเทอร์เฟซ eth0 และ ppp0 .. จากนั้นที่ Clie เลือก Pref ==> Network ==> [Connect] ลองเช็ค /var/log/messages ก็จะเห็น

Jun 30 01:48:59 peorth /etc/hotplug/usb.agent: Setup visor for USB product 54c/9a/100
Jun 30 01:48:59 peorth kernel: usbserial.c: USB Serial support registered for Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x
Jun 30 01:48:59 peorth kernel: usbserial.c: Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x converter detected
Jun 30 01:48:59 peorth kernel: host/usb-uhci.c: interrupt, status 2, frame# 1833
Jun 30 01:48:59 peorth kernel: usbserial.c: Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x converter now attached to ttyUSB0 (or usb/tts/0 for devfs)
Jun 30 01:48:59 peorth kernel: usbserial.c: Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x converter now attached to ttyUSB1 (or usb/tts/1 for devfs)
Jun 30 01:48:59 peorth kernel: usbserial.c: USB Serial support registered for Sony Cli้ 3.5
Jun 30 01:48:59 peorth kernel: visor.c: USB HandSpring Visor, Palm m50x, Treo, Sony Cli้ driver v1.7

สุดท้ายก็รัน pppd:

[root@peorth root]# pppd /dev/usb/ttyUSB0 115200 10.0.0.1:192.41.170.217 ms-dns 192.41.170.15 noauth nodetach proxyarp
<code>
หลังจากสั่งคำสั่งเรียบร้อยแล้ว pppd จะไม่หลุดมาที่พรอมพ์แต่จะแสดงข้อความบอกสถานะการเชื่อมต่อ:
<code>
Using interface ppp0
Connect: ppp0  /dev/usb/ttyUSB0
Cannot determine ethernet address for proxy ARP
local  IP address 10.0.0.1
remote IP address 192.41.170.217

ถ้าใครคอมไพล์ PPP เป็นเคอร์เนลโมดูลลอง lsmod ดูควรจะปรากฏรายชื่อโมดูลประมาณนี้:

ppp_deflate             4504   0 (autoclean)
zlib_deflate           21528   0 (autoclean) [ppp_deflate]
bsd_comp                5464   0 (autoclean)
ppp_async               9440   1 (autoclean)
ppp_generic            20156   3 (autoclean) [ppp_deflate bsd_comp ppp_async]
slhc                    6756   1 (autoclean) [ppp_generic]

ออพชั่นที่ใส่ให้ pppd ประกอบด้วยซีเรียลดีไวซ์ที่ต้องการใช้งาน (/dev/usb/ttyUSB0) อัตราการส่งข้อมูล 115200 บิตต่อวินาที กำหนดไอพีแอดเดรสของ ppp0 ฝั่งลินุกซ์เป็น 10.0.0.1 (เอา private IP หมายเลขไหนก็ได้ที่ไม่มีใครใช้) pppd จะกำหนดไอพีของ Clie เป็น 192.41.170.217 (ตามที่แอบขโมยมาใช้ :P) และกำหนดไอพีแอดเดรสของ DNS Server ที่ให้ Clie ใช้เป็น 192.41.170.15 ออพชั่น noauth ทำให้เชื่อมต่อได้ทันทีโดยไม่ต้องมี Authentication (แปลว่าไม่ต้องใส่ login/password) .. nodetach ทำให้ pppd คงการควบคุมพอร์ตไว้ ถ้าไม่ใส่ pppd จะปล่อยการควบคุมให้กับระบบทันทีที่การเชื่อมต่อทำได้สำเร็จ และสุดท้าย proxyarp ทำให้เครื่องอื่นๆ มองเห็น Clie เป็นเครื่องหนึ่งในเครือข่ายเดียวกับ Peorth … จากตรงนี้ถ้าเช็ค ifconfig ก็จะมีอินเทอร์เฟซ ppp0 ปรากฏขึ้นมาไอพีแอดเดรสของ ppp0 คือ 10.0.0.1 เชื่อม Point-to-Point ไปยังไอพีแอดเดรส 192.41.170.217 ที่กำหนดให้กับ Clie:

ppp0      Link encap:Point-to-Point Protocol
          inet addr:10.0.0.1  P-t-P:192.41.170.217  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:82 (82.0 b)  TX bytes:97 (97.0 b)

จะลอง ping ไปยัง Clie ดูก็ได้ครับ:

[kitt@yggdrasil kitt]$ ping 192.41.170.217
PING 192.41.170.217 (192.41.170.217) from 192.41.170.225 : 56(84) bytes of data.
64 bytes from 192.41.170.217: icmp_seq=1 ttl=254 time=15.1 ms
64 bytes from 192.41.170.217: icmp_seq=2 ttl=254 time=4.89 ms
64 bytes from 192.41.170.217: icmp_seq=3 ttl=254 time=1.31 ms
64 bytes from 192.41.170.217: icmp_seq=4 ttl=254 time=0.431 ms

ถ้าได้ขนาดนี้ Clie ก็ท่องอินเทอร์เน็ตได้ละ .. :D

มีข้อสังเกตเล็กน้อยที่ผลของคำสั่ง ping .. 192.41.170.217 และ 192.41.170.225 อยู่ในเครือข่ายเดียวกันคือ 192.41.170.0/24 ซึ่งปกติแล้วเมื่อสั่ง ping ค่า TTL (Time-To-Live) ของแพคเก็ตจะเป็น 64 หรือ 255 .. แต่ในกรณีนี้ TTL=254 เพราะแพคเก็ตต้อง forward ข้าม eth0 ไปยัง ppp0 ที่เชื่อมกับ Clie (เสมือนกับมีเราท์เตอร์คั่นอยู่ 1 hop) ทำให้ TTL มีค่าลดลงไป 1 ค่า

ถ้าไม่มีไอพีสำหรับ Clie

ในกรณีที่ไม่มีไอพีแอดเดรสที่จะกำหนดให้กับ Clie ก็ต้องทำ IP Masquerading บน eth0 กันล่ะครับ เพื่อให้ Clie ใช้ private IP เชื่อมต่ออินเทอร์เน็ตได้ผ่านทาง Peorth .. เอาล่ะครับ เช็คเคอร์เนลกันก่อนเลย

Networking option:
CONFIG_NETFILTER=y

IP: Netfilter Configuration:
CONFIG_IP_NF_CONNTRACK=y or m
CONFIG_IP_NF_IPTABLES=y or m
CONFIG_IP_NF_NAT=y or m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=y or m

จัดการเคอร์เนลเสร็จเรียบร้อยแล้วก็

[root@peorth root]# cat "1" > /proc/sys/net/ipv4/ip_forward
[root@peorth root]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

คำสั่งนี้เป็นการทำ IP Masquerading อย่างง่ายๆ ครับ ถ้าใครเลือกคอมไพล์ออพชันต่างๆ เป็นโมดูลก็ลอง lsmod ดูครับ

ipt_MASQUERADE          2168   1  (autoclean)
iptable_nat            21272   1  (autoclean) [ipt_MASQUERADE]
ip_conntrack           27336   1  (autoclean) [ipt_MASQUERADE iptable_nat]
ip_tables              14904   4  [ipt_MASQUERADE iptable_nat]

ทีนี้ก็กด Connect ใน Pref ==> Network ==> [Connect] ของ Clie แล้วก็

[root@peorth root]# pppd /dev/usb/ttyUSB0 115200 10.0.0.1:10.0.0.2  ms-dns 192.41.170.15 noauth nodetach

ก็จะปรากฏ

Using interface ppp0
Connect: ppp0  /dev/usb/ttyUSB0
Cannot determine ethernet address for proxy ARP
local  IP address 10.0.0.1
remote IP address 10.0.0.2

จะเห็นว่าไอพีแอดเดรสของ Clie ตอนนี้ถูกกำหนดเป็น 10.0.0.2 แทน แต่ Clie ก็ยังใช้งานอินเทอร์เน็ตได้เหมือนกับ public IP จะต่างกันก็ตรงที่เครื่องอื่นๆ ไม่สามารถ ping ไปยัง Clie ได้เพราะมัน masquerade อยู่นั่นเอง .. ข้อสังเกตอีกอย่างคือ กรณีที่ทำ IP Masquerading เครื่อง Clie จะอยู่ใน private network จึงไม่จำเป็นต้องใช้ proxy ARP

แต่ไม่ว่าจะยังไง คราวนี้ก็ผมก็ sync AvantGo ผ่าน Mobile Link หรือ AG Connect ได้ไม่ยากแล้ว หรือจะเช็คเมล์ ไอซีคิว ฯลฯ ก็ยังไหว .. โฮ่ๆๆ :D

อื่นๆ

สำหรับลินุกซ์ทะเล RedHat และดิสตริบิวชั่นที่มีพื้นฐานจาก RedHat สามารถกำหนดให้ทำ IP Forwarding ถาวรเลยก็ได้ครับ โดยเพิ่มบรรทัด

FORWARD_IPV4=true

เข้าไปใน /etc/sysconfig/network แต่ผมไม่แนะนำให้ทำ เพราะเราคงไม่ได้ต่อ Clie ใช้อินเทอร์เน็ตบ่อยครั้งนัก จึงไม่จำเป็นต้องเปิด IP Forwarding ไว้ตลอดเวลา เขียนเชลล์สคริปต์ให้ทำงานเป็นครั้งๆ ไปจะดีกว่า .. ส่วนออพชั่นของเคอร์เนลถ้าเป็นไปได้ก็ควรเลือกคอมไพล์เป็นโมดูลด้วยเหตุผลเดียวกัน

คำสั่ง pppd จำเป็นต้องเรียกใช้ “หลัง” สั่ง Connect ที่ Clie เพราะดีไวซ์ /dev/usb/ttyUSB0 จะไม่ปรากฏในระบบจนว่า Clie จะเริ่มการเชื่อมต่อเข้ามาทาง USB .. หากเรียก pppd ก่อนสั่ง Connect จะมี error message ขึ้นมาประมาณว่า

Failed to open /dev/usb/ttyUSB0: No such device

ส่วนเวลาที่สั่ง disconnect ที่ Clie pppd มักจะค้างและมี error ขึ้น เป็นเพราะว่าดีไวซ์ /dev/usb/ttyUSB0 มันหายไปจากระบบแล้ว pppd จึงไม่สามารถสั่ง flush ดีไวซ์ได้ ให้กด Ctrl+C เพื่อออกจาก pppd

สุดท้าย .. หากอะไรๆ ไม่เป็นไปอย่างที่คาดหวัง หรือไม่เป็นไปตามที่ผมเขียนๆ ไว้ .. ลอง tail /var/log/message lsmod modprobe tcpdump man และ google อาจจะพอช่วยได้ .. ไปนอนล่ะคร้าบบ

เมาท์เมโมรีสติ๊กบน Sony Clie T-665C

รอมานานแสนนานกว่าจะหาวิธีคอนฟิกให้เมาท์ memory stick ของ Clie PEG T-665C และ Clie รุ่นหลังๆ ได้ .. ปัญหาติดอยู่ที่ไดรเวอร์ USB Storage ในเคอร์เนล ดังนั้นงานนี้จะต้องแก้ซอร์สของเคอร์เนลและต้อง recompile เคอร์เนลกันใหม่

ไฟล์ที่ต้องแก้คือ /usr/src/linux/drivers/usb/storage/transport.c .. ในไฟล์นี้ ให้เปลี่ยน

   /* was this a command-completion interrupt? */
 if (us->irqbuf[0] && (us->subclass != US_SC_UFI)) {
   US_DEBUGP("-- not a command-completion IRQ");
   return;
 }

เป็น

 us->irqbuf[0] = 0;

แก้เสร็จก็ recompile เคอร์เนล

เสร็จแล้วก็มาทดสอบกัน .. ต่อ Clie เข้ากับพอร์ต USB เรียกโปรแกรม MS Import บน Clie .. ลอง lsmod ดูน่าจะเห็นบรรทัด usb-storage (ถ้าไม่ขึ้นลอง modprobe usb-storage) .. /var/log/messages ควรจะมีข้อความประมาณนี้ :

[root@admin root]# tail /var/log/messages
Apr 11 15:37:01 admin kernel: hub.c: USB new device connect on bus1/2, assigned device number 2
Apr 11 15:37:01 admin kernel: usb.c: USB device 2 (vend/prod 0x54c/0x99) is not claimed by any active driver.
Apr 11 15:37:04 admin /etc/hotplug/usb.agent: Setup usb-storage for USB product 54c/99/100
Apr 11 15:37:04 admin kernel: Initializing USB Mass Storage driver...
Apr 11 15:37:04 admin kernel: usb.c: registered new driver usb-storage
Apr 11 15:37:04 admin kernel: scsi0 : SCSI emulation for USB Mass Storage devices
Apr 11 15:37:04 admin kernel:   Vendor: Sony      Model: CLIE MGMS         Rev: 1.00
Apr 11 15:37:04 admin kernel:   Type:   Direct-Access                      ANSI SCSI revision: 02
Apr 11 15:37:04 admin kernel: Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
Apr 11 15:37:04 admin kernel: usb-uhci.c: interrupt, status 3, frame# 24
Apr 11 15:37:04 admin kernel: SCSI device sda: 126848 512-byte hdwr sectors (65 MB)
Apr 11 15:37:04 admin kernel: sda: Write Protect is off
Apr 11 15:37:04 admin kernel:  sda: sda1
Apr 11 15:37:04 admin kernel: USB Mass Storage support registered.

หรือจะดูที่ /proc/scsi/scsi ก็ได้

[root@admin root]# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: Sony     Model: CLIE MGMS        Rev: 1.00
  Type:   Direct-Access                    ANSI SCSI revision: 02

ทีนี้ก็ลองเมาท์กันเลย

mount -t vfat /dev/sda1 /mnt

เท่านี้ก็เรียบร้อย .. เมื่อเลิกใช้ให้สั่ง

umount
rmmod usb-storage

แล้วค่อยกดปุ่ม disconnect ที่ MS Import .. ฮุๆๆ ได้อย่างนี้แล้วก็โหลด mp3 ไปฟังล่ะคร้าบบบ :D

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…