|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-4-10 11:26 编辑
/ q) G Y7 ]7 k; q; u, h
& t% q2 G0 J- {( B+ \本文将通过飞凌嵌入式OK3568-C开发板介绍OTA升级流程,本地升级程序recovery执行升级的流程及技术细节。
& s r+ G3 i# e9 m
( X# R7 O0 b6 V$ x
) N9 Q# k. H1 e) b: W$ v- r) X3 b6 x8 |$ c8 j3 Q: X
- F5 t+ h! m9 f% N; X- V2 Q/ Z& e2 n, H% Y% J. a2 ^8 U3 S
01制作recovery.img; P# j" t; {+ F) S
6 Y* W8 o6 v# ?+ n5 h7 R
recovery相关的源码路径:
+ f7 B" g* e1 ]1 G* R" N
4 _% m5 }) R& d9 z" [% e& i R" E$ Wbuildroot/output/OK3568-recovery/build/recovery-develop7 h; c- k- S2 d9 \0 I g
$ O8 d: X4 K, i T: k/ ?% Q* u6 G
+ ~0 |- [1 C6 }! b
6 Y+ N/ C1 J+ Y7 y6 l/ U% \0 {
( Q- b! @1 P3 l% o
如果有修改过以上目录的源码文件,则需要执行以下操作:7 @# _" j: T) p# M3 ^
2 T: o" [1 m' C" Z1. forlinx@ubuntu:~/OK3568-linux-source$ source envsetup.sh+ [1 q! L! W5 e
1 p/ g; ?- v6 O! S3 f3 a2. 选择某一平台的 recovery 配置,输入96
3 \: a+ x. V8 Z. K( p1 P: v4 j
+ @) V* [5 X# ]* r# d) R3. forlinx@ubuntu:~/OK3568-linux-source$ make recovery-dirclean && make recovery #清除编译产物重新编译
' Q8 F" K3 F h& X, E0 f3 L# T- F& j: i2 i9 Y/ m
4. forlinx@ubuntu:~/OK3568-linux-source$ make rkupdate-dirclean && make rkupdate #清除编译产物重新编译
, [5 H( }6 {6 @" i' M
' Z& {; G* J2 [
3 Q: n1 W4 V5 N, E- R0 ~2 [3 k8 X4 e' l" ]* V6 E
' F) _! q3 I# h% D) Y3 x( O
如果没有修改过上述目录的源码文件,则直接执行以下操作:2 L! Z, o. p$ N5 _" h
4 |, E$ u6 r: Y) G$ c
1. forlinx@ubuntu:~/OK3568-linux-source$ ./build.sh recovery #编译生成recovery.img
0 P# x5 C: @/ i( B- y! C
+ V; q2 ^1 @# i# Y/ F$ R2. forlinx@ubuntu:~/OK3568-linux-source$ ./mkfirmware.sh
* V0 |$ j4 j4 _8 c6 Q2 m# s* z1 Q$ \0 y. \- `" X
#将生成的固件拷贝至 rockdev/目录下
' [; P: f0 K. O
4 d6 M! g# O! D9 q) ]烧写/OK3568-linux-source/buildroot/output/OK3568-recovery/images/recovery.img文件。
! s4 g0 j4 {' F/ c- V* k; m- {4 P J- { t7 o# @7 G
& ~0 ?: {8 A: b+ u, c
" B x$ S# |$ h# T. m+ X0 Y5 a
& t# |2 x" `9 y' h% T7 E- |+ i点击设备分区表,勾选9,选择recovery路径,点击执行。
% D4 ^" ^! ]1 L z# F& y/ w3 m% Y1 {) C- E0 A* G/ k
% _& w1 A' ]$ y. N% Z7 B. _
! U D9 q8 }% H {5 h
$ x; x) F! A9 A/ P0 M, W3 g8 M7 |4 a1 x% w+ d5 E% d$ K5 b
& d4 T& U) p) [5 o' v ?
9 E) D7 {# N- J$ c6 N6 i. T; X3 X: F' K' q! c
02制作升级镜像" m/ O4 Q, \; ~
. ]- N7 w- b* f' G如何验证是否升级成功了呢?我们要先对boot.img文件有一个初步了解,boot.img文件存放有设备树和内核,我们只要对设备树或者内核进行适当的修改即可。本例程以更新boot.img文件为例,对设备树进行了适当修改。' S" a0 t# A. b% D
5 J, i+ q7 @* l9 _+ p9 Z
修改 /OK3568-linux-source/kernel/arch/ARM64/boot/dts/rockchip/OK3568-C-common.dtsi设备树文件,对forlinx_control节点做如下修改。默认只打开HDMI输出,将MIPI和LVDS输出关闭。
( j$ ^: {" G' x1 t' U0 w& W+ p
+ ?5 D# ~0 k. O- ^8 u4 N
0 q! W0 f' X/ w/ m5 X3 `- H/ ?8 `$ h, i6 d
) b- Q0 _' F2 o G4 W) ?- N+ Y! F9 v0 _: k! A7 B4 _
0 B8 L4 u, g$ v4 y7 X% E
# \+ {3 x. Q1 o& i: }9 Y1 N) D. Z4 `& ^
5 y8 h/ t+ \# K
修改/OK3568-linux-source/tools/linux/Linux_Pack_Firmware/rockdev/package-file文件,根据需求修改该文件,本例程以更新boot.img为例,所以将其他.img文件注释掉。用户可以根据产品更新需求对该文件进行调整。
/ o: n- a! h- U, V+ J+ F: S, m/ i( J2 U
+ c/ L* W4 X6 Y3 i+ p H+ t: C; O# F2 I6 \& ~5 f9 p0 r+ v
0 m' h" V; o' \( o
$ V8 p+ o% \; }! \* h5 M! `4 R3 B7 n7 o# F {; T3 x# O8 D
/ w- P: q7 P, l% H, k# \& j( x
2 v$ [7 L" L+ E8 y& l9 W6 `$ z* k
本例程以修改设备树显示为例,修改完设备树后,重新编译内核。2 N& R( Z' Y M/ w# i G. D5 z
. P4 W9 R: @! g* k; _
& r% d" E) F( A* u
0 g1 `. @1 D4 d9 X; C* c
, A! G; u$ z4 v
+ G" K r4 [* Q# t {7 r$ i% s! K03升级操作
- m R2 z; T |( x5 ?: k5 L# w! z4 a
' r! c4 m+ v" i2 _SD卡或U盘升级7 o6 @0 P5 d o
/ z3 m) \" M% a! ^$ C4 a8 ?/ r. k
将SD卡或U盘默认挂载到OK3568-C开发板的/run/media目录下。将update.img镜像文件拷贝到OK3568-C开发板的/userdata目录下,重启开发板后系统将检测该目录下的升级包自动升级。$ ]9 K% Q1 ^6 e
7 i3 a1 z( M) N& f( I
2 p% w( ^5 f: B
% _( m) q0 F) Q+ P, A( H+ m Z& s! c) a: z5 A
ftp服务器升级4 w& A0 R3 d) f% p# t5 `
3 x4 ~7 f3 ?4 n- L6 @! A+ O/ k p开发板端执行如下命令,将服务器的升级包文件拷贝到开发板进行升级。9 J) K% \/ f% A' f! j7 w0 a
: z; D- A( }4 |) Z* Q$ S
4 o) X% A: e4 I% Z0 d1 K! W0 z
5 C. c" U3 [- ~5 _ ~6 q: k
5 n& i Z9 `8 u$ ?, c) p0 S! M
8 s& P3 X) u' B- f% }0 O
: m/ y, m U7 Y- N3 l: }2 F3 i
) U: p! z ]& s. j, I8 ~# t下载完成以后使用以下命令进行升级:0 Q% Y+ \# f# B+ J& e( f
m4 m" e& U% {. i: |update ota /userdata/update.img
# O7 x$ }9 D- B3 x4 h: n9 ~: F9 @. _9 S6 w- m3 Q) x' v6 j2 [; a
! i3 Q( \! p; ^' A
, @, L* |0 Z+ L+ E. f- ]8 ?) H$ p, D- a2 \8 m* U) V
升级过程中设备将会进入recovery模式,并进行自动升级,升级成功后会进入到正常normal系统。4 J$ D7 a( b7 N u
. v- \( z3 H0 r6 i6 S' @
验证测试结果 d A2 t! c7 x6 M
将OK3568-C开发板上电,串口终端按住空格键,会进入uboot选屏界面。
) v& }% N, y9 z5 s8 W0 P& _+ X3 O9 b6 m! d) T w" H* y$ I
( P& e$ \2 c# R
烧写默认出厂镜像文件现象:默认是开启HDMI、MIPI和LVDS三个输出。
$ J. S8 Y( Z$ ]% a
: G/ N) Q! a9 B4 R R& H+ `
4 v$ @' E. P. @# z9 D. w7 G* M1 H( x* z I* e- A7 W" y
7 l# X" D# F$ l
/ X1 J3 H; `% \0 X
, ?4 E4 `$ O# j9 h% B烧写升级包镜像文件后现象:只有HDMI显示开启,其他的两个输出被关闭。7 a3 @% \. C$ I4 F) w
* Q9 p8 l; k' H9 i# J. [
0 w6 l( ^; S/ T; M- z/ o" E
/ w/ Q" n) C- k
/ L& V. T1 T( `$ p/ i0 Z6 X- T; P! V8 X1 K/ l w8 Z
注意事项7 n/ @3 R K7 c/ }1 b: m0 |
4 t. s' t5 t) U3 Q打包update.img固件时需要注意,升级固件可以全分区打包,也可以部分升级,可修改package-file文件,将不要升级的分区去掉,这样可以减少升级包(update.img)的大小。
5 i* g! X3 f8 q0 ~: [$ m
$ l4 U7 T% ]) T* ?2 Xpackage-file中recovery.img如果打包进去的话,不会在Recovery模式中升级,为了预防升级recovery.img过程中掉电导致后面其他分区无法正常升级的问题,该分区升级放在normal系统下升级,执行update命令时会先检测update.img升级包中是否有打包recovery.img,若有则升级recovery分区,再进入Recovery模式升级其他分区固件。. P3 ]% d7 r" ^& ]
+ p$ w6 O- ]) I2 G1 J4 j* H
misc分区不建议打包进update.img中,即使有打包进去,在升级程序中加载判断到后也会忽略该分区,即使升级了misc分区,升级成功后recovery程序仍会清空misc分区中所有的命令及参数,从而导致达不到预想的结果。! W% |6 s0 C8 G2 j/ h
5 ~1 [6 X" W8 |+ J& a+ B- O Z" D" K) Z2 {& g
如果将update.img升级包放置在flash中的userdata分区,则需要保证package-file中不包括userdata.img被打包进去,原因是可能会导致文件系统的损坏,升级成功后可能使oem或userdata分区mount不成功。若从SD卡或U盘升级时,可以打包userdata.img,从而对userdata分区进行升级。升级完成后会对userdata分区重新resize操作。; H* V C3 z! u- h* N
|
|