|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-4-10 11:26 编辑 ' Q) ]/ |' Q+ ^8 J+ p
& I/ b7 z$ [* ?4 U. K6 L本文将通过飞凌嵌入式OK3568-C开发板介绍OTA升级流程,本地升级程序recovery执行升级的流程及技术细节。
& M s7 u. R$ j. Z$ G( j7 ^
4 d; l3 e5 k& t# J; n, J! z" a! _' R9 O* ]' w
1 I# L# C& i+ ?; j6 L9 y- n' a1 _: D; `# P& |0 b- S3 z+ [
. \- b6 n6 a/ w: `2 Q8 h" q1 {% t5 {
01制作recovery.img. L+ O: f: n9 Q0 Y2 A: a
2 S* W1 r5 I0 E* M3 p
recovery相关的源码路径:
& X( `+ g5 U- t) k8 D
5 ?; B' ~- N, b' i' tbuildroot/output/OK3568-recovery/build/recovery-develop
- ^$ p% p% n. M6 H+ M/ @; D1 H& f4 ?$ T. Y: p( P7 I
8 o* d9 A/ x; I/ H* Y2 m1 L& ?
8 H" F% U) k3 b; q/ s8 r* ~, ~7 q! r, j. F1 z2 G2 D
如果有修改过以上目录的源码文件,则需要执行以下操作:& v# W. h6 _) l
: X7 L3 t; D3 V! u
1. forlinx@ubuntu:~/OK3568-linux-source$ source envsetup.sh
! D$ L! Y% R# I _: R" p5 i
- P- K9 l0 J6 Q# {2. 选择某一平台的 recovery 配置,输入96
, {( T. U/ v. Z, d1 ]- P# C& C$ p0 h- r* F; R
3. forlinx@ubuntu:~/OK3568-linux-source$ make recovery-dirclean && make recovery #清除编译产物重新编译2 k8 |" k7 \0 X9 c
( w& H# n# V! m3 H4 P$ L) |1 a4. forlinx@ubuntu:~/OK3568-linux-source$ make rkupdate-dirclean && make rkupdate #清除编译产物重新编译* A5 N; s: x: |7 t5 g& Q, G. M
9 B+ I7 X: @6 n9 T5 j( x) Y
7 n! Q% @% ?, r; S0 U
2 Y4 `/ Z8 [) z2 ?0 Y! E8 X$ _; y+ x$ ^0 Q
如果没有修改过上述目录的源码文件,则直接执行以下操作:& E3 ]* Q- \3 @
( ^- r7 `) R* f0 z
1. forlinx@ubuntu:~/OK3568-linux-source$ ./build.sh recovery #编译生成recovery.img# v; t& w& ?" H J' \
, \2 t: F. ~, R2. forlinx@ubuntu:~/OK3568-linux-source$ ./mkfirmware.sh; M: d4 c9 Y5 j% j3 I
2 Z8 {6 q) w! K# P5 k8 g #将生成的固件拷贝至 rockdev/目录下
" q& E- y" Z Q& x. C
- W% ^9 a' Q, e# H/ A) Y: s! \1 M烧写/OK3568-linux-source/buildroot/output/OK3568-recovery/images/recovery.img文件。
6 e' J& K9 d) P9 _0 v8 n$ \7 H: T% [! D4 V; o
5 e( p# T& Y) A6 U* S7 `& G3 p5 G, K1 q1 z0 D
) I9 F& W! @' T. `
点击设备分区表,勾选9,选择recovery路径,点击执行。# q( f) H9 q/ g
6 c' K2 B+ K# B1 o( d
& r$ n0 w6 x- Y9 B& q4 X. M. ?7 z8 Z8 t6 b6 T
# j9 P, ~: u2 l8 o, D
" P6 q2 i& s! ~
# q+ p* G1 Y6 _, T% v' Q
3 l1 [& N) u( o x* q1 |
4 r. E. @9 N7 ]5 h* _02制作升级镜像
5 I: @6 P, t5 {. ~( h2 Q/ E- X" u/ C/ p( }; J- z* e' A$ Q# \
如何验证是否升级成功了呢?我们要先对boot.img文件有一个初步了解,boot.img文件存放有设备树和内核,我们只要对设备树或者内核进行适当的修改即可。本例程以更新boot.img文件为例,对设备树进行了适当修改。
9 E. L+ n, U2 P! p9 a* P; \2 r- w8 ~+ R- J) p
修改 /OK3568-linux-source/kernel/arch/ARM64/boot/dts/rockchip/OK3568-C-common.dtsi设备树文件,对forlinx_control节点做如下修改。默认只打开HDMI输出,将MIPI和LVDS输出关闭。
2 L6 h3 M h% ?4 H8 f y! m8 }. K" z8 p: c/ J7 X
: Y, i K, v$ \$ H4 n2 G
8 r& U# ^( D6 ~5 b% T% }- Z/ c# A
" A' }8 V0 ~; w1 ]9 g1 p2 W5 {7 D
! d+ R. f& i- b& g
. m! J- j s+ t, a7 k5 N- t
- m, Q5 T9 k6 k2 y+ g" Z. f/ M8 w, I3 k% M; [) Y1 a3 H
) \1 u) } K j* j3 o修改/OK3568-linux-source/tools/linux/Linux_Pack_Firmware/rockdev/package-file文件,根据需求修改该文件,本例程以更新boot.img为例,所以将其他.img文件注释掉。用户可以根据产品更新需求对该文件进行调整。
% s# i5 O! t- f7 T r5 W# _
) ^8 e6 S$ O; t& l( V* S% Y1 i" n$ M8 k h, o7 m* M
1 p) T% z. \8 h" [4 G
2 {+ \2 N* O* t* W: W
+ `2 \! j, E: n3 E8 m2 y: Y
1 i$ a# l# _ c& L! }4 ?
% V: i" z) q( T7 z
' F8 R1 l5 n9 W t: E+ S3 B$ ?' R本例程以修改设备树显示为例,修改完设备树后,重新编译内核。
0 t) G) W1 w4 q2 \7 A
, ]: l' D. |; `* j: Q( \4 ]
: o) D$ Q% C7 J# ~7 l& K$ T) V) g( l$ g# F
0 q$ N5 k7 ?9 e; C7 I8 P R/ W
" K! J& i- o, O: @4 C4 A
03升级操作- n# y5 f3 U+ A3 k% O# K9 ]( I
- h: U, d6 [% R, JSD卡或U盘升级
7 x5 u: T/ @0 }- i; w J
& v: L f' `5 L将SD卡或U盘默认挂载到OK3568-C开发板的/run/media目录下。将update.img镜像文件拷贝到OK3568-C开发板的/userdata目录下,重启开发板后系统将检测该目录下的升级包自动升级。) K, o) ~- r/ X: t. T
( J W- k" D& z- v: _
' X/ z( L" k7 M& b+ F0 Y5 i3 L2 v* f
$ ~2 k& X- S: C8 \6 a& h& k
, F) c& _; |- J) n2 i4 v' }ftp服务器升级
- Q5 i" R5 S% Z; ^2 b9 D/ J7 _: K. V O+ W' I4 K
开发板端执行如下命令,将服务器的升级包文件拷贝到开发板进行升级。
3 z0 m% n7 L: ^1 q% a# t$ n" j/ ~
+ i# o1 t) C% I- i
2 |; z8 O" v; O$ Z
2 {3 z1 B+ s# r# {9 Y: _5 ]4 ?
q7 u7 u! J9 n* @4 l3 U' U% @: i! F0 }- K8 r E
" b! _, L3 c( P7 J, @
下载完成以后使用以下命令进行升级:
: t" j j- q2 T4 p, v- U }4 B5 e5 y6 A, d1 e
update ota /userdata/update.img. P8 v+ a3 F: @, A6 G$ I. |1 e6 a
; b! e: ^/ |1 h" t! b9 ?9 }% \6 P- s L" S) h
2 ~2 V+ E+ A9 ?# V" n
* C0 \* C- Y, q# v- Y" d升级过程中设备将会进入recovery模式,并进行自动升级,升级成功后会进入到正常normal系统。
, ^6 H2 u* I5 e$ ~
) W* p6 A; i' s, `验证测试结果4 L. ]# f! \. N+ Z: D: ?
将OK3568-C开发板上电,串口终端按住空格键,会进入uboot选屏界面。" t5 e7 U7 ?/ p! x! T w
9 E! f6 a1 t. a' [' D2 U4 y
v( \8 @4 E0 {- A7 T. ~烧写默认出厂镜像文件现象:默认是开启HDMI、MIPI和LVDS三个输出。
9 l7 _# l+ B/ g' g
' Y# ~( L) T; U+ t+ l, a" u
* w x' R/ b" b5 `& }+ i
, i ?, S0 D+ ]: s7 D. W; U% J
y5 z, _4 m, x0 h: J2 ?; D9 M( C9 q2 f1 y& Z
4 F; |7 N' D/ ?
烧写升级包镜像文件后现象:只有HDMI显示开启,其他的两个输出被关闭。6 z- G* b3 z) K1 a* M8 p1 h7 H2 f z
4 G3 ^" n7 | i; i5 w5 u& X1 j1 w$ s5 F/ r" V& X' u9 s- J3 Z7 Q* \
, A% r; [# L c* a
@# s- }3 M: V1 p
' k* r4 @" `2 u' ^4 q- ~. V* b! O
注意事项
7 A0 k+ S; h- Q% v( I: ~9 T+ ~, `$ c8 X' _' P/ x
打包update.img固件时需要注意,升级固件可以全分区打包,也可以部分升级,可修改package-file文件,将不要升级的分区去掉,这样可以减少升级包(update.img)的大小。
' F5 ]* y9 X* `( D0 y; w" [" Y0 d& \( v- ?' a5 Q8 j7 ^7 o9 ~
package-file中recovery.img如果打包进去的话,不会在Recovery模式中升级,为了预防升级recovery.img过程中掉电导致后面其他分区无法正常升级的问题,该分区升级放在normal系统下升级,执行update命令时会先检测update.img升级包中是否有打包recovery.img,若有则升级recovery分区,再进入Recovery模式升级其他分区固件。0 a+ m8 G9 b! ~6 ~
% o0 }% O! Q- r
misc分区不建议打包进update.img中,即使有打包进去,在升级程序中加载判断到后也会忽略该分区,即使升级了misc分区,升级成功后recovery程序仍会清空misc分区中所有的命令及参数,从而导致达不到预想的结果。
/ {' L0 ^% g; j
" J p" m, P, \. B$ b, F( D7 @$ Q& d# L' e" K- e
如果将update.img升级包放置在flash中的userdata分区,则需要保证package-file中不包括userdata.img被打包进去,原因是可能会导致文件系统的损坏,升级成功后可能使oem或userdata分区mount不成功。若从SD卡或U盘升级时,可以打包userdata.img,从而对userdata分区进行升级。升级完成后会对userdata分区重新resize操作。
6 V% q0 |, z a; o& D0 V) Q |
|