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 อาจจะพอช่วยได้ .. ไปนอนล่ะคร้าบบ

MIDI SoftSynth บนลินุกซ์ด้วย ALSA VirMIDI + TiMidity

ปัญหานึงของซาวด์การ์ดหลายๆ รุ่นคือไม่มีมิดี้ที่เป็นฮาร์ดแวร์ หรือ FM Synth ก็เลยไม่สามารถเล่นมิดี้บนลินุกซ์ได้ (ถ้าเป็นวินโดวส์ ไดรเวอร์จะจำลองมิดิ้ให้ เป็นซอฟต์ซินธ์ด้วย (SoftSynth/Software Wave Table Emulation) แต่นับว่าโชคดีที่ลินุกซ์ทะเลใช้ระบบเสียงของ ALSA (Advanced Linux Sound Architecture) ก็เลยมีทางที่จะเซ็ตซอฟต์ซินธ์บลินุกซ์ด้วยเหมือนกันโดยใช้ไดรเวอร์ Virtual MIDI และซอฟต์แวร์ชื่อ TiMidity++ … ขั้นตอนมีดังนี้ครับ

เริ่มกันที่ ALSA

คอมไฟล์ alsa-driver โดยระบุให้สร้างไดรเวอร์ virmidi ด้วย ถ้าติดตั้งลินุกซ์ทะเลปกติ จะมีไดรเวอร์นี้อยู่แล้ว แต่สำหรับคนที่ recompile alsa-driver ใหม่ถ้าระบุออพชั่น –with-cards ให้ใส่ virmidi เข้าไปด้วยประมาณนี้

./configure --with-sequencer=yes --with-oss=yes --with-cards=virmidi,intel8x0

จากนั้นก็ make และ make install ตามปกติ หลังจากติดตั้ง alsa-driver แล้ว ทีนี้ก็ลอง load kernel module กัน ..

[kitt@peorth kitt]$ modprobe snd-virmidi index=1

ถ้า lsmod ดูควรจะเห็นอะไรประมาณนี้

snd-virmidi             2144   0 (autoclean)
snd-seq-virmidi         5096   0 (autoclean) [snd-virmidi]
snd-seq-midi-event      5672   0 (autoclean) [snd-seq-virmidi]
snd-seq                47408   0 (autoclean) [snd-seq-virmidi snd-seq-midi-event]
snd-intel8x0           24228   1
snd-pcm                83360   0 [snd-intel8x0]
snd-timer              19688   0 [snd-seq snd-pcm]
snd-ac97-codec         44640   0 [snd-intel8x0]
snd-page-alloc          8552   0 [snd-intel8x0 snd-pcm]
snd-mpu401-uart         5184   0 [snd-intel8x0]
snd-rawmidi            18752   0 [snd-seq-virmidi snd-mpu401-uart]
snd-seq-device          6364   0 [snd-seq snd-rawmidi]
snd                    43332   0 [snd-mixer-oss snd-virmidi snd-seq-virmidi
snd-seq-midi-event snd-seq snd-intel8x0 snd-pcm snd-timer snd-ac97-codec
snd-mpu401-uart snd-rawmidi snd-seq-device]

ลองสั่ง cat /proc/asound/cards

[kitt@peorth kitt]$ cat /proc/asound/cards
0 [82801CAICH3    ]: ICH - Intel 82801CA-ICH3
                     Intel 82801CA-ICH3 at 0x9800, irq 10
1 [VirMIDI        ]: VirMIDI - VirMIDI
                     Virtual MIDI Card 1

จะเห็นว่ามีซาวด์การ์ดสองใบ หนึ่งในนั้นเป็นซาวด์การ์ดจริง (ในตัวอย่างนี้คือ 82801CA ICH3 ของชิพเซ็ต i830) อีกตัวเป็น VirMIDI เป็นการ์ดที่จำลองขึ้นมาโดย module snd-virmidi ..

TiMidity

ที่จริงลินุกซ์ทะเลให้ TiMidity++ มาด้วยนะครับ แต่ว่าไม่ได้คอมไพล์ให้ใช้กับ ALSA ได้ .. ก็ต้องดาวน์โหลดเวอร์ชันที่คอมไพล์ ALSA และ ALSA Sequencer Client ด้วย .. ไม่ต้องไปหาไกล ผมทำให้แล้วล่ะ คิดว่าคงอยู่ใน TLE Update แล้ว จะใช้ Synaptic หรือจะสั่ง apt-get install หรือ apt-get update/upgrade เอาก็ได้ หรือดาวน์โหลด rpm ก็ได้ที่

ftp://ftp.kitty.in.th/pub/rpms/timidity++-2.11.3-4_1kit.i386.rpm

เชื่อม Virtual MIDI กับ TiMidity

Virtual MIDI ไม่ได้เล่นมิดี้ได้ด้วยตัวเองครับ มันแค่จำลองเป็นมิดี้อินเทอร์เฟซเท่านั้น จะทำให้มันเล่นมิดี้ มีเสียงได้ต้องทำให้ Virtual MIDI ส่งข้อมูลมิดี้ไปยัง TiMidity++ ให้ได้เสียก่อน .. อืมม จะอธิบายหลักการตรงนี้ก็เป็นเรื่องยาว .. ขอตัดบทเลยก็แล้วกัน ก่อนอื่น TiMidity++ เป็นโหมด ALSA Sequencer Client โดยระบุออพชัน -iA เข้าไป

[kitt@peorth kitt]$ timidity -iA -Os &
[1] 1106
Requested buffer size 32768, fragment size 8192
ALSA pcm 'default' set buffer size 32768, period size 8192 bytes
TiMidity starting in ALSA server mode
can't set sched_setscheduler - using normal priority
Opening sequencer port: 128:0 128:1

จากนั้นหาหมายเลขพอร์ตของ Virtual MIDI โดยดูจากไฟล์ /proc/asound/clients หรือ /proc/asound/seq/clients

[kitt@peorth kitt]$ cat /proc/asound/seq/clients
Client info
  cur  clients : 6
  peak clients : 6
  max  clients : 192

Client   0 : "System" [Kernel]
  Port   0 : "Timer" (Rwe-)
  Port   1 : "Announce" (R-e-)
Client  72 : "Virtual Raw MIDI 1-0" [Kernel]
  Port   0 : "VirMIDI 1-0" (RWeX)
Client  73 : "Virtual Raw MIDI 1-1" [Kernel]
  Port   0 : "VirMIDI 1-1" (RWeX)
Client  74 : "Virtual Raw MIDI 1-2" [Kernel]
  Port   0 : "VirMIDI 1-2" (RWeX)
Client  75 : "Virtual Raw MIDI 1-3" [Kernel]
  Port   0 : "VirMIDI 1-3" (RWeX)
Client 128 : "Client-128" [User]
  Port   0 : "TiMidity port 0" (-We-)
  Port   1 : "TiMidity port 1" (-We-)
  Output pool :
    Pool size          : 500
    Cells in use       : 0
    Peak cells in use  : 0
    Alloc success      : 0
    Alloc failures     : 0
  Input pool :
    Pool size          : 1000
    Cells in use       : 0
    Peak cells in use  : 0
    Alloc success      : 0
    Alloc failures     : 0

จะเห็นว่ามี Virtual RAW MIDI อยู่ 4 ไคลเอนด์ หมายเลข 72, 73, 74 และ 75 ตามลำดับ ทุกตัวมีพอร์ต 0 … ส่วน TiMidity++ อยู่ที่ 128 มีสองพอร์ตคือ 0 และ 1 .. เมื่อได้หมายเลขพอร์ตแล้วก็สั่งเชื่อมพอร์ตได้แล้ว ที่ต้องทำก็คือเชื่อมพอร์ต 0 ของ Virtual RAW MIDI ตัวแรก เข้าไปที่พอร์ต 0 ของ TiMidity++ โดยคำสั่ง aconnect

[kitt@peorth kitt]$ aconnect 72:0 128:0

ดู /proc/asound/seq/clients อีกครั้ง

[kitt@peorth kitt]$ cat /proc/asound/seq/clients
Client info
  cur  clients : 6
  peak clients : 7
  max  clients : 192

Client   0 : "System" [Kernel]
  Port   0 : "Timer" (Rwe-)
  Port   1 : "Announce" (R-e-)
Client  72 : "Virtual Raw MIDI 1-0" [Kernel]
  Port   0 : "VirMIDI 1-0" (RWeX)
    Connecting To: 128:0
Client  73 : "Virtual Raw MIDI 1-1" [Kernel]
  Port   0 : "VirMIDI 1-1" (RWeX)
Client  74 : "Virtual Raw MIDI 1-2" [Kernel]
  Port   0 : "VirMIDI 1-2" (RWeX)
Client  75 : "Virtual Raw MIDI 1-3" [Kernel]
  Port   0 : "VirMIDI 1-3" (RWeX)
Client 128 : "Client-128" [User]
  Port   0 : "TiMidity port 0" (-We-)
    Connected From: 72:0
  Port   1 : "TiMidity port 1" (-We-)
  Output pool :
    Pool size          : 500
    Cells in use       : 0
    Peak cells in use  : 0
    Alloc success      : 0
    Alloc failures     : 0
  Input pool :
    Pool size          : 1000
    Cells in use       : 0
    Peak cells in use  : 1
    Alloc success      : 1
    Alloc failures     : 0

จะเห็นว่า Client 72 มีข้อความ Connected To: 128:0 และที่ TiMidity++ มีข้อความ Connected From: 72:0

แสดงว่าเชื่อมต่อเป็นที่เรียบร้อยแล้ว ถ้าสั่ง playmidi หรือใช้โปรแกรมอะไรก็ตามที่ใช้งานมิดี้ ข้อมูลของมิดี้จะส่งผ่าน external MIDI ซึ่งจำลองขึ้นมาโดยไดรเวอร์ Virtual MIDI ไปยัง TiMidity++ แล้วเราก็จะได้ยินเสียงมิดี้กันล่ะ :)

