最近一些项目原因需要让自制的linux qt文件系统支持wifi功能,本文将具体进行分析。
首先想要支持wifi功能,wifi驱动是必不可少的,一般的嵌入式设备都集成wifi模块了,如果没有,请选配一款usbwifi模块。
1,然后是编译wifi驱动,具体型号具体分析,可以百度,本文不做阐述,假设编译出的wifi驱动模块文件叫wlan.ko,并且假设内核版本是3.4.39。
2,wifi驱动编译成模块之后,一般放入”/lib/modules/3.4.39/“目录下,再在/etc/init.d/rcS脚本的首行添加一句insmod /lib/modules/3.4.39/wlan.ko
这样在开机时就会加载wlan.ko驱动,然后在ifconfig -a命令中可以看到例如wlan0这样的设备,设备名不一而足,不多阐述(有的叫ra0等)。
3,然后需要在/etc/network/interfaces中追加:
auto wlan0
iface wlan0 inet dhcp
语句,目的是让操作喜用自己打开wlan设备。
那么以上步骤都做完之后,开机后执行ifconfig,直接就能看到wlan0了,这样我们的第一步就做好了。
4,一般wlan设备的驱动需要对应的命令去进行wifi连接,由于现在很多嵌入式设备使用wpa2方式进行加密,所以,我们需要移植wpa_supplicant工具,
对wpa2加密进行支持。
首先,移植wpa_supplicant需要两个库进行支持,一个是openssl库,正常来说有这个库就可以了,网上的很多移植教程也是这么说的,然而在实际使用中,
我发现,我的wifi设备驱动是比较新的,它的wifi连接标准使用nl80211,而网上教程普遍描述的是wext标准(再一次印证了网上的东西都是很早的)。
贴上一个前辈写的过程:
http://www.cnblogs.com/wanhl/p/3374443.html
按照他的方式,我确实移植成功了,但是在我的自制文件系统中不能连接,到这一步,调用
wpa_supplicant -iwlan1 -Dwext1 -c /etc/wpa_supplicant.conf
指令直接报以下错误信息:
ioctl[SIOCSIWPMKSA]: Invalid argument
ioctl[SIOCSIWMODE]: Invalid argument
ioctl[SIOCGIWRANGE]: Invalid argument
ioctl[SIOCGIWMODE]: Invalid argument
ioctl[SIOCSIWAP]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWPMKSA]: Invalid argument
unlink[ctrl_iface]: Not a directory
Could not unlink existing ctrl_iface socket '/sbin/wpa_supplicant/wlan0'
Failed to initialize control interface '/sbin/wpa_supplicant'.
You may have another wpa_supplicant process already running or the file was
left by an unclean termination of wpa_supplicant in which case you will need
to manually remove this file before starting wpa_supplicant again.
ioctl[SIOCGIWMODE]: Invalid argument
ioctl[SIOCSIWAP]: Invalid argument
l2_packet_receive - recvfrom: Network is down
这让我很是费解,显然是ioctl函数报错,那么也就是驱动提出了问题了,但我用同样的驱动在ubuntu下是可以运行的,但并不是用命令去运行。
因此我尝试用同样的命令进行操作,在ubuntu下也报了相同的错误,也就是说这个命令确实是有问题的,而问题的原因就是wext标准已经不被我的
驱动支持了,那么当我查看wpa_supplicant工具的帮助信息时,我发现它有两套标准,一个是wext,另一个是nl80211,于是我尝试修改命令,
修改成wpa_supplicant -iwlan1 -Dnl80211 -c /etc/wpa_supplicant.conf
执行之后成功了,也就是说我的驱动只支持nl80211标准,于是我回到qt文件系统下,执行此命令,报错,表示不支持80211标准。
因此,我在wpa_supplicant工程的.config文件中找到与80211相关的配置宏,也就是打开CONFIG_DRIVER_NL80211=y,
可以选择性得关闭CONFIG_DRIVER_WEXT=y
再次编译,失败,表示有多个头文件没有找到:
../src/drivers/driver_nl80211.c:22:31: warning: netlink/genl/genl.h: No such file or directory
../src/drivers/driver_nl80211.c:23:33: warning: netlink/genl/family.h: No such file or directory
../src/drivers/driver_nl80211.c:2