去年,在成功编译小米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
elseKERNEL_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,即可编译成功

解决编译小米Max内核源码后,WiFi驱动模块不能启动的问题相关推荐

  1. 39 解决全志h3 linux内核源码里的关于script.fex的bug

    在script.fex里有关于io口的配置: Port:端口+组内序号<功能分配><内部电阻状态><驱动能力><输出电平状态>[gpio_para]gp ...

  2. Go内核源码剖析 一 程序执行启动过程

    go内核源码剖析 一 这篇是看雨痕大佬的书所做练习的笔记,(其实后面部分基本都是抄的,但是都实践了) 由于电脑抽风,使用的是win10的Linux子系统,功能不完善,很多跟踪支持性不好(可以算是抄的原 ...

  3. 编译linux源码报错,记录一次Linux内核源码编译实验

    记录一次Linux内核源码编译实验 文章目录 记录一次Linux内核源码编译实验 0. 实验环境 1. 选择.下载内核源码 2. 安装必要的依赖软件以及性能要求 3. 解压.配置和编译内核源码 3.1 ...

  4. 编译FriendlyDesktop的Uboot源码、内核,修改开机图片logo

    1. 安装依赖包 参照官网wiki教程 - 12章节:Nanopi 教程wiki 安装以下依赖包. sudo apt-get -y install bison g++-multilib git gpe ...

  5. Linux树莓派开发——配置树莓派内核源码,内核编译,更换树莓派Linux内核

    目录 一.树莓派Linux源码配置 1.配置的三种方法 2.内核源码的下载 二.树莓派内核编译 1.树莓派的编译 ​2.生成vmlinux 三.更换树莓派内核的详细步骤 一.树莓派Linux源码配置 ...

  6. eBPF动手实践系列一:解构内核源码eBPF样例编译过程

    作者:闻茂泉 他山之石 了解和掌握纯c语言的ebpf编译和使用,有助于我们加深对于eBPF技术原理的进一步掌握,也有助于开发符合自己业务需求的高性能的ebpf程序.目前常见和主流的纯c语言的ebpf编 ...

  7. Petalinux 使用外部ADI的内核源码编译记录-附oe_runmake解决办法

    最近在使用zynq+ad9361,需要使用ADI提供的内核源码.按照UG1144的,Using External Kernel and U-Boot with PetaLinux.配置工程petali ...

  8. android 修改编译内核源码 对抗反调试

    0×00  写在前面 攻防对立.程序调试与反调试之间的对抗是一个永恒的主题.在安卓逆向工程实践中,通过修改和编译安卓内核源码来对抗反调试是一种常见的方法.但网上关于此类的资料比较少,且都是基于AOSP ...

  9. Android源码和内核源码的下载,编译和执行

    笔者依据罗升阳老师的<Android 系统源码情景分析>一书,尝试下载,编译和执行Android源码和内核源码.但可能是软件源"被墙"或版本号更新的原因.期间遇到诸多问 ...

最新文章

  1. thinkpad触控笔怎么用_笔记本电脑卡死了怎么办关不了机
  2. php判断一个字符串是否为纯数字,php判断字符串是否为数字
  3. ArcGIS Desktop 10.1安装教程
  4. JavaScript常用函数之Eval()使用
  5. Misc混合halcon算子,持续更新
  6. xml文件中若没有子节点,则删除文件
  7. dubbo快速实战(非最佳配置,演示用)
  8. 远程工具TeamViewer
  9. 计算机5级什么水平考试,怎么选择2015计算机等级考试级别
  10. 腾讯浏览器支持html5视频播放器,JS第8款:html5media.js跨浏览器兼容的HTML5视频音频播放器...
  11. 西方文化系列讲座之希腊文化(下)
  12. 电话机上面的接头RJ11
  13. 双鱼座男适合学计算机专业,双鱼座男生适合的职业
  14. 尝试投了下 OR 被拒,领教了顶级期刊的审稿
  15. php array_diff_assoc,关于array_diff_assoc的详细介绍
  16. 今日头条2018校招测试开发方向(第一批)详解
  17. linux分区的起始扇区,f-fdisk做磁盘分区,起始扇区从2048块开始
  18. 数值优化理论的数学基础
  19. 电脑文件数据恢复有哪些方法?电脑怎么恢复已删除的文件数据?
  20. k线顶分型 python_K线战法之『顶底分型』高手懂的

热门文章

  1. 基于高校图书馆的用户画像、可视化、模型预测、推荐算法项目实现
  2. 【H5】自己写了个仿360商城demo,欢迎大虾路过拍砖
  3. golang下载所有的依赖包
  4. 【0137】【libpq】向postmaster发送 startup packet 数据包(7)
  5. 判断二月天数的c语言程序,C语言 输入年月日判断是第几天
  6. HY-M5 三维机器视觉系统在工业自动化生产的应用
  7. 太干了!大俠『云飞杨』带你走进GFX!
  8. VC++的AssertValid和Dump函数的应用详解
  9. java获取tomcat临时文件夹路径
  10. thymeleaf里面*{},@{},${}的用法