EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。 0 g4 o! {# b* e! L+ U& P+ \7 v! o
![]()
& C. |2 s8 k' l+ I01进入源码的drivers目录下,并创建一个名为hello的目录:
5 X8 a! ~# \9 ?( [6 K% d% {0 i
7 X% r& V4 K; _5 A' d/ f7 \$ ?forlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers; W& a9 V f" Z+ G8 x0 H6 S6 q
6 l2 j* I' ?- E; h/ i
' s* K3 q+ m" |) b# g6 t+ ?: c' B+ W4 _% |' a a3 C
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello
! \8 r- L9 q* G$ `
I: h4 U X# I* j4 H3 t
) B8 j8 c5 w1 e + m% V3 o. Z3 ~2 x- Z$ x; |
02进入hello目录,创建hello.c:
3 w, W/ i. q; o$ t: s
$ B( l- W% O7 F, Dforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello
: l1 a1 Q1 c5 t7 l' S- i9 ]9 T5 S$ b
- * R, K4 c: |3 I w; h! e
2 ^ m/ M! w r9 Z, W. K9 o; c6 W
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c; b- n3 y* W* _! ]' M C. }5 I) c' S$ B
. K+ M$ i8 ?" K" ?
! C; b" {8 ^0 q' o: b% R0 q 5 }5 _& a* y5 W, d2 L; Z
在hello.c中写入如下内容: - $ S e2 t4 H) G
) @+ q: ~2 Z. T4 s* v6 J, m: V# q#include <linux/init.h>' s! B- T' n% y9 d$ v3 j# Y- e" ?
: S/ p) p, H# ?1 F0 ^( h4 Y
- ) z; Z# C9 z2 q2 R H/ A0 w
, k% p2 M' x6 Y% }5 B# T3 i. K#include <linux/module.h>* _+ N* ?5 i2 y1 C% K: I
, A8 {# r$ O' Z& b4 x9 i
- . X; A2 H+ w D0 i6 V
. N p& f5 Q& `; rstatic int hello_init(void)
* N5 p! I" t% y& B5 P& v- Y n3 S( u% w: F
0 d8 R2 I2 O+ p4 W+ k* E9 k+ U; I7 A/ o) k
{2 T7 B6 W, p, s# O( r! U& g( i
) u2 I+ h5 n& n! Y9 L9 z
- & o" z4 {5 h% Y3 j/ N% A. e4 r! a
' G Z$ M0 W" t* {2 }' V6 h
printk(KERN_ALERT "Hello world\n");1 F9 U5 }% j6 c: h8 I
! c2 g! x" ]) T/ A! @9 {' e
5 _8 K; u$ c0 b0 ]7 R
! @4 ?6 }6 L$ m r: preturn 0;
- h" s8 ?7 x; l# u* |8 T1 K
1 W/ Z- H* D" v$ K+ f, n: A- |- " U! q/ f3 n& @# F1 J, [+ ?5 w' @0 L( u
' m. c! f; D7 U% k+ g5 c3 ^' Y}
' V s' s0 j- ]- V+ i5 e- F T( G, F- W% h
9 Z$ p& {/ P7 Z/ ]; U, m0 c
3 ?# S0 J8 z* m, j3 pstatic void hello_exit(void)! g9 ^& d; W1 C% i
! l) R$ s* o% d6 P+ c
$ F6 U- t& A3 G: k& Z
& b' r, w; j% K/ ?9 Q{
- [) p' T$ ~1 i k: Z0 r3 t# x. f( N' E* S
- - c l4 I; ]2 Q) e$ T" o$ f7 e
1 D# i$ n% E7 E+ D+ Hprintk(KERN_ALERT "Goodbye world\n");( r A: e% H+ R: [( J$ ?5 F- G
' x8 I" z& b* F$ N - # C* Z9 v9 B. O6 Q: n4 C
0 c: }/ H$ q" q6 R* L, \
}
& i) ^/ s5 o, a' h1 ^" M: b, X& b
- ' G/ C7 e8 Z/ n i: x
$ h s; S: k8 Smodule_init(hello_init);
3 A0 ~: d8 H! R2 u! M( x6 w! U& w4 w# J( [: z6 J
; q2 u* E' }# |/ C1 j: W
! d( ]' O! {5 K7 _1 A) q2 C5 Zmodule_exit(hello_exit);9 ^( n* E8 q& }% T) S4 s
. E/ |9 \ q' @9 V- |: X A
- % Q6 s2 q. @3 P- R% X- }
. s$ w. T. M6 B, ]3 v5 s x
MODULE_LICENSE("Dual BSD/GPL");+ h5 F5 z2 H: {3 c7 T' a+ C# q
, i- r5 B# Q, G+ V6 @# D
& q+ {4 Z6 w3 u+ x+ S, ] N3 [5 s
7 r: D. F% \ E; d B% i程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world
' l9 |: `' K7 M" X9 e- y03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
% s, b' l" a' i; l2 {7 T: ~2 P在Kconfig文件中写入如下内容:
1 a8 H9 l6 h8 X* Z1 b4 z
! I2 G4 Y5 g& K3 A+ j* D& F* f0 \) Nconfig HAVE_HELLO0 b5 R6 E8 w, [* w [% ^8 Z
. n) j7 n. [' i2 `3 J! r7 y
- 9 N8 n0 H* E' \0 D, |: l
. q. e3 [: h' X" C/ U, X9 Atristate "hello driver"9 t$ U6 W' ^& M7 @. ]. x0 @; u
! c! a5 @. s- X5 U/ h. c" x
7 D5 Q0 Z; w6 K) G L- m
+ j9 X8 y8 Q" Lhelp& `2 Y& q: m D$ _) Q* c
- s8 ~! A$ N( \3 J% F& b
& I I' f% e8 r
' I0 v. i: R) Z t' @) pThis hello driver is just to show how to develop driver process.7 T: Z/ C) s% o" l& p
$ R, T+ z$ {7 s' r- 6 v* i" B3 S/ O! U1 h9 X. @
7 C4 E' U; ^8 Y7 A# `9 ~
! ]+ d+ r6 Z& n+ v! F
# ?* C& n9 d) N7 R
. j5 ], O+ x9 b) a. r. A3 D" v9 X
9 \) n* w# o. Z8 q- d) g7 y2 w8 F& L3 t
0 e, f z0 c7 ~5 y
- ( C- h6 ^# ]1 e" H" i; X' P
" v3 E+ `$ _( f3 T# m! N8 PThis driver can also be built as a module. If so, the module will be called .# o* a& H4 @ j* y) r* E5 j
4 c/ R* Q% R2 Q# o$ l/ }& q1 b
& d p' ^/ c x+ ^ B# S2 s1 Y9 K2 H) H6 [. v& V8 W
default y" S) N; V: ~7 F6 B- R" S
4 q% t) V! P# C. A3 K; O
: E% u1 R6 O0 i+ W
. j7 O# K7 p# M8 I% l$ n#endmenu
7 L7 K; c) N7 t& @ o+ H2 X( v) m; w' I4 u+ b% G$ A- V/ b
: i2 W4 T# E8 m
& }" y3 V, g' Y2 c
表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig1 p! ?3 o. L6 m7 M! C5 W) u
在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o
4 b5 z( D6 ]% p' x4 g: ^& `2 f注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。
7 L$ f( g8 @& [) Y给添加的这三个文件权限:
4 x$ O, _, u5 I" Z2 \+ W
/ C$ |! m0 X; t8 j) qforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c% e- V7 ]& U2 L+ y8 W
' Z4 ^( s1 P1 ?* M- & j7 t6 Q9 z3 t/ M1 m
0 p2 @0 b9 W$ g1 A/ D; a% {
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig" O- H, l( \0 c7 [* g& E) x$ \% T( H& k
- \; v+ R8 s! _7 }. U1 D
" \8 Z. r/ D, v( g$ ]) O8 S. x1 N* F# }9 ~5 \9 r% w
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile8 X2 X. Q- K1 q8 J* L
4 j! T t* m; f; k% `
5 v( k! B. h/ @: p( I0 L/ v " @# f4 Y6 U/ W: l7 }3 d% Z
04编辑drivers顶层的Kconfig,Makefile文件。
( o# a& e& `6 b& W9 [, b& E( u! e# v h, F
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..
8 x& e, d* \" c, J% _, ]$ b3 J* d4 n9 o' Y
& G6 R) |! s" [4 C, \( o$ g0 X; J' G8 X6 N! c8 c) Q
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig T7 |8 D! r$ s7 J W! K6 X5 d4 ?
' ~) g. f: \/ i
4 x8 N" d E! ^/ o% u. V; g( J7 n
" ?+ g M/ n& u- P2 r
在Kconfig文件中写入如下内容:
5 v* j8 m- B2 y$ D6 T8 Y: s6 t' j+ @2 O. y( N
source "drivers/counter/Kconfig"5 |% p) ]/ [+ @' E, i
$ r4 N. [4 b; ^* X% l" m
- 7 r- N- e! K2 g' T/ B( e: _
+ N* O3 {) ?) G% q, U3 @& F; [0 Rsource "drivers/mxc/Kconfig"! ~+ A0 T r+ k" B% U/ R9 I
' M, n. N: x; O
' w' N3 h. P! x! Y# v
! Z. v9 k3 ~ P7 @0 Gsource "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析
. g6 F$ |- `6 }: V2 }) A
* z3 W- E# N6 M7 E" T- & q5 ?4 o1 d/ \+ W! |' z% N
9 X9 H1 c8 ?3 f5 L/ P" ]+ a
endmenu
i5 {, B! e9 s4 A2 L8 j) S9 N9 f1 z, m
9 H; j* T/ d) a# j1 [
0 ]# X0 L0 |: N$ N8 _- U如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。
" F" U% @8 r5 S( L! q: K$ B! }( Q编辑Makefile: forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile: U1 r3 x8 M/ A
在Makefile文件中写入如下内容:
" e! l0 w1 z H a
5 c/ n% o' h. b* B1 K; M4 Pobj-$(CONFIG_COUNTER) += counter/7 S' x# Q0 N$ ~4 W
! K$ a3 q% c1 V- h; }- . g D; H6 U9 h7 i0 `" L' c% I
% g5 r0 {( @: u! i/ D3 F9 fobj-y += mxc/; i2 r+ K( K( {2 ], ~/ W" ^
& B8 q4 s. ?" p9 X J
+ ~) d6 Z, e& Y# U0 W% r% |3 A$ n9 ~$ P1 r0 ?
obj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句: O; c) K; V0 Z2 S& d
# r* v7 c6 R3 u4 v4 Y. `& O8 w& H4 s7 {+ ~) P A. x
~4 e2 N- p& o. w
这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。
' I+ d) G+ `( j v k5开始编译:
) z- {, J6 V" E/ v0 L" C' \- ^# \$ O0 o7 S1 f
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..4 _$ j% S2 n" k9 l7 N o
J V8 \8 e6 y* ]" `
- , x7 f }& T3 Z8 S. p4 J- {/ V
, l% [. C% p# q+ q2 W1 {. Y
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux% s9 U' ~2 k" G- E' _1 R
$ N% w1 I$ C* r1 H% T! w8 ^
- ; a: {0 b* ?, \: D. ?) M2 v/ E
: K) j- X. w8 a( q! d" m
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux# H; I; j: H! a! Y6 m8 H0 R$ K
- C$ e/ `+ w: q" q* t3 d9 v
0 c9 O/ C9 Z# E/ F d$ \3 W
: m" D9 i+ B: G6 r0 }forlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel
, k, P% K& i% H8 H% F! y$ w
5 T1 Y9 x! z" l2 S# n8 a# P- 5 k* v; j M; ]0 A+ ?/ D
' m5 B& w" d; E) Lforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules# l3 F8 Z3 S' u* ?" ?
7 w& R: l" d9 a( Y1 F. d
% z T" j8 _" M, f4 t0 P2 p+ O
3 t& b, S+ K4 |+ K: u8 w7 gscripts/kconfig/conf --syncconfig Kconfig, R/ L1 | y' O$ G4 a% n
- R! M& r& K7 k, Z' ]3 I, I
& Q( h5 A2 L: J8 Z) T" p( U& T! Y
- Z# a& w* k% udrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
) y+ b) M7 E, K7 h* ]+ W, |* Y- @# z' J8 ]$ W
- 8 b8 @; ?. r* o# {
. y' K$ L/ }/ X# C) gdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�': Y7 Q" p2 J' f- M! g) B0 m8 M
* K0 ^( ]0 Z! o y5 {0 y
& z7 K6 o3 r4 y' {8 x5 l" F3 h) D( x" Z( s' [1 v- f$ J
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'! j; G& e2 e, t4 N" y ]+ A3 m
- H( ]6 C' _" R0 P; \
4 j0 V9 x7 l1 N0 O9 O1 ^
1 [( ~! r- P* t7 x0 s0 Edrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'0 D8 q& Q0 L' T9 Z8 J- h7 v
e2 @: `# f. i& F5 S
- ' P" M. {3 k, O9 X9 r! d
' k% q$ o2 Y$ j. Z" T
*5 v, f4 ~3 W" |
7 C7 Z, T" ^, c, T- F; }" t& ] - " M: [* ?1 g, u2 g/ h( V$ r! a
! {) A+ o; D3 T1 D+ l- \# h$ Q* Restart config...( K; t4 _4 Q& `% Z* v; F: o
d( Q+ s7 c9 Q, j) Y6 y" a5 R. J
- $ I/ @6 C- ?7 o6 _* D& h4 G$ b
+ O# H! A9 e1 [3 x# Y9 O4 _8 o
*$ C t( E% t$ ]* p
7 @" k+ z8 H" S& l- f
! P& U: V! B9 P; L! c# O+ B
7 v- s9 S$ O( F" G3 V: z3 C*! a! y; V& M- f
0 t% @ v }+ ~9 c' Z4 G- 5 j7 Q% D' R( I4 w+ h$ b0 [! C
6 `+ D1 @- J1 Q2 l" M$ N" ?9 k
* Device Drivers5 F; A1 T, ^% C" o1 F
0 X% ] ]" c1 H7 V8 { - . u8 E2 N. M' D+ @; @' p' I
# s8 \( m( U2 T; a w8 x V1 ?
*
9 C) ?$ @6 [! T5 q
* J% s% t0 Q- A* T! [
2 Z) s; Q; c0 y2 J( w: d; a9 G' H( c8 g
Trust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n
' `+ }6 J& m- X* C
; b* c+ q" t' f( Q" |3 F
# h1 j; y3 \) Q+ H; Q$ e% W- b: V! O$ S: j# S! [
Platform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y5 \: j0 s4 c* m( R" V/ u( Y% K
. V5 |: y! F( E) O9 a3 d a
- ( b8 ~- W8 w+ F1 A6 b/ Z
" r6 L9 g* P8 r6 N0 N7 y8 O
Trusted Execution Environment support (TEE) [Y/n/m/?] y! ` j* z, s- J$ v6 z( H
6 Z( o+ m# b$ _; I3 k. H% _1 O
: a$ A" t$ Q* Q, N: l
: ^+ h h1 W# z' xhello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
# T0 N# e5 ~$ @/ r
- Y1 F! W4 o+ m3 |, _& |
4 l' f6 h$ H( S8 Q1 b4 T0 Q' _2 X2 f' I8 W- z8 g) z
CALL scripts/checksyscalls.sh
% c9 _. h2 P3 ]! o, f1 e/ `- E1 }4 y% W
: O' W2 p& M1 r2 \- h8 z
- N& f. [9 A: \+ e. ZCALL scripts/atomic/check-atomics.sh
& J1 N6 I0 o7 H' G/ @ O+ y) K3 ]5 H! E* G
- : v# W* t' B |& Q# q- H4 H+ {5 ?
$ c) t6 l) e/ M. S! t' X) z
CHK include/generated/compile.h
8 I" M ]% y; } ?) K
0 {/ T- k$ g2 ` G& c
, }. u2 C& O E* ` z' k5 L6 O1 ?% J* Q1 D
GZIP kernel/config_data.gz0 E7 g6 u r+ V; g# l, h& r+ `
2 S5 p, [5 D# l; L2 S) j1 v
$ f5 {5 t+ x7 k7 P) a. y" s6 w
1 }3 g) V1 L: o# }3 d% aCC kernel/configs.o$ S& n/ H. d6 o" O W: R
! i" D$ L, D6 L- 4 r# O' {7 Y3 V. Q% o9 X5 Z
: p' ]$ r9 {% O
[…]4 F; [) n" V# k( O1 n3 g8 R% E9 {
% U! }- Z9 X% h& c. {" a
6 U3 M$ \- n. i, n, [1 X
" z$ @& D7 z4 _. Z" V6 Z+ l( C jLD vmlinux
) ^( L, T' _2 a( ?! ~
* x9 A$ i( V, T) _4 Y
- `1 ^' h! }$ S1 ^
' F) p |- O$ U/ rSORTEX vmlinux0 b, T4 d; {0 A: T7 i5 r
o/ E& d3 R* p/ F5 ~- 9 p' _$ j' C5 M6 \1 b2 Q3 j& @, B
6 m( p( L. ]. ^; k
SYSMAP System.map# x3 O9 J3 X g& O& U$ z/ k2 U
# H8 g0 p0 F$ p( h
- 2 `9 O! I, q* Y2 v7 q2 h% ^
) D( U# t" W9 u' k0 B$ S
Building modules, stage 2.
) _) _6 h3 [ p( C
) n$ m* L4 J- {; C$ M - . s4 Z0 U4 j. r/ W7 @8 @
) y" }' @9 F$ l7 Y3 IMODPOST 536 modules
# w3 l8 M4 N- V" y9 T
3 [( K+ S4 H( _! F# o - 3 y& T3 k# w% t* r/ f# \* x+ ~
\* t- q" n) a3 vCC [M] drivers/hello/hello.mod.o
f, F$ o3 v' b! p8 L0 K: D+ C0 o. f" I6 z1 |1 u" x
- ! a6 ^ }9 H" p/ o- q
- E3 H% r- Q, i4 f
LD [M] drivers/hello/hello.ko
6 ]1 X6 s/ K& G# |# ?' C( a( b6 d2 i; v! `2 O7 d
; p8 j: E( U1 k' U/ r3 S$ w! t
8 m: Q3 a) z( \" ]/ o" d( o
9 Y: y; Y; p# }3 E编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了: - : C$ j* [0 _% R5 ?( F" W
+ c2 A, D, ~- M; y; V4 P: wforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello
0 \/ x. H. x. c5 b6 v1 I9 i: s4 u/ Z+ {" R
9 ^- ]1 W9 v# n+ V+ t j7 N6 N( s" i: U& c) d7 w+ l& U
hello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order
* \# E* [0 ~+ G3 ~9 l: c+ A4 c! r: N' \9 J) x
* j6 M( i0 v( ]0 G' _
" e+ _: C4 s2 ^' P# V" c' T) G6
+ \2 A$ e% H' t
6 u9 d5 j4 E& s4 J* q4 f% q2 P将hello.ko使用U盘或TF卡拷贝到开发板里进行验证: - ) _0 T6 a9 E& a; E6 V
8 }7 O8 N6 [' O; ]+ C4 Q' K: _
root@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下
w& ^1 a5 h, g0 d+ n, B1 p- |- y( r% y4 W
& Q/ ~/ N& \% d, z" b: }* L& N% i+ R- H/ ]# f* Q
root@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko" R. K: I! A. x9 W9 v
9 X2 _; P% a1 ^0 \0 J& Y4 w6 |! k
0 O4 \) [; j* F9 c
# N- E1 N( a ^) |[ 138.679964] Hello world //挂载驱动打印信息
3 d2 ?7 L/ Q! h& Z( K; G1 t, C1 L
; u( i9 L7 m6 R/ @. R/ \3 X- m$ N5 I) {
root@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko7 |+ h& z% C9 s
9 q( R0 B$ u4 ]7 ^+ \- 6 @* i3 R0 L5 k. g7 Y8 J! p2 R
+ ^! l5 Z! O/ j2 ~[ 142.022115] Goodbye world //卸载驱动打印信息/ A! I& E2 I5 e: w) A; X3 p2 {* M
0 p5 W; d( y7 g% C" l
- $ x1 @+ @& d3 N0 }
% Q3 r8 A: ~7 w5 C+ `& }2 b
root@OK8MP:/run/media/sda1#7 K4 i E) V% N; L; P% e
/ @8 A( o2 _% T
9 u% { Y# S& \2 W7 E
' K$ q4 v0 c8 J由上述测试可看,hello.ko驱动可正常运行。 % ]$ }0 p u, u+ V5 y) f
以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。 % X3 P. d' @) g
|