ใช้ซอฟต์โมเด็ม ICH3/ICH4 บนลินุกซ์

หลายๆ คนที่ใช้โน้ตบุ๊ก หรือเดสก์ทอปที่มีซอฟต์โมเด็ม (AMR/CNR/MDC/ACR) คงเจอปัญหาโมเด็มใช้งานบนลินุกซ์ไม่ได้ แต่วันนี้มีข่าวดีสำหรับซอฟต์โมเด็มบน Southbridge ตระกูล ICH3 ICH4 และชิปเซ็ตอื่นๆ ครับ .. บริษัท SmartLink เขาทำไดรเวอร์บนลินุกซ์ให้แล้ว :D .. ไดรเวอร์ตัวปัจจุบัน (2004-02-05) คือเวอร์ชัน 2.9.6 จากเอกสารที่มากับไดรเวอร์ระบุว่าใช้ได้กับชิปเซตต่อไปนี้ครับ

HAMR5600 based AMR/CNR/MDC/ACR modem cards on the following Southbridge
chips:
- Intel ICH0,ICH2, ICH3, ICH4
- Via 686A, 686B, 8231, 8233
- SiS 630
- ALI 1535.
SmartPCI56/561/562/563 based PCI modem cards.
SmartUSB56 based USB modem.

ของใครไม่ตรงกับที่ระบุก็เสียใจด้วยเน้อะ :P

ส่วนโมเด็มบนเครื่อง Peorth ของผมเป็น ICH3 วินโดว์สบอกว่าเป็น Lucent AMR Softmodem ส่วนลินุกซ์ (lspci -v) บอกว่า

00:1f.6 Modem: Intel Corp. 82801CA/CAM AC'97 Modem Controller (rev 01)
(prog-if 00 [Generic])
        Subsystem: Acer Incorporated [ALI]: Unknown device 1022
        Flags: medium devsel, IRQ 10
        I/O ports at a000 [size=256]
        I/O ports at a400 [size=128]

ใช้ไดรเวอร์ slmodem ตัวนี้ได้แน่นอน :D

ติดตั้ง..

ตัดฉากมาที่การติดตั้งกันเลยดีกว่า.. วิธีติดตั้งก็เหมือนการคอมไพล์โปรแกรมทั่วไป แต่เพราะมันเป็นไดรเวอร์บนลินุกซ์ซึ่งจะคอมไพล์ออกมาเป็นเคอร์เนลโมดูล ดังนั้นสิ่งที่จำเป็นอีกอย่างก็คือซอร์สของเคอร์เนลครับ อ่อ ที่เจ๋งอีกอย่างคือ slmodem 2.9 นี่ใช้กับเคอร์เนล 2.6 ได้ด้วย:)

ก่อนอื่นก็ดาวน์โหลดซอร์สของไดรเวอร์มาก่อนที่ ftp://ftp.smlink.com/linux/unsupported/slmodem-2.9.6.tar.gz

อย่าได้แปลกใจ ที่มันอยู่ใน unsupported ก็เพราะไดรเวอร์นี้ยังเป็น beta อยู่ครับ แต่ไม่ต้องกังวลเพราะเท่าที่ลองก็ใช้งานได้ดี ได้มาแล้วก็

$ tar xvzf slmodem-2.9.6.tar.gz
$ make
$ su -
# make install

เท่าเนี้ยะ เป็นอันเสร็จการติดตั้ง ตัวติดตั้งจะติดตั้งโปรแกรม เคอร์เนลโมดูล และ mknod ใน /dev เตรียมไว้ให้

เริ่มใช้งาน

สำหรับ AMR ก็เริ่มต้นที่เคอร์เนลโมดูลก่อน

# modprobe slamr

โพรบแล้วลองเช็ค /var/log/messages ควรจะเห็นอะไรประมาณนี้ครับ

Feb 12 20:25:23 peorth kernel: slamr: module license 'Smart Link Ltd.' taints kernel.
Feb 12 20:25:23 peorth kernel: slamr: SmartLink AMRMO modem.
Feb 12 20:25:23 peorth kernel: slamr: probe 8086:2486 ICH card...
Feb 12 20:25:23 peorth kernel: PCI: Found IRQ 10 for device 0000:00:1f.6
Feb 12 20:25:23 peorth kernel: PCI: Sharing IRQ 10 with 0000:00:1f.3
Feb 12 20:25:23 peorth kernel: PCI: Sharing IRQ 10 with 0000:00:1f.5
Feb 12 20:25:23 peorth kernel: slamr: mc97 codec is SIL27
Feb 12 20:25:23 peorth kernel: slamr: slamr0 is ICH card.

ตอนนี้เราก็จะได้ดีไวซ์ /dev/slamr0 เป็นตัวเชื่อมกับซอฟต์โมเด็ม

