EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。 5 g7 z5 l* H$ V8 X, E* C! Y
![]() $ A O! ~* h$ K$ ^
01进入源码的drivers目录下,并创建一个名为hello的目录:
! v+ T( D. D! e) g3 {- ?' N0 _+ \% S/ @8 p
forlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers
$ F3 r# a% U0 ?
6 L2 q1 Y# ~; P/ ~
: r" U$ y) P# H1 C) F1 ~) m
2 {7 K; ~) t2 h8 x* Rforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello
& b6 r4 M1 F& _* h) `1 ]/ N
& d2 k6 q" [. z K; {6 Q, i: U) Z8 P: R2 p
7 L; X/ I6 j+ s2 r. ~- a. p! \8 R. U02进入hello目录,创建hello.c:
' g; d) [7 a: a2 V& b9 ?! J
* J. j# G' N( l* Qforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello
% K) j/ O8 u3 F* D6 `- \' R6 a. T3 k; I# Q1 x; E
- b9 I9 e# n9 E) A2 G d
9 \2 |( k, N! p7 ]4 k
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c
2 T e6 B; c: {
" d; }4 ~& I" o8 Y' I
4 a4 i( d2 N+ K/ d4 M# M2 T1 B
; i% G! N. }2 B5 p( q* [在hello.c中写入如下内容: - , z$ U! q: Y5 j4 W
# n! X5 j- r6 [$ C1 t, u#include <linux/init.h> i. [! t5 K0 u5 x5 N
* `' |) }& k. @& G
- % u2 X& Z& g: M* }
h# w D+ ]: X; k
#include <linux/module.h>
: ?/ {& ]' B6 x
' z2 c8 d! v3 Q7 p. e0 G
% F+ Q5 G% q3 A$ j9 D
9 {/ u% n c. E, {( z( \* |& L( @static int hello_init(void)* j' ~: @9 t( ]- {3 q; z4 E
) e9 \% F: a; X2 `- n
& p* r2 ]) s2 Z7 m, a
$ T; t& `% T$ U+ o$ K& h( M{* @# f) i. W0 U m# ]% B
1 ~. |% L( [9 f) T0 s% m" Y
- ! k4 }- C9 c8 K" f9 ]
E/ B% Z3 U" c& ]6 c
printk(KERN_ALERT "Hello world\n");0 L) N6 `1 d) h" p z" D
4 S' }! E, l5 L2 H/ E2 u
- 6 g8 j' Z* a$ F! |" A. {
% U# Z \3 g6 r- ?- M' E' P+ ^2 Ireturn 0; g1 k- X' }. B c
+ O. ]2 s# O( a5 }
$ A( j* w$ j0 | C1 I, z; j3 w5 r# K- x2 G1 n; g
}
5 A9 l! @0 k$ _. O* F( Y/ j
7 i; T4 M' @, o( u6 N% r. y- 7 z6 z' y- j1 `8 V
" w i* r, P2 Hstatic void hello_exit(void)
4 ]; K2 ^5 z6 c1 U
7 @7 ^7 n: F3 P$ \$ L' [' C) M - / h( T% w2 d! }; z8 y( {) g
* l- P U/ j, {: p" i' q
{5 u. ?& e u6 ], p; o9 N, y
) `( \$ P! |+ d7 J
- + q8 l o2 X9 ^. d+ Z
. G; j- i' M F% ~, S% |' B- q5 `9 ~
printk(KERN_ALERT "Goodbye world\n");( u# x% v) J1 p0 q/ L
' w9 [1 ~7 T7 E3 @3 a& q
8 E& z% w! m3 C9 W/ Q6 M% B/ ]# n0 Q# Y) u
}/ X I4 y+ |* Q* Q; \
) z' E. f$ Z; J* \2 k) N. l
; M9 p3 @) \$ y8 a n* ~
* z1 h' ~& [7 s6 v+ emodule_init(hello_init);
+ g- j; T' K" a& ^8 N* E9 u1 Y( B1 d- {3 u& X
' P# c) n! D D4 _# o) t( U: d Y; X! j& W+ X7 m
module_exit(hello_exit);( S3 P6 y6 ~2 C$ r0 a ^2 U
% @, F0 ?, A/ M4 z/ w. ^# @
8 e. R# @# {* R6 n+ Q+ b. v1 l* @+ T' s
MODULE_LICENSE("Dual BSD/GPL");
( D$ D T; M% l. T- G' o9 ]( M; I. g8 d7 g$ L j) ^
3 e! e" t! p" J! k9 R( [9 U" h4 M
) Y$ D8 g. ~5 a- B6 W! n
程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world % q1 L9 ?" t' H0 P4 c
03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig: L8 z9 `: v; B% O7 k& x
在Kconfig文件中写入如下内容: - 6 e# e+ q- D& K$ h9 v4 K
; X3 _& t/ z7 J% h }* p
config HAVE_HELLO5 P6 s$ w) A* V- }; B1 C- \
* V, E3 ?3 U8 L) U
& {) H [; e8 m$ t4 \ p3 V
/ j/ u0 G2 n$ b e* itristate "hello driver"+ l' F7 Z4 u' e; _: `2 ?9 G2 d
4 ^7 l$ b- \' h* E7 i
& ]# J/ n. ^/ Y8 a" ]4 A* A3 i
3 y4 n } [6 khelp. N; y0 m7 Q! U) Z
1 s+ ~4 E6 A0 s
- ; Y1 I' g! V7 B- P
- J( V' V- o% B6 b# d5 yThis hello driver is just to show how to develop driver process.
2 [$ y1 y7 i# a7 j' K- H8 W
5 w7 J/ q h6 f' c. g5 F - 2 v; T) S3 ?# G6 w6 d
9 L% _7 k! }8 ?
! ]1 t# q/ ?# {2 L
) r2 m4 Q, y& u8 u1 g3 _% H - $ A& V7 u, J3 m9 u, _
" V* a) O+ R8 k
& d4 v- G6 n% V7 u- [
( i7 i) `' H7 u, | - 8 g) t1 `- A. T8 ~& P) G, q
* |% R' G! o. J- L1 K+ ]9 tThis driver can also be built as a module. If so, the module will be called .
) W! z) v4 g( {$ d5 u8 \# D! ]0 k- G
- + e5 ^8 ~4 `5 g0 L0 O0 y/ G
4 R+ a% k! A* l; B
default y
5 O$ `0 X& W8 E8 f0 L g
5 @ X7 h: {1 f( z& p - - |; W7 _5 J2 l$ h% V
/ f5 a+ X: B; W& m
#endmenu8 ^0 A: T5 c! o) E" W/ D
1 {2 D6 ]6 X, K- C* V& \, p
2 L, I1 p+ ~" ^. x5 K * A& Y9 |7 O. ?% U/ Q
表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
+ I9 I4 Q, x& K- ^. h在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o& f0 D7 W& |0 f9 \9 L" z
注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。
& y( ^$ s# H6 w" P2 L给添加的这三个文件权限: - k e0 ~) M4 X' K. n8 k( r% U$ S0 z
" P2 R A# X4 v
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c" Q9 @4 t( G) k$ G9 f8 R
h) U2 x" J# ~3 I q( S( } - ) q; W R4 Z$ q1 N
8 R7 S( q) k- T# G2 A8 o5 X
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig
4 i2 ]( x" E0 Z
, g0 _2 `; X9 b) ?& I - * P' K' A M o4 f" d; O; i/ j. h
% H$ y! ^5 c9 L) ?1 R( @forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile# f9 O- _% o" k% `
$ i( `* B1 x; S+ J$ f: d
/ c( \9 ], g$ d& N) z/ j& c( E ' Y$ O( G6 l6 l6 r5 k5 Z# M" h2 [- r
04编辑drivers顶层的Kconfig,Makefile文件。 - 4 X: Q1 }1 `% X) Q! Z J: ?
$ W, p6 W$ p& o: w' a. n
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..4 @! e, g |: A" M
: A) z2 ?4 e1 G$ H9 `4 }% Q
- 3 e* G% Q! S! [ ]5 g* U9 o# @
* w" z+ ]* A0 c1 c' sforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig5 r0 r" ]1 y5 g/ Y' T5 a
) m" Y/ m ?' Z% f. q
# Q& {6 y9 J9 S; ~# \; W" a
7 [8 `, `) F7 f- M+ n4 W* y在Kconfig文件中写入如下内容: - ; q! i5 B8 W2 B8 e" x
- E' Y: t/ E# Z6 f, m4 s
source "drivers/counter/Kconfig"" B. P- y- @6 U- ~# L
1 P! g" g8 f" d) f3 o1 k3 y - , `' Y. t' [" }- _& \2 J
; F( Y# c; t% {$ U( c) H' \0 `* Tsource "drivers/mxc/Kconfig"% M8 k; `, \+ G# K& F4 h7 i5 J
0 {2 q0 }+ V2 z/ l: }4 v
; A$ r* Q( X; d6 K! J7 x3 i
+ W3 ?' f1 X2 T3 }2 u6 @( Qsource "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析
4 t% L T5 _; o7 O8 T0 I- r- b1 v- x+ F* I9 q0 A1 l) H
- 2 ?, P, o7 F$ w" _
1 d9 h" ^0 W- S/ g! i* ~" j
endmenu
! ]+ S2 V" V" P9 x5 y5 w
5 }) \* b( |7 p+ g3 e- v: @
6 @, T3 i+ I! y/ I
' I2 f2 v" {9 r/ }如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。
6 V5 Q4 N) W3 S0 f& {" d6 K编辑Makefile: - " G( c( a4 v7 {5 @$ [3 y% v& R
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile& J+ J- E/ t& s! Q9 F
在Makefile文件中写入如下内容: - 7 ?3 \! ?# c; J# I! a
; D: j! k* n1 R0 N6 Q- A$ L3 qobj-$(CONFIG_COUNTER) += counter/
9 a1 z' b4 ^ p3 ?1 r$ R, V8 J1 i. s7 f. h
5 H; a f6 Q( V
3 ?3 m1 B' b$ G3 _) e' _obj-y += mxc/# ]4 o! b) s; Z+ B
3 w5 J" V" m: r5 ]1 q2 m! Z/ B7 l- , A1 ]3 I! G( B% z0 W
( v/ i2 g! T& P4 v% e/ l" q% F
obj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句
; l6 r5 g- @& k# N& B" \/ \- u! T n8 ?+ a' ~2 {/ |% o! ^1 e
* t- u7 ]* g. c. w$ | [" C
, J. B! { c6 |$ U8 V这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。 & K7 M) M1 \( Z8 B
5开始编译: - 8 O, D4 Q- t& y1 y! n+ c
1 l7 B% N# p: g, _ Zforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../... R! l- `; _" ~' |
$ N% _7 G$ d9 i9 K% u
E f0 I$ H o* i; z/ e6 S7 r% E# H4 ~9 } p; m8 ~ R7 S6 S
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux: K; {* }& ^- b4 W
0 X: m9 A% y: D, u3 @3 d4 V$ w, n
5 N& T: \6 M9 k& D; G* d s; i" l D7 {2 U# I% v
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux+ x; f6 x' Q5 z* [
* E" k5 G8 W. F9 ]
- $ B1 q: h. W; L
. S( N4 o4 Y# A- Sforlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel- V! q9 T5 V4 X1 Z y0 ] E( G
+ J2 ?7 t5 `7 m6 |9 ]* l3 x7 G - $ _) ^- L, E/ u5 G% O* m8 ~
6 U, X( Y: w& |, @! a" j2 }
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules) i, n$ b% Z. b* N
+ B% {0 a8 k, z% |
- 3 u/ h9 E# c) t; ~7 b4 j, G
3 i: t3 y8 V+ Z' b- U7 ~scripts/kconfig/conf --syncconfig Kconfig
' L6 C1 y" _, y2 V4 @7 e# [8 l8 C# ^0 ]
* J. J) J- P: T) O7 z' s! ? O8 Q# N2 s4 k8 l0 g C
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'3 d, W7 b+ d$ [1 {5 E3 w
! W; o8 m$ r8 h+ F) t: B% h
. ~+ l0 \3 q& O% f& O2 H- L
: l2 o3 w7 O# k1 w3 Cdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
# B. ]% \: c8 ~ @7 {) ]% R% ]8 n" _( I
- 3 @1 ]0 W: Q, J# Q( w4 Z
7 H( I8 _. V9 F) }
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'2 L N- x$ A9 ~5 |* T
1 j w) ?5 b0 Q" Z7 C4 H3 m
" X8 O6 b$ Q: X& m$ F( m5 o1 D% B+ y( i- _$ L- X% Y
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'* k7 r" \/ M1 i1 V( d/ g9 ?5 O
) d- D: D( u R& `- + l1 p1 Q& S6 [+ t \ \
% p6 C6 D6 ?+ p0 V/ S( m* T
*9 z) A( }3 J9 r' V) s5 O
+ [4 W% p8 k( t: C" C I - : N3 {* U1 ~& k" h
R. `% [: Z) t6 P' r
* Restart config...
' {; r2 K. k" f3 L
S' `- d" I% s. |
9 u& P6 a8 z, [( ~- \* w. W0 R H; `( t0 l5 D) i6 @" p: P
*
& \& ?4 ~/ u. c- z! {# H* \) @0 u) J! ?4 q; `: |
- 8 u l! n& u: p
. \4 x) C% \1 ~# V) D4 F' ~
*
- O7 Z9 R( y! r" v) N# ^0 Z* G
9 Z7 }9 W' X3 J8 m5 U! k; _
/ _! ?( N: j* d
. ]' K* M9 g4 @# h1 c* Device Drivers1 ], _7 O3 R" B* E+ d, W
9 P' z! p' p9 H8 s; z
3 g# D# i2 t. V& L
1 W s% c( f0 t*% t7 _$ N; U- U
3 `1 P6 z0 ]4 ]4 H
+ P) r( t" ~9 A: r5 Z
3 e1 R$ B8 f G4 H/ g+ D9 P; p' sTrust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n4 t6 V) O. ~* v( I0 \1 R
* O7 y2 h6 F# G+ y# m- - e: b* G/ C2 } Z3 R
+ C, v9 i- B `/ ~- \2 v- |; c; U: A
Platform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y
% ]1 t7 n2 p; I0 v3 R- w* ^
$ P, l* L. N. Z( w# w3 i - ( `8 [) h. p% V5 Q! s% n3 f! t$ a
8 |, q6 T! W7 D7 J" Q4 I
Trusted Execution Environment support (TEE) [Y/n/m/?] y+ f1 f2 v& X6 A/ k
\6 A; @3 \! A1 `; c" k) g8 m$ [
8 b7 u3 A& w& ?( ]& D' v' i
, ]/ |! f2 L* [5 d) Yhello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
9 f4 o; c z6 p' N* ?9 ~+ k
; y. W; s5 ]( D% v" i: m* I
: Y$ H" y1 Z8 U, d4 c" o6 |& P2 w% f( W# g+ H8 I/ ?
CALL scripts/checksyscalls.sh
1 W+ O- t# K0 g% g, {0 q2 H# G
* i+ @ C9 y+ V& n& @8 C0 W7 V- 8 i4 k! }- o, }+ s/ p2 r
, y+ }# l, e7 o# D/ r W9 @CALL scripts/atomic/check-atomics.sh
9 r4 \- L& ?2 S
) P- l1 @/ p" a; ^7 h* |
]. x8 V9 K$ k' v# B5 ~( k; s
2 U) q' M: o# o: }CHK include/generated/compile.h `- A1 o! h" N; P2 T
9 E6 c" R, E h( M/ r' Q- % T9 {6 ]/ d, H# s% u
6 x/ b8 \) _0 }) ~. T& q
GZIP kernel/config_data.gz4 d9 D1 C v' j$ f% x
! A' L( f O& N
- & j/ e% N0 d+ X
9 z( G: r% Y% z+ ?: F- w7 ~+ ECC kernel/configs.o
6 _' ]( W0 l# S8 U( Q2 ?% A: q. Y6 j3 R/ [" p3 F( C
- . s Y5 j) ]/ U6 B! s
8 W; l/ z" F- ^
[…]
1 f3 B. f- h, E" y; c( d+ x5 S2 y: A, S5 T W
- 2 n T: N7 D; M7 |- {$ Q
- P( j+ j: ]" a" R5 m) Q" T7 eLD vmlinux
3 P3 u% _0 ]. Q: v+ u0 n5 B2 W' O/ v0 b3 E
- 4 T7 `- C0 r$ @& h
% [; [9 D% I; eSORTEX vmlinux; \% q# d9 f. S1 ?/ Y* a
# k6 ~# g; L- G0 Z% [
- + W. ^- i: s3 o6 B8 F" `
9 \; b( I0 m! R, {SYSMAP System.map
3 \6 U. h( d5 e4 T2 g9 m* s" w# s( Y* C* s6 c3 m
- 8 V3 X6 N, T7 v2 h6 ?; @3 m6 F2 m3 s
3 v& T- `% t& S* zBuilding modules, stage 2.
' J) c; Q; Z3 Y% m6 W7 U( t/ J; x) e3 ~
& r! J, m" \+ T' W5 @
' _+ N( P+ r# ]* }MODPOST 536 modules% p: L% l. x4 {
, y% k0 H* E5 K9 ]! K
- 9 B$ A1 p5 o6 y' g* \( N
& @* x7 ]+ D: r( ], ECC [M] drivers/hello/hello.mod.o
5 t! T6 @5 |( x* `
/ Z: ^! r- z; L" }' u/ L( v
9 i, w5 i. p* k" l; J# Z) g+ c+ n" ~; N( P
LD [M] drivers/hello/hello.ko3 [: [# M& Z- {
) N4 @$ p! q6 M+ m( ]% e0 d; {4 d5 z5 b |) c
![]()
5 W- K) g% O; X5 Q0 D0 l* q* ~6 G' I( E# T# O4 f$ @; T$ U0 b
编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了: - % ]1 B& ^. S4 }0 i, A
, R \0 W" m4 @forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello/ {9 b$ g& ]7 y0 t, c! q
; |0 {# g8 l4 d& @
8 _$ }# R# W K, v! I+ F- c) R2 I8 |& s1 H
hello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order( w7 _8 @5 [0 d
# R0 S, D1 @4 \" y, S1 L2 R2 R0 T8 F; }) a
, F, ?# Y9 s+ X0 ^: Y6 $ g, p7 x7 ~$ V# ]" I
% B; T( F) y4 y; J' J' b
将hello.ko使用U盘或TF卡拷贝到开发板里进行验证:
- `) m0 ~! c& T% f7 V" x! F+ o! k9 e4 |2 l) `" ~, J# J% T
root@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下
1 z8 Z: l5 S9 A5 V- Q: _6 t# q+ E/ E `
- 5 m$ ] W5 {1 L& L7 W' x. _
6 W& w) T% W$ D3 N4 q. X' n
root@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko! J1 I3 A7 r0 d7 y* p4 D
- j& L+ ]; e! _3 N% @# E: B# t
- 2 U5 Q+ Q& o1 T& I2 z, b
4 @0 H' [ m! L& i2 Y[ 138.679964] Hello world //挂载驱动打印信息0 u3 y7 [& l; y8 n3 }8 C
( A$ b. q) Q% W
6 |% T! i$ p6 T6 D1 Y, A' a2 @' n4 }- Q% ^
root@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko+ [$ s6 Q) _# A7 N6 F6 ^
% t9 |% R$ w! Q; ?" B E- ' ?8 u& j5 M' l. p# Q
4 `- Q/ B$ K F% Z$ f* D# s
[ 142.022115] Goodbye world //卸载驱动打印信息
, X. A0 ]8 X0 r; p
$ t F# L; M2 I, e6 t5 n - z! I/ K, K1 K/ @' ?$ ]: p
6 P# S4 L' [: }& S& T
root@OK8MP:/run/media/sda1#2 s! ^5 D8 U& z8 K3 U1 m/ y
9 d2 s+ j* o. D. o, D5 }# N* ?" j2 j
I( X9 J3 R$ L, I# w4 Q' a由上述测试可看,hello.ko驱动可正常运行。 , M0 |# R, Q6 y5 P: p- |
以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。
7 B; K; _- H, N( w1 b/ g |