|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-4-10 11:26 编辑
4 u4 b5 w8 ^( S" t) q2 d3 r6 K, `
+ r& B( `; h: J/ Z4 o本文将通过飞凌嵌入式OK3568-C开发板介绍OTA升级流程,本地升级程序recovery执行升级的流程及技术细节。 # e8 b1 B4 Q) o, w- P# Q. P
3 }) M- }' r% h* [. d6 ~2 x- f5 m
; T7 ?! d0 I+ L7 W* ]. {( o: C0 ?3 A5 N2 {8 u, h6 y
: c _' p$ a, k5 \( c
% ~% P' o( Z% d& Y01制作recovery.img2 \) X8 W6 ~! I
8 W; m, A. L# [
recovery相关的源码路径:
5 d+ Y! a9 d- M9 z$ k
$ Z/ `5 i6 [6 pbuildroot/output/OK3568-recovery/build/recovery-develop3 p+ @! u! o8 R, c9 Q0 B/ F
" W% k* Q' l* K* P& F
[2 P- L4 F4 f( w. B
! k5 d7 \+ a9 l! j! z( X: Z+ I% d0 }+ `+ O/ ^; {
如果有修改过以上目录的源码文件,则需要执行以下操作:0 S: B$ i' ?; F" @ u8 i- n
F& n' S/ O& I Z1. forlinx@ubuntu:~/OK3568-linux-source$ source envsetup.sh
% ^3 [- N& m: m- l
; j% x9 M9 N- ^) p, n4 g- d! I2. 选择某一平台的 recovery 配置,输入96- T9 S$ ]! n% j; ~9 A
, l% [* s) c' e8 t9 S0 g5 z3. forlinx@ubuntu:~/OK3568-linux-source$ make recovery-dirclean && make recovery #清除编译产物重新编译, ` C$ \& a* W6 w- _- A% T
. k9 @) j8 D% |; X t0 U' p7 D
4. forlinx@ubuntu:~/OK3568-linux-source$ make rkupdate-dirclean && make rkupdate #清除编译产物重新编译6 [" {0 Q4 J- j, v1 u! V
) O7 `; }$ e5 Q7 P/ c/ w' F
N5 `, ^/ w L1 L. Y+ z6 N- F! Y) M$ R6 k$ L5 \2 }. y/ O+ l
+ D, t$ _8 i, v1 M0 A
如果没有修改过上述目录的源码文件,则直接执行以下操作:
3 ]: |( [; X( S9 M) S0 l Y4 i
* U4 h3 B4 l+ b2 o5 B8 M1. forlinx@ubuntu:~/OK3568-linux-source$ ./build.sh recovery #编译生成recovery.img
( G% Z2 q9 B% Y% L5 S/ E& L! t5 u4 ?! X+ W
2. forlinx@ubuntu:~/OK3568-linux-source$ ./mkfirmware.sh
- d3 j0 a; g e' C1 @8 j7 _9 Y
- K$ U4 l) P- U( E; W #将生成的固件拷贝至 rockdev/目录下1 {+ s v b f2 E9 _& m
' _& x3 D9 [' p' ~! N+ {* W
烧写/OK3568-linux-source/buildroot/output/OK3568-recovery/images/recovery.img文件。7 u5 R3 G# @0 O3 ?. b; y9 f1 a
0 D+ T( k) u& [
3 t' `$ o' u6 }
P9 S# G# a" _' @
$ M4 M! y( k+ q2 [! b$ M. ^: ?点击设备分区表,勾选9,选择recovery路径,点击执行。* p! [ H' v3 E9 E# `
! x$ p \* z* ~) L- w; C3 L5 W% ?# P0 Y c% O. z2 j. A
" }9 ~- q% H6 P9 h& m) e+ S! a* K
" F/ i' e w, j0 E4 J$ J; d. Y
' _- E9 R$ g% \$ _
1 }% }- \5 f# r- D, n8 I* ?! Q+ |
" e" s* D+ n5 g3 q. P3 b0 L5 [
/ q' s" C. F' S6 C
02制作升级镜像
; F* H8 D: P X5 Q3 j* s+ B/ i" O- I, h
如何验证是否升级成功了呢?我们要先对boot.img文件有一个初步了解,boot.img文件存放有设备树和内核,我们只要对设备树或者内核进行适当的修改即可。本例程以更新boot.img文件为例,对设备树进行了适当修改。
R3 P9 Y0 r6 s! I9 x- D0 L" \# A1 _. I H% J
修改 /OK3568-linux-source/kernel/arch/ARM64/boot/dts/rockchip/OK3568-C-common.dtsi设备树文件,对forlinx_control节点做如下修改。默认只打开HDMI输出,将MIPI和LVDS输出关闭。- ?8 M+ I& S9 s# a; T3 P
8 ?7 v7 O/ C9 \9 b% o v. H9 H) p
`# m: W7 [9 O3 I* o* l! K) M+ h2 i1 l/ Z: p
, \( y. F. L l
" X) `' ^8 m, m9 Q* |# v$ t) P1 [6 j! s
+ c: g; v/ m% C/ X9 \# m( l! Q$ K5 Y, d- z/ ]: d) g- V
+ r* O) @; C j8 t
修改/OK3568-linux-source/tools/linux/Linux_Pack_Firmware/rockdev/package-file文件,根据需求修改该文件,本例程以更新boot.img为例,所以将其他.img文件注释掉。用户可以根据产品更新需求对该文件进行调整。
% x- s2 }& \9 p* o
( u( B% w, i9 w. O$ ~! c2 V) A
! g) ~: F: ]& K8 }9 }' P; `0 m _ L7 x6 {( R% u, Z
0 Z N3 H" R' E: A0 @4 O2 w& ~# r
% ~* u: Z+ `% ]" w- k, D" v A4 u1 y9 K" l4 H/ x6 O
# X+ I) e( H4 B1 ] { b
' V0 t2 z1 L. a0 B. o
本例程以修改设备树显示为例,修改完设备树后,重新编译内核。: f/ @0 q0 k* I# Y+ d |5 M
: i/ B7 C# O E
+ J6 e0 R% A2 T5 J3 J6 M" t+ f7 e5 ?
4 w" D- m7 r$ o$ {8 R- Y4 E: X1 @
" q' j- a. E7 ?; j$ S$ |8 }
03升级操作
8 ]2 M6 S7 \; P3 z3 i( M" d5 m1 V7 e2 k2 K M
SD卡或U盘升级
; O G# ~3 c' Z# {" Z9 _# w" {
: \$ S: ^* i0 c. [将SD卡或U盘默认挂载到OK3568-C开发板的/run/media目录下。将update.img镜像文件拷贝到OK3568-C开发板的/userdata目录下,重启开发板后系统将检测该目录下的升级包自动升级。5 L2 \# {* x' ~: m4 R0 @; F, Y
3 }5 ]+ y/ I9 l: U$ q3 q0 @ Y# D
2 k1 p' F/ @0 I% ~0 V6 p
' G% ?3 L3 ]7 l
8 s5 B/ v1 {& F. P! v! \" }
ftp服务器升级
% p" v5 v. ^' k7 C# j/ R4 ?; B% W6 V# g! C3 E4 U
开发板端执行如下命令,将服务器的升级包文件拷贝到开发板进行升级。
8 W k( N& L/ V) d& g
. y$ Z1 {) x1 g% t3 o* a; [1 g/ C* A
6 o& K( U: R8 t4 }' x6 b: b- i$ w
; g7 v& A" d7 o- _- _# u% d! u# @9 i* o3 |! Q2 X
+ N+ M- x% j4 p4 X. ^! U# W$ A
- ]! z6 ?! q0 K `6 l) p6 K下载完成以后使用以下命令进行升级:6 O, X0 @) R$ u1 P3 n; O1 v1 w
$ a& c- C/ l4 ?3 Q
update ota /userdata/update.img( M2 X1 E; r! q* r4 n' ?
' p: A) x3 T1 U& H3 |: n1 ]
4 Q9 a! T5 i2 z9 N+ G2 f( |& s6 y( B$ i4 [( l
/ Y# x/ f. m* Q- s; w1 H
升级过程中设备将会进入recovery模式,并进行自动升级,升级成功后会进入到正常normal系统。
3 X# f D7 L' x8 C$ |
, C- ~1 I, Z( X2 K( u验证测试结果
# _6 b/ z# P3 `! N' |: D; B, H7 E将OK3568-C开发板上电,串口终端按住空格键,会进入uboot选屏界面。' J) n+ C8 }9 q+ A
6 M3 ~9 a) S2 R- p8 v6 j: {5 a# Z' E- V! K; i
烧写默认出厂镜像文件现象:默认是开启HDMI、MIPI和LVDS三个输出。) z: q$ Q4 ~1 Q& t" K
5 o# M* j' B5 k( l* w! X( J4 N- S# u2 B* x
# l2 S6 n# `4 i- f7 v
) T% n$ ~9 q! @
" Y: Q/ B7 Z+ |3 `7 x u' j1 C; s
' d8 t% M( H, l- i- L' m8 d
烧写升级包镜像文件后现象:只有HDMI显示开启,其他的两个输出被关闭。* y3 J) I" Y- v% A+ g6 H" |. _
# \8 ?) Y7 Q7 H5 ^% r. T0 M
- J- t1 E) j" l3 g" g9 H& M0 v' P
3 l5 l: [( G: I& d! u/ w2 a1 m( l: N% A8 c- K; ~ w I
2 n' A2 e4 w/ V. O注意事项
2 V% J. I3 t4 o8 C8 Q5 A+ ?. l
0 r- e% T& M% I6 ^$ F0 w" n; g. k打包update.img固件时需要注意,升级固件可以全分区打包,也可以部分升级,可修改package-file文件,将不要升级的分区去掉,这样可以减少升级包(update.img)的大小。# V/ {# d) S; T/ y: V
1 L6 H' v4 q# q, S6 h" d+ j
package-file中recovery.img如果打包进去的话,不会在Recovery模式中升级,为了预防升级recovery.img过程中掉电导致后面其他分区无法正常升级的问题,该分区升级放在normal系统下升级,执行update命令时会先检测update.img升级包中是否有打包recovery.img,若有则升级recovery分区,再进入Recovery模式升级其他分区固件。
" v2 i" h, c8 n2 i# Q; i6 g9 O g, ~# T* s
misc分区不建议打包进update.img中,即使有打包进去,在升级程序中加载判断到后也会忽略该分区,即使升级了misc分区,升级成功后recovery程序仍会清空misc分区中所有的命令及参数,从而导致达不到预想的结果。$ r0 G/ t0 ^3 r7 F6 D7 p& v7 `0 L# y9 T
/ V+ m9 _& u# K: Y
* Z; t- k2 }8 s' a+ m6 o如果将update.img升级包放置在flash中的userdata分区,则需要保证package-file中不包括userdata.img被打包进去,原因是可能会导致文件系统的损坏,升级成功后可能使oem或userdata分区mount不成功。若从SD卡或U盘升级时,可以打包userdata.img,从而对userdata分区进行升级。升级完成后会对userdata分区重新resize操作。1 ~+ n z' G* [$ K- ]$ T
|
|