通常,从mtk拿到的闭源wifi驱动,解压后只有mt_wifi、mt_wifi_ap两个文件,参考https://github.com/hanwckf/mt7615/tree/master/MT7615_LinuxAP_V4.4.2.1_20170829,
如果要移植到openwrt中使用,需要修改成openwrt package的方式,类似https://github.com/hanwckf/openwrt-mt7615,以mt7615作为例子,其他mt7628等都是一个套路
在mtk-openwrt-3.10.14中编译闭源wifi驱动
在mtk官方提供的mtk-openwrt-3.10.14中编译WiFi驱动,确保wifi驱动被打进linux kernel,这样就可以根据kernel里编译wifi驱动的Kconfig作为参考
创建package_mt7615
在openwrt/pacakge/下创建一个文件夹package_mt7615,并在其下创建两个空文件Config-mt7615.in、Makefile和两个文件夹files、src
deng@ubuntu:/work/work/openwrt1907/package/package_mt7615$ ls
Config-mt7615.in files Makefile src
拷贝src源代码
从mtk获取到的wifi驱动源码,直接拷贝到src文件夹下
deng@ubuntu:/work/work/openwrt1907/package/package_mt7615/src$ ls
mt_wifi mt_wifi_ap
修改Makefile
先直接将https://github.com/hanwckf/openwrt-mt7615/blob/master/Makefile拷贝过来
修改Config-mt7615.in
Config-mt7615.in的作用是为了在make menuconfig中可以看到wifi驱动的配置选项。
参考mtk提供的openwrt-3.10.14(mtk适配的openwrt),在linux kernel 中可以看到,mtk wifi driver的配置选项索引
deng@ubuntu:/work/mtk/linux-3.10.108$ cat ralink/Kconfig
......
source "drivers/net/wireless/mtk/Kconfig"
......
deng@ubuntu:/work/mtk/linux-3.10.108$ cat drivers/net/wireless/mtk/Kconfig
......
menuconfig WIFI_MT7615E
bool "MT7615E WiFi"
default n
if WIFI_MT7615E
source "drivers/net/wireless/mtk/mt7615/mt_wifi/embedded/Kconfig"
endif
......
deng@ubuntu:/work/mtk/linux-3.10.108$ cat drivers/net/wireless/mtk/Kconfig
......
if MT7615E_WIFI_MODE_AP || MT7615E_WIFI_MODE_BOTH
source "drivers/net/wireless/mtk/mt7615/mt_wifi_ap/Kconfig"
endif
......
可见,config的配置是由
ralink/Kconfig-》
drivers/net/wireless/mtk/Kconfig-》
drivers/net/wireless/mtk/mt7615/mt_wifi/embedded/Kconfig -》
drivers/net/wireless/mtk/mt7615/mt_wifi_ap/Kconfig
这四个Kconfig文件递归生成的,所以需要将这四个文件按照Kconfig(按照Kconfig的source “xxxx”)嵌套方式放进Config-mt7615.in中,这样就可以在opewnrt下make menuconfig出现与在mtk-openwrt-3.10.14中make kernel_menuconfig一样的config选项,进行配置wifi驱动选项
也可以参考https://github.com/hanwckf/openwrt-mt7615/blob/master/Config-mt7615.in
根据Config-mt7615.in的选项修改Makefile
由于Config-mt7615.in的配置,在make menuconfig中配置完wifi 驱动之后,各个config_xxxxx会被写进openwrt/.config中,此时我们需要将这些参数传进Makefile,通过cat Config-mt7615.in | grep "config " | awk '{print $2}'命令,可以将config参数全部提取出来
deng@ubuntu:/work/work/openwrt1907/package/package_mt7615$ cat Config-mt7615.in | grep "config " | awk '{print $2}'
HW_IPSEC
RALINK_HWCRYPTO
WIFI_DRIVER
SUPPORT_OPENWRT
MT7615E_CHIP_MT7615E
FIRST_IF_NONE
FIRST_IF_MT7615E
SECOND_IF_NONE
SECOND_IF_MT7615E
THIRD_IF_NONE
THIRD_IF_MT7615E
RT_FIRST_CARD
RT_SECOND_CARD
RT_THIRD_CARD
RT_FIRST_IF_RF_OFFSET
RT_SECOND_IF_RF_OFFSET
RT_THIRD_IF_RF_OFFSET
RT2860V2_2850
RALINK_RT5350_1T1R
RALINK_RT3050_1T1R
RALINK_RT3051_1T2R
RALINK_RT3052_2T2R
RALINK_RT3352_2T2R
RALINK_RT3662_2T2R
RALINK_RT3883_3T3R
RTDEV_MII
UNIQUE_WPS
WIFI_SKB_ALLOC_SELECT
WIFI_SLAB_ALLOC_SKB
WIFI_PAGE_ALLOC_SKB
WIFI_MT7615E
MT7615E_MT_WIFI
........
然后将这个配置写入到Makefile的PKG_KCONFIG参数中,这样就可以在编译时将config_xxx宏传到每一个.c文件,这样就可以开始编译wifi驱动了
添加wifi的.dat文件
将相关的.dat或其他文件放进files文件夹,一同编译到ipk包中
deng@ubuntu:/work/work/openwrt1907/package/openwrt_mt7615/files$ tree
.
└── etc
└── Wireless
└── RT2860
├── RT2860_2G.dat
└── RT2860_5G.dat
3 directories, 2 files
编译wifi驱动
make menuconfig可以看到mtk wifi 驱动选项
根据实际情况选择wifi选项,之后单独编译wifi驱动
deng@ubuntu:/work/work/openwrt1907$ make package/openwrt_mt7615/{clean,compile} V=s
此时还会出现编译的报错问题,但是根据报错提示问题寻找解决方法即可。
例如:
src/mt_wifi_ap/Makefile中定义了CONFIG_SUPPORT_OPENWRT选项,需要把这个选项放到Makefile与Config-mt7615.in中默认配置成CONFIG_SUPPORT_OPENWRT=y
EXTRA_CFLAGS需要确保WIFI_DRV_PATH的目录正确,等
ifeq ($(CONFIG_SUPPORT_OPENWRT),y)
WIFI_DRV_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))/..
else
ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y)
WIFI_DRV_PATH = drivers/net/wireless/mediatek
else
WIFI_DRV_PATH = drivers/net/wireless/mtk/mt7615
endif
endif
EXTRA_CFLAGS = -I$(WIFI_DRV_PATH)/mt_wifi/include \
-I$(WIFI_DRV_PATH)/mt_wifi/embedded/include \
-I$(WIFI_DRV_PATH)/mt_wifi/ate/include \
-I$(WIFI_DRV_PATH)/mt_wifi/include/mcu
如果好遇到其他编译报错问题,请参考https://github.com/hanwckf/openwrt-mt7615中的代码或补丁进行修改