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.0pre\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, включена ли в ядре поддержка беспроводных сетей... и попробовать снова.

Так как связь установлена нормально, можно приступать к настройке автоматического запуска сетевого драйвера по старту ОС.

Автоматически запуск: взгляд из Слаквари 9.1

Лично я подошел к вопросу автоматизации запуска следующим образом:

  1. Скопировал модуль драйвера для DWL-520+ (acx100_pci.o) в каталог /lib/modules/2.4.26/kernel/drivers/net/wireless.

  2. Создал каталог /lib/modules/2.4.26/firmware/acx100_pci и скопировал в него файлы firmware - WLANGEN.BIN, RADIO11.BIN, RADIO0d.BIN, AIRPLUS.BIN.

  3. В каталоге /etc/rc.d создал два файла: rc.dwl_520p и rc.dwl_520p.conf

    1. Содержание файла 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

    2. Содержание файла 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=""

  4. Внес изменение в файл 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
    
  5. Потом перезапустил Linux.

 


Страница сайта http://silicontaiga.ru
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=6503