EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。 6 P/ q0 l5 p+ p) m$ D7 n7 q
![]() 3 g8 ~" P$ j3 [1 j0 x) {
01进入源码的drivers目录下,并创建一个名为hello的目录: - ( B% e+ `# j! l- n" f Y
2 n, a L! w* @" o5 U [+ X
forlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers
% z) d) |. H$ F U% v# W" `* }/ L9 C5 b. T
- 5 w# a& ]" h/ y3 O$ e2 x) G
- J0 c7 n" Y7 u, H) h$ z& o
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello
) _$ Y6 }, O. @& V# Z$ J0 `
2 C7 a3 X2 [/ L: o5 l7 F4 I& @* h" A& W: h' t
( r+ z+ k# [+ l' b02进入hello目录,创建hello.c:
U. b6 I% i, E6 [& Q2 Z$ c; N7 D: [% ~+ J: ?
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello" L6 S' d+ \! N! m8 F( { K/ w; x$ l
7 R* J5 g' U4 k. ~' V0 _, k$ |
& A3 `) X9 y/ f# T" H# V% k- r; ]1 G; Z {0 B( ~' A% K
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c1 h& Y4 E( l) n/ m. ?
7 V1 |3 ]5 B R) P: f) y1 Y% e: ^' K& E, @5 w% \
& u% w$ t. k+ i/ W- A# x- |& r在hello.c中写入如下内容: - ' n. a- X( Q$ N* S2 }) F2 f
/ Z; h3 H4 Y; H% ] R8 A3 Y! ^
#include <linux/init.h>
* W" Z3 L5 J, u8 v; e3 V! `. y& w/ I. }) M* l
- ! p- A7 n- X* ^1 w" R# V* W
" N1 s* L* w. f# a& ^& q
#include <linux/module.h>
. N+ [2 g, r& u: \1 P1 F1 _2 _3 U3 G, v2 k" I
- ' W! k6 V- L8 o3 b( G4 I' F8 D
; ~/ J& z7 T3 Istatic int hello_init(void)1 T \; n8 A2 H, ?1 J0 K" x
( _6 O- c& D8 u - ( r2 b7 \& L9 i5 N. r$ ]
1 Z, `; z) E$ D# n9 g& X4 h0 u/ y7 x; J{+ `# a+ W) M' v: \
m- F _1 D- ]# ^( w* M4 f
- ~6 F' b, f' S! n" d- u5 d# h% ~2 f5 j& P. R: u
printk(KERN_ALERT "Hello world\n");
# p# r- P) l; }
5 d0 P0 u C, }1 [2 |: q1 H5 }& q
' x ^! C: `9 k J5 M8 } e/ D
return 0;- R! l3 J' k9 S, B, w6 A4 T
" n9 _2 r- \* G' b- s
# e. ~# x1 x! l' A/ ]1 V* s% \
) p2 A; _ J* ~}- x* c; r, a$ C& ^( p% v- F2 [3 m
: N6 m9 m- {/ F2 t2 u* k, g. C
- ) o! ~5 ?7 k( e6 Q$ y* h
' r8 q/ c9 ~9 V' h Y
static void hello_exit(void)
. B6 E* C: c) S! s5 `4 d8 s% ?
5 L& V' O9 F: y8 I - ; ^" s _% E1 `* t" `1 Q @" [
?2 a7 p# D/ v{
( A' h$ M, P# D# V: J, R7 [% J0 d y1 b' `
- X7 W. L$ t$ ]2 @
" q6 ]9 J" b1 a0 L. ?/ o
printk(KERN_ALERT "Goodbye world\n");
, H8 z: o9 ]: p
! X/ b& X. G/ Y6 b - / `/ @+ B$ M6 \4 Q
* o, Z' e5 [+ Q) T3 C
}
+ u+ H" G. ~% B7 P9 y
* V# l& x2 b+ p T. Z. T$ y: e - 6 |) C9 U$ i% A x8 }* \
+ r0 r3 `+ s* k- p" O1 F _+ F* Tmodule_init(hello_init);
9 t, H7 }, p' V) n& u. t* d* K- P! A
c7 G, U: h: f
1 y$ O) ?2 g) p, n
5 z& c7 X6 W9 F5 c; Y8 [. C& A$ Wmodule_exit(hello_exit);1 X: H, Z1 ]% g% [' H0 f, H |- _
C6 w5 }, A' ~5 u1 m! d
. Z+ _( L( C) A0 X
, Q3 b' S# C8 i# R% |MODULE_LICENSE("Dual BSD/GPL");
4 h7 S9 H) t2 P) A% t2 B$ I/ M: j7 G1 W3 |: t8 K, x0 W
& H4 W" R' k+ g$ t% N6 Z
9 A( b0 y' W4 V1 e$ j5 e程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world / X- u8 U- M: E- r0 b
03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
( N" u2 @$ c" U0 F. z: |6 [. i在Kconfig文件中写入如下内容: - - b [7 Z, `( R
6 V- K$ `3 w& E9 G" Z$ j
config HAVE_HELLO
+ v# Z( z; o: W; H; ]) m/ U. J" i: F+ U9 {
- " d) Q# d3 f9 }. Q" [0 x, F
% J* h" W, p% m
tristate "hello driver"
' j K, ^% x& d4 v j2 v! a; o, e# h
5 f# ?5 v; U( H2 @2 I9 K+ W" t8 a i0 e6 Q% T
help
2 Z$ M. m) d+ t; S w8 H
" h* v0 h! T6 B0 O9 v. o- - n n+ n! K% C: I; T, E v
3 j/ z4 U# r3 @. _ MThis hello driver is just to show how to develop driver process. p+ `3 [1 ^" }0 L) @
$ ]$ T/ ^: B* h% }" e. j6 Y
- 3 P8 }. e& i8 j, j; n$ t- a
8 j, s, p# Q3 B- E3 _
' l8 g+ M6 ~7 }6 L& ^" X* w% n: d6 ?( _$ j
- 4 n! z9 z2 X' ^
- p9 R) R2 q4 r) J9 f
2 y! i9 e& U: k. e/ L4 L9 z, e6 j3 n
- Y) l5 x9 |/ n4 n5 i
; \. h" q2 t/ I3 z+ p1 S [
: L) p6 H e4 }/ ?4 A1 VThis driver can also be built as a module. If so, the module will be called .: y% |( d7 j. e' c& M
9 p1 a+ c3 i j( r: b8 a' v" e
8 ?: |8 m X8 f- f6 `' \" O+ J' \) A: t7 j. k5 F+ f
default y/ Z) X: n4 t0 z
/ v. x9 I, {, C, o* ~/ M* `- 1 X% B) `9 r" B X$ ~ d) F
2 i- u; R; ?* ^! R y, U$ j#endmenu
/ K# D' O' H* S c4 C( p O0 h2 F) d* n: ?
( D2 B0 Y Q5 | ; ?' i9 k- l4 n @6 t
表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig' E8 \8 M6 F9 z: c' F% r
在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o$ Q- y' ]% ^6 U
注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。
% Q( k+ r5 A# k* K5 S6 x给添加的这三个文件权限: - - V- K2 ` ]6 ?9 S. u
0 h8 w/ ^% h; |$ M; X [forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c8 t( h6 @2 W: A- N
. h/ E& z! c2 a% C4 w$ p8 J - - _( n P$ O4 H
W! I( i/ V* p9 Z3 P# M5 dforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig
+ ^! [3 R- ?: ]2 K$ a$ I: q
' c1 b: g( }1 n, O( y& ^
0 N( P$ M# O+ l1 Z: d* H3 P) l/ k! T# b* Q
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile' A" W/ P( t/ N' c
R' \5 \0 [8 ~" o0 ~, `# {! u
; _5 f9 e+ d3 q4 s7 a8 v3 x3 E4 `
0 K$ b/ p& T ^2 C
04编辑drivers顶层的Kconfig,Makefile文件。
) a( U; S6 D @$ T: s
' Z3 t; H/ I9 }) Z4 o' U" E% ~& gforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..
7 H( X6 S4 N A) s1 f( _( `) Z* Y5 Q" l5 N
- , E3 {4 d9 @, r
+ C$ o( B# n$ w
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig
& Y- F/ C% H$ ?9 S5 \0 k, _0 d2 o6 f, |3 X
9 U( d, q( [* R7 u, m : _/ ~3 n" w. ?+ c) m
在Kconfig文件中写入如下内容: - & ]- B# A, {" \9 O) H! G9 J
( `" S. R( ]$ Y! \ N
source "drivers/counter/Kconfig"* y1 K9 b" Q, _# u$ v% z0 L! R
" z( @; B) D: c5 L" S1 O
9 I6 I8 ]# z2 U
- _9 f3 z7 V7 b# L# Vsource "drivers/mxc/Kconfig"- Z0 g( v2 o# e' R' c
$ P/ N$ e3 o9 ?& N6 L
) E! q+ n A- i! E$ }' ?& c# G
% O6 [0 \6 g% l/ Fsource "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析! G* g' a/ Y+ J Y" |
. s' O3 {/ H; z4 F8 @; H2 e- ~
- $ M/ |3 F: I5 W5 @! T5 j0 h$ E: T
! Z) O: g4 \$ L5 _* ]: r2 Wendmenu
1 N5 s1 i% q! |( S8 Q
" t: C1 A) C4 t( U1 }" H
: Y( {! X: H! f4 a/ e
3 X8 i' h( v& k8 b+ X$ v如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。
; a+ @( y; |0 V. I编辑Makefile:
) s3 E6 W" t2 S6 j' A8 ~( _ forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile. G" W8 o/ m+ x$ n9 ]
在Makefile文件中写入如下内容: - . m L% ^* h- s+ \+ X
% l5 L6 ?9 `" ^" E# G5 ^: `$ u+ K
obj-$(CONFIG_COUNTER) += counter/
% Q) @: L" m/ a& R% u
1 D0 N6 }. j3 t; a
: Q5 U4 o, t5 X7 J1 Y$ Q
8 i$ k2 z) g% ^) l+ {; Gobj-y += mxc/" K4 B) m$ v* [& D2 z9 e- Y; T7 p# `
3 D6 ?; \+ B* I/ ~
4 E, ?' Z) B }9 M% ?+ [
+ m7 V. B; ]# {( Z+ Lobj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句6 e. p1 ^. O, A+ |- O k
. K! E, X( |" y1 G
/ j e4 ^7 h5 N
$ O0 L% d6 K+ \5 j$ i6 T2 A
这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。 ! p `5 B: j4 g* a
5开始编译:
8 ]! x: W' H3 H$ O' F
$ T' Q4 G' n& ?forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..( D8 ? c6 N; ~6 O: d
" ], e/ B, O j1 B, ~3 t- v
- , Q% f7 Q5 O, J% r0 Q6 G: T( R
6 {+ |* f: E( }( [' ?$ L! r. ]
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux! ^2 q2 d* p) x; t+ S3 n, N1 H
0 p5 x* L* D. l& U) ^6 F2 z
* v4 u W3 o* ^9 B4 F1 E' P
1 \6 Y& C1 M$ t1 ~# V Sforlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux5 v' J+ P' z. A8 a
. @6 p6 E" i1 {+ H9 `
, ?$ m n8 Y3 V+ X7 p% k8 {
* C! C4 v, I& j! g6 p5 d! G& lforlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel! h- n, L; s3 D$ Y
5 y( h4 y9 J) X( m; v
+ C. i9 O( ~7 o6 j1 s( Z* ?' ?& b
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules
/ y2 z3 S" \2 w/ K4 b+ z
z. U! F1 V- V. d" K1 ^3 Q) [- 0 M' J+ E' y0 `# }; `
& Q/ \9 r2 {9 L
scripts/kconfig/conf --syncconfig Kconfig B- J$ x: ^" G/ T& G
3 j7 E5 w3 C8 |; a1 I& G
* }( T) T" n" v8 k, ?8 s6 i0 w8 n3 q! X6 o
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
( |+ r& Z9 U0 K% a Q
# q }: y3 R# V$ L+ b
) D6 D# W. L. a# `7 D7 ^$ i
, g5 X$ M9 O& l8 v1 y1 B: ldrivers/hello/Kconfig:7:warning: ignoring unsupported character '�') f' r b8 K9 V, t- O
- e) Q; Q4 v7 Q b* a$ Q8 ~
- 8 G; S8 E% X! {+ F# u
$ u# x& N+ t( D0 S) V5 w" M
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
- ]7 o0 m$ K( W/ a! t; w
3 @- m+ o$ E0 L9 |' ^! T - ) X$ g+ p, E1 P- y
3 a* j: @; a& Q* H( p- V T Bdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
: B7 Q; y6 O# f- w' G) \5 I0 z: D+ e% _7 t! s% ]* R
* Q1 @% p& H! r6 r/ w# o( u6 T( N8 ^8 K) k: x# v b/ Z
*
4 J1 n$ z: x! ]) c+ j1 ^8 M- }: |" k9 q* G
6 O$ n _1 F# G+ F( B5 ^; A# Y. l j% G3 i8 O: \; h
* Restart config...
" s* G0 ^" v- W% I+ e+ y, W# R. c/ u6 a9 g) y1 E
- 9 ?4 x0 _6 g( t: c1 `* x, p% n+ _7 N
) n5 R: e: U% R/ K2 A9 j2 p" X! j" @*9 g$ W$ n9 x+ f' L
) p! z8 j8 u8 {( h: \, d& n
- 2 L6 i% o, k7 E9 c. F6 X! l
V/ ^* I" E- J3 ^3 ~
*
* n7 g( A- _( U+ _3 u$ F; v/ Z0 P% A7 {2 _4 v: A' ~
- 7 Q: K$ ~8 l; M
9 i( k1 o8 I& b* Device Drivers; [' f1 N9 g" [9 o% h! U
6 l2 j" a9 d* x
- - Z; t5 ~( [9 ? b& Y! z8 t
5 y8 I' f7 W2 b" @. K*, ?3 P% o. p. l3 j* s7 j
) G; u3 m' O. v8 _* i- h) N - ( |, w/ U2 b- g2 J* O% { h
/ W0 |0 w5 z: @2 ITrust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n+ r5 A" `+ z5 i8 a* m% c o! r
- f7 [+ u. C% e! f, H
& ~ C( C8 h. p: i6 A3 \$ O6 w3 Z& l
Platform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y
, Q5 M5 K1 o0 }" p! O
& v! r3 X- D; x, @- + |$ C H% `1 t4 m
; f# e7 y0 i$ O1 K. T# W
Trusted Execution Environment support (TEE) [Y/n/m/?] y
, `/ n/ O2 A, ~( r1 }- \; } q8 A# {7 a7 O% v! Z
- 1 c; y; n; z7 l7 k* l
* u$ U5 }. v1 T% Z9 khello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
# A; l; ^+ |8 t/ W- x3 d* j
7 M3 c$ r, M% ]0 e2 B - " A/ |8 w, N, E# g/ K& _& A
! z" b3 W& M( D$ B1 ACALL scripts/checksyscalls.sh
# D1 T" g3 f& C2 O4 ^' J: O4 F, h4 E! d' L2 Q$ B
- - _* H8 _8 C) f$ I. B% Z* z
8 i( U. K5 l* b0 ^2 {1 I |CALL scripts/atomic/check-atomics.sh
" @$ {2 o! l) m& H+ T s1 W# @, v
& S- n p3 f+ N& I
7 O) T" e% N) D6 I4 r2 ECHK include/generated/compile.h8 Q/ T6 F m; p2 N$ K
. R* [" S6 y& z4 E" X3 T$ p( B
|1 i# ]: |" U7 {' v% _' S+ E: _# r/ x' Z1 K7 k0 |8 j
GZIP kernel/config_data.gz
6 E. r5 O3 \; G( m, b5 e% d+ ~& S6 k. F$ [
/ W, O+ n6 k8 T8 U! \. y: c. G/ i
/ I# w$ C5 R5 ~9 |" b4 I( vCC kernel/configs.o
3 z2 Q; Y3 F9 p8 q7 p+ G* }( A+ g
! l" k3 z5 v" M& Y- 3 c3 c- N& P2 b+ U3 X' u8 v! a
7 y# U" ~& K2 n8 r1 H[…]
$ O7 Y+ T6 F$ {9 g; _2 P9 P8 g- N' |! k" V/ Z
* D+ F4 _0 C0 v/ _( s- J) c" y' z" c: ]& ?4 I- V' @
LD vmlinux
, j3 U) e2 c' V( D* k+ k
: R2 i+ V& A9 K# [
7 V0 ]% q% |& o& N! d+ }5 g; F6 c6 j9 |- F
SORTEX vmlinux& _ _" V! e3 A5 ]; R7 Y/ `
' x3 _# m4 @8 A& D
. y1 R1 {* n. p( _( I& z- H7 U3 X
! K! z" X- _. ]SYSMAP System.map9 j+ I, g, Z# K2 K* X/ a4 n6 a
( w& S1 V' z3 b$ s, r
- q& f1 L4 v( t5 [( p! n
9 ]- X6 t7 l% t8 X5 [Building modules, stage 2.
1 m* @. V, E% [# I) ^
7 j5 T1 e Q# Z3 z
2 C3 E; F7 v* g- U) Q7 T; s0 n, j9 e4 C8 r, [$ A/ r" z; _
MODPOST 536 modules
3 [7 ?) x) N# V3 D! p
- {1 B* v1 o4 Y3 X; a
3 m( {4 ^& e) V* C- A
$ U. k# g5 k' u* ^" ]6 x# _CC [M] drivers/hello/hello.mod.o6 i% t1 d3 [" ]' p1 @
8 t: F% h2 q$ J, V4 m6 C
& R" a& ~! p' }+ \4 L( }, h4 m# B3 Y+ f/ J0 [
LD [M] drivers/hello/hello.ko5 _- Y* M0 C' x+ Y7 f7 R8 i0 k2 [
, r; E0 r- k! o5 A. {2 L0 v* j2 Z
^' r6 b* ~0 G7 v
% A6 s! Z8 A# F5 B& I" x0 k1 A
. s4 R4 q+ Q$ [5 E编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了: - # n! v* _9 l8 k( l' t) x
- o9 y3 s8 d- c& y; F6 Hforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello: O" g# c; K( N" u& Q
: ~ d% I7 O& X2 }9 I& L
9 S$ w9 R* `% X2 h/ Z8 K7 @; K( H+ _9 ^' o: {) _
hello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order
* d# U- K* c; ~; F$ i! |/ H3 ]. @: @. y' s! j
- X3 A4 h+ n2 z$ z( M) y0 a
5 o$ w9 z" j# d6 U* Y9 P6 ( A( q0 @( \+ H" Q T( c
7 ?2 o- U: C s) U将hello.ko使用U盘或TF卡拷贝到开发板里进行验证:
5 ?; ]6 Y5 M r. z9 J8 C
& e9 [. X3 k) ~, nroot@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下& l3 M- l$ j& V1 c( ?
0 V; V2 T# l, w- : ?% C F# _6 } z5 l9 U
: I; d4 q! K1 H/ z/ _4 D
root@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko
* q! E# j. [! \. w6 d- e9 J: G* x" G/ }" f4 e. h" o2 I
4 P& Z% Z9 k6 h
$ Y! O# {* B, ~8 [[ 138.679964] Hello world //挂载驱动打印信息
6 I8 u. C, \: D, u7 L3 e
% V( z' F. w' v: q0 ]4 O+ \
; N2 ?$ m8 L- G# }$ T0 E# I! W/ B" s1 y
root@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko
' B$ \* Z8 x7 J( J# {$ o) k6 g6 C+ s ]/ ?
- y! j: A3 j ]2 |
7 F1 X! ?/ B3 r: h E[ 142.022115] Goodbye world //卸载驱动打印信息
2 q. _. k* Y1 w: E* p' M# w
' k2 J: Z1 v. @! i( C n- 4 x+ I( m; a; N; p6 ^$ Y4 ~6 C* x
+ ^# z6 H4 T5 w' F/ croot@OK8MP:/run/media/sda1#
+ A c, O" R8 p) D8 \# N. J
3 J: q9 W6 r& M1 O4 r* f- T
6 u1 J! b5 m0 P2 ?
$ U! h% r+ r$ Q) Y. d+ _: Y由上述测试可看,hello.ko驱动可正常运行。 ) c9 i; _) C6 z0 g2 M) ]
以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。
1 m+ ~5 M! ]! k9 a" i0 I* ^ |