|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-4-10 11:26 编辑 \8 L8 T' Z: s
* i c! b3 m! _! g3 R
本文将通过飞凌嵌入式OK3568-C开发板介绍OTA升级流程,本地升级程序recovery执行升级的流程及技术细节。
2 q$ I- N: f8 a2 G! b Q- \$ p
( W" [" J: p) J* {1 W
I) y% L+ P3 V
3 W0 [, o9 e( m' U" U/ J9 K4 l6 s9 F2 ^ ]1 X5 |4 t) S9 R l
01制作recovery.img
6 ]$ M+ T2 y H# c
4 T; t! J0 K, G: o, ^* hrecovery相关的源码路径:
! t; R* d8 l O U- Y# c$ i* A
& H, @; y/ R9 \/ B' {, kbuildroot/output/OK3568-recovery/build/recovery-develop6 }% h+ V& T, b1 b+ W. A
- L% j% v* w) y, W5 ?
3 T9 Z/ V1 Z8 e) c9 N- J1 O
! t: w p, [$ z8 L
/ [/ s& m( |, U) d5 }如果有修改过以上目录的源码文件,则需要执行以下操作:+ m1 f$ e- d% A. \
' }, }% J) l/ g' g1. forlinx@ubuntu:~/OK3568-linux-source$ source envsetup.sh
; \8 q# n9 ]+ e3 a4 }% c- c
5 Q+ z' \' e+ d* R6 |4 G2 J2. 选择某一平台的 recovery 配置,输入961 V: Z& D$ b! p/ C' F1 a
* F0 p/ {! ?* h; ?
3. forlinx@ubuntu:~/OK3568-linux-source$ make recovery-dirclean && make recovery #清除编译产物重新编译6 e/ U1 S) H4 B8 h6 T/ @
9 n' c ~5 e0 k9 |1 m
4. forlinx@ubuntu:~/OK3568-linux-source$ make rkupdate-dirclean && make rkupdate #清除编译产物重新编译8 ]( }& c9 m& n$ H( T1 y
3 c) v8 ^: W- x( }8 j# D# ]6 h/ g: \6 {. m. K, B
+ L7 b: z [" H" W: t1 J
) T1 Z i0 k) `$ `如果没有修改过上述目录的源码文件,则直接执行以下操作:* f' d! [: P1 Y
i2 {$ V* x4 `! i, B( z+ `
1. forlinx@ubuntu:~/OK3568-linux-source$ ./build.sh recovery #编译生成recovery.img
5 m9 {+ Y' h+ g. q. A
/ A; Z" @$ z9 \3 H2. forlinx@ubuntu:~/OK3568-linux-source$ ./mkfirmware.sh
- j! }2 R" |7 t3 e6 ^: p
* A, P4 O, r$ E0 @* x #将生成的固件拷贝至 rockdev/目录下( L+ N5 G$ F5 l
5 M8 z5 [: Z: Y& N9 Z, [& W烧写/OK3568-linux-source/buildroot/output/OK3568-recovery/images/recovery.img文件。7 E8 Q$ R J: V' L
% U' j( ?- a2 `+ O! Y& E
* w7 ^( x8 g' h \
$ U8 Q! m/ x' O6 u* N# y7 D# Q+ L+ j9 P6 l& D. g
点击设备分区表,勾选9,选择recovery路径,点击执行。( F! p/ ~2 H2 \7 E+ U3 h' q& v; E
2 U' w5 [. v4 N+ A) d
8 c1 y# b$ W8 R# E& Y
' L2 H' d& ^2 M% R4 T Q* ]' ?
" ^/ o( ^! b. f# B6 i
# i! }& V! b$ t; F1 @9 q) U+ _/ r( `# K! U9 h
u9 h* m ~9 P02制作升级镜像! M0 [9 G! |( D( U$ Q! V" a6 V" L
7 J" _3 B' u! `! K s' e/ H3 i如何验证是否升级成功了呢?我们要先对boot.img文件有一个初步了解,boot.img文件存放有设备树和内核,我们只要对设备树或者内核进行适当的修改即可。本例程以更新boot.img文件为例,对设备树进行了适当修改。" L9 }9 g1 P1 E$ a
" L7 d/ ] R' w
修改 /OK3568-linux-source/kernel/arch/ARM64/boot/dts/rockchip/OK3568-C-common.dtsi设备树文件,对forlinx_control节点做如下修改。默认只打开HDMI输出,将MIPI和LVDS输出关闭。
/ |6 c) K; r. ?
T4 q0 Y- K* i9 d) q
; c8 X1 i5 l9 A& u9 X# J6 a% p x0 F, j" O n1 V) Q
' V/ x$ F% q7 N- F! r5 r( |; O
1 k3 p! h3 o! g) S, L. o* b$ U6 S9 `& m, H# i: {; U/ Q! Q$ g
' b3 D; f) `! r- [+ R+ J- T
2 Y( d+ w! |# ~+ O# R* v, j
: i* c% @$ q: q. G修改/OK3568-linux-source/tools/linux/Linux_Pack_Firmware/rockdev/package-file文件,根据需求修改该文件,本例程以更新boot.img为例,所以将其他.img文件注释掉。用户可以根据产品更新需求对该文件进行调整。$ J" Y/ D9 N/ o
[8 K$ E) ?, t& u3 X/ Q
9 P, Y o' U: z% `% A8 U- v: o. r& b N0 T1 ~/ s# D5 a* Y1 G) B
1 e+ T* ~- F: w5 p4 w! P
% i; _0 N% ^ M7 A# E2 V* J0 m/ j, p; U
/ C# ]; I; \4 I3 K3 W/ S- i1 [
( E7 ^. X$ q- r/ J! W" Y8 ~本例程以修改设备树显示为例,修改完设备树后,重新编译内核。
/ A$ y8 d% K. V/ k A% j/ k( v: s1 b2 }
/ }" E7 P1 _$ t: _* p5 y: b( ^# ]* }
& j0 {: u3 @* E9 M H& M: _6 I N" y
; i0 b7 W+ Z% u! X
03升级操作- ?- e$ t) G: [: h0 Y
I" V( R1 L* tSD卡或U盘升级
) x0 l2 ~4 M: a- Z9 @2 @: y$ m, ^" h! T4 |2 Y4 h# f4 Y; e
将SD卡或U盘默认挂载到OK3568-C开发板的/run/media目录下。将update.img镜像文件拷贝到OK3568-C开发板的/userdata目录下,重启开发板后系统将检测该目录下的升级包自动升级。+ M& a. |/ o( B0 Z5 p# w
3 q$ X' ~& N: d8 e1 t5 ]
% t5 [5 X9 l1 Y' G+ M& b9 A8 ?4 {6 M4 L, e2 C1 {; o# T
- b3 A( p4 S% ]' e! j
ftp服务器升级 B! b& u/ F# L2 Z P
* C3 e* u0 q, Y8 ^5 ~
开发板端执行如下命令,将服务器的升级包文件拷贝到开发板进行升级。
- c% T4 s/ Q& {' z0 |$ ]5 [- Z( R9 c; J4 M0 t
: K, ~9 @5 ]; i/ d" j
. q, e3 Q0 Q9 N: s$ \) I `; J& B6 [
0 q9 o7 I# Y1 C" k, W3 p6 a: k; X& s5 b: @
! _! r& O2 p" `$ n5 V$ j3 e9 p
- T2 V; X" G1 W1 y
下载完成以后使用以下命令进行升级:9 u& T: v) p( H& H
" b# K E, P+ `
update ota /userdata/update.img
- b9 p d( }' J* A& x0 ` \. c
7 l, A* m, ^7 h7 |
1 T- ~3 t$ S. N [. J2 \7 h& s& ~, r' A* f; d
8 e8 h( q1 |: K! ~升级过程中设备将会进入recovery模式,并进行自动升级,升级成功后会进入到正常normal系统。
, K. b$ I4 q7 n* [
( J5 B5 G/ f& S7 O. D8 h验证测试结果
$ S$ B3 C8 c; l N将OK3568-C开发板上电,串口终端按住空格键,会进入uboot选屏界面。% {% I) `, f3 r3 e
. K# m1 x- o9 B
$ h+ M) S. k/ u烧写默认出厂镜像文件现象:默认是开启HDMI、MIPI和LVDS三个输出。
; W& R5 D s9 q. m2 X
( M- V1 @- C) V7 `7 U) r8 M3 m3 O/ b A7 [1 |2 z
( O: z8 ^. f) a3 E8 k: B) H3 x
; a" z! J: B. j& Z% U$ z4 ^+ a) F5 j3 T; |9 ]0 y6 H, g
, G9 h# u1 K0 i: _# {" g. o$ Q5 X! V* g
烧写升级包镜像文件后现象:只有HDMI显示开启,其他的两个输出被关闭。
8 j4 H( ?5 {; z4 b P
6 P% m% r$ z0 [! U( D K' A" B! ]
0 O# J1 {8 f$ W9 C# c J
+ a) \3 N) \/ S2 Q" M5 {
, ^0 a% H6 a7 c9 R0 u
/ \& Q. d4 X, }& ^/ G注意事项( z, n% i& {* q @- m+ P
* \$ ~1 E& g# M! K" e
打包update.img固件时需要注意,升级固件可以全分区打包,也可以部分升级,可修改package-file文件,将不要升级的分区去掉,这样可以减少升级包(update.img)的大小。6 p0 F5 e0 i2 e2 }$ {! J; M$ U
. n/ u l C5 y( {( Xpackage-file中recovery.img如果打包进去的话,不会在Recovery模式中升级,为了预防升级recovery.img过程中掉电导致后面其他分区无法正常升级的问题,该分区升级放在normal系统下升级,执行update命令时会先检测update.img升级包中是否有打包recovery.img,若有则升级recovery分区,再进入Recovery模式升级其他分区固件。7 S' ], k3 |3 Z- ~5 c" w
6 j5 W+ y6 j5 T" K) N3 c' e$ O- j( H
misc分区不建议打包进update.img中,即使有打包进去,在升级程序中加载判断到后也会忽略该分区,即使升级了misc分区,升级成功后recovery程序仍会清空misc分区中所有的命令及参数,从而导致达不到预想的结果。5 W B, J# |8 x" n! @& }
+ k$ A9 S' ]' R% I% S8 l5 C* q( {" B' B8 D
如果将update.img升级包放置在flash中的userdata分区,则需要保证package-file中不包括userdata.img被打包进去,原因是可能会导致文件系统的损坏,升级成功后可能使oem或userdata分区mount不成功。若从SD卡或U盘升级时,可以打包userdata.img,从而对userdata分区进行升级。升级完成后会对userdata分区重新resize操作。
5 h' `3 Z0 z4 n |
|