Site Mascot
 

Не удивляйтесь, сайт переехал: был http://smacker.fatal.ru, стал http://smacker.heliohost.org.

Установка драйверов Martian для Модемов Lucent/Agere

07.11.2007 11:13

Установка драйверов martian для Lucent/Agere модемов, как выяснилось, является довольно популярной темой и потому заслуживает отдельного рассмотрения.

 
Рассказывая об установке Linux на мой ноутбук Dell Latitude L400 я вкратце упомянул о настройке софтмодема с помощью драйверов Martian. В этой публикаци я собираюсь осветить этот вопрос более подробно, так как по моим данным он представляет значительный интерес.

 

На официальной странице проекта http://martian.barrelsoutofbond.org/ можно узнать, что Martian — проект создания драйвера для линмодемов на чипсете DSP 164x (Mars), особенность которого состоит в том, что функциональность ядерного модуля минимальна, а всё, что связано с проприетарным кодом Agere вынесено в приложение, выполяющееся в userspace. Говоря простым языком, это значит, что закрытому коду теперь нет доступа в ядро и повесить систему так, как могут драйвера ltmodem[-alk], он не может. Далее я опишу процесс установки драйверов поэтапно.

 

 

Какой у меня модем?

 

Чтобы это узнать, в консоли введите lspci:
 [smacker@notebook ~]$ lspci
 00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 03)
 00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 03)
 00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 02)
 00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
 00:07.2 USB Controller: Intel Corporation 82371AB/EB/MB PIIX4 USB (rev 01)
 00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
 00:08.0 Multimedia audio controller: Cirrus Logic Crystal CS4281 PCI Audio (rev 01)
 00:0a.0 CardBus bridge: Texas Instruments PCI1410 PC card Cardbus Controller (rev 01)
 00:0d.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 78)
 00:10.0 Communication controller: Agere Systems WinModem 56k (rev 01)
 01:00.0 VGA compatible controller: ATI Technologies Inc Rage Mobility P/M AGP 2x (rev 64)
Строка о модеме выделена, найдите похожую в своём выводе.

 

 

Скачать и распаковать

 

С официального сайта или с http://linmodems.technion.ac.il/packages/ltmodem/kernel-2.6/martian/ нужно забрать самый свежий пакет martian-full. Я проверял материал данной статьи на примере martian-full-20071011 (улучшена поддержка ядра 2.6.22) и martian-full-20061203. После этого архив нужно распаковать и открыть терминал внутри каталога с исходным кодом.
Предположим, что я сохранил архив в /home/smacker/tarballs, тогда нужно открыть консоль и набрать:
 cd /home/smacker/tarballs
 tar -zxf martian-full-20071011.tar.gz
 cd martian-full-20071011 

 

 

Компиляция, проверка и установка

 

Теперь драйвера нужно собрать. Это делается очень просто. Предполагая, что после вышеописанных действий терминал не был закрыт, набираем:
 su root
 make 
Можно, конечно, сделать sudo make — если, конечно, вашему пользователю это разрешено. Но тогда и далее каждую команду, требующую прав root-а придется предварять словом sudo.

 

Когда (если) сборка завершится без ошибок, хорошо было бы проверить её результат. Наберите
 insmod ./kmodule/martian_dev 
и затем посмотрите вывод dmesg. Если в конце вы увидите похожие строки, все в порядке:
 martian loaded - 20061202
 PCI: Found IRQ 3 for device 0000:00:10.0
 "martian_dev": added device 11c1:448 BaseAddress = 0xf800, CommAddres = 0xfcc8, irq = 3 
Теперь наберите
 ./modem/martian_modem 
или
 ./modem/martian_modem.stripped 
и снова посмотрите вывод dmesg. Если в конце появились строки
 "martian_dev": serving irqs in module
 "martian_dev": martian_modem is attached. 
То всё собралось и работает. Осталось только установить, для этого наберите:
 make install 
И компоненты драйвера будут установлены.

 