คอนฟิกระบบ

ถ้าต้องการคอนฟิกให้ลินุกซ์เรียก Virtual MIDI อัตโนมัติทุกครั้งที่บูตก็สามารถทำได้โดยแก้ /etc/modules.conf ประมาณนี้

alias snd-card-0 snd-intel8x0
alias snd-card-1 snd-virmidi
alias sound-slot-0 snd-card-0
alias sound-slot-1 snd-card-1
alias char-major-116 snd
alias char-major-14 soundcore
options snd major=116 cards_limit=2
options snd-intel8x0 index=0
options snd-virmidi index=1
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss

ที่ต้องเพิ่มเข้าไปใน /etc/modules.conf ก็คือ บรรทัด

alias snd-card-1 snd-virmidi
alias sound-slot-1 snd-card-1
options snd-virmidi index=1

และต้องเปลี่ยน cards_limit เป็น 2

ทีนี้ทุกครั้งที่บูต snd-virmidi module ก็จะได้รับการติดตั้งอัตโนมัติ ส่วนการเชื่อม Virtual MIDI กับ TiMidity++ ทำเป็นครั้งๆ ไปเมื่อต้องการใช้ดีกว่า เพราะยังต้องรัน timidity -iA -Os ก่อนถึงจะสั่ง aconnect ได้ .. จะให้มันรันตอนบูตเลยดูจะเป็นการเปลืองทรัพยากรระบบเปล่าๆ

