Firefly-RK3399 Linux内核编译
本帖最后由 F_Developer_X 于 2017-9-21 15:11 编辑一、简介
Firefly提供的ubuntu固件中存在不少的bug,比如说设置系统时间之后,图像界面会出现严重的bug,所有的窗口都无法拖动和关闭,只能重新启动,这样就无法执行更新系统时间的操作。由于官方没有提高最新Linux内核版本的烧写固件,为了解决一些比较严重的bug,需要自行编译Linux内核进行更新,接下来就介绍一下Linux内核编译和更新的操作流程。
二、编译环境搭建
本次Linux内核编译的主机系统是Ubuntu16.04。在进入内核编译之前,首先需要在主机系统上安装一些依赖包,否则编译过程中会出现一系列问题。使用以下命令安装依赖的包:
sudo apt-get install build-essential lzop libncurses5-dev libssl-dev libc6:i386
其中,如果使用的是64位的Ubuntu,必须安装libc6:i386
接下来就可以下载firefly-rk3399的Linux内核和GCC交叉编译工具链了。可以在Ubuntu系统下使用Git工具克隆,但是速度可能会比较慢,最好是直接从Github上下载压缩文件后再在Ubuntu系统中解压,如下图所示,其中linux-kernel-firefly是Linux内核源码,prebuilts是交叉编译工具链。
http://b05.ickimg.com/201706/5896f26449720519ad1de8f9e1e6b3c6.png
内核源码结构如下图:
http://b05.ickimg.com/201706/3c24ff314fe27b1a96262b23c7c475b9.png
从Linux源代码中的顶层Makefile文件中可以发现,编译内核时,会使用内核源代码同一级目录中的prebuilts目录中的交叉工具编译链,所以需要确保交叉工具编译链的目录结构和名称符合该要求。
http://b05.ickimg.com/201706/eae0594b7ea1376df32754f21a56d175.png
三、Linux内核编译
在内核源码的目录下,执行make ARCH=arm64 firefly_linux_defconfig命令,使用firefly-rk3399的默认配置。
http://b05.ickimg.com/201706/b5e65751af4dfd60e3975d705c6676b6.png
配置好内核之后,执行make ARCH=arm64 rk3399-firefly-linux.img -j4命令开始编译内核。
http://b05.ickimg.com/201706/3458254697e4df1b9a9ee26b9c9c52d8.png
内核编译时间视电脑配置而定,当出现如下图提示,表示内核源代码已经成功完成编译。
http://b05.ickimg.com/201706/eef6980c8d93982919d33d806ee404fe.png
内核编译完成后会在内核源码目录下生成kernel.img和resource.img文件,如下图所示,这是我们更新内核所需要的镜像文件。
http://b05.ickimg.com/201706/a0470f2b5635cfb4fc3436380ac18d8f.png
四、Linux内核烧录
将编译内核后生成的kernel.img和resource.img拷贝到一个目录下,打开瑞芯微的烧写工具,仅仅勾上名字为kernel和resource的勾,并且将得到的kernel.img和resource.img选中到该烧写工具中,如下图所示,最后点击执行开始更新内核。
http://b05.ickimg.com/201706/9f08983bf2035b17a1ab3b93fdbcf17a.png
五、总结
系统重新启动后,可以使用uname -a命令查看下内核信息,和内核更新前进行对比,发现,内核版本从4.4.52更新到了4.4.55,还能看到内核的具体编译时间。经过测试,发现设置时间引发图形界面卡死的问题得到了解决。
http://b05.ickimg.com/201706/0a93dd92b1605d409bf6930336b5c27d.png
http://b05.ickimg.com/201706/5b149661ac18b189cac3340a4dd39587.png
make ARCH=arm64 rk3399-firefly-linux.img -j4中, rk3399-firefly-linux.img是什么意思? 请问楼主,你是怎么进入到RK3399里面查看信息的。我现在编译出了Kernel.img和Rrsource.img,然后下载进板子了,但是我不知道有没有成功,想登陆到RK3399板子里查看,我不知道如何操作。根据官网上的串口工具来,识别不到串口的com口 購買USB-TTL 線,再依WIKI圖示連接,使用終端程式連線即可看到.
lincoln 发表于 2017-10-12 16:59
make ARCH=arm64 rk3399-firefly-linux.img -j4中, rk3399-firefly-linux.img是什么意思?
rk3399-firefly-linux指的是dts,将rk3399-firefly-linux.dts编译到resource.img中。 楼主 我按照你的步骤编译,为什么会出现错误呢?
这是我存放的目录:
lbs@lbs-vm:~/buildSpace/rk3399$ ls
linux-kernelpackageprebuilts
我是在虚拟机下编译的,ubuntu16.0464位
下面是出错
lbs@lbs-vm:~/buildSpace/rk3399/linux-kernel$ make ARCH=arm64 firefly_linux_defconfig
HOSTCCscripts/basic/fixdep
HOSTCCscripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCCscripts/kconfig/zconf.tab.o
HOSTLDscripts/kconfig/conf
#
# configuration written to .config
#
lbs@lbs-vm:~/buildSpace/rk3399/linux-kernel$ make ARCH=arm64 rk3399-firefly-linux.img -j4
File "./scripts/gcc-wrapper.py", line 63
print "error, forbidden warning:", m.group(2)
^
SyntaxError: invalid syntax
scripts/kconfig/conf--silentoldconfig Kconfig
File "./scripts/gcc-wrapper.py", line 63
print "error, forbidden warning:", m.group(2)
^
SyntaxError: invalid syntax
HOSTCCscripts/basic/bin2c
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
UPD include/generated/uapi/linux/version.h
WRAP arch/arm64/include/generated/asm/bugs.h
WRAP arch/arm64/include/generated/asm/bug.h
WRAP arch/arm64/include/generated/asm/checksum.h
UPD include/config/kernel.release
WRAP arch/arm64/include/generated/asm/cputime.h
WRAP arch/arm64/include/generated/asm/clkdev.h
WRAP arch/arm64/include/generated/asm/dma.h
WRAP arch/arm64/include/generated/asm/dma-contiguous.h
WRAP arch/arm64/include/generated/asm/current.h
WRAP arch/arm64/include/generated/asm/delay.h
WRAP arch/arm64/include/generated/asm/div64.h
WRAP arch/arm64/include/generated/asm/errno.h
WRAP arch/arm64/include/generated/asm/ftrace.h
WRAP arch/arm64/include/generated/asm/early_ioremap.h
WRAP arch/arm64/include/generated/asm/hw_irq.h
WRAP arch/arm64/include/generated/asm/ioctl.h
WRAP arch/arm64/include/generated/asm/ioctls.h
WRAP arch/arm64/include/generated/asm/emergency-restart.h
WRAP arch/arm64/include/generated/asm/ipcbuf.h
WRAP arch/arm64/include/generated/asm/kmap_types.h
WRAP arch/arm64/include/generated/asm/kvm_para.h
WRAP arch/arm64/include/generated/asm/local.h
WRAP arch/arm64/include/generated/asm/local64.h
WRAP arch/arm64/include/generated/asm/irq_regs.h
WRAP arch/arm64/include/generated/asm/mm-arch-hooks.h
WRAP arch/arm64/include/generated/asm/mcs_spinlock.h
WRAP arch/arm64/include/generated/asm/kdebug.h
WRAP arch/arm64/include/generated/asm/mman.h
WRAP arch/arm64/include/generated/asm/msi.h
WRAP arch/arm64/include/generated/asm/mutex.h
WRAP arch/arm64/include/generated/asm/pci.h
WRAP arch/arm64/include/generated/asm/msgbuf.h
WRAP arch/arm64/include/generated/asm/poll.h
WRAP arch/arm64/include/generated/asm/preempt.h
WRAP arch/arm64/include/generated/asm/pci-bridge.h
WRAP arch/arm64/include/generated/asm/resource.h
WRAP arch/arm64/include/generated/asm/rwsem.h
WRAP arch/arm64/include/generated/asm/sembuf.h
WRAP arch/arm64/include/generated/asm/serial.h
WRAP arch/arm64/include/generated/asm/shmbuf.h
WRAP arch/arm64/include/generated/asm/segment.h
WRAP arch/arm64/include/generated/asm/simd.h
WRAP arch/arm64/include/generated/asm/socket.h
WRAP arch/arm64/include/generated/asm/swab.h
WRAP arch/arm64/include/generated/asm/switch_to.h
CHK include/generated/utsrelease.h
WRAP arch/arm64/include/generated/asm/sockios.h
WRAP arch/arm64/include/generated/asm/sizes.h
WRAP arch/arm64/include/generated/asm/topology.h
WRAP arch/arm64/include/generated/asm/termios.h
WRAP arch/arm64/include/generated/asm/trace_clock.h
WRAP arch/arm64/include/generated/asm/termbits.h
WRAP arch/arm64/include/generated/asm/unaligned.h
WRAP arch/arm64/include/generated/asm/user.h
UPD include/generated/utsrelease.h
WRAP arch/arm64/include/generated/asm/types.h
WRAP arch/arm64/include/generated/asm/xor.h
WRAP arch/arm64/include/generated/asm/vga.h
WRAP arch/arm64/include/generated/uapi/asm/kvm_para.h
HOSTCCscripts/conmakehash
HOSTCCscripts/kallsyms
HOSTCCscripts/dtc/dtc.o
CC scripts/mod/empty.o
File "./scripts/gcc-wrapper.py", line 63
print "error, forbidden warning:", m.group(2)
^
SyntaxError: invalid syntax
scripts/Makefile.build:258: recipe for target 'scripts/mod/empty.o' failed
make: *** Error 1
scripts/Makefile.build:403: recipe for target 'scripts/mod' failed
make: *** Error 2
make: *** 正在等待未完成的任务....
CC kernel/bounds.s
HOSTCCscripts/dtc/flattree.o
File "./scripts/gcc-wrapper.py", line 63
print "error, forbidden warning:", m.group(2)
^
SyntaxError: invalid syntax
HOSTCCscripts/dtc/fstree.o
Kbuild:44: recipe for target 'kernel/bounds.s' failed
make: *** Error 1
Makefile:1026: recipe for target 'prepare0' failed
make: *** Error 2
make: *** 正在等待未完成的任务....
HOSTCCscripts/dtc/data.o
HOSTCCscripts/dtc/livetree.o
HOSTCCscripts/dtc/treesource.o
HOSTCCscripts/dtc/srcpos.o
HOSTCCscripts/dtc/checks.o
HOSTCCscripts/dtc/util.o
SHIPPED scripts/dtc/dtc-lexer.lex.c
SHIPPED scripts/dtc/dtc-parser.tab.h
SHIPPED scripts/dtc/dtc-parser.tab.c
HOSTCCscripts/dtc/dtc-lexer.lex.o
HOSTCCscripts/dtc/dtc-parser.tab.o
HOSTLDscripts/dtc/dtc
Makefile:573: recipe for target 'scripts' failed
make: *** Error 2
lxdlbs371 发表于 2017-12-29 14:13
楼主 我按照你的步骤编译,为什么会出现错误呢?
这是我存放的目录:
lbs@lbs-vm:~/buildSpace/rk3399$ l ...
1.不要虚拟机编译;2.不要root用户编译 本帖最后由 lxdlbs371 于 2017-12-29 16:07 编辑
leung先森 发表于 2017-12-29 15:35
1.不要虚拟机编译;2.不要root用户编译
我没有用root 权限, 但是 虚拟机一直都是可以编译内核的。还有 后面报错 不是文件缺失么?大神可以尝试一下 虚拟机编译, 毕竟一台机器两个系统切换还是不真实的,更何况,我们的虚拟机是在服务器的,有保密协议。如果虚拟机都不能编译,那么很多公司岂不是没人要准备两台电脑? 问题解决 这里说明一下: 不是虚拟机的问题,也不是用户权限的问题。真心希望这个坑到我这结束。
主要是 /linux-kernel/scripts 目录下gcc-wrapper.py 文件的所有print 函数有问题, 可以屏蔽,也可以加括号:比如:
print ("error, forbidden warning", m.group(2))
全部修改完之后,在编译就不会出现问题了。最后说一句, 官网技术确实让你填坑。然后再继续让你挖坑。彻底无语。。。。 lxdlbs371 发表于 2018-1-2 14:38
问题解决 这里说明一下: 不是虚拟机的问题,也不是用户权限的问题。真心希望这个坑到我这结束。
主要是 / ...
也不怪技术,我查了一下是因为python版本不同的原因。2.7 的printf 语句不需要括号, 3版本都需要了