Wireless Ethernet D-Link DWL-520+ и Linux
Wireless Ethernet D-Link DWL-520+ и Linux
Введение
Не секрет, что самой большой проблемой open source операционных систем является отсутствие поддержки со стороны производителей аппаратуры. Для многих устройств отсутствуют «родные» драйверы. На сайтах многих производителей аппаратуры присутствуют драйверы только для семейства Windows. Возникает вопрос: а знают ли они вообще о чем-нибудь, кроме «конторской» Windows? :-)
Точно такая же ситуация возникла и с беспроводной сетевой карточкой DWL-520+ от D-Link — на сайте производителя отсутствуют драйверы для Linux. А ведь карточку поднять надо…
Что для этого надо?
Поиск на Google по ключевым словам «DWL-520+», «linux» и «driver» очень быстро дал ответ на вопрос «Что надо, чтобы поднять карточку». На первой же странице можно обнаружить ссылку на проект acx100.sourceforge.net, где можно легко найти сам драйвер и море информации на тему беспроводных сетей. Например, легко выяснить, почему в адресе проекта присутствует наименование acx100. Оказывается, это наименование чипсета от Texas Instruments, на котором построена карточка. К слову, стоит отметить, что предшественница DWL-520+, карточка DWL-520, была основана на совершенно ином чипсете — Prism2.
Что нам нужно для полно счастья? Мне было необходимо следующее:
- linux-2.4.26.tar.gz — последнее ядро (для порядка);
- wireless_tools.26.tar.gz — средства настройки беспроводных сетевых интерфейсов;
- dwl520+_drivers_307.zip — драйверы для Windows. Оттуда нам необходимо firmware для карточки DWL-520+;
- acx100-0.2.0pre7.tar.bz2 — последняя стабильная версия драйвера для Linux. Можно, конечно, взять и версию 0.2.0pre8, но на момент написания материала она была в разработке и я не стал рисковать.
Как это сделать?
Начать надо с того, чтобы войти в систему как root.
Далее собрать новое ядро. Перед сборкой надо убедиться в том, что в конфигурацию ядра включена поддержка беспроводных сетевых устройств. Сборка займет много времени, поэтому ее стоит начать в первую очередь. Материалов по сборке ядра много, и я опущу ее описание.
Далее, во время сборки ядра, можно подготовить остальные средства.
Начнем, например, со сборки wireless_tools.26.tar.gz. Для этого достаточно сделать следующее:
# tar -xzf wireless_tools.26.tar.gz
# cd wireless_tools.26
# make && make install
Теперь можно заняться драйвером acx100. Распакуем его и драйверы для Windows:
# tar -xjf acx100-0.2.0pre7.tar.bz2
# unzip dwl520+_drivers_307.zip
Теперь необходимо скопировать файлы firmware из набора драйверов для Windows и скомпилировать драйвер:
# cp Drivers/520+/WinXP/*.BIN acx100-0.2.0pre7/firmware
# make -C acx100-0.2.0pre7
Теперь подождем, пока завершится сборка ядра… подождем… пойдем покурим, попьем кофе…
После окончания сборки ядра перезагрузим Linux с новым ядром.
Настройка
Теперь стоит проверить работоспособность карточки. Для начала, для простоты, допустим, что у нас есть другая машина под управлением Windows с такой же карточкой, настроенная и готовая к работе. Предположим, что карточка имеет такую конфигурацию:
SSID: HomeLan
Wireless Mode: Ad-hoc
Channel: 6
TxRate: Auto
Preamble: Long Preamble
Power Mode: Continuous Access Mode
IP: 192.168.85.1
Теперь настроим скрипт запуска драйвера сетевой карточки из пакета acx100-0.2.0pre7. Для этого перейдем в каталог acx100-0.2.0pre7/scripts и отредактируем файл start_net. Установим следующие значения переменных:
DEV=wlan0
ESSID=HomeLan
RATE=11M
CHAN=6
MODE=Ad-hoc
ALG=open
IP=192.168.85.2
NETMASK=255.255.255.0
GATEWAY=192.168.85.1
Запускаем скрипт start_net и смотрим результат… Если нет сообщений об ошибках, то проверяем связь:
# ping 192.168.85.1
Если не идет обмен, надо проверить еще раз настройки и на том ли месте firmware, включена ли в ядре поддержка беспроводных сетей… и попробовать снова.
Так как связь установлена нормально, можно приступать к настройке автоматического запуска сетевого драйвера по старту ОС.
Автоматический запуск: взгляд из Slackware Linux 9.1
Лично я подошел к вопросу автоматизации запуска следующим образом:
- Скопировал модуль драйвера для DWL-520+ (acx100_pci.o) в каталог /lib/modules/2.4.26/kernel/drivers/net/wireless.
- Создал каталог /lib/modules/2.4.26/firmware/acx100_pci и скопировал в него файлы firmware: WLANGEN.BIN, RADIO11.BIN, RADIO0d.BIN, AIRPLUS.BIN.
- В каталоге /etc/rc.d создал два файла: rc.dwl_520p и rc.dwl_520p.conf:
- Содержание файла rc.dwl_520p:
#! /bin/sh
#
#set -x
############################
# READ NETWORK CONFIG FILE #
############################
# Get the configuration information from /etc/rc.d/rc.dwl_520p.conf:
. /etc/rc.d/rc.dwl_520p.conf
WLAN_DEV_NO="0"
KERNEL_VER=`uname -r`
MODULES_DIR="/lib/modules/${KERNEL_VER}"
MODULE_TYPE="acx100_pci"
MODULE_FILE="${MODULES_DIR}/kernel/drivers/net/wireless/${MODULE_TYPE}.o"
FIRMWARE_DIR="${MODULES_DIR}/firmware/${MODULE_TYPE}"
dwl_520p_up() {
DEV="wlan${1}"
if test -r "$FIRMWARE_DIR/WLANGEN.BIN" -o -r "$FIRMWARE_DIR/TIACX111.BIN"; then
insmod $MODULE_FILE debug=$DEBUG firmware_dir=$FIRMWARE_DIR
if test "$?" = "0"; then
if test "$DEBUG_ETH_UP" = "yes"; then
echo "Module $MODULE_FILE successfully inserted."
fi
if test -n "$RATE"; then
iwconfig $DEV rate $RATE
if test "$?" != "0"; then
if test "$DEBUG_ETH_UP" = "yes"; then
echo "Failed to set rate $RATE!"
fi
fi
fi
if test -n "$CHAN"; then
iwconfig $DEV channel $CHAN
if test "$?" != "0"; then
if test "$DEBUG_ETH_UP" = "yes"; then
echo "Failed to set channel $CHAN!"
fi
fi
fi
if test -n "$TXPOWER"; then
iwconfig $DEV txpower $TXPOWER
if test "$?" != "0"; then
if test "$DEBUG_ETH_UP" = "yes"; then
echo "Failed to set Tx power level to $TXPOWER dBm!"
fi
fi
fi
iwconfig $DEV essid "$ESSID"
if test "$?" != "0"; then
if test "$DEBUG_ETH_UP" = "yes"; then
echo "Failed to join or set ESSID $ESSID!"
fi
fi
if test -n "$MODE"; then
iwconfig $DEV mode $MODE
if test "$?" != "0"; then
if test "$DEBUG_ETH_UP" = "yes"; then
echo "Failed to set mode to $MODE!"
fi
fi
fi
if test -n "$KEY" -a "$ALG" != "open"; then
iwconfig $DEV key $ALG "$KEY"
if test "$?" != "0"; then
if test "$DEBUG_ETH_UP" = "yes"; then
echo "Failed to set key to $KEY and algorithm $ALG!"
fi
fi
fi
if test "${USE_DHCP}" = "yes"; then # use DHCP to bring interface up
if test ! "${DHCP_HOSTNAME[$1]}" = ""; then
/sbin/dhcpcd -t 10 -h ${DHCP_HOSTNAME} -d $DEV
else
/sbin/dhcpcd -t 10 -d $DEV
fi
else # bring up interface using a static IP address
if test ! "${IPADDR[$1]}" = ""; then # skip unconfigured interfaces
# Determine broadcast address from the IP address and netmask:
BROADCAST=`/bin/ipmask ${NETMASK} ${IPADDR} | cut -f 1 -d ' '`
# Set up the ethernet card:
echo "Configuring $DEV:"
echo "/sbin/ifconfig $DEV ${IPADDR} broadcast ${BROADCAST} netask ${NETMASK}"
/sbin/ifconfig $DEV ${IPADDR} broadcast ${BROADCAST} netmask ${NETMASK}
/sbin/ifconfig $DEV mtu 576
else
if test "$DEBUG_ETH_UP" = "yes"; then
echo "$DEV interface is not configured in /etc/rc.d/rc.dwl-520p.conf!"
fi
fi
fi
else
if test "$DEBUG_ETH_UP" = "yes"; then
echo "Error while inserting module $MODULE_FILE! Failed..."
fi
fi
else
if test "$DEBUG_ETH_UP" = "yes"; then
echo "Firmware not found or not readable. Failed..."
fi
fi
}
dwl_520p_down() {
DEV="wlan${1}"
if test "${USE_DHCP}" = "yes"; then
/sbin/dhcpcd -k -d $DEV
sleep 1
else
/sbin/ifconfig $DEV down
fi
rmmod acx100_pci
}
# Function to bring up the gateway if there is not yet a default route:
gateway_up() {
if ! /sbin/route | grep "^default" 1> /dev/null ; then
if [ ! "$GATEWAY" = "" ]; then
/sbin/route add default gw ${GATEWAY} metric 1
fi
fi
}
# Function to take down an existing default gateway:
gateway_down() {
if /sbin/route | grep "^default" 1> /dev/null ; then
/sbin/route del default
fi
}
############
### MAIN ###
############
case "$1" in
'start') # "start" brings up all available interfaces:
dwl_520p_up $WLAN_DEV_NO
gateway_up
;;
'stop') # "stop" takes down all existing interfaces:
gateway_down
dwl_520p_down $WLAN_DEV_NO
;;
*) # The default is to bring up all interfaces:
dwl_520p_up $WLAN_DEV_NO
gateway_up
esac
# End of /etc/rc.d/rc.dwl_520p - Содержание файла rc.dwl_520p.conf:
# /etc/rc.d/rc.dwl_520p.conf
#
# Config information for wlan0:
ESSID="HomeLan"
RATE="11M"
CHAN="6"
MODE="Ad-hoc"
ALG="open"
KEY=""
IPADDR="192.168.85.2"
NETMASK="255.255.255.0"
GATEWAY="192.168.85.1"
USE_DHCP="no"
DHCP_HOSTNAME=""
- Содержание файла rc.dwl_520p:
- Внес изменение в файл rc.M, добавив после строк:
# Initialize the networking hardware. If your network driver is a module
# and you haven't loaded it manually, this will be deferred until after
# the hotplug system loads the module below.
if [ -x /etc/rc.d/rc.inet1 ]; then
. /etc/rc.d/rc.inet1
fi
следующие строки:
# Setup D-Link DWL-520+
if [ -x /etc/rc.d/rc.dwl_520p ]; then
. /etc/rc.d/rc.dwl_520p
fi - Потом перезапустил Linux.
Автор: Андрей Головня (AG)
E-mail: andrew_golovnia [аt] ukr.net
ICQ: 75123273
URL: http://ag.qnx.org.ru/