อื่นๆ

ยังมีเทคนิคอีกเล็กน้อยสำหรับ TiMidity++ เพื่อให้การทำงานกับมิดี้ตอบสนองได้ดีขึ้นครับ … ปกติ TiMidity ใช้บัฟเฟอร์ขนาดใหญ่เพื่อให้เพลย์ได้ราบรื่น แต่ก็ทำให้มี latency เยอะซึ่งไม่เหมาะกับโปรแกรมที่ต้องการทำงานแบบเรียลไทม์ เช่น โปรแกรมซีเควนเซอร์ อย่าง Rosegarden หรือ Noteedit ทางแก้คือกำหนดบัฟเฟอร์ให้เล็กลงด้วยออพชัน -B ค่าที่เหมาะๆ มีคนแนะมาว่าใช้ -B2,8 ส่วนตัวผมใช้ -B8,8 กำลังพอดี

ถ้า TiMidity++ กินซีพียูเยอะ และต้องการลดมันลง สามารถทำได้โดยยกเลิกเอฟเฟกต์ต่างๆ เช่น reverb และ/หรือ chorus โดยกำหนดออพชัน -EFreverb=0 และ/หรือ -EFchorus=0 ตามลำดับ

ถ้ายังไม่พอใจอีก ก็ต้องลองรัน TiMidity++ ด้วย root หรือตั้ง suid root วิธีนี้ทำให้ TiMidity++ สามารถตั้ง scheduling เป็น FIFO ด้วย priority สูงสุดเท่าที่จะทำได้ (ซึ่งมีเฉพาะ root ที่มีสิทธิตั้งค่าแบบนั้น) วิธีนี้ทำให้การตอบสนองดีขึ้นโดยเฉพาะกับโปรแกรมที่ทำงานแบบเรียลไทม์

.. วันนี้ยาวแฮะ

ใช้ภาษาญี่ปุ่นบนลินุกซ์

พยายามกับภาษาญี่ปุ่นบนลินุกซ์มานานแล้ว วันนี้ก็เห็นผลเสียทีครับ เรื่องของเรื่องก็คือลินุกซ์ทะเล 5.0 ไม่มีภาษาญี่ปุ่นให้เลือก ตอนติดตั้ง .. glibc ก็เลยไม่สนับสนุน locale ญี่ปุ่นเลย หลังจากเอาเวลาว่างๆ ไปค้นข้อมูลหลายหน ก็ได้ข้อสรุปมาบ้างแล้ว

อย่างแรกเลยคือเรื่องของ locale ภาษาญี่ปุ่นที่ต้องเพิ่มเข้าไปใน glibc .. ทำได้ไม่ยากเลย แต่กว่าจะรู้วิธีนี้ก็เสียเวลางมหาซะนาน กุญแจอยู่ที่ localedef นั่นเองครับ .. สำหรับภาษาญี่ปุ่นนิยมใช้ ja_JP.eucJP ก็ localedef ได้เป็น

# localedef -v -c -i ja_JP -f EUC-JP /usr/lib/locale/ja_JP.eucJP

ลองสั่ง locale -a ดูถ้ามี ja_JP ก็ใช้ได้แล้ว

อย่างที่สองคือ keyboard input .. ต้องติดตั้งหลายตัวหน่อย

Canna
Canna-libs
FreeWnn
FreeWnn-libs
FreeWnn-common
Wnn6-SDK
kinput2-canna-wnn6
kterm

ไม่ต้องคิดมาก ลงๆ ไปเลย apt-get install kinput2 เอาก็ได้ เดี๋ยวมันลาก dependencies มาลงให้เอง :)

วิธีทดสอบ

ก็ลองกันด้วย kterm นี่ล่ะครับ .. สตาร์ท canna เซิร์ฟเวอร์ก่อน ตามด้วย kinput2 เพื่อเชื่อมกับ canna แล้วค่อยเรียก kterm:

# service canna start
# kinput2 -canna &
# kterm &

ใน kterm กด shift-space จะเข้าสู่โหมด input ภาษาญี่ปุ่น ลองพิมพ์ภาษาญี่ปุ่นด้วยอักษรโรมาจิ .. เอาเป็น konnichiha ก็ได้ จะเห็นว่ามันแสดงเป็นตัวอักษรฮิระงานะ มีเส้นขีดใต้ข้อความ เส้นนี้เป็นตัวบอกว่าข้อความไหนที่ kinput2 กำลังประมวลผลอยู่ ลองเคาะ space ดูมันจะแสดงตัวคันจิขึ้นมาด้วย ถ้าเคาะ space อีกครั้ง kinput2 จะแสดงหน้าต่างให้เลือกตัวคันจิ คะตะคะนะ และฮิระงานะด้วย

