环境:4418 kernel3.4.39 MTK7601 usb wifi
1)、进入源码根目录,修改Makefile。
#PLATFORM: Target platform
PLATFORM = s5p4418
在末尾添加
ifeq ($(PLATFORM),s5p4418)
LINUX_SRC = /home/work/linux/linux/kernel/kernel-3.4.39/ //注:内核源码目录
CROSS_COMPILE = /opt/arm-cortex_a9/bin/arm-cortex_a9-linux-gnueabi- //注:交叉编译器安装目录
export ARCH=arm
endif
2)、修改源码根目录下的os/linux/config.mk文件
218:#ifdef CONFIG_ELIAN_SUPPORT
219:HAS_CONFIG_ELIAN_SUPPORT=n ----- 把y改成n,不支持smartlink功能
220:#endif
注:之所以不支持smartlink功能,是因为这部分源码MTK保密,且该功能是wifi万能钥匙才能用到。如果选择该功能,编译不过。
添加:
ifeq ($(PLATFORM),s5p4418)
EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include
export EXTRA_CFLAGS
endif
3)、make clean
4)、make
编译出现错误:
1、
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/rt_main_dev.c:345:11: error: ‘struct net_device’ has no member named ‘wireless_handlers’
make[2]: *** [/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/rt_main_dev.o] 错误 1
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2555:2: error: unknown field ‘private’ specified in initializer
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2555:2: warning: initialization from incompatible pointer type [enabled by default]
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2555:2: warning: (near initialization for ‘rt28xx_iw_handler_def.get_wireless_stats’) [enabled by default]
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2556:2: error: unknown field ‘num_private’ specified in initializer
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2556:2: warning: excess elements in struct initializer [enabled by default]
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2556:2: warning: (near initialization for ‘rt28xx_iw_handler_def’) [enabled by default]
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2557:2: error: unknown field ‘private_args’ specified in initializer
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2557:26: warning: excess elements in struct initializer [enabled by default]
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2557:26: warning: (near initialization for ‘rt28xx_iw_handler_def’) [enabled by default]
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2558:2: error: unknown field ‘num_private_args’ specified in initializer
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2558:2: warning: excess elements in struct initializer [enabled by default]
/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.c:2558:2: warning: (near initialization for ‘rt28xx_iw_handler_def’) [enabled by default]
make[2]: *** [/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/../../os/linux/sta_ioctl.o] 错误 1
make[1]: *** [_module_/home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux] 错误 2
make[1]:正在离开目录 `/home/work/linux/linux/kernel/kernel-3.4.39'
make: *** [LINUX] 错误 2
解决办法:重新配置编译指定的Linux Kernel,将Device Drivers==>Network deivce support==>Wireless LAN==><*> USB ZD1201 based Wireless device support,编译即可
继续重新编译
make[1]:正在离开目录 `/home/work/linux/linux/kernel/kernel-3.4.39'
/opt/arm-cortex_a9/bin/arm-cortex_a9-linux-gnueabi-strip -g /home/work/NETC.MT7601U.MP1.KK.V1.5/wifi_driver/os/linux/mt7601Usta.ko
编译成功
将.ko文件放板子上加载
接下来编译WiFi应用软件 wpa_supplicant (网上很多)
#tar xvfz wpa_supplicant-0.7.3.tar.gz
将wpa_supplicant中的补丁拷贝到openssl中:
cp wpa_supplicant-0.7.2/patches/openssl-0.9.8e-tls-extensions.patch openssl-0.9.8za/
如果是wpa_supplicant-2.4的话,那么补丁文件在patches目录下,文件名为:
openssl-0.9.8za-tls-extensions.patch,注意这里我们下载的openssl的版本一定是为0.9.8za,不然的话会出错的。
#tar zxvf openssl-0.9.8za.tar.gz
二、编译openssl库
make 之前要进行这步cp wpa_supplicant-0.7.2/patches/openssl-0.9.8e-tls-extensions.patch openssl-0.9.8za/
#make
#make install
在/usr/local/ssl/lib目录下安装了ssl库
拷贝下面文件驱动到目标系统/usr/lib/ 这步很重要,不然会提示找不到这个库文件的。
libssl.a
libcrypto.a
openssl 移植完成
三、编译wpa_supplicant
进入wpa_supplicant-0.7.3.tar.gz解压生成的wpa_supplicant-0.7.3/wpa_supplicant目录中:
#cp defconfig .config
#gedit .config
复制:
#CFLAGS += -I/usr/local/openssl/include
#LIBS += -L/usr/local/openssl/lib
修改成
CFLAGS += -I/usr/local/ssl/include
LIBS += -L/usr/local/ssl/lib
#make
出现错误:
../src/drivers/driver_nl80211.c:25:31: fatal error: netlink/genl/genl.h: No such file or directory
compilation terminated.
make: *** [../src/drivers/driver_nl80211.o] Error 1
这时需要使用命令:apt-get install libnl-dev
apt-get install libpopt-dev
来安装需要的支持库头文件,之后再次执行make命令。
将编译好的wpa_supplicant wpa_cli 放在板子上;
wpa_supplicant是核心程序,它和wpa_cli的关系 就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。
打开网卡
网上有ifconfig ra0 up 或则ifconfig wlan0 up
是ra0还是wlan0取决于
include/rtmp_def.h文件
#define INF_MAIN_DEV_NAME “ra”
#define INF_MBSSID_DEV_NAME “ra”
ifconfig wlan0 up
ifconfig wlan0 192.168.0.248 netmask 255.255.255.0
route add default gw 192.168.0.1
wpa_supplicant -Dwext -iwlan0 -c/etc/wifi/wpa_supplicant.conf &
但是我这里用这些命令始终不能连上
我又换成如下命令成功了
wpa_cli
> scan
OK
> add_net
0
> set_net 0 ssid "wifi name"
OK
> set_net 0 psk "password"
OK
> select_net 0
OK
> enable_net 0
OK
> q
dhcpcd wlan0