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

Linux on Acer TravelMate 361 EVi

So, you want to install Linux on your 361 EVi ? No problem! Linux runs well on 361 EVi and perhaps better than the preloaded WinXP! This webpage describe how to install TLE 4.1/RedHat 7.2 on Acer TravelMate 361 EVi. It might work for other TravelMate 360 series, and/or different distributions of linux as well. Anyway, information in this webpage is provided AS IS, and WITHOUT ANY WARRANTY. So, do not blame me if it does not work, or damages your notebook, etc, etc. Okay, first thing first, the brief hardware hardware specification of Acer TravelMate 361EVi :

  • CPU Intel Pentium III 1 GHz with SpeedStep Technology
  • Memory 256 MB
  • HDD 20 GB
  • 13.3 TFT i830 Display Subsystem
  • AC’97 Sound Subsystem
  • 10/100 Ethernet Intel EtherExpress Pro 100 VE
  • Orinoco 802.11b Wireless LAN
  • Texas Instruments PCI1410 CardBus controller
  • O2Micro OZ6933 CardBus Controller
  • SmartCard Reader
  • IEEE 1394, IrDA, USB, PCMCIA, Serial, Parallel
  • External Combo Drive (EasyLink) FDD, 8X DVD

Does Linux support all of these ? Fortunately, yes — at lease, that is what the Linux Documentation said. So, I installed two OSes on my 361 EVi. One is MS Windows XP Home, another is Linux. I simply partitioned my HDD to 50/50 for XP and Linux. Because I’m Thai,I choose Linux TLE 4.1, a Thai Linux distribution developed by NECTEC. TLE 4.1 is a variant of RedHat 7.2. So, what can be used on TLE 4.1 can be used on RH 7.2, and vice versa. Almost every components of 361 EVi can automatically be configured by the installation script/setup utility. So, it’s quite easy to install Linux on 361 EVi. Anyway, let see them one by one.

Boot Loader

I use grub. It is safer and easier than lilo, especially when you install Linux on a large hard drive. It also works fine for WinXP. This is my /etc/grub.conf.

default=0
timeout=10
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
title Linux TLE
    root (hd0,1)
    kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 vga=791
    initrd /boot/initrd-2.4.18-3.img
title Windows XP
    rootnoverify (hd0,0)
    chainloader +1

X-Window

TLE 4.1/RH 7.2 includes XFree86 4.1 in the package. This version of XFree86 does not support i830 display subsystem, so you have two choices here:

Use either ‘fbdev‘, or ‘vesa‘ driver. It does work and it is fast enough for almost everything, but 3D games. Or, upgrade to XFree86 4.2 that natively supports i830 through the ‘i810‘ driver. RedHat just released the 7.3, which includes XFree86 4.2. You can go entirely to RH 7.3, or if you already install TLE 4.1/RH 7.2, you may download only XFree86 4.2 packages (XFree86-*-4.2.0-8.i386.rpm, Glide3), and replace the 4.1 with the new one. I have tested and currently use it. Also, you must upgrade your kernel at least 2.4.11 to use AGP GART. I use 2.4.18-4. You can download one from RedHat or kernel.org. It works well.

I provide here config for both 4.1 using vesa, and 4.2 using i810. The ‘Monitor’, ‘Device’, and ‘Screen’ section of my /etc/X11/XF86Config-4 are showed below:

Section "Monitor"
    Identifier "13.3 TFT Flat Panel"
    VendorName "Unknown"
    ModelName  "Unknown"
    HorizSync 30.0-57.0
    VertRefresh 55.0-100.0
EndSection

Section "Device"
    Identifier "VESA"
    Driver "vesa"
    BoardName "VESA compatible"
EndSection

Section "Device"
    Identifier "i830"
    Driver "i810"
    BoardName "i830 display subsystem"
EndSection

Section "Screen"
    Identifier "Screen0"
# uncomment below to use "vesa" driver, works for both XFree86 4.1/4.2
#    Device "VESA"
# uncomment below if you want to use i830, works only for XFree86 4.2
    Device "i830"
    Monitor "13.3 TFT Flat Panel"
    DefaultDepth 16
    Subsection "Display"
        Depth 24
        Modes "1024x768"
    EndSubSection
    Subsection "Display"
        Depth 16
        Modes "1024x768"
    EndSubSection
EndSection

Sound System

AC’97 sound subsystem could be detected by TLE4.1/RH7.2. Just run the ‘sndconfig‘ utility and it will modify /etc/modules.conf for you. AC’97 does not support MIDI. So, you might want to install some software wavetable to play MIDI files (try TiMidity++, it’s cool!). Here is what sndconfig put in my /etc/modules.conf

alias sound-slot-0 i810_audio
post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :
pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :

If sound quality is poor, try to upgrade kernel.

PCMCIA

361 EVi has two CardBus Controllers (YES, TWO !) One is TI PCI1410, another is O2Micro OZ6933. The document said they are supported by kernel module named “yenta_socket“. However, if you use (modprobe) yenta_socket, it will lock your system immediately and you have to cold boot. To use PCMCIA on 361 EVi, you need to disable CardBus/PCMCIA support in your kernel, and use pcmcia-cs instead. So, grab the kernel source (2.4.xx), config, disable CardBus/PCMCIA, check the other kernel options, compile, and install. Then, grab the pcmcia-cs source, config, compile, and install. It should work. This is my /etc/sysconfig/pcmcia

PCMCIA=yes
PCIC=i82365
PCIC_OPTS="do_scan=0"
CORE_OPTS=
CARDMGR_OPTS=

Please be very sure that you include “do_scan=0“. Otherwise, your system will crash when you start PCMCIA service. If things go well, the Orinoco 802.11b Wireless works immediately (it is hard-wired to TI PCI1410). You can start eth1, and manage the wireless LAN through iwconfig utility. The SmartCard reader is hard-wired to slot 2 of O2Micro. It is recognized by Linux PCMCIA, but it does not work right now.

10/100 Ethernet

This Intel EE Pro 100 VE works out-of-the-box by using

eepro100 driver. What in my /etc/modules.conf is

alias eth0 eepro100

But, you might want to clear sleep mode bit of the adapter. Otherwise, it will cause transmit timeout when you transfer large data. To do so, visit http://www.scyld.com/diag/index.html download ‘eepro100-diag.c‘, compile the program (see instruction near the end of the file), run ‘eepro100-diag -G 0 -w -w -f‘, and reboot (don’t forget to reboot. it’s required). It should work.

Ports

Serial/Parallel/USB works perfectly. I’ve tested all of them. Firewire should work but I have no firewire devices to test :P.

IrDA also works but you might need to enable IrDA in the BIOS setup. You also need configure your system to run irda init script at startup (using either ‘setup’ utility, or manually link /etc/init.d/irda to /etc/rc?.d/S??irda). I have Palm IIIxe and I can sync through IrDA perfectly.

External Combo Drive

This combo drive works fine, but you MUST connect/disconnect the drive ONLY when your 361 EVi is OFF. WinXP may support hotplug for this device but it does not mean the same for Linux. I think Linux recognize this device as a generic FDD and ATAPI CD/DVD ROM, not a kind of hotplug/removeable stuff, so DO NOT TRY!

Well, I hope this helps. The Linux TLE 4.1 is very fine for me. I used to do my works on MS Windows. Now, I transfer all my works to Linux and use WinXP only when I wanna play games! If you know something more, or you want to know something more, you can contact me at [email protected] . Comments/questions are welcome.

Have a nice (Linux) day!