之前已经在FLX6410的平台上移植过8787的驱动程序了(详见:http://blog.csdn.net/sdecat/article/details/7514576),这次为了方便,依旧在FLX6410的平台上进行调试。调试前,先把平台的软硬件情况大概列一下:
CPU:S3C6410 OC to 1GHz
RAM: 512MB mDDR
硬盘: Seagate 2.5' 80GB IDE Harddisk(工作于UDMA66模式)
声卡:WM9713
有线网卡: DM9000 100M FastEthernet
无线网卡: Marvell 88W8787 SDIO WIFI BLUETOOTH FM 3in1
OS:Debian6.06
Kernel: 2.6.38.2
Native GCC: 4.4.5
与上次不一样的是:上次使用的是3.2.5版本内核的驱动程序,这次为了支持Simultaneous UAP-STA的特性,需要使用最新3.6.6版本内核的驱动。由于内核需要保留2.6.38.2的版本不升级,这次仍然使用大名鼎鼎的compat-wireless。到官网上下载最新3.6.6-1版本的compat-wireless,解压后在工程目录中执行make && make install 然后就是耐心等待编译和安装的完成。一切正常的话,编译出来的驱动会被安装在系统的/lib/modules/2.6.38.2的updates目录当中。驱动安装完毕,插入8787网卡试试:
mmc0: new high speed SDIO card at address 0001
bus: 'mmc': driver_probe_device: matched device mmc0:0001 with driver mmcblk
bus: 'sdio': driver_probe_device: matched device mmc0:0001:1 with driver mwifiex_sdio
mwifiex_sdio mmc0:0001:1: WLAN FW is active
mwifiex_sdio mmc0:0001:1: driver_version = mwifiex 1.0 (14.66.9.p96)
root@ArmCat:~# iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
pan0 no wireless extensions.
mlan0 IEEE 802.11bgn ESSID:"wireless"
Mode:Managed Frequency:2.462 GHz Access Point: 39:85:38:DB:CE:66
Bit Rate=54 Mb/s
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
Link Quality=32/70 Signal level=-78 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
uap0 IEEE 802.11bgn Mode:Master
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:on
root@ArmCat:~#
驱动已经跑起来了,生成两个网络设备mlan0和uap0,其中mlan0和上次的一样,而uap0则是驱动新增的专用于AP的网络设备。
驱动搞定,下一步就是编译建立AP用的hostapd软件了,同样,从官网上下载个最新v2.0-devel版本的hostap源码,解压后进入工程目录的hostapd目录中,把defconfig拷贝一份cp defconfig .config, 编辑.config, 把CONFIG_DRIVER_NL80211=y之前的注释符“#”去掉,保存后退出编辑状态,执行make 编译工程。完成后,当前目录下面就能看到编译出来的 hostapd 程序了。接下来就需要修改hostapd的启动配置文件了,把当前目录中的hostapd.conf拷贝一份cp hostapd.conf myap.conf,编辑myap.conf,为了简单起见,先不使用加密,使能下面这几项:
interface=uap0
driver=nl80211
ssid=ArmCat
hw_mode=g
channel=8
macaddr_acl=0
ignore_broadcast_ssid=0
保存,退出编辑状态,激动人心的时刻到了,执行./hostapd ./myap.conf,此时就可以在手机和电脑的无线网络中搜索出没有加密的ArmCat接入点了,赶紧连上去看看,手机和电脑上一直显示“正在获取IP地址”,过一会又断开重连,始终无法成功接入。看样子是缺少个分配IP的关键服务程序dhcpd了。懒得找源码编译了,把板子连入因特网,用root用户执行apt-get install udhcpd ,不到一分钟udhcpd程序就自动下载和安装好了,这就是Debian系统的方便之处,需要什么软件,联网后用root直接发个apt-get install命令完事了,自动把有依赖关系的软件包一起下载并依次安装,省力又省心,这对早期调试专注主线,排除干扰,避免节外生支起到了非常重要的作用。要知道,Linux的库依赖关系有时候可以非常的错综复杂,譬如为了运行A,需要库B,而库B又依赖于库C,库C依赖于库D...最后晕头转向的把库Z整起来后,突然发现自己都不知道到底要干什么了。还好,这里我还记得现在需要修改刚装好的udhcpd的配置文件/etc/udhcpd.conf。 编辑文件,使能下面这些项:
start 192.168.0.20 #default: 192.168.0.20
end 192.168.0.254 #default: 192.168.0.254
interface uap0 #default: eth0
opt dns 192.168.1.1
option subnet 255.255.255.0
opt router 192.168.0.1
#opt wins 192.168.0.1
option dns 192.168.1.1 # appened to above DNS servers for a total of 3
option domain local
option lease 864000 # 10 days of seconds
这里说明一下,FLX6410板子是通过mlan0接入到一个无线的ADSL modem,自动获取192.168.1.0/24网段的IP地址,然后在uap0上建立一个192.168.0.0/24网段的AP供电脑的无线网卡接入测试,192.168.0.0/24网段的dns全部指向192.168.1.0/24网段的网关,即无线ADSL modem的IP,由其转发处理0网段内的dns请求。
配置文件编辑好后保存退出编辑状态,用root先给uap0配个IP作为0网段的网关: ifconfig uap0 192.168.0.1 netmask 255.255.255.0 up 再执行/etc/init.d/udhcpd restart即可启动dhcpd服务器。现在接入ArmCat的电脑和手机就可以自动获取到0网段的IP地址了。
为了能使0网段的电脑和手机能通过1网段的无线ADSL接入到internet,还要做一个NAT的转发。用root执行下面两条命令:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o mlan0 -j MASQUERADE
echo "1" > /proc/sys/net/ipv4/ip_forward
至此,8787的Simultaneous UAP-STA模式就完全跑起了,FLX6410板子也就成了个简单的无线路由器了。