Если же сборка завершилась с ошибкой, вам придется ликвидировать её причину. Проявлю телепатический дар и предположу, что скорее всего у вас не установлены заголовки ядра (пакет kernel-devel или что-то вроде) или необходимый для компиляции софт — начиная с make и заканчивая gcc. Их придется установить, но эта операция зависит от дистрибутива, поэтому я её расписывать не буду.

 

 

Установка с помощью checkinstall

 

Checkinstall — крайне удобная утилита, которая позволяет собрать пакет для вашего дистрибутива — RPM, DEB или TGZ — из практически любого исходного кода. Это хорошо тем, что в, скажем, RPM-системе не плодятся «незарегистрированные» бинарники и файлы, и по-прежнему можно держать руку на пульсе системы даже собирая всё только из исходного кода. Однако, в случае с драйвером martian необходимо соблюсти один нюанс.
Команда strip вырезает служебные символы из объектного модуля. В общем случае, в этом нет ничего страшного, только экономия места на размере исполняемого файла. Однако в случае с модулями ядра такое усечение может быть критическим. При сборке martian_dev.ko и martian_modem вырезаются только допустимые символы, но checkinstall при сборке пакета по умолчанию вырезает все. Поэтому если вы просто запустите checkinstall для сборки, скажем, RPM пакета, то при запуске установленного таким образом martian_modem вы получите в dmesg
 martian: error: dynreloc: /proc/self/exe: no symbols
 martian: error: Failed to link to driver 
И, разумеется, ничего работать не будет. Поэтому для сборки пакета с помощью checkinstall обязательно укажите опцию strip (-R для сборки RPM, вам может понадобиться другой тип пакета):
 checkinstall -R --strip=no 
Дальнейшие действия вам или уже известны, или вам их подскажет сам checkinstall.

 

 

Автоматическая загрузка драйверов

 

Итак, теперь у нас есть модуль ядра и программа для работы с модемом. Осталось только прописать их автозагрузку при старте системы. Для этого есть два способа. Первый, самый простой и очевидный — дописать соответствующие команды в /etc/rc.d/rc.local:
 modprobe martian_dev
 /usr/sbin/martian_modem --daemon
 ln -s /dev/ttySM0 /dev/ttySL0
 
Первая команда подгрузит модуль ядра, вторая (не забудьте параметр daemon) запустит userspace-оболочку как демон, а третья создаст символическую ссылку с устройства /dev/ttySM0 на устройство /dev/ttySL0. Последнее нужно потому, что во-первых, устройства /dev/ttySM0 может не быть в списке программы-звонилки, например, KPPP, а во-вторых, потому что ссылку /dev/modem могут затереть другие программы, например, если вы вставите PCMCIA-модем в слот. Если вам это не грозит, можете делать ссылку /dev/modem.

 

