之前拿到的mt7603驱动和之前ralink的其他驱动如7601等没有什么大的区别,控制接口也都是ioctl,然后根据/etc/Wireless下的配置文件来配置wifi的属性。不过老版本的7603驱动据说有些问题,现在拿到的新的驱动据说已经修复了……而且增加了netlink的接口,可以直接用hostapd来控制ap。
新驱动果然是新驱动,只是编译就遇到很多问题。
1、配置文件依然是Makefile和/os/linux/config.mk,把其中的编译器和内核目录修改为自己的目录;
2、修改好了可以直接编译,然后问题就来了:
error: implicit declaration of function 'RTMP_DRIVER_ADAPTER_RT28XX_WOW_DISABLE' [-Werror=implicit-function-declaration]
cc1: some warnings being treated as errors
看起来是编译器把warning被当成error了,去掉config.mk中的Werror选项,继续编译,还是出现此错误,后面怎么找也找不到驱动的哪个配置里还有配这个Werror选项。想想此驱动编译时应该会依赖内核的Makefile,是否是内核Makefile的问题。找到内核的makefile,果然发现了-Werror-implicit-function-declaration,去掉重新编译,错误变成了警告,驱动编译成功。
3、驱动放到文件系统,然后insmod,结果出现错误如下:
[ 1374.080000] mt7603u_sta: Unknown symbol cfg80211_scan_done (err 0)
[ 1374.080000] mt7603u_sta: Unknown symbol cfg80211_remain_on_channel_expired (err 0)
[ 1374.090000] mt7603u_sta: Unknown symbol regulatory_hint (err 0)
[ 1374.110000] mt7603u_sta: Unknown symbol cfg80211_new_sta (err 0)
[ 1374.110000] mt7603u_sta: Unknown symbol cfg80211_disconnected (err 0)
[ 1374.120000] mt7603u_sta: Unknown symbol cfg80211_ready_on_channel (err 0)
[ 1374.130000] mt7603u_sta: Unknown symbol wiphy_register (err 0)
[ 1374.150000] mt7603u_sta: Unknown symbol wiphy_new (err 0)
………………
[ 1374.190000] mt7603u_sta: Unknow symbol RTMP_DRIVER_ADAPTER_RT28XX_WOW_DISABLE ( err 0)
[ 1374.200000] mt7603u_sta: Unknow symbol RTMP_DRIVER_ADAPTER_RT28XX_WOW_ENABLE ( err 0)
看了下前面的unknow symbol应该是cfg80211的接口没找到?将内核中的cfg80211编译成module,然后insmod,再加载7603的ko,果然前面的错误去掉了。后面的错误看起来和之前Werror遇到的是同一个问题,果然还是不能直接去掉Werror选项。查找了一下出错代码的位置,发现出错代码由ifdef控制:
#ifdef MT_WOW_SUPPORT
RTMP_DRIVER_ADAPTER_RT28XX_WOW_DISABLE(pAd);
#endif
于是想到这功能能不能先去掉,在config.mk中将HAS_MT_WOW_SUPPORT选项配置为n重新编译,这个错误没了,cfg80211.c又出现错误了,错误是error: 'struct _RTMP_ADAPTER' has no member named 'WOW_Cfg'即pAd中没有WOW_Cfg这个成员:
NdisCopyMemory(pAd->WOW_Cfg.PTK, data->kck, LEN_PTK_KCK);
NdisCopyMemory(&pAd->WOW_Cfg.PTK[LEN_PTK_KCK], data->kek, LEN_PTK_KEK);
NdisCopyMemory(pAd->WOW_Cfg.ReplayCounter, data->replay_ctr, LEN_KEY_DESC_REPLAY);
查看了pAd结构体中的定义,发现WOW_Cfg还是由HAS_MT_WOW_SUPPORT选项来控制的,因为之前被我们配成了n,所以在此刻找不到WOW_Cfg了。于是直接在上述出错的代码上加上ifdef HAS_MT_WOW_SUPPORT的控制继续编译,终于编译成功。放到文件系统,先挂cfg80211.ko再挂mt7603u_sta.ko,没有错误,并且可以找到节点wlan0了。