找回密码
 注册
关于网站域名变更的通知
查看: 403|回复: 2
打印 上一主题 下一主题

RK3568开发板上手编译源码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-5-20 15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
一、准备源码
) K6 |" O, a; s' f# O8 C
7 F% M, U6 n* `. D9 n

: b. Q6 N7 H8 `+ r! W. t& H0 W( W3 |/ J9 v  p
4 c' Z; g% K) C; m3 ~0 Y2 y" m
1. 创建工作目录# G6 Z! L% p" E0 H! u# \$ g

6 G9 ~& H! y$ p& C- h; P: l$mkdir -p ~/rk3568
2 ~0 d- \  [( X/ q% ^

& A5 x) G1 R. ]# H1 j
7 U7 b9 _' y0 |+ A
# k; v6 x! Q* ]0 E5 w- e
, H7 x! S3 D' S3 u6 u0 V
2. 拷贝源码& ~) ~6 ~( M$ b/ w: r/ [: c4 U* O

' x' p9 @: K  c- i: E将RK3568用户资料中的源码文件OK3568-linux-source.tar.bz2.a*拷贝到虚拟机~/rk3568目录。
3 g9 l0 n' g+ h0 d. T
* h3 c& k$ h4 B9 C

+ S$ W# N+ {( e) ~  S8 t1 |0 f, w) T
* }, O' l  ~" J( h

0 y- K: g/ |6 c

- L" W! v- _* T8 u# c
, O7 O* z# Y. i$ Z) F" w0 v- _3 }6 j8 L$ k/ g
2 R$ G4 j# F. N( x
拷贝文件的方式有很多,笔者使用的是共享文件夹方式。" T% `+ R' H9 r  K3 v/ B" M. V- Z

' M' V7 S2 `2 k0 Y" K
' y1 n# ]$ C' p/ t2 u
# M5 Z/ o) [% S# U# a

! Z( _0 f! H) }7 d' A【注】OK3568源码使用分段压缩,每段最大4G,这样方便拷贝,因此有些存储器单文件最大支持4G。
0 Z; \. o2 w* `1 O" Z5 H
/ C/ f$ t2 q. }1 L) Q0 A4 ~

