去年,在成功编译小米Max的内核源码后,刷入手机发现WiFi驱动并不能正常加载,通过一翻操作后,成功启动WiFi驱动。这里分享一下我完整的解决过程。
小米FAQ已经给出原因:
因为WiFi驱动模块是由高通开发的,不是小米开发的,所以不在小米的开源仓库里面,需要去下载高通的开源项目QAEP。WiFi模块源码在QAEP项目里的vendor/qcom/opensource/wlan/prima
去腾讯云新建一台按量计费的香港服务器,用完可以立刻销毁。
由于高通源码巨大,本人下载小米Max的有115G,所以新建的时候推荐选500G硬盘大小
安装下载环境
yum install -y git curl screen
curl https://storage.googleapis.com/git-repo-downloads/repo > /bin/repo
chmod 777 /bin/repo
启动screen来后台开一个shell下载,防止下载过程中SSH突然掉线
screen -S test
执行后会来到一个全新的SSH界面(其他screen操作详情请百度)
高通QAEP源码的下载命令为
$ repo init -u git://codeaurora.org/platform/manifest.git -b [branch] -m [manifest] --repo-url=git://codeaurora.org/tools/repo.git --repo-branch=caf-stable
其中branch的分支应该选择release,manifest选$tag.xml
例如小米4的cancro-kk-oss分支:
~/Qualcomm_Android$ repo init -u git://codeaurora.org/platform/manifest.git -b release -m LNX.LA.3.5.2.2.1-04310-8x74.0.xml --repo-url=git://codeaurora.org/tools/repo.git --repo-branch=caf-stable
所以这里我的命令为:
mkdir /myDownload cd /myDownload repo init -u git://codeaurora.org/platform/manifest.git -b release -m LA.BR.1.3.4-05310-8976.0.xml --repo-url=git://codeaurora.org/tools/repo.git --repo-branch=caf-stable
然后执行同步命令(下载代码)
~/Qualcomm_Android$ repo sync -j8
FYI:高通这个仓库真的很大,下载需要大量时间(本人腾讯云香港下了16个小时)
repo sync -f -j4 --no-tags --no-clone-bundle
// --no-tags:减少不需要的tag下载,可以缩减下载的代码量
// -f:当某个库因为网络原因货其他原因下载失败的时候可以继续进行,避免已经下载的代码不能写入到硬上
// -j4:开启4个线程来下载,这个根据CPU和硬盘的性能决定的
附小米原文
高通源码下载完成后
取出vendor/qcom/opensource/wlan文件夹
其中.git文件夹比较占空间,而且也无用,可以删除
打开Makefile发现是这样的
这怎么编译?别慌,小修改即可
1.首先将Kbuild文件内容全部复制到Makefile的头部
2.将头部的两段代码删除,删除原因在英文注释里,我们是编译成外部wlan.ko模块文件,所以不需要这两段
然后在头部补上一句
KERNEL_BUILD := 0
3.在Makefile尾部的这里4句屏蔽掉,因为我们要重新写一个obj-m出来
4.将Makefile尾巴这两句改写成正常的格式,并放在Makefile文件头部
WLAN_ROOT := $(PWD)
MODNAME := wlan
KBUILD_OPTIONS := WLAN_ROOT
KBUILD_OPTIONS += MODNAME
5.将Makefile底部重写增加obj-m
#加入这句话的目的是为了接下来要查看编译器的预定义有哪些
$(info info $(CDEFINES))
ifneq ($(KERNELRELEASE),)
$(MODNAME)-objs:=$(OBJS)
obj-m := $(MODNAME).o
else
KERNEL_SOURCE := /hydrogen-m-oss/output
all:
$(MAKE) $(EXTRA_CFLAGS) -C $(KERNEL_SOURCE) SUBDIRS=$(CURDIR) ARCH=arm64 \
CROSS_COMPILE=aarch64-linux-android- M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
主要是多个了obj-m来指定生成的模块
至此Makefile修改完成
重新make一下
会发现还是有错,提示某些未定义。
这时候
$(info info $(CDEFINES))
那句话就派上用场了
可以看到编译器总共有哪些定义,格式为-DXXXXXXXXXXX
我复制下来,将"-D"替换成"#define "后如下
要在哪些地方加上这些定义呢?答:每个头文件最顶部,当然我不可能一个一个手动加进去,
用一些技巧就好了
手动搜索出*.h结尾的头文件,新建一个文件夹,全部复制出来,
我全部扔进notepad++打开,并发现每个头文件顶部都有一个Copyright (c)字样。
这就好办了
先把每个文件的Copyright (c)替换成这样,
再最终替换
替换完成
注意要加上,这个好像是必须的,不加编译不通过
#define WCN_PRONTO
替换完成后务必检查替换进去的#define定义数量是否完整,因为notepad++替换文本有长度限制
如果完整,则可以按全部保存。
接下来把替换完毕的.h头文件放入Kernel/include目录下(防止编译wifi驱动时候编译器找不到他们)
重新make,即可编译成功