|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-4-10 11:26 编辑
; B0 J, b5 d, O$ D8 k7 t( @
& [( w, v+ _" L+ L- C* o& ]本文将通过飞凌嵌入式OK3568-C开发板介绍OTA升级流程,本地升级程序recovery执行升级的流程及技术细节。
' M, X! s5 B- t# O C' b/ e' g# j7 ?2 p% o, U% K/ d
! p w* h y G% F% J9 ^& E7 ?% v# u' k* Z$ m
, q; w9 y( Q) r% w" z5 Z
3 t) Q) v; E( X) g. `2 p2 }
01制作recovery.img- L& ^2 U4 k+ t& `, @4 B2 J
( t6 n" |- n9 V- y& \& I6 \recovery相关的源码路径:: l$ M) K. {/ m' u
' J9 T2 L) [# ~! Bbuildroot/output/OK3568-recovery/build/recovery-develop, h9 o* E2 K: c
8 R3 G, U% Y0 G7 |% _3 y l* D1 I# _9 |
( W6 ]3 F* k+ G3 j4 L; v- I8 ^
2 o2 z7 W- S2 Z% n0 g如果有修改过以上目录的源码文件,则需要执行以下操作:. r2 }/ q v* v: S' m1 m* `2 p/ O
V: k; c0 C3 c7 A/ l/ R9 s1. forlinx@ubuntu:~/OK3568-linux-source$ source envsetup.sh. t6 W7 N% p/ i4 v( D( R
, B9 _5 U T" x1 y4 t
2. 选择某一平台的 recovery 配置,输入96, f h; Q: E# Q0 l. K
# a9 z6 p3 g- l; t% P
3. forlinx@ubuntu:~/OK3568-linux-source$ make recovery-dirclean && make recovery #清除编译产物重新编译% H' ?, m/ \/ p1 m |. Z6 U1 D
$ n, ]" I# B7 C3 J9 q4. forlinx@ubuntu:~/OK3568-linux-source$ make rkupdate-dirclean && make rkupdate #清除编译产物重新编译8 d: c a8 W6 ]# Y3 t% j
2 F6 A8 c2 u, |
( x/ |( T8 j& v' [) }
3 l- b6 V! h* k) |4 N0 x' L. C- a7 \8 p) _ U6 z
如果没有修改过上述目录的源码文件,则直接执行以下操作:* d t1 t9 x) N: H
. ~# {, f0 l- x6 |( W1. forlinx@ubuntu:~/OK3568-linux-source$ ./build.sh recovery #编译生成recovery.img4 z# h+ P7 D+ a7 ]% P l
' [6 D0 F- X: K. Q8 ?9 O4 _1 e9 l2. forlinx@ubuntu:~/OK3568-linux-source$ ./mkfirmware.sh5 b1 L5 X5 C& ]2 j5 G$ l8 ]( c3 n
8 H2 l% n `4 ` k
#将生成的固件拷贝至 rockdev/目录下
" y6 E+ [: a( z
% n% D* Y$ P) c/ R6 y7 e! P烧写/OK3568-linux-source/buildroot/output/OK3568-recovery/images/recovery.img文件。: K0 A- v% v& r4 V; _
1 j, M$ a' v/ i) K% j
+ e" t% y: H/ k3 w* z. c7 [: m9 l
% w6 i8 v* x3 G- f: B# f) v" Y, [4 r8 O7 B4 {8 J. ~% Y. U% p3 [5 R% M
点击设备分区表,勾选9,选择recovery路径,点击执行。
- J7 h2 A/ {) [% ^/ W- x" c6 M# t$ I1 ~, g- `5 |& e% u
! W# ?$ ^% f) x3 |( h
5 [& F, ]6 x% F# R! F: ]+ I5 V
9 R% M' D# E' w; y0 k
) k2 F. H2 ^. a% \7 j
& M8 r" x+ X& F+ [ l5 D5 c
- Z' \; R8 A9 `( c) l& x3 X4 c" A
3 |4 s8 V0 |( {5 P. u3 O% o( G02制作升级镜像% }# \' L$ U: {- A7 _( \
+ q8 P# J7 D7 Z( G2 M( }4 I* h
如何验证是否升级成功了呢?我们要先对boot.img文件有一个初步了解,boot.img文件存放有设备树和内核,我们只要对设备树或者内核进行适当的修改即可。本例程以更新boot.img文件为例,对设备树进行了适当修改。7 ?1 k9 T! p+ b
) x, \- H4 _6 J7 H修改 /OK3568-linux-source/kernel/arch/ARM64/boot/dts/rockchip/OK3568-C-common.dtsi设备树文件,对forlinx_control节点做如下修改。默认只打开HDMI输出,将MIPI和LVDS输出关闭。6 k1 z5 h, R8 x) A
8 Z1 t, T; b0 C+ I/ P! F
; f$ V2 O) {( `8 R6 Q
3 ~4 K, m2 t- r" _) _
3 Y, K5 g8 B* n
% F# s) @/ C7 y( K0 l8 J0 F8 k' w {8 T9 z4 ?1 z; P) y6 C
7 z6 H8 V5 O+ r5 o; s: G7 J
( B0 F" W+ E. Q
$ N4 h) T1 {9 d' L$ Q修改/OK3568-linux-source/tools/linux/Linux_Pack_Firmware/rockdev/package-file文件,根据需求修改该文件,本例程以更新boot.img为例,所以将其他.img文件注释掉。用户可以根据产品更新需求对该文件进行调整。5 b' [5 S; m, A/ ^) ^8 z
) @+ ?3 A# l% E9 u s* c" Y+ {$ s
4 L' l3 e' H" G4 S' a9 I- m+ D* e/ J/ s: j6 A% ^: ^
- b! ^" e( `4 \
U! x( [' I: w' \0 u; x# @6 L) v
5 P" g: ^+ [1 c9 v
) ]% W7 T, K! u4 [6 r9 r4 [7 M( s5 O
* Q$ m& u1 U6 d" n/ y本例程以修改设备树显示为例,修改完设备树后,重新编译内核。9 h5 n _% k, Y0 o
; B# T" J- J/ j$ }
' B; H: a4 B" w4 w# ?$ E2 {$ T# \- n
, c" \( A2 W+ @7 V5 H- q' |
9 K+ `5 Z- S$ \. h1 P' T
; R2 P S0 r: C1 G2 h9 B
03升级操作$ Y" z* V+ i2 L) c$ _, @
n) G- i# l* R! ySD卡或U盘升级 s; n3 L' o' O, |
& d6 d1 { P" `+ A3 a
将SD卡或U盘默认挂载到OK3568-C开发板的/run/media目录下。将update.img镜像文件拷贝到OK3568-C开发板的/userdata目录下,重启开发板后系统将检测该目录下的升级包自动升级。
6 T( n7 _! `1 t, j z) l( e. w# ]
7 X8 c# G( B, H2 i/ R0 j. X# ~
" T+ [( i' \" i. n# }2 T: q7 K+ y) x. u6 w. W+ y2 E
ftp服务器升级) ]2 A; g, F+ j, j6 j8 J% X8 B: l
4 F0 H+ Y* t& \& {
开发板端执行如下命令,将服务器的升级包文件拷贝到开发板进行升级。
7 n! e% {' i! o" d& k# x8 R' f- s+ i4 G0 W/ @& j# H5 o
& b9 t# B+ P2 [6 A- v
p% J. x6 {! w- z/ f& O
# C4 @6 Q" Q+ @0 a: p. K1 ]3 L k" J* E# \7 d! }# O
9 U& \$ A. ]+ e, w0 p' N+ ^! L8 y
7 J) \* W+ U6 g2 m; j4 ?9 k下载完成以后使用以下命令进行升级:
4 W; C5 c% F. @( K) Z3 v
2 ~3 c s+ p& R# f$ Bupdate ota /userdata/update.img# a, [9 |) {0 ~
! ?0 h+ d8 Q, x( Q4 i: t; ?) O) |, _$ R
; R3 s/ [; ]# q2 l7 Q3 _+ Y, B' V8 F- U+ A
升级过程中设备将会进入recovery模式,并进行自动升级,升级成功后会进入到正常normal系统。
0 z; N- Z% S q
& c+ ~9 |. N2 S9 z3 H验证测试结果2 X' c! z5 f8 ], V/ c
将OK3568-C开发板上电,串口终端按住空格键,会进入uboot选屏界面。
9 s& D7 k5 x! L% e$ D, ^4 b! g/ b: a( h
! \+ f8 v! y, R0 q1 u, Q
烧写默认出厂镜像文件现象:默认是开启HDMI、MIPI和LVDS三个输出。
4 ?8 G( G6 F1 T7 t) C1 J- I0 e
0 P4 g/ X% ]. |7 p# W( ^
: X) J- g: q1 P# S: _, f/ l: S1 K/ R5 P% ^
7 i5 }' q) x. \! N& s; ~) Q
" a8 @' ]6 @1 X( c m# ]$ v
# y6 ~1 C+ X/ V# P烧写升级包镜像文件后现象:只有HDMI显示开启,其他的两个输出被关闭。
" A' Q' u" ~/ b$ k6 Y8 z
! Y! Q( c5 l# @3 X. q) [) C$ e4 Z# X6 B' n
/ O: N; z# Z( s; c
% Z" ^+ D. }7 j& t) L7 n. Z4 v) }
注意事项
d" \: |. o, a' W/ h; b& d+ [7 i7 k; g7 d& _# [
打包update.img固件时需要注意,升级固件可以全分区打包,也可以部分升级,可修改package-file文件,将不要升级的分区去掉,这样可以减少升级包(update.img)的大小。- T+ C! o; z. n
/ K/ ^* ^4 k4 _3 ]# M# Y m" d
package-file中recovery.img如果打包进去的话,不会在Recovery模式中升级,为了预防升级recovery.img过程中掉电导致后面其他分区无法正常升级的问题,该分区升级放在normal系统下升级,执行update命令时会先检测update.img升级包中是否有打包recovery.img,若有则升级recovery分区,再进入Recovery模式升级其他分区固件。' ^1 Y3 T5 Q- C
" }# U) k; W' w) xmisc分区不建议打包进update.img中,即使有打包进去,在升级程序中加载判断到后也会忽略该分区,即使升级了misc分区,升级成功后recovery程序仍会清空misc分区中所有的命令及参数,从而导致达不到预想的结果。2 H8 n& Q9 F o! u0 u
# [4 `* m7 b) D! w- j, L
2 k2 R9 ^( r X b. c如果将update.img升级包放置在flash中的userdata分区,则需要保证package-file中不包括userdata.img被打包进去,原因是可能会导致文件系统的损坏,升级成功后可能使oem或userdata分区mount不成功。若从SD卡或U盘升级时,可以打包userdata.img,从而对userdata分区进行升级。升级完成后会对userdata分区重新resize操作。6 F1 u" k/ k5 j% x) o9 E. p
|
|