หลายๆ คนที่ใช้โน้ตบุ๊ก หรือเดสก์ทอปที่มีซอฟต์โมเด็ม (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