首先吐槽一下小米3移动版,居然用的是英伟达的CPU,而联通、电信版是高通的
比较舒服的是小米已经开源了很多内核源码,资料基本都能查到
虽然安卓底层也是linux的内核,但因为安卓百花齐放,一堆不同的硬件、适配,不同版本的手机也有定制的内核,不然很可能出现某个硬件用不了的情况
另外,编译过程还出了很多的错误emmmmm
猜测是编译器版本不同导致的问题
一下算是手把手教如何编译一遍了……
Mi3 TD分支选择
首先再吐槽一下,github的repo description没有显示全,导致刚开始我没找到Mi3 TD的分支,但在网页的title可以全部显示出来
MiCode/Xiaomi_Kernel_OpenSource: Xiaomi kernel OpenSource:cancro-kk-oss(contain MI 3W, MI 3C, MI 4 series, MI NOTE), armani-jb-oss(H1S), dior-kk-oss(HM-NOTE-LTE), ferrari-l-oss(Xiaomi 4i), thmoas-kk-oss(HM2 LTE),libra-l-oss(Xiaomi 4c,Xiaomi 4s and Xiaomi NotePro),kenzo-l-oss(HM Note3),ido-l-oss(Redme 3 and Redmi 2 android L),gucci-kk-oss(HM Note dual SIM version),pisces-kk-oss(MI 3TD),gemini-m-oss(Mi 5),hydrogen-m-oss(Mi Max),mocha-kk-oss(Mi Pad),latte-l-oss(Mi Pad2),land-m-oss(Redmi 3S),markw-m-oss(Redmi 4),scorpio-m-oss(Mi 5/5s/5s Plus/Note2 and MIX),mido-m-oss(Redmi Note4X),sagit-n-oss(Xiaomi 6 and MIX 2),jason-n-oss(MI Note 3),cancro-m-oss(Mi 3W/C, Mi 4, Mi Note),oxygen-n-oss(Mi Max2),tissot-n-oss(Mi A1)
https://github.com/MiCode/Xiaomi_Kernel_OpenSource/tree/pisces-kk-oss
对应分支是这个pisces-kk-oss
其他不同的手机可以选对应的版本
环境准备
因为我的Ubuntu很多库都装好了= = 并不清楚准确需要到那些库,但有一点是,我使用的交叉编译工具是arm-none-eabi-gcc
可直接通过apt下载
再补充一下,我的编译环境是Ubuntu16.04 amd64
当所有都装好后,就可以正式开始编译的工作了
编译操作
进入到内核源码目录,执行
1 | export ARCH=arm |
然后,从项目的git log可以看到
Kernel: Xiaomi kernel changes for XIAOMI 3TD
The Patch based on NVIDIA release TAG tegra-17r18-android-4.2 The kernel config file used is tegra11_pisces_user_defconfig Change-Id: Ie601491b74b18e87303ec010b4df660e127f03be Signed-off-by: hehao <hehao@xiaomi.com>
kernel config file的版本
输入
1 | make tegra11_pisces_user_defconfig |
进行编译的预设置
另外,因为我是要借用Module.symvers编写LKM的,所以在生成的.config
文件中,设置CONFIG_MODVERSIONS=y
这篇文章大家可以参考http://www.freebuf.com/articles/system/93168.html
一切准备就绪,就可以直接
1 | make |
了
存在问题
编译过程中断了好几次,经过修改后终于是成功了
这里就总结一些各个存在问题的地方
- 代码BUG?
在编译到/drivers/media/video/tegra/ad5823.c
的时候
会出现error: iteration 6u invokes undefined behavior
的编译错误
说是第六次循环的时候出现未定义行为
看了一下代码
这一行循环是这样的,看内容是遍历ad5823_gpios,然后针对里面的元素进行操作
但是看下面的static代码,这个结构体数组只有6个,然后循环体里用了<=
1 | static struct nvc_gpio_init ad5823_gpios[] = { |
把<=
改成<
后就好了
- 报头文件找不到的错误,主要文件
drivers/tspdrv/tspdrv.c
include的方式都是用<>,但所需的头文件都在同目录找到了,猜这是编译器版本的原因了,把那几个<>改成双引号””就好了
1 |
include/linux/dynamic_debug.h:64:16: error: implicit declaration of function 'KBUILD_STR'
这个报错在google的时候找到了一毛一样的错误,在Makefile添加了参数后解决~
https://stackoverflow.com/questions/41388294/error-while-compiling-android-3-10-kernel-source
根目录的Makefile在KBUILD_CFLAGS添加
1 | KBUILD_CFLAGS += -w |
error: ‘tspdrv’ undeclared
这个问题直接在Xiaomi kernel的issues下找到了
https://github.com/MiCode/Xiaomi_Kernel_OpenSource/issues/62
把drivers/tspdrv
下的Makefile修改一下
1 | ##EXTRA_CFLAGS += -I$(M) |
就成功了
编译成功
没啥说了,好冷不想写了[doge]