ใช้ space หรือปุ่มลูกศรเลือกคำที่ต้องการ แล้วก็เคาะ enter .. หน้าต่างก็จะปิดลง เคาะ enter อีกครั้ง เส้นใต้ข้อความจะหายไป กด shift-space อีกครั้งก็จะออกจากโหมด input ภาษาญี่ปุ่น ..พอใช้ kterm ได้โปรแกรมอื่นๆ ที่ run เป็น text mode บน kterm ก็ควรจะใช้ภาษาญี่ปุ่นได้ด้วย .. ลองดูก็แล้วกัน

บน GNOME2

สำหรับ GNOME2 สามารถเซ็ตให้โปรแกรมใช้ kinput2 ได้โดยใช้ XIM .. อย่างแรกก็ต้องตั้ง XMODIFIERS ให้ input method เป็น kinput2 ก่อน

export XMODIFIERS="@im=kinput2"

ทีนี้ kinput2 จะทำงานอัตโนมัติถ้าโปรแกรมนั้นทำงานด้วย locale ญี่ปุ่น สมมติเป็น gedit บน terminal สั่ง

LANG=ja_JP gedit

จะ start gedit โดยกำหนดให้ LANG ที่ใช้เป็น ja_JP ครับ ทีนี้ใน gedit ให้คลิกขวาเลือก input method เป็น X Input Method ก็จะใช้ภาษาญี่ปุ่นได้เหมือนบน kterm .. อ่อ อย่าลืมเปลี่ยนฟอนต์เป็นภาษาญี่ปุ่นด้วยนะครับ ถ้าไม่มีก็ติดตั้งแพคเกจ ttfonts-ja ได้จากแผ่นติดตั้งลินุกซ์ทะเล หรือ apt-get install เอาก็ได้

เฮ่อ .. ได้ขนาดนี้ก็พอใจแล้ว .. วันนี้เอาไว้เท่านี้ก่อนครับ :)

ปรับขนาดพาร์ติชันบนลินุกซ์โดยไม่ต้องลบ/ย้ายข้อมูล

อยากลองใช้ transcode แปลง DVD เป็น VCD ดูสักหนล่ะครับ แต่พาร์ติชันขนาด 5 GB ที่กันไว้ตอนแรกไม่พอเสียแล้ว .. ก็แค่ซอร์สของ DVD แผ่นนึงก็หมดไป 4 กิ๊กแล้ว .. อิมเมจของ VCD ที่จะสร้างด้วย transcode ก็ใช้พื้นที่อีกประมาณ 1.4 GB (เท่ากับแผ่นซีดี 700 MB สองแผ่นไง) แต่เวลา encode ต้องมีพื้นที่ว่างๆ ประมาณสามเท่าของอิมเมจ รวมๆ กันแล้วต้องใช้พื้นที่ 8-9 GB .. เฮ่อ .. ฮาร์ดดิสก์ 60 GB จะหมดก็คราวนี้ล่ะฟะ .. วกกลับมาเรื่องพาร์ติชัน 5 GB กันต่อ .. ในเมื่อมันไม่พอก็ขยายพาร์ติชันสิ ข่าวดี (หรือหรือข่าวเก่าแล้วก็ไม่รู้) คือพาร์ติชันที่ใช้ไฟล์ซิสเต็มแบบ ext2/ext3 สามารถย่อ/ขยาย ได้โดยข้อมูลไม่สูญหาย ไม่ต้องลบ หรือย้ายข้อมูลก่อนด้วย .. โอ๊ะ .. ทำได้ไงๆๆ …

สิ่งที่ต้องทำมีสองส่วนคือปรับขนาดของไฟล์ซิสเต็ม และปรับขนาดของพาร์ติชันครับ .. การปรับขนาด ext2/ext3 ทำได้ด้วย resize2fs ส่วนขนาดของพาร์ติชันก็ใช้ fdisk นี่ล่ะ .. เริ่มกันเลย ..

