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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

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


3 @% s* o3 J8 W& n3 Q" r

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

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


1 V6 Q$ N8 Y; B$ E: F8 E2 D

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/

5 u* h6 B6 d! X, v! v

8 p  |. _& ^1 t3 @4 n6 G
) T& A4 o! A8 B. a7 J) D3 M. r/ p

1 s$ Y  R4 c! [* x+ e# M" ^+ J

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


/ Z' a& j7 Y: p  E3 u0 w3 e4 Z

然后解压:

9 W' \- w* F1 t8 S, r/ Q* z& _
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar

解压结果如下:

3 c: D0 g/ X; W4 n" m

  Z( E+ J! G0 c; M7 }, G3 r! p8 j5 H
- z9 y; y. _  o$ [

+ m+ U; n6 N; _$ A: w+ T
* E9 \* L- s- F) D; j

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


. k- B+ z9 Y6 @4 t5 c5 Z- ?
8 G, n% q) g- R" y, F, K6 K1 }. n- s5 A! g$ B

: i1 M) M+ N. p2 x# l$ F% Q

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


2 P, y% k* w/ U7 R9 U

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

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


- v  ~4 \5 |/ I
! Y6 k1 d8 m7 M) s. J  m9 \2 H$ w' `+ o* {' ~, o

- g7 |$ ~5 f6 \; `  L
$ f& E% s" _3 m6 }/ X0 G
( P; B" p4 y2 \
) ^7 q/ L9 ^; R/ g6 ^- H#include <stdio.h>

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


6 x# g% F4 A5 ]/ b. D6 ]- o5 x. P+ y  @$ ]7 X9 H
export PATH=/home/xxpcb/myTest/OK3568/gcc_aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/binPATH
; [$ q. ]" \+ q& a

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

/ [8 D- m) k4 j. U! \' n% z

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

$ D: u" R$ K' G& v

6 B& M6 u9 J) o8 Y" P1 ?: n4 p+ |. y% A0 ?- t  q

: l4 e6 u% M/ N9 k! c4 G5 ?% A4 l/ f' Z6 I

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


+ f. ?& J) `0 }- N; H0 ?; b5 T

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


+ d, ~" E' s8 g; [1 B9 W2 A" F3 T% \3 c" @1 k* O* |
  ~- k) t) I$ m0 m

" d0 v% h7 F& x. x9 o

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

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


5 _6 `3 E# C! {

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

3 E  T6 I8 \: m  V, K1 u
6 r# Q9 q: o. _! P; o. y/ o
#!/bin/sh
' R& f7 |6 t, q6 V' v# Z) ^: T

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


: b! v7 |5 E3 q" s

02RK3568 Linux源码编译

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


1 h2 O7 t) h+ e! v

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

- F3 O$ @8 E3 x- |# C

1. 基础环境配置

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


% ~& i- u  F; [) J7 g2 L) V5 e- _8 X2 L. }+ N4 T

% R3 \0 N9 Z. a. p3 ~$ V$ [* t7 T( _1 {+ M7 |- L
sudo apt-get update sudo apt-get install build-essential # j7 T7 _* ?, T# {! R! m

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

6 |) I1 ~! D! h' p$ L+ c

* @# ]& R/ V' Z0 M0 u% F) U/ Z  W
9 d( T) B1 U6 h7 a. f4 bsudo apt-get update
8 c( J: I% i! Q7 B- @$ K: l

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

: c5 y! G: K% D, u. b- T" s2 t2 Z; Y0 m

2. 准备RK3568源码

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


! l8 T9 H: b* j1 n, D  L' l* I8 p& d
- \# f' F* |: {" o* kcat OK3568-linux-source.tar.bz2.a* > OK3568-linux-source.tar.bz2

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

2 E, q3 U! Q7 u5 E0 s% _

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


1 \8 ]" {8 R/ y! ?
6 a! R. y4 I4 H! t. R4 y6 x/ T+ B  q1 B
1 W- W- B( l4 A0 \1 c9 r) e. _

* d- z/ S2 ^9 }0 a! A# L

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

5 x  Z: P5 z6 G. _

$ @. p8 V* `2 u8 M. m0 X9 Q9 l2 |! n

3 L& X  L4 f" l7 Y' D
: I) i# J  h* V+ d

3. 编译RK3568源码

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


5 f0 V& \. c" t& D* ~  H  Q+ c+ h: q
5 Y* [& D0 Q/ e/ O5 O$ G, N' V
/ i  z0 ]) ~8 E  P) c0 z, H0 I
( q! z# n$ Y3 q$ }, B6 N

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


. f- E' E, @. b  A, \! s6 P

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

  K, A. \2 W) S$ a" P, P
* h- i. Y" C) W

/ ?3 u( l: ?& {, X( B. u& c' U$ O
: N+ T: }- g0 y5 b% D

3.1 全编译测试

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


3 Q  u5 R! K7 ]  H- U

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


' I" S8 @& L- ?  P1 t  S, {0 s) J6 b. k2 B
: y3 r6 Z4 s; [0 w
. ^  v. p1 `4 _

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

+ ]! _6 t" X0 b0 J# ^6 V

2 E% k' _, M4 a2 y+ G( S+ W# ^; T9 O3 m+ |* J/ m; c$ x
' C: q" S/ i4 {6 M

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

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

' O! d+ a7 d( N( e/ g& _
$ ?$ _$ E' q) R. o4 V

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


, M8 z' @  A& ~: E$ L; y: G2 ^, _- }: q$ P6 \$ P3 [
5 [( C* R) S. A8 a$ h4 E2 z; {

0 |4 g- H/ {  C: s

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

/ u/ b6 W9 e5 n  |" J  r

# G. A- }: R/ S4 A& E! M. o9 }$ r: k% l  T& j2 w# @1 z# H# ?% v
0 N8 [* Z2 \2 I2 N4 _( L) @! A

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

. T  w( G, b0 x# |

2 \6 D) r# J" p2 d
# b0 u6 D  S  Y

( _: q: q. d1 N9 Q& F/ s

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

2 R0 g  w3 L! A3 o7 s" `

3 a  Z3 v$ h6 R
! F5 U* A- y# b4 X+ E: t9 X
( z  p& y  U. Z( Y( @

3.2 内核单独编译测试

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


# }9 E4 G; ~4 g5 a1 J ./build.sh kernel
0 i, d; u' l% O# _$ g$ o& k

03Qt程序交叉编译测试

1. Qt程序交叉编译

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


  e$ e8 h' Q) O- R# v6 `8 }+ I3 }+ U  V  z$ d* X& q

9 c2 e$ _6 e0 w/ f
0 y$ ~  M, B# p

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

5 c; A! E2 p; E( F( u
* B9 y9 J$ Y- ~) }9 g7 ~4 {5 E  `
* W+ W) ^, N6 \, ^- @$ [* g6 H9 k
export PATH=/home/xxpcb/myTest/OK3568/sourcecode/OK3568-linux-source/buildroot/output/OK3568/host/binPATH

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

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

第三句是使用make来编译;

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

6 v9 `: O, y- y+ Q7 w( K7 L
# x% u" v3 f" ~# b* Z
  }  ^* O6 }; F4 C; Z! \6 Q7 T  ?

* H* v  R0 ]' j2 |2 i2 o8 S

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


0 w8 W: K9 H6 m

2. Qt程序运行测试

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


2 T; n" v1 h; r  N" J, N& |2 \; R; m) }; `
4 ~7 e" i0 l$ f3 d- w6 K

" M- F  `, ~9 P* x& |

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


. U/ h  t' e+ X0 I( i! z# \
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 20:30 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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