/ }$ |( V& v2 b' J5 U* [1 H& {6 h) D4 N, Q5 `
: _5 O' y! M7 a7 d/ H* d% P
3. 解压源码+ Y+ I* ~# g! O1 p& {# A

- u* }) a6 ?5 {  j( b$cat OK3568-linux-source.tar.bz2.a* >OK3568-linux-source.tar.bz21 p+ G* k- R# b) @, ^: d
+ l, H/ {* X* I8 c
$tar -xvf OK3568-linux-source.tar.bz2
9 \; C" H: h0 x+ v; U  x0 ^5 n
: m( E( J" `' M% k4 v2 ]" h

/ X: U/ X) R+ ?! K  q& s" \5 p# c+ L& M8 q% l* _  P  r' Q
0 Z( m4 z' {- j
耐心等待完成即可,解压时间有点久。
! J3 d7 Y7 E6 Y# S

# f2 V5 Z3 [+ h. j( S# e
8 a0 y# y+ Z  c1 u; }# `# E9 F2 d5 S
. G' _. V5 n0 @3 l8 Y9 P( a8 k
4. 进入源码
8 b& U: T* H: H# ?& F" i

5 U$ b$ l1 n7 _# c- v9 e8 ]/ z$cd ~/rk3568/OK3568-linux-source( S3 J+ h' f' H. [8 E' f. A6 x/ u

- v6 o$ D" S5 \, Y4 e目录结构
( `2 J1 V, W8 ]
7 [) ~/ S6 y! m
0 N8 h* _$ s$ W) S" ]+ r

$ a6 N- D4 v. I; `+ J
" T$ X- m( k) Y3 B( p. |3 m

& L4 k' y1 j0 \: V. e
2 K6 r" b1 p) i* i. K( w
) r) v3 R) s! X4 I' R
二、编译SDK
3 T. S6 P; v6 v, ?1 x

5 _; R) d8 [: m5 m% L9 z7 I0 H4 Z

0 a8 G6 F/ c+ W% N  b- m% H
) G1 E+ h6 o9 x
1. 编译前配置
) {. m- b1 Y, j( a
. M! z" O0 ^& U# R5 E( M# b
在device/rockchip/ok3568/目录下,有不同板型的配置文件,选择配置文件:
+ w7 R9 d  e4 l0 @) ^9 J

" `8 x4 P1 b  M1 Z  }, D+ }$./build.shBoardConfig-ok3568.mk  1 E0 t0 G* ]& }9 |4 o
4 b" R1 q5 K8 j# T$ h. l
相关配置介绍:
/ s$ V) p& G$ Q6 ^. A

1 E6 F' l5 ~. s2 U5 V) w  k; U3 q& d2 o% W( f
1 A8 c! G- r5 Z. I$ t7 I) A) u7 d
+ a8 ?7 R* {! h- W3 ?' ~

: l" i" y1 W$ A% N  S" d/ a3 g
( Q% K& z& B% |/ [) r' U% j3 N! t% W
2 J9 Q$ b3 b- H$ `- Z. n
) g) X& ]1 ]' d
! C3 H& @2 Q9 W; v$ ?, s; p6 e

1 V4 E( r3 q) R6 j4 d& \  z6 x

, D; X  y3 z- a2. 编译
/ `% h% ]5 V+ N' L

2 M) V. A- G3 t0 g4 `/ f  t编译u-boot
4 s/ r5 N* ~9 t% g
5 M& T0 D8 A/ k4 e; Q
$./build.shuboot
& R0 [% g. L' X6 [  _

, D  N# N& X+ a0 K) @) i: E/ d
6 s; c. c6 {9 [) o+ L  J$ b* H! F5 O5 Q& I& m$ m! V' @
5 |0 m1 z4 r; s2 J
! y; F& |7 L1 l# K

0 r. E. L- N' k) A. k

5 R5 k8 y+ f/ v/ S% g, z5 T……8 ^0 O/ D! d% I* |9 o9 Z

6 E; T! M; ^  r9 ^8 k6 u$ S$ K. v/ q9 o% G: ?3 Y
( V% V* }3 e* t2 |3 @, t' K

: ~) g  L& w5 l/ S# t/ _5 v9 n2 o
% X) S& {4 _% L; t, F# X, x5 h- Z

2 p+ _+ d9 ?" I' W1 i- A/ _" ]) D+ N% `7 y
4 K$ V; P+ l0 l3 c/ }& r" k
编译kernel/ a4 f  o2 [" Y5 V& r9 u  |) \
3 d5 `2 m. K% i! `: m# [
$./build.shkernel1 u! I* a1 ?1 @8 J& V) q
( m/ Y5 ~1 f! [( `* X

$ D' ^8 o: ~+ u* V
9 N" P: ^7 Y! @) s& N/ `. P
: M' N' g, W" H( |- Z# H5 D
) Z% ~( V6 K+ y- s
  k) V0 @0 E6 \4 @: r$ H. l
; `7 M# g5 {& }- Y4 Q! V. W
1 D* a  A# Q: t# B" o( l* t( c
1 T1 ?& F. g# \
# V$ ]; E' W+ ~! G3 @) ~7 ^/ W
……. D' c3 K* c- y- O

+ ^3 l1 U4 }( l6 B
: x2 \1 s. z0 h+ F, b. {4 M/ x- y2 h# J7 d6 N
8 B3 c7 |* Z6 f! j+ \& \3 b8 s
+ ~/ O/ J  N; {" g0 Q

8 b5 d1 ~& @. h- }! X
$ U6 @# i3 Z6 g' b
: j- h1 |$ C9 P1 m

, x; ^% v2 H6 U* r9 `2 n【注】编译一段时间后会弹出下图界面,需要选择,提取图中信息,VCCIO4和VCCIO6选择1800000其余选择3300000,使用上下方向按键选择选项,按回车确认选择即可。
- ?& Y  s+ p: `7 p
1 @* r% }* T( U. t! f; i
% d5 I# [  Y! w. M* t6 k

! _. a5 F) |8 [. s

8 a% K( h% T' ^4 R4 p7 |
0 D: y, G4 c8 N- S1 {- Z3 B7 e3 l* O# T
编译recovery
4 R  g* p8 @: y2 U
3 g  n5 i. @1 P
$./build.shrecovery
: @( X; c3 R# n
% u' t" a; O5 h# _1 d* y( u

' H0 t- [+ G8 h  `- ^2 H; F: A2 `$ V. g1 T1 W6 e5 b8 B5 }
; w  {' J" T3 ^" }! `, S
* W' ~, S3 V9 x* s+ y; l( d
……
, b  \) l% S5 e9 |" I( o1 W
+ G9 `. F: h, @: L- p% l) u

5 G; O5 _' N% ~6 c/ t1 |( C' @& z2 ~9 t5 S) C3 `3 d: N
5 y/ L/ h( X' ]

6 ]" m. D5 V* \3 ]# x( h, X
7 d- a9 o/ X1 |6 e) i
1 y5 l1 H  W8 d- J: S8 t  B1 i