สมมติว่าต้องการขยาย /dev/hda7 ก่อนอื่นต้อง fdisk ก่อน ดูให้แน่ใจว่ามีที่ว่ามีที่ว่างต่อจากพาร์ติชันที่ต้องการขยาย จากนั้นทำตามขั้นตอนนี้

  1. unmount file system ที่จะขยายเสียก่อน
  2. เรียกโปรแกรม fdisk
  3. จดตัวเลข start ของ /dev/hda7 .. จดสิๆๆ
  4. ลบ {{/dev/hda7 ทิ้ง ..เอ่อ.. ไม่ต้องห่วงๆ เพราะข้อมูลทุกอย่างยังไม่หายไปไหน มันแค่ลบ entry ในตารางพาร์ติชันของฮาร์ดดิสก์ ไม่ได้ลบข้อมูล .. แต่ถ้าต้องการให้มันกลับมาก็ต้องสร้างพาร์ติชันที่มีตำแหน่งเริ่มต้นตรงที่เดิม นั่นเป็นเหตุผลว่าทำไมต้องจด start ของ /dev/hda7 ไว้ ..
  5. สร้างพาร์ติชัน /dev/hda7 เริ่มต้นที่เลข start ตัวเดิม กำหนดขนาดตามต้องการ แต่ไม่เกินพื้นที่ว่างที่เหลืออยู่
  6. บันทึกการเปลี่ยนแปลง ออกจาก fdisk
  7. รีบูต .. เพื่อความแน่นอน.. รีบูตเลยครับ .. ผมเคยพลาดมาแล้ว ใจร้อน ไม่ยอมรีบูต ไฟล์ซิสเต็มหาย ข้อมูลไปหมดเลย กู้กันสามวันสามคืน ได้ข้อมูลสำคัญๆ กลับมา 3-4 MB แต่ชีวิตหลังจากนั้นเหมือนกลับไปอยู่อดีต 3 เดือนก่อน เพราะแบคอัพล่าสุดอายุประมาณนั้น
  8. หลังจากรีบูตแล้ว e2fsck -f /dev/hda7 พาร์ติชันก่อนหนึ่งที
  9. จากนั้นสั่ง resize2fs /dev/hda7 แล้วก็ลุ้น.. ไม่ต้องกลั้นหายใจนะครับ ถ้าขยายไฟล์ซิสเต็มให้โตขึ้นใหญ่มากๆ ก็ต้องรอนานเป็นนาทีเหมือนกัน :)

ส่วนการย่อขนาดพาร์ติชัน ต้องสั่ง resize2fs เพื่อเปลี่ยนขนาดไฟล์ซิสเต็มก่อน แล้วค่อย fdisk ไปแก้ขนาดพาร์ติชัน สมมติว่าจะย่อ /dev/hda7 ให้เหลือแค่ 1048576 blocks ก็สั่ง

resize2fs /dev/hda7 1048576

จากนั้นก็เข้า fdisk จดตำแหน่งเริ่มต้นของพาร์ติชัน ลบพาร์ติชันของ /dev/hda7 ทิ้ง แล้วสร้างใหม่แบบเดียวกับการขยาย ข้อควรระวังคือ ต้องกำหนดขนาดพาร์ติชันไม่ให้เล็กไปกว่าขนาดที่ระบุตอน resize2fs (เช่น ในตัวอย่างนี้คือ 1048576 blocks) เพราะจะทำให้ข้อมูลหายได้

เสร็จแล้ว ขอตัวไป RIP DVD ก่อนละคร้าบบบ

แชร์ไฟล์/พรินเตอร์ผ่านโปรโตคอล AppleTalk ด้วยลินุกซ์

ที่ห้องแล็ป IRL พรินเตอร์จะต่อตรงกับเครื่อง Yggdrasil แล้วก็แชร์ผ่าน Samba ให้คนอื่นๆ ได้ใช้ แต่แล้วก็เกิดมีเครื่อง Apple PowerBook และ Apple iBook โผล่เข้ามาในเน็ตเวิร์ค แรกๆ ก็ไม่คิดว่าจะยุ่งยากอะไรจนกระทั่งได้รู้ว่า MacOS X มันไม่สามารถพิมพ์ผ่าน SMB ได้ …แปลกแฮะ ที่จริง OSX ก็มี SMB นะครับ แต่ว่ามันใช้ได้กับไฟล์เท่านั้น .. เท่าที่ google หาดูก็มีทางออกอยู่ 2-3 ทางคือ ซื้อ DAVE มาใช้ โปรแกรมนี้คงเรียกได้ว่าเป็น Samba for Mac แต่ไม่ฟรี (~ US$150) .. หรืออีกทางนึงก็คือคอนฟิกให้ Yggdrasil รู้จัก AppleTalk แล้วแชร์ไฟล์และพรินเตอร์ผ่าน netatalk .. อืมม.. วิธีหลังนี่น่าสนใจครับ :)

เคอร์เนลของลินุกซ์มี AppleTalk นานพอสมควรแล้ว และมีแพคเกจสำหรับแชร์ไฟล์ ไดเรคทอรี่ และพรินเตอร์ได้ .. แพคเกจที่ว่านี่ก็คือ netatalk (อ่านว่า เนต–ทอล์ค ลากเสียง ‘เนต’ ยาวๆ) .. ก่อนอื่น จัดการกับเคอร์เนลซะก่อน เช็คดูก่อนว่าเคอร์เนลสนับสนุน AppleTalk หรือยัง ถ้ายังก็ต้อง recompile เคอร์เนลครับ

CONFIG_ATALK=y or m

จากนั้นติดตั้ง netatalk มี rpm เยอะแยะ หาดาวน์โหลดเอา ดีฟอลต์คอนฟิกฯ จะแชร์โฮมไดเรคทอรีให้อัตโนมัติ ค่อนข้างสะดวก ที่ต้องเพิ่มเข้าไปก็เป็นพวก แชร์พรินเตอร์ หรือ ไดเรคทอรีอื่นๆ

สำหรับลินุกซ์ทะเล ใช้ CUPS ก็แก้ /etc/atalk/papd.conf โดยเพิ่ม

HP4:
:pr=|/usr/bin/lpr:
:op=root:
:pd=/etc/cups/ppd/HP4.pdd:

บรรทัดแรก เป็นชื่อพรินเตอร์ที่จะปรากฏเมื่อเชื่อมผ่าน AppleTalk

บรรทัดที่สอง เป็นคำสั่งในการพิมพ์งาน กรณีของ CUPS จะใช้คำสั่งอย่างที่ปรากฏในตัวอย่างนี้ ส่วนอื่นๆ .. google เอา

บรรทัดที่สาม เป็น queue operator ของทะเลใช้ lp หรือไม่ก็ root ไปเลย

