解决编译小米Max内核源码后,WiFi驱动模块不能启动的问题
去年,在成功编译小米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驱动模块不能启动的问题相关推荐
- 39 解决全志h3 linux内核源码里的关于script.fex的bug
在script.fex里有关于io口的配置: Port:端口+组内序号<功能分配><内部电阻状态><驱动能力><输出电平状态>[gpio_para]gp ...
- Go内核源码剖析 一 程序执行启动过程
go内核源码剖析 一 这篇是看雨痕大佬的书所做练习的笔记,(其实后面部分基本都是抄的,但是都实践了) 由于电脑抽风,使用的是win10的Linux子系统,功能不完善,很多跟踪支持性不好(可以算是抄的原 ...
- 编译linux源码报错,记录一次Linux内核源码编译实验
记录一次Linux内核源码编译实验 文章目录 记录一次Linux内核源码编译实验 0. 实验环境 1. 选择.下载内核源码 2. 安装必要的依赖软件以及性能要求 3. 解压.配置和编译内核源码 3.1 ...
- 编译FriendlyDesktop的Uboot源码、内核,修改开机图片logo
1. 安装依赖包 参照官网wiki教程 - 12章节:Nanopi 教程wiki 安装以下依赖包. sudo apt-get -y install bison g++-multilib git gpe ...
- Linux树莓派开发——配置树莓派内核源码,内核编译,更换树莓派Linux内核
目录 一.树莓派Linux源码配置 1.配置的三种方法 2.内核源码的下载 二.树莓派内核编译 1.树莓派的编译 2.生成vmlinux 三.更换树莓派内核的详细步骤 一.树莓派Linux源码配置 ...
- eBPF动手实践系列一:解构内核源码eBPF样例编译过程
作者:闻茂泉 他山之石 了解和掌握纯c语言的ebpf编译和使用,有助于我们加深对于eBPF技术原理的进一步掌握,也有助于开发符合自己业务需求的高性能的ebpf程序.目前常见和主流的纯c语言的ebpf编 ...
- Petalinux 使用外部ADI的内核源码编译记录-附oe_runmake解决办法
最近在使用zynq+ad9361,需要使用ADI提供的内核源码.按照UG1144的,Using External Kernel and U-Boot with PetaLinux.配置工程petali ...
- android 修改编译内核源码 对抗反调试
0×00 写在前面 攻防对立.程序调试与反调试之间的对抗是一个永恒的主题.在安卓逆向工程实践中,通过修改和编译安卓内核源码来对抗反调试是一种常见的方法.但网上关于此类的资料比较少,且都是基于AOSP ...
- Android源码和内核源码的下载,编译和执行
笔者依据罗升阳老师的<Android 系统源码情景分析>一书,尝试下载,编译和执行Android源码和内核源码.但可能是软件源"被墙"或版本号更新的原因.期间遇到诸多问 ...
最新文章
- thinkpad触控笔怎么用_笔记本电脑卡死了怎么办关不了机
- php判断一个字符串是否为纯数字,php判断字符串是否为数字
- ArcGIS Desktop 10.1安装教程
- JavaScript常用函数之Eval()使用
- Misc混合halcon算子,持续更新
- xml文件中若没有子节点,则删除文件
- dubbo快速实战(非最佳配置,演示用)
- 远程工具TeamViewer
- 计算机5级什么水平考试,怎么选择2015计算机等级考试级别
- 腾讯浏览器支持html5视频播放器,JS第8款:html5media.js跨浏览器兼容的HTML5视频音频播放器...
- 西方文化系列讲座之希腊文化(下)
- 电话机上面的接头RJ11
- 双鱼座男适合学计算机专业,双鱼座男生适合的职业
- 尝试投了下 OR 被拒,领教了顶级期刊的审稿
- php array_diff_assoc,关于array_diff_assoc的详细介绍
- 今日头条2018校招测试开发方向(第一批)详解
- linux分区的起始扇区,f-fdisk做磁盘分区,起始扇区从2048块开始
- 数值优化理论的数学基础
- 电脑文件数据恢复有哪些方法?电脑怎么恢复已删除的文件数据?
- k线顶分型 python_K线战法之『顶底分型』高手懂的
热门文章
- 基于高校图书馆的用户画像、可视化、模型预测、推荐算法项目实现
- 【H5】自己写了个仿360商城demo,欢迎大虾路过拍砖
- golang下载所有的依赖包
- 【0137】【libpq】向postmaster发送 startup packet 数据包(7)
- 判断二月天数的c语言程序,C语言 输入年月日判断是第几天
- HY-M5 三维机器视觉系统在工业自动化生产的应用
- 太干了!大俠『云飞杨』带你走进GFX!
- VC++的AssertValid和Dump函数的应用详解
- java获取tomcat临时文件夹路径
- thymeleaf里面*{},@{},${}的用法