Однако есть более изящный способ: написать соответствующий сервис (я пишу с позиции пользователя RPM дистрибутива ASP, не забудьте об этом — если у вас что-то иное, фокус может и не удаться). Тогда модем будет запускаться в том же порядке, что и общесистемные сервисы, как, например, bluetooth или nvidia-glx, при старте системы. Плюс добавится возможность управлять драйверами. Я написал для этого простой скрипт, который назвал martian и поместил в /etc/init.d — разумеется, для этого нужны будут права рута, а ещё нужно не забыть сделать скрипт исполняемым (chmod 755 /etc/init.d/martian). Из параметров, которые возможно придется поменять — переменная TARGETDEV, содержащая имя символической ссылки.

 

 #!/bin/bash
 #
 # chkconfig: 2345 50 15
 # description: Launching service for Lucent/Agere LinModem "Martian" driver
 # processname: martian_driver
 # pidfile:
 # config:
 
 # This will be the symlink to our modem device /dev/ttySM0
 TARGETDEV=/dev/ttySL0
 
 # source function library
 . /etc/init.d/functions
 
 RETVAL=0
 
 start() {
 	echo -n $"Initializing Lucent/Agere LinModem: "
 	
 	if [ -f /var/lock/subsys/martian ] ; then
 		echo "already running, exiting..."
 		exit
 	fi
 
 	modprobe martian_dev
 	daemon /usr/sbin/martian_modem --daemon
 
 	RETVAL=$?
 	echo
  	[ $RETVAL -eq 0 ] && ( touch /var/lock/subsys/martian && ln -s /dev/ttySM0 $TARGETDEV )
 }
 
 stop() {
 	echo -n $"Disabling Lucent/Agere LinModem: "
 
 	if [ ! -f /var/lock/subsys/martian ] ; then
 		echo "already not running, exiting..."
 		exit
 	fi
 
 	killproc martian_modem
 	rmmod martian_dev
 
 	RETVAL=$?
 
 	echo
 	[ $RETVAL -eq 0 ] && ( rm -f /var/lock/subsys/martian && rm -f $TARGETDEV )
 }
 
 restart() {
 	echo -n $"Disabling Lucent/Agere LinModem: "
 	killproc martian_modem 2>/dev/null
 	rmmod martian_dev 2>/dev/null
 	rm -f /var/lock/subsys/martian 2>/dev/null
 	rm -f $TARGETDEV 2>/dev/null
 	echo;
 
 	echo -n $"Initializing Lucent/Agere LinModem: "
 	modprobe martian_dev 2>/dev/null
 	daemon /usr/sbin/martian_modem --daemon 2>/dev/null
 	touch /var/lock/subsys/martian 2>/dev/null
 	ln -s /dev/ttySM0 $TARGETDEV 2>/dev/null
 	echo;
 }
 
 case "$1" in
   start)
 	start
 	;;
   stop)
 	stop
 	;;
   restart|reload)
 	restart
 	;;
   condrestart)
 	if [ -f /var/lock/subsys/martian ]; then
 	   restart
 	else
 	   echo "Martian LinModem not running - nothing to restart"
 	fi
 	;;
   status)
 	status martian_modem
 	RETVAL=$?
 	;;
   *)
 	echo $"Usage: $0 {start|stop|restart|condrestart|status}"
 	exit 1
 esac
 
 exit $RETVAL
 

 

Теперь можно будет включать инициализацию модема с помощью, скажем, system-config-services, chkconfig или другой программы для настройки сервисов. Кроме того, можно сделать соответствующие символические ссылки на /etc/init.d/martian вручную, но тот, кто знает об этом, не нуждатся в дальнейших объяснениях.

 

 

Эпилог

 

Теперь можете смело брать любую звонилку, указывать там устройство /dev/ttySM0 или вашу символическую ссылку и дозваниваться. Не забудьте только, что поскольку модем софтовый, проверку несущей придётся отключить. Для wvdial нужно добавить в файл конфигурации
 Carrier Check = no 
А для KPPP нужно пойти во вкладку параметры -> модемы -> изменить -> модем и снять галочку с пункта «дождаться сигнала в линии перед набором номера». Про другие звонилки не знаю, ибо не пользуюсь — разбирайтесь сами.
Относительно потребительских свойств — могу, конечно, сказать только за свой модем — они замечательные. Модем работает стабильно, соединяется на высоких скоростях и не даёт сбоев. Соединение держит часами, даже бывало по 5 или 6 часов подряд.
  1. mamo
    Email: andrey166 гав-гав ukr.net  
    ***
    Ето то что я искал и нашол тока у вас
    [ Запись от 07.04.2008, отправлена в 13:02 ]
    Ето было приятно слышать.
  2. Mark
    Email: teltoepsi гав-гав umail.ru  URL: www.numc.ru
    #
    Превосходно! Особенно важно, что вы
    дали скрипт для установки сервиса.
    Во многих случаях возникают проблемы
    с сопоставлением устройств /dev/ttyS*
    модемам, поставленным на ISA или PCI
    слоты.
    [ Запись от 12.11.2008, отправлена в 9:14 ]
  3. Я буду рад, если вы оставите свой отзыв об этой заметке:

    Никнейм

    Email

    URL

    Заголовок комментария

    Проверка на человечность
    - Введите буквы:
    The CAPTCHA image