บรรทัดสุดท้าย เป็น ppd ที่จะใช้ ..ปกติแล้วเมื่อติดตั้งพรินเตอร์ CUPS จะสร้าง ppd เก็บไว้ที่ /etc/cups/ppd ก็เอามาใช้ได้เลย

ส่วนแชร์ไดเรคทอรี สามารถเพิ่มใน /etc/atalk/AppleVolumes.default เช่น

/usr2/public "Shared Space"

จากนั้นก็สตาร์ทเซอร์วิส atalk และ/หรือ คอนฟิกให้เรียกใช้เมื่อบูต

ทางฝั่งเครื่องแมค ให้ enable AppleTalk ใน System Preference -> Network จากนั้นก็เพิ่มพรินเตอร์เข้าไปในระบบโดยเลือกตามรูป

อย่าลืมเลือก Printer Model เป็น Generic เพราะเท่าที่ทดสอบดูถ้าเลือกเป็นอย่างอื่นจะพิมพ์ไม่ออก หลังจากเพิ่มเข้าไปแล้วเน็ตเวิร์คพรินเตอร์นี้ก็จะเข้าไปเป็นพรินเตอร์ตัวนึงของระบบ ตั้งเป็นดีฟอลต์ก็ได้ถ้าต้องการ

จากนั้นก็ลองสั่งพิมพ์เอกสารดู ..

ถ้าไม่สำเร็จ ให้ลองดู log ของ atalk และ cups ที่เซิร์ฟเวอร์ครับ จากนั้นก็ตัวใครตัวมันละครับ แก้ปัญหากันเอาเอง :P .. ที่จริงยังเหลือไม้ตายอีกทางหนึ่งคือ พิมพ์ผ่าน IPP (Internet Printing Protocol) ไปที่ CUPS บน Yggdrasil .. แต่เอาไว้โอกาสหน้าก็แล้วกัน

เมาท์เมโมรีสติ๊กบน 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

เขียนแผ่นซีดีบนลินุกซ์ด้วย cdrecord และ mkisofs

ข้อมูลในฮาร์ดดิสก์เริ่มเยอะขึ้นๆ ทุกวัน สงสัยต้องเขียนลงแผ่นซีดีซักหน่อย แต่ในลินุกซ์ทะเล 5.0 ไม่มีโปรแกรมสำหรับเขียนซีดีง่ายๆ เลยครับ .. เอาวะ เล่นมันถึกๆ นี่ล่ะ ใช้ mkisofs + cdrecord ก็ได้ :D .. สองโปรแกรมนี้เป็นโปรแกรมหลักที่ใช้เขียนซีดีบนลินุกซ์ ส่วนโปรแกรมที่เป็นอินเทอร์เฟซสวยๆ ใช้ง่ายๆ อย่างพวก EClipt Roaster เป็นแค่หน้ากากที่ช่วยให้ใช้งานได้ง่ายขึ้นเท่านั้นเอง และเอาเข้าจริงๆ แล้วใช้ mkisofs + cdrecord ก็ไม่ได้ยากอะไรเลย จำแค่สองคำสั่งก็ใช้ได้แล้วครับ .. ที่เราจะทำก็คือใช้โปรแกรม mkisofs สร้างอิมเมจของแผ่นซีดีก่อน แล้วจึงเอาอิมเมจที่ได้ไปเขียนลงแผ่นจริงๆ อีกทีด้วย cdrecord ..

สร้าง ISO อิมเมจ

เริ่มกันที่สร้างอิมเมจก่อน คำสั่งพื้นฐานในการสร้างอิมเมจก็คือ

[root@yggdrasil kitt]$ mkisofs -o image.iso /source/tree

mkisofs จะสร้างไฟล์ซิสเต็มและจัดโครงสร้างการจัดเก็บข้อมูลเสมือนกับว่า image.iso เป็นแผ่นซีดีแผ่นนึง แล้วก๊อปปี้ข้อมูลทั้งหมดจากไดเรคทอรี่ /source/tree ลงไป .. แต่การใช้งานจริงเรามักต้องการให้ซีดีใช้กับวินโดวส์หรือโอเอสอื่นๆ ได้ด้วย .. นอกจากนั้นอาจจะต้องการใช้ชื่อไฟล์ยาวๆ และชื่อไฟล์ภาษาไทยอีก จึงต้องระบุออพชันเพิ่มเติมเข้าไป ..อืมม.. เอาเป็นว่าจำคำสั่งนี้ไปเลยก็แล้วกันครับ:

mkisofs -V "My Label" -v -r -jcharset cp874 -o image.iso /source/tree

อธิบายสักนิด

-V "My Label" เป็นการกำหนด volume label ของแผ่น เป็น “My Label” .. เปลี่ยนข้อความตามใจชอบ แต่อย่าลืมใส่เครื่องหมายคำพูดกันไว้สักหน่อย

-v หมายถึง verbose ที่จริงไม่จำเป็นเท่าไหร่ ไม่ต้องระบุก็ได้ แต่ผมชอบให้มันแสดงข้อความเยอะๆ จะได้รู้สึกว่ามันกำลังทำงานอยู่ :P

-r ตั้ง permission เป็น public permission อันนี้ใส่กันเอาไว้ เผื่อเอาแผ่นไปใช้กับลินุกซ์หรือยูนิกซ์อื่นๆ จะได้ไม่มีปัญหาเรื่อง permission ของไฟล์..

