EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。
( _$ G' u A1 a2 y![]() ' F [2 L! {( }2 N. L
01进入源码的drivers目录下,并创建一个名为hello的目录: - 5 }1 M% ?' j6 ?$ D
/ Q0 C5 b; H. r! c5 L! v9 J
forlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers0 I4 }) A, K6 }9 \9 {- t' D
4 o* g& `, r( J8 h
, t9 }, s6 y3 Y
2 ~$ B M6 f9 F; Lforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello
- C6 H$ n; I# w5 L/ h; \' I; f6 b% k7 _6 [2 D# e: r
: t6 ~7 K2 ~* v
6 u/ R4 `- g7 D& s6 h
02进入hello目录,创建hello.c:
4 z. o5 |3 e" M; y# X6 k& W/ ]# E
) K6 V+ O3 P1 R3 [) K( \forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello
3 U& e. @6 P0 {1 f, b- |: `2 t( ]: v& G9 h3 C$ G
- ; M+ A$ Z, K9 t8 D' s& C/ n& x0 |% p
9 o. C3 R/ x" H8 |# @" jforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c2 \( v7 ]( a5 C6 v J+ O
$ p& }: O( Q+ J Q/ z- ^
2 i C+ \, W$ m% R
& {2 d. P q$ [) J在hello.c中写入如下内容: - 6 i# ?9 E3 s" ], j, X f; V- Z
4 m; f) Y& w; |% ^4 p6 z* P" |: U' y8 Q
#include <linux/init.h>
6 K1 V3 K5 j8 w6 [' H H" X
4 h Q6 G0 ^+ J
8 g2 ~8 {# L4 [: D! \! W8 Z* E' S( w7 f' X# n+ V4 }
#include <linux/module.h>9 P- k; N' C) }# p" ]8 h6 G" E
T/ L. C' s4 n' x, B$ ?
* [+ Z7 H$ J9 g9 y* o2 V1 x& s9 z, W- e/ \3 S% T; M" g
static int hello_init(void)- ^ [) ]7 k+ B/ w
( o9 J' I4 j& r- 6 }2 V# |9 p5 B7 S% N" q, M5 f1 b
- w/ L! K' k2 I- ~{+ _5 W5 I; B' t9 I: Q& L/ W2 V
- R' P/ z5 Z8 N
0 e y) I. s5 a9 p9 Z/ V' s1 d) k# i" p5 {
printk(KERN_ALERT "Hello world\n");5 X; U0 f) y$ X" n+ s
" g F7 j, L3 s/ l& [3 N' t
- 4 w4 w% m- w& ]; J' q# Q8 `5 p! t+ Y
# {# m: q) z( G! i) x9 oreturn 0;
! U. G- V G- X; r) H- Q( r+ L4 P) d
- ( S. J0 X2 `5 e: }
, B/ ?# I7 Z7 l; X9 F}; X5 {' k" R& y- g' S
$ ^. z6 \! r; h& B! |
- 6 s1 ^/ I, [+ q- K! V
6 p4 ]! y7 v# J' _
static void hello_exit(void)+ K; G3 K" Q+ r6 |
# X3 n3 g$ J" U$ Q
- 8 A0 k: p; |5 i1 }
# [" W/ S2 F5 x& b{; P T1 h/ e8 g g' r) s# v) Z
; c' L; I- x' J4 g. y- d2 A - t5 j2 }* F) Z; K9 T0 F. s, v5 Y% @; ~2 |
# J5 X6 _# Q7 h3 Q/ t9 t
printk(KERN_ALERT "Goodbye world\n");
2 I2 {8 c% n9 H$ h: C( B* G8 F4 Z' H" b; d w3 V4 X1 I
- 9 S' M5 E( g) R) N8 i
3 U2 ^/ l" Y) P/ D- h) D}
; j7 d2 Y8 L/ a
. g- K3 _% @& e- s
; p" Q3 x. E5 q5 |/ G! |
2 F0 L6 f( D i# H4 Q; Omodule_init(hello_init);
Q* G- @2 Q0 d4 @
, {& Y n( i, t- 0 s- M" G- }5 r! W% }
" w0 Q8 j5 p, x3 ?; omodule_exit(hello_exit);# P5 B. W' w* N5 o% I" G! z; {* H
% `5 H) b2 @: Z; d; C
- A/ S# G0 i9 m, a, o9 ?' h! a
z/ T, u2 u! V0 {; I/ ~# d6 L" PMODULE_LICENSE("Dual BSD/GPL");
9 z: m* K- {; { _8 c* N: d; ^$ B9 K% H/ |
3 \: E1 N! M! n( D- O/ \ ^# p' h
' F, v* a* K: W' x% @/ J: D+ l2 B程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world
2 \4 D% i! ~2 x. X9 @, q$ x03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig! u" b% a2 d, N3 c
在Kconfig文件中写入如下内容: - 9 V: H8 f: J! t8 ?2 l6 |* I9 }
0 ~# R I* {0 Y* V$ pconfig HAVE_HELLO
4 ]; ~9 m7 [. v0 a3 h+ u9 s: C* T, Y6 q
- 0 _ {& p* u# [/ e. ~
B" W2 B$ V7 w3 h, X" `/ y' `
tristate "hello driver"' r7 E. ?9 f! ^$ y% v9 a* @6 \6 N
+ t4 T+ y4 X! L. t5 Q L1 N
; {, |% n5 T% N V- k1 h4 P9 {/ m. t" ?
help
v# J1 A" P4 }7 \' ^, y; A8 I3 }+ F- I$ o; s
- - [! b, x# O- C, t" w K
; v" ^' c. o# w7 W. [, _
This hello driver is just to show how to develop driver process.
( w0 d f+ C* g' `; W9 O, l' p8 s Z+ O
3 Z& ~. I5 d+ E4 t$ T
; M# R: \7 [3 f/ a: E& r! X4 Y$ `+ b0 V! W0 q7 @
* U! o$ ?. g# k" v9 I P- P+ z' J- ' v! u+ U- y- ^3 {' L8 y
9 b' }. e3 M$ u' p0 w
+ t$ P+ ~ W: c5 g5 k
9 {/ i" `8 T6 S/ c0 F$ ]/ B
- 1 h* [' H( i! E0 E& }4 J
6 j9 G/ q+ g4 b7 j* x
This driver can also be built as a module. If so, the module will be called .
" }% C$ j0 t) l+ C; }* |
+ c& r" V4 X) b# w1 C
0 l7 B1 P9 w7 L: J$ k0 |1 o; T
3 }' Z3 C; x0 T5 B; m/ c: y8 L( @default y
: Q/ Z( B4 S8 e/ m. `
5 d9 G! y/ ~; i
; _, ?) k0 S& {' W2 {+ t! N; | l, }! X# ?8 d7 }
#endmenu
2 H! f! \- L4 G' X2 K$ N, F0 N# ^/ f0 g$ R3 C
% z7 s& O$ n" a2 ]5 u1 O+ `9 B7 h" K
# p+ [( n4 z) t) V$ k9 t3 I: k
表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
6 V( X- n) n5 r1 t8 J. P在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o+ k& X0 U3 ^# E, R. c; ]% e
注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。 ( d: u* U" j+ U/ U' A
给添加的这三个文件权限:
$ Q8 T0 C2 T1 z4 L$ q' H W8 ]- N: @# G! Q( |
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c3 U& }7 B7 k. ~
6 w. d P& @) R1 q; N
$ B, l' a$ f$ \1 k- ]! _5 ?
; v# o& m) n% j0 P& z' U( A/ I* ]forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig
* A. e) W& `( `4 G! M5 S, c N' B! G) b" }0 S; V
. [) B6 V* _: }
- ]7 P2 x2 n% J5 _2 Y; e9 Mforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile( ?' |+ h3 n0 U5 r7 r+ k9 `
, I+ n3 s' u3 d
2 u6 c: Y, i! L, `
% W" c9 P: m/ R- D- s5 H04编辑drivers顶层的Kconfig,Makefile文件。
6 ?0 H' |2 c3 |+ h" k$ w
7 }# F0 \% g" q8 C/ U- C, Kforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..0 U0 o& K! e" x4 Q4 `. Y6 {+ b
( ], e& l: {3 Z4 c3 o7 ~2 L1 Q- 5 l. P7 o+ r; s( g& G5 S
6 |4 M0 V- c7 y0 L1 K1 ~
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig A5 P* `4 X5 P Q
l+ c! u$ k4 {. c0 z2 F
, [% k. d4 M/ `4 t3 E3 _6 m6 V
; A8 l" F& w2 o* b! v
在Kconfig文件中写入如下内容:
4 `: E" s# Y: U8 v. f8 J
; A1 W( ?1 C1 O7 x" s) m" y; }" Msource "drivers/counter/Kconfig"
0 \% X' ~+ t- E6 y1 n) e' U
& u+ K$ M$ v2 @0 E/ K( A- . U; ?5 H. ]3 _8 k. O2 V
* S/ I! j9 ^, d
source "drivers/mxc/Kconfig": u7 i' u% w9 y! V' N& E
# \* J8 ~8 C) Y! A/ R; `
- E x1 D+ J) d! Z
1 t2 G% w7 b) M6 s- P8 D, Lsource "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析" m: @0 e1 O c2 V
! J8 A S v0 N) ]' D9 U! [
- 7 o$ G* S5 y2 s% H/ I$ [6 P
3 K8 Z% d% `9 m7 I# _
endmenu
$ }9 u& a; E0 g# ?9 I$ g+ T! b1 J, \% O. C6 I3 s# m
; I" W3 c& }) q% o3 ~
& B* q. ~- }% g: _如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。 K+ p) v) o q# k; }
编辑Makefile: forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile8 l* {8 P! Q% [' L; J4 P, N! E
在Makefile文件中写入如下内容: - , J) X! u3 |9 S
$ a6 D! J5 B- x. N/ _9 @: B
obj-$(CONFIG_COUNTER) += counter/
% @) J$ g5 w6 O# x) R b$ V( W2 d/ C* m( k3 v5 P% p1 d2 X$ G
' j- \4 D- A) T% v L$ p* d2 T4 R* D6 F' `" V' k" d& Z
obj-y += mxc/4 Z5 K' J8 [% `1 n
% \, P! L) y& }: ~# M3 f
6 u0 l* j& i& U5 P) r9 h3 q; [7 y8 h; |6 P( E: g4 ~
obj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句
7 ]& |9 i% Y4 i' w; L) x" K, P) B+ I! [" w/ q
# {- I4 }* a; e' V O+ v ; K Y( G. L" A9 | I$ T8 |! j: u( V
这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。 8 ] L! b5 V# V! D# W6 k1 P
5开始编译:
0 x) Y9 T4 v; g" P' R3 e% E7 f% [- w8 A4 }
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..
1 s* Y- p2 G4 F" x# X1 M
. i9 U+ b( V9 V& ]
+ h3 Y. ]" D/ v# q6 s) d3 a6 C: U
, E, h! ]2 U3 K4 M2 |7 xforlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux7 W. C, j. m( s( e
5 v- T0 [0 h/ @) ?# v
- 0 C( o) V' ?9 }3 f
g3 ?2 y) Z. O( l$ E* k
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux9 w$ f* m- b7 X9 B3 t
* ~3 e+ G4 l F6 D. h+ l& T4 H
4 M6 G) J `5 e$ L% |9 ]4 q* U/ a R. @* l) w& r' {
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel, F: e3 V3 L x; I
) M$ j6 w* r2 n8 }% L7 y
& A# C0 P2 [& x4 e' g, ]0 }. M" ^7 K0 W$ Z% X' ~
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules; i1 y9 i. g. {+ A4 W, x
; x, r7 Q5 G; [& N& z4 G: F% J
; ~0 w, P; C* e6 M7 E+ z( H, l5 R$ t4 C$ {
scripts/kconfig/conf --syncconfig Kconfig: v" r& ~4 @& R4 K/ _
; Q% G4 x. r+ P- R' g( K
- 7 n0 x- |& N- P
, m" f. e& { d5 Kdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'6 e3 w4 Y+ y) e$ T
9 X/ y: {/ {: x - & K/ W6 k9 F5 \6 f- ^/ k6 O. H, w
9 t7 S+ _1 n% j7 S
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'/ Z C, C9 @9 n0 H y! ?; F0 l$ @
& a- m! g& o" U1 w: ~" ~% r6 X - + O0 Y3 k1 ^' q7 F
: p' i* m( w9 N/ b' K. Ydrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
; M+ w V0 z. e" U" f c/ \" m% z- r* I# l2 g3 E% o* x
& U- Z: U8 }3 W# i- C: g2 T
% H: H6 r. S7 i; xdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'# Z/ R! _" N$ A5 Z( J2 \: f4 |
) r% X# p& l! ^) T$ J3 x
- . M d ]6 w% W" o
& T3 @ i1 l% n( e# o
*9 q- ]* [# a" o( i/ c2 c3 F- K2 A2 Z
* p/ \7 ?; W( O% n% S# U- J
- ' E/ U: g8 f) R4 ?! W
0 s! I# y5 R8 R' e f* Restart config...
* O* @# n; k$ m. _& X: @: b |5 r$ w4 U' C9 `9 P( p
- 7 B4 i D& W( c( N( G
& s Z2 {& W, e*" [8 y: z3 W9 T3 }
# L' b4 M/ D* [; H' N; O a/ B
- ( ^, n. w1 T+ o( A; ~: a. z3 t
( \# d R3 E8 x+ t, v2 h5 @7 b*
7 z; C/ F1 a$ i! H+ r6 G0 c$ J/ n+ k# M
, a* b; {) t- b G- E9 T
1 U* ]8 t N. M5 r- Y* Device Drivers# A% s' D4 v1 {" r( r
) R, T i+ U( I" B/ j* P# U3 u+ `; @& [4 S
, S$ \6 I1 j( e( ?4 B& X
" d- U7 N0 K ?9 f4 d*. h* H1 o0 X4 T0 \/ A: L
0 f! e* c# ]: J% x: M
- 9 x7 T! `- W# y( v* V; B
* V; G2 O5 U2 a6 eTrust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n+ m' a; M) x* X, k- B o( D; Y
* J n% o* N, P! ?1 \$ U# ^" V - , c, {, q! w* T0 G: i/ d& r" Q1 k
. f/ a; z! P! [; t |" ^
Platform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y! {& _: r4 Q2 B5 t8 \
( o) c% r$ L/ }! u( i
! H9 w& X. I# m/ P1 Z: M& \1 I- w1 C, M8 z# k" c% N
Trusted Execution Environment support (TEE) [Y/n/m/?] y; U* q3 i7 J1 S* X; o3 y9 c3 a6 I
) i' v3 S* J, Q0 i
6 @! }& J" D9 h% U! w, l" R2 m; Z" b k0 _) v3 C# Y9 Q8 |
hello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
# n5 W' N: d* {# B0 V
: I$ \% P1 {2 H$ W& s6 \4 W p) @! J- ; M. r& ~$ v$ E4 P7 A* |
5 s% h: t8 S, pCALL scripts/checksyscalls.sh; T! I r* J8 L: ], c& N
8 v ~" ^* b. ]0 O, B - . B7 H; h# H. c% d$ R
4 o$ q2 w( p1 O. f) xCALL scripts/atomic/check-atomics.sh
$ O4 K. K# Y; T. K) G, s+ I7 |3 T5 R+ m/ v* b
- 4 Y) D. G' c6 d0 u0 i: b3 E
7 v: N/ U$ Q' C2 ]+ F$ V: S
CHK include/generated/compile.h
; E$ p" i7 i& P+ L' x
; r# T3 ]. A$ z2 U
+ W4 }; F% p |7 B/ I
9 z) T1 e& `1 H* C6 ]% FGZIP kernel/config_data.gz
) s, ?1 u2 U% K1 ]/ A, t% t) d* r; F' Y3 I" r3 M% u1 ]% F8 ]
- " B6 p5 `* p6 e+ I# p3 Y4 B
% n- ]) Y$ r/ r9 K/ ?, g4 ~1 @) C- ^
CC kernel/configs.o
: a+ P1 ?6 V; Q$ |3 F0 c% r! X6 I5 h2 O. T
- , w6 Q$ L4 T: O3 n. |7 E* W! a4 _
# ^8 b l1 I' R; u
[…]
/ v6 G6 u" G0 g6 W- N; ~4 W0 Y Q$ j
0 b! X! K( b3 q - 5 H% }' A4 }! ?0 l; P7 `8 @: ~
2 D6 A9 f. f' \( [# H8 C
LD vmlinux
+ H$ e! J" R; H) n0 T
* l6 V+ k9 z% ^* k# f" N
: T: D5 r9 ?8 ?( H0 R# l ]2 s1 ?/ V) K. L4 H: S
SORTEX vmlinux/ J4 t Q% U" N0 v4 s( A0 j( b
}( q3 T- W- ^5 b ?) X$ N
- m6 N8 \/ l" J2 y& F& M
6 C; F' }; M+ B6 f# i- f" n# D
SYSMAP System.map$ s/ q3 W- L5 Q! y9 ^7 D
/ u# x! B. |1 \1 ^
8 p; r4 Z+ C; r$ \
& d7 o" l* t$ _2 B( bBuilding modules, stage 2.
& @7 Y" S7 K" d; E6 B" @. [8 C. S4 Y1 l! j6 M6 U5 H
- 3 _ [ f% j# B
* [! h) Z8 g* O" z: a" g+ X& h8 W
MODPOST 536 modules$ s9 d1 P* V* f* [; D5 A
7 \3 }! m9 \ V; D9 b
- _! U: Y' z5 ]8 `/ m9 B: x
! s/ P8 _ b8 R/ s5 o+ I" m8 N0 ]* ?, N: sCC [M] drivers/hello/hello.mod.o
) e' r! E+ q& D" E: f' [& ?! b* v5 j7 z* Y" U. P1 u" _
- 6 S9 h% ~) |& H7 N6 C; }2 I
- m) l d; C, K7 p# c, K
LD [M] drivers/hello/hello.ko
p/ g# q- F# x' b8 J H/ t: c. e1 Y& ^, G. _
1 M) V! n3 f3 j' v! `8 n
![]()
, w$ G% u1 `+ l2 H5 X0 p Y4 ~+ d
编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了: - % z8 D% x5 G1 h$ w
( t5 R0 ^( E6 @+ eforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello
" b! j& y* X0 N9 x/ ]* g ?' |, @+ |" d$ b4 H% ]( W8 Z
- 1 k \* w1 w7 K! M5 Y% z
3 v @1 V+ E: }+ _1 }) I
hello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order
3 ~ C5 b* Z7 m3 L, {7 G: z: e$ q t( A7 Q5 ]" k
/ U* `5 c1 J. ?5 L# O
% M, w+ i! ~( j9 w+ {/ S% B/ T
6 5 w/ _0 x0 |6 p0 m) q) q5 C D
2 N) }/ z& z8 y% _. y7 [
将hello.ko使用U盘或TF卡拷贝到开发板里进行验证: - : X$ x9 X* I, r a8 A! N! ?
7 \$ ?- `* I5 Q6 n$ y! g7 e
root@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下+ b* n( @# i9 ~) V! O: ]
8 f8 d5 [ C. \7 J1 G9 g- i, Z | { - * B2 ~8 R& F9 {8 W& F7 [
. g S$ e. { e: m1 y
root@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko
+ I4 y$ y; v* ^2 H
: h/ w8 Z: U: Y, @5 b2 T( `6 ^, U - / W% e) f* d) W8 O
5 s$ i3 x) u/ l8 f3 K6 H
[ 138.679964] Hello world //挂载驱动打印信息
! q+ g4 N1 q9 z% k
3 u: R8 U' m9 K2 n! R9 s. } - ' Z# _. T0 v. Z7 c3 y
: j* g! a) W7 {4 B" y" [) O
root@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko* L/ A s" h2 z- E
5 q7 E; w5 ?( V8 A
( v; d Y E( x* X
2 ?2 [9 v' D2 I5 M" Z[ 142.022115] Goodbye world //卸载驱动打印信息
5 A" I9 j0 c8 h" w5 W. R/ i* l) H; s2 s4 X. W! k7 u6 _* f: w1 Z) n
/ F9 Z$ i4 K. w/ o9 V! j+ H8 u( l. D; x: B4 V. g8 `: F$ B
root@OK8MP:/run/media/sda1#6 w* Y S5 Y# \. r& e
# f; w3 W/ U( h% R
; i2 u+ y& D7 h. A
0 @/ W) C6 w5 q7 K/ H9 W$ v& G由上述测试可看,hello.ko驱动可正常运行。 + A$ ]/ \, G4 d
以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。
: v5 q/ ?: i6 F( Z8 z/ h |