|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-4-10 11:26 编辑 $ W' P5 z1 o/ j5 ?! R+ w
; k7 d* y0 d. r- \& x本文将通过飞凌嵌入式OK3568-C开发板介绍OTA升级流程,本地升级程序recovery执行升级的流程及技术细节。
8 V5 o( Q# {; u; z9 v. Y' |- L/ [& Y. f
& S+ j! Z- Z3 X' m: m
3 @1 [: l. t' X6 E. `* q
4 F% N% [5 e. X( N1 M* O
3 @' |( a# n0 p8 R6 |( I01制作recovery.img
' t6 l3 T, T. ~4 z9 P
( i6 Q' R" K) v4 u8 {$ jrecovery相关的源码路径:3 I& }1 }, _2 v' o
! g0 R0 h6 X8 N: G1 Z* Sbuildroot/output/OK3568-recovery/build/recovery-develop9 Z! ^3 G$ }) B1 r3 w5 V
6 b* w6 b y4 L0 S1 K: i9 X
3 {8 }3 Y8 w3 O. `! G$ w5 p h
3 b. M% d0 i. e" U# w9 x, N如果有修改过以上目录的源码文件,则需要执行以下操作:
9 U3 D$ k0 E: h, |3 y5 J$ Z* t: P4 T( e8 j0 h
1. forlinx@ubuntu:~/OK3568-linux-source$ source envsetup.sh
" I9 Z5 M( t4 X( s/ P0 v4 b5 ]* b, w8 M1 Z
2. 选择某一平台的 recovery 配置,输入96
/ y3 |$ v7 O" K+ g' W4 T/ G; q) y q: H& Z
3. forlinx@ubuntu:~/OK3568-linux-source$ make recovery-dirclean && make recovery #清除编译产物重新编译
3 |- p+ n# ^4 q4 Z4 \# v- C2 L+ u o" w
4. forlinx@ubuntu:~/OK3568-linux-source$ make rkupdate-dirclean && make rkupdate #清除编译产物重新编译
) z0 s( u, ~/ s% |! h I( s- I- K( o& h$ P! A8 o
( K8 D L2 V( F: @5 V( [
# k- Z C n6 L! J1 m9 }. q. G8 T, h& p0 t
如果没有修改过上述目录的源码文件,则直接执行以下操作:% @1 }: p! h5 I; N* f
9 r: K! y; s8 j1 i9 I0 E1. forlinx@ubuntu:~/OK3568-linux-source$ ./build.sh recovery #编译生成recovery.img1 B$ ]0 W ?- H! ?# a8 {
+ ~( k5 G( k/ g# `% z' N
2. forlinx@ubuntu:~/OK3568-linux-source$ ./mkfirmware.sh
& a8 `% F/ N9 O! q
1 y1 z+ g0 A: p #将生成的固件拷贝至 rockdev/目录下
4 L' a8 q& C) _( M2 g2 `" n1 \/ d
烧写/OK3568-linux-source/buildroot/output/OK3568-recovery/images/recovery.img文件。
" [1 ~( P/ i& S
/ X+ L. x- x+ |+ C8 u6 {4 d( |$ r( M6 I5 I* F7 e
& W: q, J+ G6 R4 O$ x
. G. [$ a7 m* |) s% k$ }点击设备分区表,勾选9,选择recovery路径,点击执行。; H8 R% W6 l. k' d- _; z- E8 ?2 T
/ H8 M/ k9 t7 A" |( o
& f6 [0 _+ |# M7 K
$ V3 V1 C( ]( C2 ]; F/ i7 M* t) n4 e1 N7 g" b
8 A: A: @9 ?2 B" u. b T& A/ ?5 n: q. K
6 G$ I; D' n' m6 j Z6 a2 l5 s' ?
02制作升级镜像
2 {' Y6 l0 r( y) R! p
$ j; o8 B$ W5 d, G如何验证是否升级成功了呢?我们要先对boot.img文件有一个初步了解,boot.img文件存放有设备树和内核,我们只要对设备树或者内核进行适当的修改即可。本例程以更新boot.img文件为例,对设备树进行了适当修改。
2 e3 c+ N" ^2 C" m& e; [) v: N6 }+ q
1 C/ |) F8 x' V/ i修改 /OK3568-linux-source/kernel/arch/ARM64/boot/dts/rockchip/OK3568-C-common.dtsi设备树文件,对forlinx_control节点做如下修改。默认只打开HDMI输出,将MIPI和LVDS输出关闭。: `) B% `# v, |) b6 \' Q
6 ?4 b) f" H$ }, y# F+ E, l, Z* D
! @, G& Q" \5 ^; f+ F% f6 O! J. a" ]7 r0 M! o
: B- i7 T7 |, |. M0 m
, K/ H* P$ F, R+ j1 h( X) A
" r+ b) o7 F' F, K7 Y" p2 d* ?$ {& f2 Y( q% y
* W7 E* o$ A' m* n' K* U7 ]
- g3 o5 ?1 j) c: @8 L修改/OK3568-linux-source/tools/linux/Linux_Pack_Firmware/rockdev/package-file文件,根据需求修改该文件,本例程以更新boot.img为例,所以将其他.img文件注释掉。用户可以根据产品更新需求对该文件进行调整。; m6 z* H" v" `' `
; m; t: c b/ H+ d4 Y R8 G3 L& o, b t
( E" {1 h" z) [% E; P: {; B8 H z- Y* \& `4 j5 Q6 B
$ d( ~1 `1 N+ A. {; j$ X5 b+ X, m- h; b* n$ l3 l
1 q- @5 ?3 |, q9 f$ P; x3 z" Q. O* j" S9 O) k9 O, U5 i: B
本例程以修改设备树显示为例,修改完设备树后,重新编译内核。
6 M& @' L. ~: w) i, E1 d5 V5 R/ q0 r! ?+ M9 F( [. R
+ x+ [' ~ x* H# }# G
$ L5 {1 U4 U- n) r7 X4 C
/ k( ~2 ], b3 X: b; r' F7 _$ U1 q. B$ h
% j8 G- y! ~2 d5 @5 X# [03升级操作/ c. R9 n; j) a
* O* A( H; A* JSD卡或U盘升级
+ D/ `5 _) v7 \# ]7 v0 C8 J5 z8 b+ k5 j" O l
将SD卡或U盘默认挂载到OK3568-C开发板的/run/media目录下。将update.img镜像文件拷贝到OK3568-C开发板的/userdata目录下,重启开发板后系统将检测该目录下的升级包自动升级。
" B% D+ W6 H& k; S. O" G G: G. m3 }6 G3 T6 X3 Q6 D2 T
5 L9 b, @1 R5 M! h
0 B' ^$ ^4 o' _
+ [+ s6 [$ U4 }& y0 Q: d$ I
ftp服务器升级
) K3 C4 A7 s) J5 Z: F
6 C0 ], K& q: T( h开发板端执行如下命令,将服务器的升级包文件拷贝到开发板进行升级。, @: `1 g5 o, J- ~: J* [6 b5 Y" Z
" C& x7 ^% w$ i9 G2 X4 L" J
) W' N) X; T$ s2 b3 {
e+ X$ V% |6 z
: ~5 q" n) |8 W7 q% T* ^9 p& p$ C$ q6 {' e* Z9 c3 v' V
1 l3 m- D9 E$ z- ` N \: @4 g: h: E; V% b3 G. O
下载完成以后使用以下命令进行升级:% h; H% e+ i3 U X4 T
c. Z6 H$ [* p* i& B5 Uupdate ota /userdata/update.img8 l7 b5 }- x9 z8 {/ G
/ T) F( _8 N2 Q
4 u# P* Q1 t6 l. x, w( H; h, l: A @, W+ X
2 c; R3 T! U" E7 Q. @6 }( ?: B
升级过程中设备将会进入recovery模式,并进行自动升级,升级成功后会进入到正常normal系统。( ~& q0 p, X3 W! J! e/ O% f
! L8 Y( a4 X- {; J验证测试结果3 L$ L3 z+ {# e( M1 N) w+ o
将OK3568-C开发板上电,串口终端按住空格键,会进入uboot选屏界面。
! {# ?7 `7 r, A6 _) \' _$ p) x; `# E" h! r: Y' E3 Z& t' N
$ J( C5 Z* ^3 p* @烧写默认出厂镜像文件现象:默认是开启HDMI、MIPI和LVDS三个输出。
/ o7 g# u3 ]* w( t5 s/ Y+ ~4 \% O1 ]3 a ?) P- Z9 L
" f- ]: M7 {8 I- l9 [5 W+ Q1 \
a& l/ S1 h& q1 K+ f8 Q/ k& ^( G, e
4 W. q' f$ T) H
) B" y- I% A# o! [烧写升级包镜像文件后现象:只有HDMI显示开启,其他的两个输出被关闭。
% L, S3 J" r7 B+ O% o: ?4 k9 E9 `# y$ i4 j0 k6 Q6 v- p
6 k9 d; w( d( ?3 s7 C( o1 ?( W0 q5 `
9 _; h" Q4 j- K8 Y/ ~. J4 N; }5 Q6 f8 ?' J6 F1 T
注意事项
2 U8 O4 ^ V- o/ [6 f0 e5 O6 e& h8 \- R: \4 t6 Q) h
打包update.img固件时需要注意,升级固件可以全分区打包,也可以部分升级,可修改package-file文件,将不要升级的分区去掉,这样可以减少升级包(update.img)的大小。
& p/ z' j' M4 |6 D, e
! y2 k. ]2 E$ c# Y# Dpackage-file中recovery.img如果打包进去的话,不会在Recovery模式中升级,为了预防升级recovery.img过程中掉电导致后面其他分区无法正常升级的问题,该分区升级放在normal系统下升级,执行update命令时会先检测update.img升级包中是否有打包recovery.img,若有则升级recovery分区,再进入Recovery模式升级其他分区固件。+ c& b* ~7 F- O6 i* K" b$ I
6 Y, m+ M) |8 @8 |# A
misc分区不建议打包进update.img中,即使有打包进去,在升级程序中加载判断到后也会忽略该分区,即使升级了misc分区,升级成功后recovery程序仍会清空misc分区中所有的命令及参数,从而导致达不到预想的结果。
+ B# u: ?$ S* n5 o" s
6 o7 q [- g. d# ^. `
5 Z& X/ A$ I( ? g4 l I2 j如果将update.img升级包放置在flash中的userdata分区,则需要保证package-file中不包括userdata.img被打包进去,原因是可能会导致文件系统的损坏,升级成功后可能使oem或userdata分区mount不成功。若从SD卡或U盘升级时,可以打包userdata.img,从而对userdata分区进行升级。升级完成后会对userdata分区重新resize操作。5 ]$ ]. m- y( x0 \/ t
|
|