-jcharset cp874 เป็นการกำหนดให้ใช้ Joliet ซึ่งทำให้เก็บชื่อไฟล์ได้ยาว 64 ตัวอักษร และตั้ง charset สำหรับ Joliet เป็นภาษาไทย (cp874 คือ codepage ภาษาไทย) .. ออพชันนี้ทำให้วินโดวส์แสดงชื่อไฟล์และไดเรคทอรี่ภาษาไทยได้ถูกต้อง

หลังจากได้ไฟล์ image.iso แล้ว อาจจะอยากทดสอบดูก่อนเขียนลงแผ่นซีดี.. ไม่ยากๆ .. เพราะเราสร้าง image.iso เสมือนเป็นแผ่นซีดีอยู่แล้ว การทดสอบจึงทำได้โดยการเมาท์ไฟล์ image.iso ..

[root@yggdrasil kitt]# mount -o loop image.iso /mnt

คำสั่งนี้จะเมาท์ไฟล์ image.iso ไว้ที่ /mnt ออพชัน -o loop เป็นการระบุว่าเราต้องการเมาท์อิมเมจของไฟล์ซิสเต็ม .. เมาท์ได้แล้วก็ลอง ls -lR /mnt ดู .. ถ้าทุกอย่างดูเรียบร้อยดีแล้วก็ umount /mnt แล้วก็เตรียมเขียนลงแผ่นจริงๆ กันล่ะครับ

เผาแผ่นกันล่ะ

ก่อนอื่นต้องสแกนหาไดรว์ที่จะใช้เขียนเสียก่อน โดยใช้คำสั่ง:

[root@yggdrasil kitt]# cdrecord -scanbus
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J#rg Schilling
Using libscg version 'schily-0.7'
scsibus0:
        0,0,0     0) 'LITE-ON ' 'LTR-40125S      ' 'ZS0N' Removable CD-ROM
        0,1,0     1) *
        0,2,0     2) *
        0,3,0     3) *
        0,4,0     4) *
        0,5,0     5) *
        0,6,0     6) *
        0,7,0     7) *

จากตัวอย่างจะเห็นว่าไดรว์เขียนซีดีเป็นดีไวซ์ 0,0,0 .. หมายเลขดีไวซ์นี้จะเอาไปใช้ระบุไดรว์เมื่อสั่ง cdrecord ..

[root@yggdrasil kitt]# cdrecord -v speed=32 dev=0,0,0 -data image.iso

ออพชันที่ระบุประกอบด้วย

-v หมายถึง verbose .. เช่นเคย

speed=32 หมายถึงเขียนที่ 32x แต่อัตราการเขียนจริงๆ อาจจะไม่ตรงกับค่านี้

dev=0,0,0 เป็นการระบุให้ใช้ดีไวซ์หมายเลข 0,0,0 ในการเขียนซีดี

-data image.iso เป็นการระบุให้เอาไฟล์ image.iso ไปเขียนลงซีดี

ทีนี้ก็นั่งรอ ไม่กี่นาทีก็ได้แผ่นซีดีอุ่นๆ ออกมา :)

Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J#rg Schilling
TOC Type: 1 = CD-ROM
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Linux sg driver version: 3.1.24
Using libscg version 'schily-0.7'
atapi: 1
Device type    : Removable CD-ROM
Version        : 0
Response Format: 2
Capabilities   :
Vendor_info    : 'LITE-ON '
Identifikation : 'LTR-40125S      '
Revision       : 'ZS0N'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Driver flags   : MMC-3 SWABAUDIO BURNFREE FORCESPEED
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16 RAW/R96P RAW/R96R
Drive buf size : 1422080 = 1388 KB
FIFO size      : 4194304 = 4096 KB
Track 01: data   676 MB
Total size:      776 MB (76:56.77) = 346258 sectors
Lout start:      777 MB (76:58/58) = 346258 sectors
Current Secsize: 2048
ATIP info from disk:
  Indicated writing power: 7
  Is not unrestricted
  Is not erasable
  ATIP start of lead in:  -11597 (97:27/28)
  ATIP start of lead out: 359849 (79:59/74)
Disk type:    Short strategy type (Phthalocyanine or similar)
Manuf. index: 20
Manufacturer: Princo Corporation
Blocks total: 359849 Blocks current: 359849 Blocks remaining: 13591
Forcespeed is OFF.
Starting to write CD/DVD at speed 32 in real TAO mode for single session.
Last chance to quit, starting real write    0 seconds. Operation starts.
Waiting for reader process to fill input buffer ... input buffer ready.
BURN-Free is ON.
Turning BURN-Free off
Performing OPC...
Starting new track at sector: 0
Track 01:  676 of  676 MB written (fifo 100%) [buf  98%]  32.9x.
Track 01: Total bytes read/written: 709132288/709132288 (346256 sectors).
Writing  time:  177.016s
Average write speed  27.3x.
Min drive buffer fill was 97%
Fixating...
Fixating time:   26.745s
cdrecord: fifo had 11170 puts and 11170 gets.
cdrecord: fifo was 0 times empty and 6789 times full, min fill was 51%.

สำหรับใครที่มีเครื่องเร็วพอ จะเขียนซีดีจากข้อมูลในไดเรคทอรีโดยไม่ต้องสร้างอิมเมจก็ได้ โดยสั่ง

[root@yggdrasil kitt]# mkisofs -V "My Label" -v -r -jcharset cp874 /source/tree
 | cdrecord -v fs=8m speed=36 dev=0,0,0 -