ต่อไปก็รัน slmodemd เป็น daemon ประมวลผลแทนฮาร์ดแวร์ (ซึ่งเป็นส่วนที่ซอฟต์โมเด็มไม่มี .. ก็เลยต้องใช้ซอฟต์แวร์ทำงานแทนนั่นเอง) อย่าลืมระบุประเทศด้วยเพราะสัญญาณโทรศัพท์ของแต่ละประเทศจะต่างกัน และที่ขาดไม่ได้ก็คือดีไวซ์ของโมเด็ม:

# slmodemd --country=THAILAND /dev/slamr0
SmartLink Soft Modem: version 2.9.6 Feb 12 2004 20:27:49
modem `slamr0' created. TTY is `/dev/pts/3'
symbolic link `/dev/ttySL0' -> `/dev/pts/3' created.
Use `/dev/ttySL0' as modem device, Ctrl+C for termination.

เอาล่ะ พร้อมทำงานแล้ว สังเกตว่าโปรแกรมจะสร้าง /dev/ttySL0 เป็นดีไวซ์ของโมเด็ม ดีไวซ์นี้จะปรากฏเฉพาะช่วงที่เรารัน slmodemd ไว้เท่านั้น

ทีนี้ก็มาเซ็ตโมเด็มให้โทร. เชื่อมอินเทอร์เน็ตกัน ผมก็ลองกับ TOT Online นี่ล่ะ บนลินุกซ์ทะเล/FC/RH ใช้ redhat-config-network ก็ได้ (เรียกได้จากเมนู Applications » System Settings » Network) เสร็จแล้วลองดู /etc/wvdial.conf สักนิด ถ้าใช้ redhat-config-network โปรแกรมจะใส่ Modem = /dev/modem ให้เป็นค่าปริยาย แต่เราต้องใช้ /dev/ttySL0 ครับ ดังนั้นมีืืทางเลือกสองทาง คือ 1. แก้ /etc/wvdial.conf ให้ Modem = /dev/ttySL0 หรือ 2. ทำ symlink เอา โดย ln -sf /dev/ttySL0 /dev/modem

# cat /etc/wvdial.conf
[Modem0]
Modem = /dev/ttySL0
Baud = 57600
SetVolume = 2
Dial Command = ATDT
Init1 = ATZ
Init3 = ATM1L2
FlowControl = Hardware (CRTSCTS)
[Dialer TOT_Online]
Username = [email protected]
Password = xxxxxxxx
Phone = 1222
Stupid Mode = 1
Inherits = Modem0

ออนไลน์!

ได้เวลาสั่งหมุนโทรศัพท์กันแล้นน .. ลินุกซ์ทะเล/FC/RH จะใช้ redhat-control-network ก็ได้ครับ (เรียกจากเมนู Applications -> System Tools -> Network Device Control) หรือจะ wvdial อย่างที่ผมใช้ก็ได้

# wvdial TOT_Online
--> WvDial: Internet dialer version 1.53
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATM1L2
ATM1L2
OK
--> Modem initialized.
--> Sending: ATDT1222
--> Waiting for carrier.
ATDT1222
CONNECT 37333
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Thu Feb 12 20:30:47 2004
--> pid of pppd: 3056

โทร. ติดแล้วลอง lsmod ดูน่าจะเห็นอะไรประมาณนี้

ppp_deflate             4800  0
zlib_deflate           21880  1 ppp_deflate
zlib_inflate           21344  1 ppp_deflate
bsd_comp                5184  0
ppp_async               9952  1
ppp_generic            22288  7 ppp_deflate,bsd_comp,ppp_async
slhc                    6176  1 ppp_generic
slamr                 317956  2

/var/log/message ก็ประมาณนี้

Feb 12 20:30:47 peorth pppd[3056]: pppd 2.4.1 started by root, uid 0
Feb 12 20:30:47 peorth pppd[3056]: Using interface ppp0
Feb 12 20:30:47 peorth pppd[3056]: Connect: ppp0  /dev/pts/2
Feb 12 20:31:03 peorth pppd[3056]: local  IP address 172.17.212.15
Feb 12 20:31:03 peorth pppd[3056]: remote IP address 203.113.60.8
Feb 12 20:31:03 peorth pppd[3056]: primary   DNS address 203.113.93.1
Feb 12 20:31:03 peorth pppd[3056]: secondary DNS address 203.113.93.2

และ ifconfig ก็จะประมาณนี้

# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1202 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1202 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:957852 (935.4 Kb)  TX bytes:957852 (935.4 Kb)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:172.17.212.15  P-t-P:203.113.60.8  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:1 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:66 (66.0 b)  TX bytes:87 (87.0 b)

เป็นอันเรียบร้อย ใช้อินเทอร์เน็ตผ่านโมเด็มได้ซะที :D