* Z: m8 S# Y6 v' e3 [

. Z! e" r4 H+ U, ~' @0 e- b编译Buildroot根文件系统: U2 B/ v2 B7 ^0 t" V- W; s) a
6 ]9 i- d9 o& S4 k6 s0 C% n9 B
$./build.shbuildroot
+ d; w/ K0 w' y5 w3 F; i

: \9 V7 V$ t" q7 ~. r9 I7 Q7 l; `) I2 d; L

" C1 h6 D; x6 y$ ?1 u. |) @+ l
! B, U! P9 ?9 X3 ^
9 \0 a& H# E# Y1 q. T
3 l. b# R$ d7 ~/ _7 \
制作文件系统的时间会比较久,请耐心等待编译完成。
9 c/ I. @3 _2 v! v& q6 f: a  F5 C

' O- y2 \6 q1 V% i. Q* L; s
; u& X' e4 \+ k3 X6 ^- h9 E
1 [# x8 T6 F2 o
5 c) g6 M+ h" L' i4 |& B, T
【注1】确保作为普通用户编译Buildroot根文件系统,避免不必要的错误;
4 K4 }3 _+ Q* l4 x/ y1 o
1 Y4 t8 ~  M1 [+ i
【注2】如果不想编译文件系统,也可直接从已有的镜像中解压后,将其拷贝到rockdev目录下。
0 q6 C! N' i0 V. `3 G0 G
1 P: p5 N0 R2 _  ^3 c1 i$ S

4 Y# f4 r% f0 p7 ^, w# S8 A9 O6 A' W6 @

" a+ m: ^/ ^* s' l$ w4 Q. C. `) B. Y4 \3. 打包固件
/ b# ~6 k1 h2 |% _: r

4 q- f6 G9 M: L/ t" S- x更新各部分镜像链接到rockdev/目录:
: J* K; \3 z- {( m9 S1 H& n

* m! K; l6 l& [2 a- V$./mkfirmware.sh; }' a+ Z( ~9 |# P
8 G8 z6 a0 R( ~$ v. }' _
打包固件,生成的完整固件会保存到rockdev/目录。! N; n$ q- e, G( m& I

- ~! K" X6 R) d$./build.shupdateimg
# j( R( B' y7 v+ y# T: V& ^
% E! e( D; i& Z% O

" _% U$ F% ~! I) K
+ X* L5 y& Q( o( m+ v

3 Q" @# \1 y9 i9 ]

3 A8 ~, X  M7 d  a
$ u; }3 ~6 q1 \* j1 r# N
[PS]全自动编译
' V6 z  c& V9 X, T
0 ~* Y) i# `4 V4 A( w. R2 a
全自动编译会执行上述编译、打包操作,生成完整固件。; Y  E  N' p) _) ]

- k6 m/ x& Q# G% y6 B1 y* I+ m$./build.sh0 f: e" w. a8 [5 n+ v$ i0 D

2 |  L$ r  l- w9 c' c' f9 l3 l/ f1 A# C

2 U" I  u8 y  Y6 @# ~" T

3 N5 s, k$ ~$ S2 b) K1 P, G3 k; D
) Z' C$ J/ v' H- u1 ]0 d6 L
5 R4 W$ N' w/ ^4 j1 S- F6 ^# }, r# M
三、分区说明8 k$ V$ \* x; i4 S0 \  e
% i8 f* E/ ?  g% M
& ^( z2 p# E; n: w

- O* L( B7 S% g# G3 V9 w7 M+ Q* m/ Y8 i

! l. R5 S, x# ^% ]8 P: y  C  m1. parameter 分区表# P# u- Y( Y5 x0 I9 ^/ r+ c" m
9 D( e$ \* f/ u9 U
parameter.txt文件中包含了固件的分区信息,以parameter-buildroot.txt为例:
4 V0 V( C7 s5 f' f/ _0 s! H
9 w/ U) B1 j2 E4 J
路径:% [4 j$ t5 o& b; g0 i
( k) M  E) }$ M7 q6 V) C& e6 ~; Q
device/rockchip/ok3568/parameter-buildroot-fit.txt
7 |0 {4 T3 U6 R* P0 h  ~/ B6 ?& n

0 u- m+ S, w% R& Z% o; p' f: v+ Y7 r  F9 R6 }7 L
$ [9 ^; N! d$ @5 c0 n& b" N! m
- `: D# n0 f4 M! G$ m% t. b

+ l* g4 Q$ ]- D

4 Q8 @- x6 z" Q8 NCMDLINE属性是我们关注的地方,以uboot为例,0x00002000@0x00004000(uboot)中0x00004000为uboot分区的起始位置,0x00002000为分区的大小,以此类推。
5 |( \; Y( t2 v2 K' j
, p$ e; G* Z: r8 w) w* Z2 N

: y5 i0 i+ q- X
/ N+ H1 D3 L" D1 y- Y
, ]( H, B' B. s" y/ I: {$ e; s
2. package-file
" O8 s4 c6 K+ m6 ^

6 {) z. H* d0 w2 I' ^package-file文件用于打包固件时确定需要的分区镜像和镜像路径,同时它需要与parameter.txt文件保持一致。
; |) Y* p4 p% k  W9 D8 K
, O- P  l6 ?0 [# W* x

- [8 @/ _; v& g* l  ?. K: x  J% _' a, R8 W

7 n  H& p0 G# F* z1 {8 M路径:  Y, _0 e9 ^. L3 g" C

# U; o: B0 X% f0 x# a) etools/linux/Linux_Pack_Firmware/rockdev/rk356x-package-file
) g: x2 k; W- N$ k" W
9 L: o# n5 j5 w' }0 Z/ _
#NAME        Relative path. d4 K: J$ L0 n
2 f/ i+ _2 X5 d4 z3 t
#% O7 k( H: j+ ^  i7 t9 i5 k

% z- n5 `5 W( ?#HWDEF             HWDEF
5 d: a- t5 ^: n* J; l% z
) K& m3 {' i5 R, X, B) O
package-filepackage-file& U3 l& F: z* d# H* I% t
& N& G" g: r+ O9 H* L' [
bootloader  Image/MiniLoaderAll.bin
8 R" T5 c9 b9 m% I4 |

1 E) N5 d  B$ H1 g% `parameter   Image/parameter.txt
% y* L+ D6 m- `% I
% w6 r* n' a$ a9 }" V1 D$ W& P- d! K# `
#trust          Image/trust.img' f) y8 v2 c/ ^$ y; Y! e( R

9 D: h! Z$ ]7 J3 Duboot          Image/uboot.img! l9 Y4 t1 H/ s9 ~
" A% N+ M# U/ h3 a
misc             Image/misc.img& p3 ?1 p5 c6 s9 s8 n: [1 q: ^
6 Z- P0 y; f  y5 P  W/ h
#resource    Image/resource.img6 v8 N- u( f3 B" P7 \) Q

4 v' V# c/ d4 g! w9 K- `9 k#kernel        Image/kernel.img1 A/ i+ b% s, T
: g/ ~) B: P# [6 R; ~2 n
boot            Image/boot.img7 V$ i( N+ _( g% q' B6 T. U  e

0 j8 ^' [4 c; v& m3 m+ Q# wrecovery      Image/recovery.img
# h/ f9 G6 c; U$ r0 v' s' V4 R
0 T2 k, V2 O' F& m- D& @
rootfs          Image/rootfs.img
* H7 D  N# L  U6 _! |$ k$ z- Q# G+ `& b

2 K+ W- `+ O& f6 y0 P$ w( S8 C6 Eoem             Image/oem.img- g, M& q5 T" J

3 {9 [1 k* A+ a# Muserdata      Image/userdata.img
8 j1 y  T+ q* R7 ]4 J6 }8 k

( A( S' K* C4 j* p
: s# Z! `4 D% J/ I7 m+ P# ~: R1 O  x8 ?0 N
% H: f( [) U$ E- ^9 y" R* I
#要写入backup分区的文件就是自身(update.img)
% F- V/ p8 Y7 I# V$ b2 M2 f0 B2 Y

' E5 w; O4 C# }; M5 p9 U$ Q#SELF 是关键字,表示升级文件(update.img)自身" n& @' v& l" j, j: p, x: Z8 b3 B

: b# F5 c( y) Y  ?% ^, K#在生成升级文件时,不加入SELF文件的内容,但在头部信息中有记录# e7 W0 b6 R  [/ @3 j4 B
) i$ r$ [1 I$ @8 `+ n3 n0 ]# v
#在解包升级文件时,不解包SELF文件的内容。) e5 x6 E0 _) ^4 a
' B& O9 |. x& Q( E% c
6 d& |. m& T, [6 g" e* D3 |0 P8 ?

: z7 }4 C% G) W& M5 Z
8 t; b% y2 s- Y* o& i$ b
backup        RESERVED
7 D- t/ p& L" W  J8 O
) J: d1 \6 w: y
#update-script   update-script9 h' I/ I+ S3 q9 B9 {" m
, y. c  M, K3 @) [
#recover-script   recover-script
/ ~- y8 k: s2 O4 u  o
: L. j7 `* H$ o( B: Q

  `; P9 \0 j" c( k' G- F9 P4 s+ U, q! x* j
% i$ L# E4 J9 }& R% W
四、镜像制作
7 \( P( P1 {4 y: r( R* Y6 J6 l- [
: B/ R; t" h& k; u* t, C/ c

; b/ n+ i6 Y# b4 L! X4 k5 p- q
, Q" w! y! u; ~9 j! H
! P, F/ x, |$ M: T) R2 F
编译源码可直接得到镜像,但是编译时间太长,有些部分不需要再次编译,只需要从已有的镜像中解包,然后再和新编译的部分组合打包即可,下面是制作方法。& l: r) t3 k; |; S: T% b# S- h
/ P. d% @9 J9 D7 o' o0 M. u& ~% ?
, B2 k+ r' @% l, o, l
5 b/ g1 U* s5 P

5 e$ o0 A- Z+ i. i1 K4 \+ ?" A1. 工具安装5 c" p; ]0 h( l( y! [8 }2 j
' w$ S, S% e2 e' W8 K
下载工具包:
# k' a% h2 i& H- ^9 t7 F
6 r" `7 q7 d/ z0 a7 Y. M3 F
$git clone5 b& C6 k( `( q0 j  N
1 A! L- ?6 i+ s- m5 z4 N
https://github.com/TeeFirefly/rk2918_tools.git: c' M; `5 f4 ?8 F7 l7 w
: k! t/ P1 ]: {7 }- G4 F" f

# o7 }# S; n8 B; M$ [! D" m3 l, f
& [, g' X1 `1 @% O$ q9 H
, y  E# ~) D( i: ^2 _5 D9 A( u
进入工具包目录:
* s; d; k$ U) ]6 O& [
% q' i8 |, m) e5 K3 e: ]) b' }
$cd rk2918_tools4 e! r  E+ S4 V4 F2 u

- l, n# n, C( b% D6 e+ f& S0 {编译:( t" m2 |5 |! O' N$ G  A( {+ c
) u* R  i7 S' R9 h% {" o
$make" x6 b( H" Q' v, W, G
1 v9 v7 ?. M2 t$ O- R$ f
$ o3 A  G2 t( x3 h

6 ~/ z8 R6 P$ e- [/ [7 O$ b  j; X! t) A

9 C) F( l4 G9 M2 a# R

4 S) S9 _- |( D1 y* D将可执行文件拷贝到用户二进制目录:) i: M3 e/ s5 n& X# @( r3 g& r

: a2 J- O$ h+ u4 P/ j4 c$sudo cp afptool img_unpack img_maker mkkrnlimg/usr/local/bin
% N) F4 e- f8 d( M- \! o( c

2 J: J8 `* g/ Y# T4 E: }2 d5 _% N+ W$ F+ m
4 Z; o% X  R& l2 U  ?

" P+ ]% R" X% V# R$ A, |2. 解包' w* T) h% j. o

  M1 G: A1 {( t& y& Y# m* O将update.img拷贝到Ubuntu中,然后使用命令解包:
/ r$ B: L: T- _+ V. @# q0 e% [
- i4 \7 ~4 O) u3 ~& d# S% o: i- d/ z7 v
$img_unpack update.img img4 O6 y: X) R$ p# p) ]8 D5 f6 u

8 ~/ x6 i, @3 u7 c8 p/ x7 \' A* {, j7 F6 D) A/ W6 O3 ~' L

2 ?2 o. x' N! S9 U. H
+ s* D% a+ {! M. r; X! J

- E! ]; B8 n! G
. N1 I! M  N9 o; ]6 ^5 W$ p; }" z" A" A. N* q3 M! X) L/ h* v

' p# a& p  @9 a( O) W5 U, j解包到img目录,img目录会自动生成,解析成功之后,img目录下会生成loader.img和update.img。+ b; |* S; `% R  {
8 @  @& r* M2 x
- q- y  p! g) k1 d

- S7 \1 Y; r1 v5 E

% y' t6 z+ z/ Y2 p2 g
2 E" U5 I3 G$ h* X$ v0 t* T7 b; i& u
+ R; s2 X- U: K; K# q$ ^, |
) d* y1 C2 {1 s# j* f: ?. @

  ]" S1 j5 g7 l接下来进入到img目录,使用afptool-unpack 解压:
+ P% t5 v7 d; r; n- _+ B- ~$ t) j# p
# _! k* ]* ]  b( b# Z3 `: y8 H0 h- V
$afptool -unpack update.img update3 G  |/ S" p3 A1 q3 e

1 }# a9 }! W5 i% a4 F/ z  F" i2 n: t# V( D  E3 v

' [2 E4 \  ~8 _$ @! x; @
- K& N0 }) J& J) G+ A

6 P1 I7 H- e. L7 @
% n! f5 T4 l# B9 D* Q( l
解压到update目录
) {# e: B7 m! O: z0 W* O! G8 W5 V
) a, v; U# x, f1 r# s" b
打开update目录,里面有很多img文件。9 v: m: k0 c) g