จะเห็นว่าเราไม่ได้ระบุ -o image.iso ใน mkisofs กรณีนี้ mkisofs จะส่งเอาท์พุตออก stdout แทน เราจึง pipe เข้าไปเป็นอินพุตของ cdrecord ได้โดยระบุออพชัน – (อยู่ท้ายบรรทัด) ซึ่งเป็นการกำหนดให้ cdrecord รับอินพุตจาก stdin … ส่วนออพชัน fs=8m เป็นการกำหนดขนาดของบัฟเฟอร์ในการเขียนซีดีให้มีขนาดเป็น 8 MB (ถ้าไม่ระบุจะเป็น 4 MB) .. ตามเอกสารของ cdrecord บอกไว้ว่าบัฟเฟอร์ควรมีขนาด 4 – 32 MB และแนะนำว่าขนาดอย่างน้อยควรจะเท่ากับบัฟเฟอร์ของไดรว์เขียนซีดี และอย่างมากไม่เกินครึ่งหนึ่งของหน่วยความจำของเครื่อง .. โดยทั่วไป 8 MB ก็เพียงพอแล้วครับ

สำหรับการก๊อปปี้ซีดีจากแผ่นนึงไปอีกแผ่นนึง ทำได้โดยสร้างอิมเมจของแผ่นต้นฉบับ ด้วยคำสั่ง

[root@yggdrasil kitt]# dd if=/dev/cdrom of=image.iso bs=1k

จากนั้นก็เอา image.iso ไปเขียนลงซีดีด้วย cdrecord หรือกรณีที่มีไดรว์สองตัวจะก๊อปแผ่นโดยไม่ทำอิมเมจก็ได้เหมือนกัน

สมมติว่า /dev/hdd เป็นไดรว์ที่ใส่แผ่นต้นฉบับ และ /dev/hdc เป็นไดรว์สำหรับเขียนแผ่นซีดี มี dev=0,0,0 ก็จะสามารถสั่งให้ก๊อปปี้แผ่นได้โดยใช้คำสั่ง

[root@yggdrasil kitt]# dd if=/dev/hdd bs=1k | cdrecord -v fs=8m speed=36 dev=0,0,0 -

เห็นเปล่า สั่งไม่เกินสองบรรทัดก็เขียนซีดีได้แล้ว ไม่ยากเลย :D

Configuring Samba with CUPS

วันนี้ต้องการพิมพ์เอกสารออกพรินเตอร์ที่ต่ออยู่กับเครื่อง Yggdrasil แต่ปรากฏว่า Yggdrasil เพิ่งจะลงลินุกซ์ทะเล 5.0 ทับ 4.1r2 ไปหมาดๆ แล้วก็ยังไม่ได้คอนฟิก samba เลย .. เหอะๆๆ

ไฟล์สำหรับคอนฟิก samba อยู่ที่ /etc/samba/smb.conf ซึ่งคอนฟิกพื้นฐานไว้แล้วเพียงแต่ปรับตามที่ต้องการเท่านั้น สำหรับผมที่ปรับๆ ไปก็มี workgroup, server string, และ security ซึ่งที่นี่ใช้เป็น SHARE .. สำหรับ Yggdrasil จะเปิดแชร์เฉพาะพรินเตอร์อย่างเดียว ก็เลยมีคอนฟิกเฉพาะ [printers] ส่วนอื่นๆ ก็คอมเมนต์ไว้หมด .. ถ้าเป็นทะเลเวอร์ชันก่อนๆ คอนฟิกเท่านี้ก็พิมพ์ได้แล้ว แต่ระบบการพิมพ์ของทะเล 5.0 เปลี่ยนมาใช้ cups printing system เต็มตัวแล้ว การคอนฟิกให้ใช้กับ samba จะต่างจากทะเลเวอร์ชันก่อนนิดหน่อยคือ ต้องเปลี่ยน printcap name และ printing เป็น cups อย่างนี้:

printcap name = cups
printing = cups

ส่วน [printers] section ก็คอนฟิกตามปกติ .. ซึ่งควรจะประมาณนี้

[printers]
comment = printers
path = /var/spool/samba
browseable = yes
public = yes
guest ok = yes
printable = yes
writeable = yes

ทีนี้ก็ลองสตาร์ท samba กัน:

[root@yggdrasil root]# service smb restart

ถ้าถึงตรงนี้แล้วใช้งานได้ก็เป็นอันเสร็จ แต่ถ้าพรินเตอร์ไม่พิมพ์อะไรออกมาเลย ไม่มีพรินต์จ๊อบในคิว ลองเช็ค log ของ samba ดู .. หากมีข้อความประมาณว่า

printing/print_cups.c:cups_job_submit(655)
Unable to print file to HP4 - client-error-document-format-not-supported

แสดงว่า cups ที่พรินต์เซิร์ฟเวอร์ไม่ได้คอนฟิกให้รับข้อมูลที่ samba ส่งผ่านมายัง cups ซึ่งก็คือฟอร์แมตแบบ raw .. รู้อย่างนี้แล้วก็ไม่ยาก เข้าไปแก้ /etc/cups/mime.types .. เพิ่มข้อความ

application/octet-stream

อีกที่คือ /etc/cups/mime.convs ก็เพิ่ม

application/octet-stream        application/vnd.cups-raw    0    -

จากนั้นก็ restart cups แล้วลองสั่งพิมพ์อีกครั้ง .. เย้! พิมพ์ได้แล้ว … :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…