Wireless Ethernet D-Link DWL-520+ и Linux

Wireless Ethernet D-Link DWL-520+ и Linux

Введение
    DWL-520+
    Не секрет, что самой большой проблемой 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
   
    Лично я подошел к вопросу автоматизации запуска следующим образом:

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

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

  4.    
  5. В каталоге /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.    
         
    3. Содержание файла 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=""
  6.    
       
  7. Внес изменение в файл 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
  8.    
       
  9. Потом перезапустил Linux.

Автор: Андрей Головня (AG)
E-mail: andrew_golovnia [аt] ukr.net
ICQ: 75123273
URL: http://ag.qnx.org.ru/



IP Rambler's Top100