|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-4-10 11:26 编辑
8 N$ j) t4 ]9 K' e! k9 p% B+ `# u _1 R. I2 @" `5 \
本文将通过飞凌嵌入式OK3568-C开发板介绍OTA升级流程,本地升级程序recovery执行升级的流程及技术细节。
( c6 G/ [$ `; O5 T3 k
& _+ {) ^5 v0 e6 V! \
& v( T5 n( |5 d3 T% c5 `# u6 z* `
1 x, X( U7 ?5 r0 }& y
. ?6 s% n" V7 R4 Q
01制作recovery.img
6 R" Z2 N; d/ b- I; k
+ m- k( Y8 P* f6 B8 [recovery相关的源码路径:
" U, s4 W6 u- m, l( W" L! H( I8 u
, g' g; j) E t* Ebuildroot/output/OK3568-recovery/build/recovery-develop
1 v _9 t& T; Y* T2 C: B6 Y4 Z$ {' B/ v4 }
. @' `# w& M6 W' r* p' x% X6 b* Y3 |9 u/ P- v
) k0 T/ R, @2 S! o! M& A如果有修改过以上目录的源码文件,则需要执行以下操作:
. F0 G# A# }) H' {0 `0 F" L" p4 e9 x' r1 l# [
1. forlinx@ubuntu:~/OK3568-linux-source$ source envsetup.sh
x t; q% V- D( a" O% h
4 H; }2 S5 F6 M T, F0 s( |% t! X5 e! W2. 选择某一平台的 recovery 配置,输入96
, R( x5 n! e4 ?( j% F* `/ B6 ^. ?4 b1 x
3. forlinx@ubuntu:~/OK3568-linux-source$ make recovery-dirclean && make recovery #清除编译产物重新编译+ C& I& o( K9 v
6 T. \- y2 D. x+ O/ d% B& V
4. forlinx@ubuntu:~/OK3568-linux-source$ make rkupdate-dirclean && make rkupdate #清除编译产物重新编译
6 a6 l2 F4 o" O1 F. ~0 o9 G! A% u4 d" j: g
8 {; N% H4 K! m0 j
5 f) L+ A- S( O& T0 x0 N' l2 f, X4 {$ Z: f c' O! p' w+ e
如果没有修改过上述目录的源码文件,则直接执行以下操作:, K0 }7 G/ R$ G4 ^
4 ?2 B7 }3 @3 s
1. forlinx@ubuntu:~/OK3568-linux-source$ ./build.sh recovery #编译生成recovery.img4 N; t: q A# o5 x
( }5 ^6 N7 a' z- e# \4 P0 ^' k2. forlinx@ubuntu:~/OK3568-linux-source$ ./mkfirmware.sh( D$ {5 `4 x! ]" G, k2 Q( s; O+ N* y
) e1 j' N E- M5 w7 h9 |2 y' S
#将生成的固件拷贝至 rockdev/目录下7 l- P* w6 Z6 } v
3 C* _5 [% p. f. c% X( R
烧写/OK3568-linux-source/buildroot/output/OK3568-recovery/images/recovery.img文件。/ Z, H, R0 J2 C5 t Y
* r/ B7 J1 U+ l9 e0 _
3 f) V. `* |4 [; G# ~" k
6 U2 W4 E% K6 m% Z7 ~0 b; m4 ?& e
; j6 P- Y" K a$ P* L1 q5 f" M点击设备分区表,勾选9,选择recovery路径,点击执行。
0 ~4 t: C D m2 W7 t6 ?/ d" Z8 L5 Q; f- @
5 v. E0 Y. r/ T# N1 R6 r
0 }: Y/ | N" G. @. S
" `% _( U; { | T) r( A& j3 {* S( q! h, D% b9 I" E. t
( [3 k$ u$ c' e t5 F8 Z! K6 M& v( a6 x
# I+ W/ M- N/ \
02制作升级镜像
2 J% l) b2 `8 g4 f7 k5 O" g) }! n- a6 I4 n A) E1 F" C
如何验证是否升级成功了呢?我们要先对boot.img文件有一个初步了解,boot.img文件存放有设备树和内核,我们只要对设备树或者内核进行适当的修改即可。本例程以更新boot.img文件为例,对设备树进行了适当修改。
9 r: J1 y4 V7 {; y* E$ e
9 o: O1 `: h8 p1 s" J% Z修改 /OK3568-linux-source/kernel/arch/ARM64/boot/dts/rockchip/OK3568-C-common.dtsi设备树文件,对forlinx_control节点做如下修改。默认只打开HDMI输出,将MIPI和LVDS输出关闭。& l x5 g. r2 k4 O
8 B6 D) k, j8 G# b; h/ e/ O5 p7 A
4 [6 ~" B- T* ?) i) Z
* D# V W* f. R+ F! o4 c: i
! }8 V# W% _& p; [
6 V6 F. [% n- R; x0 H0 d' M1 x, p( m$ `. b! T
, ^) o! i: U6 E1 d; d" k. Z
+ ]$ w) m! l. @9 V修改/OK3568-linux-source/tools/linux/Linux_Pack_Firmware/rockdev/package-file文件,根据需求修改该文件,本例程以更新boot.img为例,所以将其他.img文件注释掉。用户可以根据产品更新需求对该文件进行调整。
4 F) W q& E4 l9 r9 j$ Z4 [ [% T
' R( V, ]# C5 w: h. r: ]! w) b& b; P" ~( o1 t+ b& X
7 @( p7 {+ ?9 Z+ G2 M; p& F5 H
1 G5 [2 G5 t# F! {; j
- h8 H& j. ?2 i( ^1 c y& K R
' b! n6 G X3 @9 \
本例程以修改设备树显示为例,修改完设备树后,重新编译内核。$ g) t! @3 o8 g* x2 i& d% I
! A5 l. z* W4 }4 }) _' z
/ c: `- E2 x5 ~% ~6 h; ]' F0 ]" U" b. @0 p: \
) V& M4 T* ?& Y* p/ k) A* ~3 e' f0 y8 e" S% g' t) C5 X5 W* \
03升级操作+ N" d* L' A3 h# M% Y0 w s
^- X ?7 Z! c
SD卡或U盘升级7 b5 a+ k) Y% h) S2 e2 }
0 [* Q6 J; m/ O. x& o1 d将SD卡或U盘默认挂载到OK3568-C开发板的/run/media目录下。将update.img镜像文件拷贝到OK3568-C开发板的/userdata目录下,重启开发板后系统将检测该目录下的升级包自动升级。
% ]. t! ]) F2 B, {/ ~0 h7 C: ^0 h8 g" r! I# o
9 T1 a3 N$ H1 Y: P B/ F# j" \. s# g/ Q$ T% C9 o# S9 Z9 H
2 _, `# `$ D7 ~+ jftp服务器升级
, T) E2 N! S) _* O9 e
0 q+ k! x) }/ r开发板端执行如下命令,将服务器的升级包文件拷贝到开发板进行升级。
5 n3 U1 V; ~8 N) l" ~( e" l
2 \3 }- V$ j) R" B n
5 B# h: B# v4 K9 h9 L5 ^; y) d3 }. B
' \* }$ {1 }1 R: v
/ c% f" ?# \) y8 N8 P) c" a p, ~
; H* L/ E$ R5 a+ K/ Y3 ~& Z
' Y) `( s( w# i8 _) @下载完成以后使用以下命令进行升级:
8 W1 m. J' A4 ?/ d# B) A
+ F, U9 m; Z& Jupdate ota /userdata/update.img: l. J8 k" O$ L8 Q! _0 m' ]
8 D4 i* r D( ]. [& c1 V/ u+ h3 {' H _
6 C5 Y' W/ w' g+ C5 T
) b+ _5 E; B9 l0 D* \
升级过程中设备将会进入recovery模式,并进行自动升级,升级成功后会进入到正常normal系统。/ I/ p; G: b% w4 h6 c
) M4 G( b1 X# j) ^' Z. z4 P验证测试结果2 L- ^( ~5 [$ Q y! O
将OK3568-C开发板上电,串口终端按住空格键,会进入uboot选屏界面。
& @6 |) B) |/ c1 l( Z/ N
- w6 g5 N9 H0 d/ i" y
+ E4 x7 e' ~2 q! y1 B- @, ~烧写默认出厂镜像文件现象:默认是开启HDMI、MIPI和LVDS三个输出。
( ~0 ?6 K" h) X$ `6 c' M5 x; X
# b* b+ Q) p5 v" A0 c: b
! s' v& C' @ A& }, v% ^/ d: W/ v$ l
* n) _9 Z% v# a# x: V$ R7 _
/ T! V* G P% @$ k Z/ B8 ?$ N( U# G( N% Z7 _$ {
烧写升级包镜像文件后现象:只有HDMI显示开启,其他的两个输出被关闭。
1 R* p6 @: X2 B: q
2 [7 @7 J2 B6 z- x( z, i8 r% p
) y2 H+ P- z. Q5 p7 B. z6 J3 O6 E- P+ ~5 g/ h
1 I- D0 r6 m) H6 m( j r$ o* ]
( v* N3 k: y# a- U7 u. D J0 K+ ]7 r
注意事项
; d" E$ G, c2 ~6 V: n2 D: e, P9 {- \ e: J
打包update.img固件时需要注意,升级固件可以全分区打包,也可以部分升级,可修改package-file文件,将不要升级的分区去掉,这样可以减少升级包(update.img)的大小。
u- Q, f e: D- w
# h( |. E6 Y1 K" b. \4 D9 @package-file中recovery.img如果打包进去的话,不会在Recovery模式中升级,为了预防升级recovery.img过程中掉电导致后面其他分区无法正常升级的问题,该分区升级放在normal系统下升级,执行update命令时会先检测update.img升级包中是否有打包recovery.img,若有则升级recovery分区,再进入Recovery模式升级其他分区固件。7 }/ t, E Z2 C4 F$ {8 m
: t- p$ r: t* w
misc分区不建议打包进update.img中,即使有打包进去,在升级程序中加载判断到后也会忽略该分区,即使升级了misc分区,升级成功后recovery程序仍会清空misc分区中所有的命令及参数,从而导致达不到预想的结果。
2 y9 Y6 I) h: B
* d$ C; `2 t8 C, u: _' k3 I8 i1 Z! Q* q! q
如果将update.img升级包放置在flash中的userdata分区,则需要保证package-file中不包括userdata.img被打包进去,原因是可能会导致文件系统的损坏,升级成功后可能使oem或userdata分区mount不成功。若从SD卡或U盘升级时,可以打包userdata.img,从而对userdata分区进行升级。升级完成后会对userdata分区重新resize操作。, j' G5 L- K2 X; Z- t4 t( T
|
|