0 O  M7 k. O8 W
. W, i' d* L& q( t. j' ?" I+ ?( H$ c. T1 \' ]
( H3 A" ]* l/ T
将需要的文件复制到rockdev目录下。; ~; Q1 }) x6 s" z, F2 [- H% C( S

0 A& u$ |% e4 V# k% r* J
% z' p8 X* b9 t; z3 w$ J8 `, F( d
* D  Y0 E' d4 y
! ]' L& y* X2 z3 @, a1 C/ O
3. 合成update.img
+ z7 S( e$ J6 D! J# ~6 C
$ A: P" ?6 M" d/ ^
然后源码目录以下命令即可:" m8 ]5 p% x% I' x+ |3 R

: w7 C& B- q6 P8 S3 Z7 H' J$ [$./build.shupdateimg1 [* S9 L4 q- W! g. M8 |, i

6 z# ]/ n9 C. y/ z/ {% a2 l( {: t- J
6 K: c( {: p6 R) q1 d# r2 A% o
1 O5 ^3 i9 I, {3 z% n6 }, A

) k8 Y. a" ~( a8 X- h

该用户从未签到

2#
发表于 2023-5-22 09:54 | 只看该作者
步骤很详细,要是能申请一个开发板就完美了、

该用户从未签到

3#
发表于 2023-5-22 13:11 | 只看该作者

; \8 Z: K  _3 N4 {+ B( `. h8 c8 K步骤很详细,要是能申请一个开发板就完美了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-9-11 02:56 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表