首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM上的linux如何实现无线网卡的冷插拔和热插拔

ARM上的linux如何实现无线网卡的冷插拔和热插拔

1. 冷插拔如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔。我们通过分析系统启动流程过程中的运行的脚本,将启动wlan的脚本加入其中,就可以实现自动运行wlan.
系统启动后的第一个进程/sbin/initinit进程最主要的功能就是准备软件执行的环境,包括系统的主机名、网络配置、语系处理、文件系统格式以及其他服务的启动等。而所有的操作都会通过init的配置文件,即/etc/inittab来规划。
inittab文件中有很多如下格式的语句:
label:runlevel:action:process
但是我们这里只关注下面这条语句:
# now run any rc scripts
null::wait:/etc/init.d/rcS
即运行所有的rc 脚本,这里是运行rcS脚本,rcS脚本内容如下:
~ >: cat /etc/init.d/rcS
#!/bin/sh

# Copyright (C) 2011 GuoWenxue <guowenxue@gmail.com QQ:281143292>
# Start all init scripts in /etc/init.d
# executing them in numerical order.
#

for i in /etc/init.d/S??* ;do
        $i
done
~ >:
很简单的一个脚本,即运行/etc/init.d/目录下以S开头,两个?匹配任意两个字符
*匹配0或多个字符。该目录下有一个文件S01_network,内容如下:
注:绿色为注释
~ >: cat etc/init.d/S01_network
#!/bin/sh
# FILE:/etc/init.d/S01_network
# Copyright (C) 2012 GuoWenxue <guowenxue@gmail.com QQ:281143292>
# This file used to configure the network from the configure files
#network_cfg_dir变量是否为空,如果是将/apps/etc/network赋值给network_cfg_dir
if [ -z "$network_cfg_dir" ] ; then
  export network_cfg_dir=/apps/etc/network
Fi

#进入/apps/etc/network目录
cd $network_cfg_dir

#~ >: cd apps/etc/network/
/apps/etc/network >: ls
bakifcfg-wlan0       ifcfg-eth0           resolv.conf
gatewayD.conf        ifcfg-ppp10          wpa_supplicant.conf
hostapd.conf         ifcfg-wlan0
/apps/etc/network >:
#上面这个正则表达式的目的是提取出网卡名,例如eth0wlan0,其中wlan0为我们所需要的。
interfaces=$( ls ifcfg* | \
                sed -e '/ifcfg-[A-Za-z0-9\._-]\+$/ { s/^ifcfg-//g;s/[0-9]/ &/}' | \
                sort -k 1,1 -k 2n | \
                sed 's/ //')

#如果网卡还没有配置好,那么运行:#ifconfig 系统只会输出以lo 为首的部分。lo look-back网络接口,从IP地址127.0.0.1就可以看出,它代表本机。无论系统是否接入网络,这个设备总是存在的,除非你在内核编译的时候禁止了网络支持,这是一个称为回送设备的特殊设备,它自动由Linux配置以提供网络的自身连接。IP地址127.0.0.1是一个特殊的回送地址(即默认的本机地址),可以在自己的系统上用telnetIP地址127.0.0.1进行测试。如果有inetd进程在运行的话您会从自己的机器上获得登录提示符。Linux可以利用这个特征在进程与仿真网络之间进行通信。(您有兴趣的话还可以试试本机的实际IP地址,如这里的机器就是210.34.6.89,或者试试"localhost",或者"127.0.0.1",同样可以模拟网络通信。这可是Linux一个非常突出的优点!)
ifconfig lo 127.0.0.1

# No interface configure, then use the default IP address
如果/apps/etc/network目录下没有带网卡名的文件,这时interface变量为空,配置eth0网卡,之后退出。
if [ -z "$interfaces" ] ; then
   ifconfig eth0 192.168.1.223 up
   exit
fi   

# Set up all the interface
设置所有网卡接口
for i in $interfaces; do
#unset删除变量或函数
  unset DEVICE TYPE
#如果这时候$iwlan0,则下面的目的是提取出ifcfg-wlan0文件中的DEVICETYPE等号后面的内容。ifcfg-wlan0在该脚本下面。
  eval $(fgrep "DEVICE=" ifcfg-$i)
  eval $(fgrep "TYPE=" ifcfg-$i)
#如果$DEVICE为空,着将$i的值赋给它。
  if [ -z "$DEVICE" ] ; then DEVICE="$i"; fi


#如果ifcfg-wlan0文件中的ONBOOT不为no,时执行下面的语句。
  if ! egrep -L "^ONBOOT=['\"]?[Nn][Oo]['\"]?" ifcfg-$i > /dev/null ; then
#下面是根据各自的TYPE值,执行相应的脚本
        if [ "$TYPE" = "Ethernet" ] ; then
                echo "Bring up $TYPE interface $i"
                /usr/sbin/ifup-eth $i
        elif [ "$TYPE" = "PPP" ] ; then
                echo "Bring up $TYPE interface $i"
        elif [ "$TYPE" = "WLAN" ] ; then
        # Just bring up the wiFi module here. Configure it in the followed shell scripts
#如果是WLAN,存在目录/sys/class/net/wlan0/就会运行下面的命令,其中/apps/tools/ifup-wlan是一个脚本。在ifcfg-wlan0配置文件下面。
        if [ -d /sys/class/net/$DEVICE/ ] ; then
           /apps/tools/ifup-wlan $i
        fi
        else
                echo "Bring up $TYPE interface $i"
        fi
  fi
# for循环结束
done
#结束
~ >:
继承事业,薪火相传
返回列表