被迫放弃,联x科官方驱动只看到了 linux-3.0 左右的版本,移植到 linux-5.8.5 难度太大。只是简单替换一下 API 还好,不过过程中发现似乎有些结构体成员也不同了,没有 know-how ,并不清楚这些 API 是否用得正确,就算编译通过可能也没有办法使用,先通过其他方式来使用 WiFi 。
之前的练习就是为了移植 mt6620 ,想让开发板使用 wifi ,就可以只使用电源线开始开发了。
不过讯为官方和联x科官方并没有基于高版本内核的 mt6620 驱动,只有自己动手移植了,可能是第一人吧,也不知道是否可以成功。
cd xhr4412-linux-5.8.5
mkdir drivers/misc/mt6620
cd drivers/misc/mt6620
export MT6620PATH=$PWD
cd $MTK_OF_DRV # 联x科官方驱动路径
cp -rp New/kernel/drivers/net/wireless/combo_mt66xx/mt6620/wlan/ $MT6620PATH/
cp -rp New/kernel/drivers/misc/mediatek/combo_mt66xx/* $MT6620PATH/
2.2.1 vim driver/misc/Makefile
obj-$(CONFIG_MTK_WIRELESS_SOLUTION) += mt6620
2.2.2 vim driver/misc/Kconfig
source "drivers/misc/mt6620/Kconfig"
2.2.2 vim driver/misc/mt6620/Kconfig
在这里插入代码片
../drivers/misc/mt6620/wlan/os/linux/gl_init.c:743:27: error: incompatible types when initializing type ‘enum nl80211_band’ using type ‘struct ieee80211_channel *’
743 | .band = IEEE80211_BAND_5GHZ, \
使用 NL80211_BAND_5GHZ
替换 IEEE80211_BAND_5GHZ
。
../drivers/misc/mt6620/wlan/os/linux/gl_init.c:3083:5: error: implicit declaration of function ‘flush_delayed_work_sync’; did you mean ‘flush_delayed_work’? [-Werror=implicit-function-declaration]
3083 | flush_delayed_work_sync(&workq);
| ^~~~~~~~~~~~~~~~~~~~~~~
| flush_delayed_work
看了一下 include/linux/workqueue.h
里的定义,没有 flush_delayed_work_sync()
API 了,可能 flush_delayed_work()
可以替代它,就换成这个 API 。
u32 *flags,
。const
。struct net_device *ndev,
。enum nl80211_channel_type channel_type,
,struct net_device *ndev,
改为 struct wireless_dev *wdev,
struct net_device *ndev,
改为 struct wireless_dev *wdev,
。struct wireless_dev *wdev,
。../drivers/misc/mt6620/wlan/os/linux/include/gl_typedef.h:84:33: warning: passing argument 2 of ‘cfg80211_scan_done’ makes pointer from integer without a cast [-Wint-conversion]
84 | #define TRUE ((BOOL) 1)
| ^~~~~~~~~~
| |
| unsigned char
看起来该 API 变化叫大。
猜测改成这样也许可以:
struct cfg80211_scan_info scan_info;
scan_info.aborted = TRUE;
cfg80211_scan_done(prScanRequest, &scan_info);
struct net_device *sb_dev
。更换为 WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK
,感觉是,bit 位一致,不过命名好像变换很大,不知道是否正确。
../drivers/misc/mt6620/wlan/os/linux/gl_init.c: In function ‘wlanNetCreate’:
../drivers/misc/mt6620/wlan/os/linux/gl_init.c:2161:113: error: macro "alloc_netdev_mq" requires 5 arguments, but only 4 given
2161 | prGlueInfo->prDevHandler = alloc_netdev_mq(sizeof(P_GLUE_INFO_T), NIC_INF_NAME, ether_setup, CFG_MAX_TXQ_NUM);
| ^
In file included from ../drivers/misc/mt6620/wlan/os/linux/include/gl_os.h:534,
from ../drivers/misc/mt6620/wlan/os/linux/gl_init.c:644:
../include/linux/netdevice.h:4280: note: macro "alloc_netdev_mq" defined here
4280 | #define alloc_netdev_mq(sizeof_priv, name, name_assign_type, setup, count) \
现在应该多加一个参数 NET_NAME_UNKNOWN
make SUBDIRS=drivers/misc/mt6620/wlan modules
$(warning $(DVD_SERVICE)) // DVD_SerVICE是Makefile中的变量
$(warning ST40_IMPORTS is $(ST40_IMPORTS))
变量名,一定要加括号。不加的话,可以发现前面都无法输出变量的值。
1、输出打印信息的方法是:$(warning xxxxx),$(error xxxxx)
2、输出打印变量值的方法是:$(warning $(XXX))
在makefile中打印警告或者错误消息的方法:$(warning
xxxxx)或者$(error xxxxx)
输出变量方式为:$(warning $(XXX))