找回密码
 注册
关于网站域名变更的通知
查看: 266|回复: 0
打印 上一主题 下一主题

瑞芯微RK3568开发板源码编译与交叉编译环境搭建

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-2-27 08:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

本篇,将进行OK3568-C开发板Linux系统开发需要用的软件交叉编译环境的配置。下面就介绍两种交叉编译环境的配置方法。


4 Y7 a* K3 A( r" T0 S& x

01C/C++交叉编译环境编译

如果只是使用C/C++代码,则在自己的Ubuntu虚拟机中添加RK3568对应的交叉编译器(gcc/g++)即可。进行代码的交叉编译时可用使用如下方法,该配置方式简单便捷。

- |! |3 v- M6 b4 Y) J4 T

1. 下载aarch64类型的gcc

在Linaro官网中下载GCC交叉编译工具链,飞凌嵌入式OK3568-C开发板采用的是64位的Cortex-A55内核,需要使用aarch64-linux-gnu。

地址:>>https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/

( T# p% E  @7 p( |% M2 ]! J

7 g3 e" j$ }$ E0 h1 L* x5 j: m% S9 B" I: d8 U
$ [1 A( O! |6 D* K; C

我下载的是这个:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz。

7 G9 l- p, ?: t  G# B) {

然后解压:

( k7 z1 ~9 N( l. ^" w5 n7 a
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar

解压结果如下:


( q, Z' R0 i0 B3 L* V/ ?) z0 u4 h  F2 @" H3 Z

- T, U+ _; y; o1 E- f' j' N
) x8 T% E. H" K" _% z

$ U& A* B# d1 m

解压完成之后,可以在其下的bin目录中看到aarch64编译器:


& Y6 n, I4 m0 c7 C* W
; C$ C! G  p  u7 j' q- Q
# B' L* @( A6 F

3 t* z5 O! F5 L* @5 B9 H

使用这里的gcc或g++,就能交叉编译C或C++程序了。


4 y" r$ W+ w/ V9 w$ e4 E( E* R/ @

2. 交叉编译C/C++程序测试

写一个简易的hello word的C++测试程序main.cpp:


0 n9 I% _- I8 ^# h5 _% d$ F
! i: F! m3 _# ~- w* V/ l+ S6 r; F- I% N' s6 w9 a

; `+ H( A  z# b7 g' g! P) r" }
) n& Z5 G! v* _  M) c
7 K, k4 D! L; U5 }5 ]% Q
! n4 N# ?( i7 @5 B- k#include <stdio.h>

然后使用如下指令进行编译:

' V' C: Z3 A& |5 Y( w# w
1 n! x7 ^* W$ N4 A7 f
export PATH=/home/xxpcb/myTest/OK3568/gcc_aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/binPATH
0 e, A- G, p) E- g) G- P/ t- Q" `' r, h! C

第一句是临时添加环境变量,当然也可以添加到.bashrc中实现永久添加,由于每种开发板用到的编译工具链不太一样,我一般都使用这种临时添加的方式。

0 r4 m; @3 P7 T! A* n) h

第二句是使用aarch64-linux-gnu-g++来编译C++程序,编译结果如下,可用使用file指令查看编译出的程序的文件类型:


' F9 O# p/ A0 m
5 k9 q% t5 `3 h6 I$ s3 l% d1 t& Q+ \+ w; F" H6 o1 h. i  i

' U. n+ {# E5 ^% N1 {2 y; l& ?3 e. F% U) X$ y

可以看到,编译出的文件是ELF 64-bit LSB的可执行文件,ARM aarch64架构的。

" Z8 C' O% h+ K" b- Z

然后将程序放到飞凌嵌入式OK3568-C开发板中运行,这里使用ADB拷贝程序。可以看到在下图右侧窗口中看到,在OK3568-C开发板中已成功运行hello word程序。


; s. o9 h$ p2 r7 g# Z9 A$ q( ]
9 N/ @1 H8 O! A6 g* ~* K+ s. N
7 m$ h3 x) j8 ~( ~( @

& d: H3 f- `& {' _0 }

3. 关于开发板的WiFi自动联网

想要给开发板传输文件,就需要先连上网络。在上篇《发烧友实测 | OK3568-C开发板初体验》中介绍过,OK3568-C开发板使用一个脚本来进行WiFi配网,但每次开机后都需要再配置。可以写个脚本加入到开机自启动程序中。

( C# _) h( O! N8 z  }

例如,在/etc/init.d目录下,添加一个S99myinit文件,写入如下内容即可实现开机自动连网:


5 u: ^0 i9 ^* C" }0 w' M) V6 }- q9 Q3 `! V2 I/ N& r# t
#!/bin/sh+ M# N$ t& U& h& r

这里注意要替换为自己的WiFi名和密码,并且要给这个文件可执行权限。

3 d$ h, P; \% V/ r9 {

02RK3568 Linux源码编译

刚才介绍了只进行C/C++程序开发时进行交叉编译环境配置的方法。

! e' f- z3 W3 R0 A

如果还要进行Qt开发,可以通过编译RK3568 Linux源码的方式,得到Qt的交叉编译工具链。由于我这里已经安装过了VirtualBox虚拟机和Ubuntu18系统,那就在自己的开发环境中进行RK3568的开发吧。


* g4 t) y* n: v9 q1 F5 Q% {

1. 基础环境配置

在进行RK3568的源码编译之前,需要先进行对自己的虚拟机进行一些依赖包的安装,如下。首先是安装一些必要的库:

6 C5 a9 `) f8 y) c& u

4 }& u2 Y$ d5 P1 ]$ B  t
) i: h/ n7 t7 \8 T* P
2 F: L5 X% Z0 w( F) msudo apt-get update sudo apt-get install build-essential
2 Z3 E5 j' ~- E# Q9 c

然后还有安装一些编译OK3568 Linux源码所需的库:


0 {4 {  D: q& L+ F( I% O5 W) {+ h0 }! Y1 p$ T: Y

, o% q5 f$ @' h7 U  Osudo apt-get update2 j+ ~  E5 E: l) P+ F' z

此外,为了便于Qt开发,可选择安装Linux版的Qt Creator到自己的虚拟机中,安装过程也比较简单,并且我之前已经安装过了,这里就不过多介绍了。当然,不安装Qt Creator也是可以进行Qt程序的编译的,只要有Qt交叉编译环境即可。

* p9 Y6 Z- p' D9 e+ c

2. 准备RK3568源码

复制RK3568源码到Ubuntu虚拟机中,准备编译:


$ V1 Z) G) T% Z5 |+ s0 Z' M8 t1 J7 Q4 h( @% E; b
cat OK3568-linux-source.tar.bz2.a* > OK3568-linux-source.tar.bz2

第一句是把.aa和.ab两个压缩包合并为一个压缩包,有个两个文件都差不多4G大小,这个合并的过程需要一点时间(大概2、3分钟左右),并且合并过程没有信息打印,命令行为不可输入状态,等变为可输入状态,即合并完成,并且在虚拟机上可看到合并后的压缩包。


2 l# E0 j3 Q0 f

第二句是把合并后的压缩包进行解压,这个解压过程也要一点时间(大概20分钟左右),解压过程会有信息打印。

1 H" B1 x8 Q8 Q" f; c+ L8 E5 ]2 b
: U2 T3 w9 W: |5 U4 A& C4 z8 A

" K& c' m. e/ h( S$ \' ?
0 t4 @% G  Y0 v* q. |% d3 I' \
6 b" K$ v6 R8 R  A

解压完成后,可以看到OK3568-Linux的源码文件夹:


- E0 c( a* n& n1 e: ^( d. r
( ~- ?& P: {! F
  q; Q0 |7 m$ U

6 l, a6 F3 @& ~9 Z
/ x1 u. o% v% v& E( T5 d

3. 编译RK3568源码

在编译之前,需要确保自己的虚拟机有足够的磁盘空间和内存空间,我的虚拟机配置如下,我的笔记本一共12G内存,我给了虚拟机10G。

% V( e3 U" E* Q
+ ^& o& n2 a* G! J" L
( i# I; ^, m8 c
* V2 k) h$ ]3 R4 v& V

注意上图中的硬盘空间,只是这个虚拟机的最大空间,需要在ubuntu中使用df指令确认下实际的大小,如果不够大,可以使用GParted等软件调整自己的虚拟机硬盘空间。

5 \0 Q& I5 Z, w

如下图所示,我的ubuntu的硬盘现在总共是276G,这个截图是我编译完源码后截的图,感觉整个编译源码操作,耗费了有几十个G的空间,现在还剩余80G的空间可用。

; i5 P/ D  e9 `( X4 ?9 J

# i' g3 @# d  E$ `: q" N9 j4 g! [" U2 f3 U$ a& q( a
* u% P; H- b9 j- X

3.1 全编译测试

进入到刚才解压后的RK3568源码目录,通过运行.build.sh脚本即可编译,在编译之前,可以先来看下脚本中的内容:


, D# ~7 T5 U9 {: I

这里编译脚本比较长,截取部分图如下:


' X: n5 X- o9 L& g
& H9 U$ H8 e' j8 [* K" P
) a% B; w- S8 O( G+ [* S
; Q  _$ J7 ^7 m4 j$ z, e

执行脚本后会先出现一个选项需要选择,选择1,即使用OK3568的配置。

& S; M/ g0 ^* C! i' _
4 y6 P  F; d7 V+ [) u/ t) {4 w

% e9 H5 }8 E8 \! V. H. Z) T

0 A8 I" Q8 P! M" M! R) Q% u

编译一段时间后(大概10分钟)会弹出下图界面,需要选择,提取图中信息:

VCCIO4 和 VCCIO6 选择 1800000其余的选择 3300000

3 ?9 g. y, d/ x2 }
2 l( n; c: S' O' g& R  L! _/ ]

使用上下方向按键选择选项,按回车确认选择即可。

& \# G$ \7 x- ^  e- U: ]

- l/ J, k7 L0 @; G) M0 H! N" m1 u% i( R; e# ^4 u# y6 N. T! d9 d

6 V- T4 p' h& J$ @2 s! ?0 r

编译的过程中,会十分耗费内存资源,我的电脑显示在编译过程中,内存基本占满了,再使用其它软件都会特别的卡,所以在编译的时候,就不用进行其它操作了,让它独自编译好了。

" S, B0 O) N3 Y( t0 l$ H$ ?' R

; [: d. `- J( O+ r( b
& j' l- \0 l( g: v7 h
3 T: b: m, `/ d% i0 C& i

整个编译时间较长,我的电脑用了7、8个小时才编译完,从凌晨编译到天亮,还好没报错。编译成功后的截图如下,注意大片的红色部分不是错误信息,只是在提醒电源域的配置是否正确。

$ u( k7 ]. X7 c$ i

$ j8 J. X) U' g- X" ^" T" g6 s# z" G3 M$ p# m, \

% w* O6 ?5 V  }0 k

编译成功后,会在IMAGE文件夹下生成对应编译工程结果文件,这些文件中,update.img为打包好用于OTG或TF卡全烧写使用,其它的编译文件用于分步烧写时使用。


; k0 P9 e# y2 p* M; {8 _' a( N  v6 q8 j8 e

) k' ~5 M5 r* E& |  ?$ j) @
2 B; d$ u3 i# F7 O6 L/ g

3.2 内核单独编译测试

整个编译程序,十分的耗时,有时如果只是修改了内核代码,可以单独编译内核,编译方法是,在执行脚本时,指定一个kernel参数即可:

( f8 k( m1 h7 K
./build.sh kernel) B$ A! @0 o/ b: s4 w

03Qt程序交叉编译测试

1. Qt程序交叉编译

RK3568 Linux源码编译完成后,可以到output目录下的bin目录中查看编译出的交叉编译工具,对应Qt开发,需要注意是qmake这个工具,bin目录中的所有编译工具如下:

" l8 W: ]0 Q: E8 z. F

9 [7 M8 A9 }3 _* Z8 z5 }- J( d
! ?+ j8 I3 d1 l" H
0 D; h( ?) d3 Y

使用资料中的Qt程序进行交叉编译测试,我使用的是qcamera这里例程,将程序源码复制到Ubuntu中,然后使用如下指令进行Qt程序的交叉编译:


* c% ?, {' A/ q) M6 v. z7 {
$ J# U; o2 F/ a& W! w* k; r% ?9 `* m/ Z' A" V
export PATH=/home/xxpcb/myTest/OK3568/sourcecode/OK3568-linux-source/buildroot/output/OK3568/host/binPATH

第一句是临时添加环境变量;

第二句是使用RK3568源码编译结果中的qmak来生成Makefile;

第三句是使用make来编译;

编译结果如下,同样可以使用fie指令来确认编译出的可执行文件的文件类型。


4 S0 F* F6 u9 _0 `2 X/ ?6 ~( m  g: D4 j

# [% w; H1 j+ _9 o* d, C" i; i  ]

- q" z( g$ z8 Q

可以看到,编译出的fltest_qt_qcamera文件也是ELF 64-bit LSB的可执行文件,ARM aarch64架构的。


( \5 b& ?+ c3 @* M9 i

2. Qt程序运行测试

同样使用ADB的方式,将可执行程序拷贝到板子中,然后运行,运行结果如下,注意我在qt程序中稍微修改了一下,给Exit字符串加了一个中括号,以确认板子中运行的就是我自己编译出的Qt程序。


. a- I1 M9 ~+ D; J/ ]! }, }3 G. @! k- N! S

3 K4 F) V# ^9 S. Y5 X$ t6 ?
; N" E; q4 W9 ?# N2 Z1 \6 P8 h

至此,Qt的交叉编译环境已验证可正常使用。


+ [% ?* z( M% I+ G8 {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-2 13:03 , Processed in 0.093750 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表