编译小米3td内核记录

首先吐槽一下小米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
2
export ARCH=arm
export CROSS_COMPILE=arm-none-eabi-

然后,从项目的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

存在问题

编译过程中断了好几次,经过修改后终于是成功了

这里就总结一些各个存在问题的地方

  1. 代码BUG?

在编译到/drivers/media/video/tegra/ad5823.c 的时候

会出现error: iteration 6u invokes undefined behavior 的编译错误

说是第六次循环的时候出现未定义行为

看了一下代码

这一行循环是这样的,看内容是遍历ad5823_gpios,然后针对里面的元素进行操作

但是看下面的static代码,这个结构体数组只有6个,然后循环体里用了<=

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static struct nvc_gpio_init ad5823_gpios[] = {
{AD5823_GPIO_RESET, GPIOF_OUT_INIT_LOW, "reset", false, true,},
{AD5823_GPIO_I2CMUX, 0, "i2c_mux", 0, false},
{AD5823_GPIO_GP1, 0, "gp1", 0, false},
{AD5823_GPIO_GP2, 0, "gp2", 0, false},
{AD5823_GPIO_GP3, 0, "gp3", 0, false},
{AD5823_GPIO_CAM_AF_PWDN, 0, "cam_af_pwdn", 1, true},
};

for (i = 0; i <= ARRAY_SIZE(ad5823_gpios); i++) {
if (info->gpio[i].flag && info->gpio[i].own) {
gpio_free(info->gpio[i].gpio);
info->gpio[i].own = false;
}
}

<=改成< 后就好了

  1. 报头文件找不到的错误,主要文件drivers/tspdrv/tspdrv.c

include的方式都是用<>,但所需的头文件都在同目录找到了,猜这是编译器版本的原因了,把那几个<>改成双引号””就好了

1
2
3
4
5
6
7
8
9
#include "tspdrv.h"
#include "ImmVibeSPI.h"

#include "tspdrvOutputDataHandler.c"
#ifdef CONFIG_HIGH_RES_TIMERS
#include "VibeOSKernelLinuxHRTime.c"
#else
#include "VibeOSKernelLinuxTime.c"
#endif
  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
2
3
4
5
KBUILD_CFLAGS += -w
# if all errors are to be suppressed

KBUILD_CFLAGS += -Wno-error=unused-but-set-variable
# if that specific error is to be suppressed.
  1. error: ‘tspdrv’ undeclared

这个问题直接在Xiaomi kernel的issues下找到了

https://github.com/MiCode/Xiaomi_Kernel_OpenSource/issues/62

drivers/tspdrv 下的Makefile修改一下

1
2
##EXTRA_CFLAGS += -I$(M)
EXTRA_CFLAGS += -I$(shell pwd)

就成功了

编译成功

没啥说了,好冷不想写了[doge]

×

赞助gif换电脑、吃双皮奶(逃

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. Mi3 TD分支选择
  2. 2. 环境准备
  3. 3. 编译操作
  4. 4. 存在问题
  5. 5. 编译成功
,