EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。
& u; q# |4 o0 ? }$ q! q: w![]()
" p) t* e+ B4 p- I% i9 L* S01进入源码的drivers目录下,并创建一个名为hello的目录: - 4 \6 N5 R9 P6 e7 D
$ j& F& v; k& ~6 {) E. n
forlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers, r* B- z; O" T E& i% S
& t3 R1 F- g! |; y4 G+ x
( L9 q2 `+ R( N# K- E) A
1 M# J# w1 i; D# e+ I" jforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello! [, |9 [% }( L6 ]3 f
" `" L7 }2 K. R6 ]# M/ P' o! S8 [" t7 b4 \5 h! {1 @3 _
" l0 U( E( u+ c4 v8 x
02进入hello目录,创建hello.c: - ) f5 p% [7 F2 C6 Z b- L B* F' }
# _: b2 a# Y' ~3 W2 Eforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello! _8 r$ j( W. z1 Q1 U
, n- x& p+ H# {
- P6 ^( ^: A$ A. t* G% O' n$ N8 T
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c) C# w6 k* \( F$ {# |% u; U0 `
0 c% e, D; I% p4 z* G
1 p4 U! p5 U4 p
; W/ P0 l6 U% z; _, H( @在hello.c中写入如下内容: - 2 C4 \( v+ ?: T0 Q; I# S$ n
; I8 N7 ?+ u) [- d8 L" p) R
#include <linux/init.h>
; [4 z5 `. y5 S m
0 w8 R2 D- h/ w# y
/ Z& O! k5 C4 f3 \7 E
& ?: X! N0 Z$ u# L" p3 m" i#include <linux/module.h>& _( V+ g' V! ]( |
3 D: J+ J/ s/ e& V/ N+ y
- . F( c; Y3 x$ R! g# b
N6 j1 |% [' J
static int hello_init(void) n# U' G) t' ` W; ?
* z3 [& n( w% j2 b! L' P6 l0 B
6 }, L% p; M- d3 n' L
6 i! R- [1 O" p" Y- Q9 R{
( ?& g. \0 k9 r% i3 K$ p; C
" r0 ?. V% E; I3 V% c
* s& V5 J- I$ H" A- m! [: z
1 m$ \! S d5 F0 Zprintk(KERN_ALERT "Hello world\n");3 B2 ?% `: G& E1 o! ~
3 Z% J) Y& K, A+ s
- & p" C: u- E% T: ~3 M/ J
! x! n9 V) f0 S# y2 A, D- mreturn 0;
8 _$ C1 n" o, X; J& p) X2 x2 O% j2 }4 u: _3 {/ }' H
- + T, c7 X! R' Y
9 Q$ b* P; }) L) f* b# D
}
# V3 W, u; N' ]( D4 c& a7 v& b& A5 @
- $ D9 e, |2 { Y: K. @: {, b
N% o9 f8 G- x8 S& M7 Tstatic void hello_exit(void)
6 S( r1 g$ m6 B8 y, j! A) N1 e" R- v
- " v' L" G$ N" b' l5 Z$ Q
. [5 r) g: b, ?8 L1 {- |2 i3 i; G8 n{7 ?* W$ B1 R/ y L8 w$ U
3 j A! l0 h8 @5 a1 y - k. G( v" }9 c0 ~
" |7 f; k1 S' f( J
printk(KERN_ALERT "Goodbye world\n");
& I* f, n+ W9 B* ~
8 j! C# J3 w, H6 J4 O3 w
& S. l: T/ I5 k S% C+ b7 z
D% F9 B# o+ e4 N- V+ V3 Y}
7 Q Y1 u |3 X1 S0 p1 O" g f3 C K! y
1 @; s8 J6 E. [8 K: I, K/ W+ I! |. J) e M/ \3 }
module_init(hello_init);
) t' ~2 t( f/ Q1 g" A- r
6 l' Z8 I& u( A1 [8 t3 d+ \- 4 a" V, U: E ^7 O% R
6 {) N& f) K+ T; Q0 M
module_exit(hello_exit);! r+ T, Q3 \" b. K, T" E/ ?
: L5 m( ]1 }; h% v# q% n! J - 8 v' p& X) N7 m
1 M/ ~7 Y4 G+ a2 |; |% XMODULE_LICENSE("Dual BSD/GPL");& ]) t' A( g+ n2 c6 D9 g
# G& n. u! U P/ |
" |+ k. t9 l+ k8 F! _" H
7 w; e9 `4 z8 r" P
程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world $ u6 |: _, _* @ Z/ V- k
03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig: _: H1 j7 `0 t/ E7 ?
在Kconfig文件中写入如下内容: - 2 R) b M9 e- ~/ }) k4 z6 K
; C/ }9 {3 q% B Mconfig HAVE_HELLO
6 y: k1 J1 O" ^. a% \$ R; K; Y* G( f/ ~! U
- o6 u5 |& |% v- u4 n4 h; K! D
$ D: o) ]" d' {tristate "hello driver"
/ _! H' |* z5 G( O2 p8 k0 _9 Q3 z. F7 a% u' H( H/ a c& V- @
! |8 _' W) z$ W0 L* ?2 I
# I+ h" |7 L) o5 ]7 y, }, Bhelp' F+ P$ r# L$ n' ~" I0 |9 N
2 S9 t% S) G, V. j: p
- , l, ]6 a8 f ^1 {0 G; V0 d, z
1 T: N5 S. X L, c: H9 Z' O6 d
This hello driver is just to show how to develop driver process.$ ]2 c! P* I6 L Z; J, G
& x \+ R$ X3 R7 z/ \% B
- % V3 s1 q' M4 ^" l/ V r7 ~( Q# c3 O$ v: P
5 s. N. E. D' @' C' `9 Y
# v3 A7 c% Y% l) c4 N& Y1 \4 E! f( ^. c, q6 e2 K
) ~9 |1 v5 A- D6 ]8 B4 X, @. {& J* e1 Y6 k4 C( R% o9 k4 a9 Z( X' Y
3 _) R% E, E! U& T' D0 {6 t
9 g% h: u& n* J6 Q) y- Y! A7 ^
- - z/ ]* `, C7 v( a1 |- G
. V) L1 y9 i' q* P+ e) {0 J" v
This driver can also be built as a module. If so, the module will be called .. _5 y/ t2 ^, r7 |2 x) o
# w: J# o% k$ w, ^) F N
- / K8 a) @3 j6 d& _! r' c
+ s" M- t) W/ X; d" Zdefault y" e: ?, V) h2 T# j& V5 y: Z
0 @; G& L- }% q" V+ p3 K
8 H& J+ Z2 Z, M
0 G$ C8 ^9 b& Q! Q2 l#endmenu
: N$ o& _! e2 _# c# C- U* R
- ~) N$ T9 E+ h- @; [- T1 D/ ^+ T" ~1 F2 C/ i& ^
% U/ Y7 B$ T& ~* H! D4 F
表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
9 s4 F; D% x( {# W' g& i在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o
e' D0 d' H: \5 I- ^注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。
% @- [6 q6 |7 v# \$ c给添加的这三个文件权限:
2 C! v, x+ ~! E6 |; T/ s0 a/ h2 A; {( s1 R* p5 K
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c
8 y/ N9 ?+ U( q) y% D, _
8 m4 |7 Y) W* u( l4 J; Z% \& {3 V9 @- 4 G3 r0 Q0 K5 H/ j
8 S! P5 l" K: y7 Q0 G& G8 G
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig, s8 F" e5 [4 y- D0 \
4 N" F4 r/ ]4 {" q' n
2 l9 f' S3 u) Y" I2 G* [4 i! t! q1 W
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile
$ U, b2 E+ Z o- }3 B& l8 W1 [" w. e9 V! O
9 w" \3 Z# L# p. X9 U s
# q* o& L7 _) D( Y9 c
04编辑drivers顶层的Kconfig,Makefile文件。
6 E1 r; h; o4 j2 Q, N6 p" Z" e+ H0 p; J0 N7 r8 d' Q8 t' V9 z
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..
7 S9 s3 v ?) Y) T: `9 j( a4 _4 w% ` t4 F3 U' `( D8 N, u: t
# p9 ?4 {9 q0 N( q9 ?; E' X( t
+ L6 D; f2 D/ V- ?" \: Sforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig/ e) ]5 V. h" {
0 O$ X/ \5 f0 |: M8 d6 I
& g$ o) ]# d7 r( [
7 k* c: m ^0 c* e在Kconfig文件中写入如下内容: - $ x; }0 H% n+ d. u% K
) ]* s! f6 N( u- W' E( ^# b' k, v {0 \
source "drivers/counter/Kconfig"
" g' |' o9 u5 _ Y: v
: T( W+ y8 ~8 R @- Q5 y( p - / L7 u- `6 Q$ I
- n& ^4 P4 b3 r" W
source "drivers/mxc/Kconfig"
; t4 z% {! T& o2 z% y! i0 q# T! x6 a( [9 N
- * O. D" F" ? ]7 L) b9 Q
* A: O# j* g8 j$ E, P# c" _( ^' b
source "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析
W: z; |+ s- [. J# _6 n3 S/ F5 c5 X, v( k, l
- ( \' u, j# P! r6 [. d Z
k3 D( d: |& `7 |/ jendmenu/ z* g; `: ~3 a/ j0 M
- P7 Y8 _9 [: W7 c' B3 H/ q( U0 a
) [* J! |2 L9 U" Z
, O# f0 s" ~0 e- i0 L B/ [如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。 0 h. x E; W8 ?) {1 j
编辑Makefile: forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile$ d1 u4 n7 h o
在Makefile文件中写入如下内容: - ' G# z: {; `5 J8 l9 b" A; j( U
6 M% t6 T7 O/ ~' n/ }obj-$(CONFIG_COUNTER) += counter/+ u M0 O! e! r1 m. G" a
Y- L0 S8 b6 ~/ Q, ^( @
# s; g% Y& S g! F
4 t9 x- t1 y# y! a- h* nobj-y += mxc/
' `+ p1 h( R9 A$ b1 }2 K/ D
# E" Y5 G8 ]* i9 o4 H- " e% N5 [8 Q0 E+ v4 Y! V/ M3 u7 ~
b s- m5 v; |4 V `obj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句
/ Q" i0 Z6 \+ B; X" y1 F
( |, _: U5 C1 }
) G( I5 R0 d6 Q7 F4 q, B2 C 6 t( O* o. l) [2 g
这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。 0 O% t! a0 B4 U
5开始编译: - 6 s' I& @, k. ~% u% }% i
v$ H: l3 U$ n1 o& q" Mforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..
4 t' p. ?" x% A) c0 f& U1 q) M2 ~6 E: {
) h9 R5 l5 n9 }6 J+ D% W1 t
4 M: k# n( n1 |- N% L! ?" _forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux
) p; d z2 M/ H- J
8 \" c" q* R; U Q- d/ H! S" O- * Y" c. k) f Q/ p, o
$ X& {/ J" A, S3 {4 I8 xforlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux% q5 _1 v0 i1 I- T" D( X# g0 I
2 F9 S: w2 V$ x) H2 s: e, U: k - 9 `) I$ N& {6 Z& V3 U/ j
1 S. H. t* L- O8 o: qforlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel5 b) ]' \8 ?5 _/ m: G/ z! v
1 O( d! ]4 Z g6 v; j - k& W6 V2 U/ u6 c
& ]- x0 k& \9 V) B+ @5 wforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules
* \, o) T! H* ]+ |6 I* n3 |7 r9 }
* G/ ^4 D7 R+ B! L; P
! f2 g3 p$ {+ h# r H+ u+ {
/ C0 X5 @9 R4 g" \# T* C/ r4 hscripts/kconfig/conf --syncconfig Kconfig$ [, \3 G3 U) E0 O
9 u+ {) s2 Z0 Y- # s2 C" o7 b" A p" S; Q' J
" Q( P+ X9 v) w
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'' s% z. y& @7 `! J
* n0 r" }* L$ R
+ ~/ V- A3 x/ |' O7 y! M4 E T! h# H: A
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'6 t3 m* }. p S7 K& d
4 f% r. V; }5 b# m* ~- : ?: q+ u8 H. H1 Y) L# E- @
$ ~/ I. R" }( R7 Y/ U Xdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'9 V5 G% f6 a n) `+ `' [
2 \+ Y/ S$ ?' y! F/ b) |8 c - 3 H" }4 W" A. _! F/ g
. v# D& Q7 Z% m2 S
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
4 a. `) \" @$ Q2 V; W
6 x( _ ?4 U% L3 o+ d; T - . V! W+ z$ R) R, ]" B' X, s/ p" d+ d* ]
7 D8 Z* h# s5 V$ J( }# c% h+ f
*
' M9 w' ?$ K4 G
; @1 w7 T% r9 f1 a
8 Q0 x5 S% R0 E. u8 v
* a; g4 p w3 a/ H: M* Restart config...
1 z7 i" `/ l* {2 P. c2 @& S* _& E9 Y% ~) Q( a$ b
- : J& `% G6 L- L4 l' E+ h, E+ K
7 B" P4 D0 ^: V, w f. E" Y) H& g*
0 D8 q3 G2 t0 U$ q Z) \
9 S% o1 t6 E; X' [0 m' J - ! ~8 R; H; l" _7 F6 N8 e1 `
- V+ {5 x2 T2 V I; y
*3 O% L9 t {: m" W0 X2 v
: w9 T7 h6 }, }5 ]5 G8 E6 ^' H - $ h% G- M. T3 Q* _1 a; L
7 S, H+ U, L* @4 [
* Device Drivers
" I" r: A: b" f! i/ h |' B+ ^6 p" H* t: D& e$ C
7 o0 @+ e, o1 Q
[1 R& ?& B! H. d* Z' X# d" f9 Y( w
6 O, s( d7 ~5 | I
\( O% L) @1 V$ I2 E" @+ ~
5 M' ]7 S) w* M' T9 ]2 b) A; M' qTrust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n: d( U! z8 o; C1 ]) d! t
) s6 \. x P, C5 t5 S$ u- N, d- . q) B0 U5 x7 {& x. F) t
& R' M7 q& _( p* S" a9 sPlatform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y( K5 Z/ Z Z- m7 Q
. ~! J4 I# G8 f, E
' \3 ?0 s; b7 [3 [& J
# o4 x- l- L G O: RTrusted Execution Environment support (TEE) [Y/n/m/?] y+ ~. `! F4 p% m l9 _6 Z7 C
% o7 ~4 d1 x2 C* Z! h8 P* W
3 I: N5 A0 N* q3 Y! s7 R0 |. |* y5 U* u8 u/ V+ @' l
hello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
$ G; [( |; [- H3 Z, ` I0 G: ?# @* T9 P0 m: o6 j! r
- . `. P! O+ x M
; J' [% n/ W! @6 |+ g" }3 x
CALL scripts/checksyscalls.sh
2 _4 t7 v) [$ P0 e( k* A5 _: @" r( I3 U: A! W: S
1 T6 [- s2 i) a1 F+ ~
! C2 M, N. C' j. dCALL scripts/atomic/check-atomics.sh
) H) A3 \3 ~0 K6 p5 Z( z
4 v! m, q5 ^6 \- u5 Z5 r0 m, L d" u8 y
$ p% Y8 g* c% z+ b$ wCHK include/generated/compile.h8 }9 ^2 j8 }! t* M6 K; q, D f
( [% {; i6 [7 P0 B0 P, _
8 }3 m8 g, Y8 k1 w! v
, `! `# z# L }. D2 j6 R8 aGZIP kernel/config_data.gz
7 s5 N) P( O3 n
! N- S$ w; N2 d. N; n
3 w" X5 d9 S1 `$ e
+ \! r; ?' f$ m0 W3 A2 I8 e6 eCC kernel/configs.o* Y. v9 J! n8 n6 G0 x0 b( U
- F; Q: d2 w: l( \- 8 T8 y0 G, i1 i5 b$ L% h5 V+ P
4 O: o" n3 P) r' T" o8 X
[…]9 M1 i7 I+ T7 N1 z" j/ Y" V3 L( |
6 L6 h1 g% s1 l' W
9 R& [' t. L# q
. i0 k: A, g. M" O CLD vmlinux% I! Y( F/ Q+ ~# _
$ `6 Y6 z# q" ^+ K' |
! C( U; g& X6 W% ~
9 C7 I( B: C1 [' zSORTEX vmlinux
' X8 O5 N/ f4 A' U$ w6 m9 K7 j) \, t( @
% c* ]4 A+ f# r0 X" \; L% U! l
4 j) T2 |8 y6 m+ WSYSMAP System.map
5 S! ~* N4 z, n/ d+ \- r- K2 X. |( \& E
- $ M7 X- i/ _% i
2 _0 m: f2 a/ A. F& M v
Building modules, stage 2.
$ Q. l( }# w- C }8 b( b/ }
( ?( O9 o$ A! Y9 H
' ^2 q9 O. g+ G3 i' w( _
; n w) x) B" m( z: UMODPOST 536 modules2 Q* N8 W) C! \$ A/ n; x2 a
# m- }$ B7 J+ U+ m" g4 |* a
. t7 Q0 V( V: G" o
" K5 Y7 E* m+ c; q4 }3 W' g) g- mCC [M] drivers/hello/hello.mod.o7 B4 a6 P) r3 l5 I; a) ~( f# K
- V- d3 `0 x* t. o
& N8 `* U+ m. h9 z
! [- u8 ~( }# {3 C8 b( T: ^LD [M] drivers/hello/hello.ko* @$ [) f% e: x
0 u: ?- e( k; B6 S3 G
% b- u' K4 a. Y. b( ]% G% H( v' ^
![]()
9 Q J3 H h( o: G% O, ^
4 u( R9 r- e) x/ L编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了: - 9 b$ I C$ _) O& }) ^/ z
4 \; o9 G2 h8 s! i: o5 }
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello
. T; b1 T4 z @+ l& E5 H# T- F- r+ ]( a
- + y3 w# Z: ?, A6 C
9 m; D- L6 Z2 u# L/ o* phello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order& x$ A ?0 D; @6 A& y/ f
4 u5 K* b3 r$ J0 \# c8 s/ ^
" U( D6 f- U* D% C. X( ~+ z + P! S1 V. e* M7 z8 a' G, ?
6
( ^/ T. @. P' H9 Y# n7 Y, R, N5 Q7 y& K* |
将hello.ko使用U盘或TF卡拷贝到开发板里进行验证: - 5 m) c9 g6 w! r- t3 x: u, [6 I
7 t; H7 x) ^* Y8 o M3 S' K
root@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下
! C( x. Y& G5 t% N9 R8 G. ~1 @5 a6 a: ?% {' N
- # V5 I. U2 w+ F: _ i/ U6 c( m
% k+ ]3 p% x' @. l4 z* \+ O- m0 J
root@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko" |& O$ J( `- }1 h* L8 g
0 _: I9 W% ]8 k6 Y% T1 @% x4 a
2 ~7 s: u; x9 v( L+ o# O. d$ U0 y# `
[ 138.679964] Hello world //挂载驱动打印信息9 c" X; b, C6 p( Y( l9 G/ q r6 N/ F* f
# j; @& f E' e; j' w
- ' p2 I1 W2 o, o, x) I: t
z. O! v# l( K! L2 g* Z) \* Kroot@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko/ a) D" _& g# N# i2 c. Y
: m& e& }7 `" e
/ ~8 [ p1 R6 r8 T/ ?2 M% E8 o" V% J+ |& f; n4 X4 w. d) ]2 ~
[ 142.022115] Goodbye world //卸载驱动打印信息3 j4 o( p" ~& \1 G, \' H' Z+ f w
$ R$ |' X: N5 M3 l) p6 g" }$ y
( ?( _# u& X# e: K, M0 s# u+ U' V# v5 W) ^& K( M
root@OK8MP:/run/media/sda1#0 z. j/ r1 G. |8 k& |+ O I
+ M0 g1 r0 p |+ T
8 r$ a* q3 z% N6 e; z- l [
' ^: H r; o# g% }; a由上述测试可看,hello.ko驱动可正常运行。
& z4 @. j$ v5 K以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。 3 V0 {( q+ R$ d, y+ F, r! ^0 h
|