EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。
/ {/ D- U8 U. K8 `( e. Y8 b" c![]()
) Y$ g v& D7 `: Y! P4 i01进入源码的drivers目录下,并创建一个名为hello的目录:
) w+ g9 h( D# Q$ S1 Z1 X8 a
+ P9 p. N( \. N3 J, o; Lforlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers
% S s! K- o& I1 _, D( l/ q( f
4 P1 B J9 u0 O4 N L8 z
) s/ D! u* `2 Q; C
" b3 C# {( F# T5 `& w' Qforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello4 L5 j: r6 G6 g2 y' e. a
7 C+ s8 g6 q$ f4 e* G- @3 C# ?! f
. K3 m* x$ n' `4 F. x J / j/ z v% l1 w/ r9 x9 `
02进入hello目录,创建hello.c:
5 E, F7 i- i6 @) B+ L7 ~7 _2 D1 H7 ]( o& y/ L
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello/ l- L9 @: S1 y6 _3 d
# g+ H+ ?! J" d1 ] K( p& p1 i- - w8 l. l# l. T
3 q9 h) ]6 h! h% l) zforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c
6 A2 I6 E' p' q) c$ {8 Y; p# w$ u
- T3 S- a; J8 ?8 V' U( }7 B, c# s8 I- A1 a- m$ y+ r- Y
$ L2 w$ I3 }7 h+ i8 `在hello.c中写入如下内容: - ) w8 p# R, R, T$ f! a- N
6 u# j9 i. N. ^! X+ d6 E
#include <linux/init.h>+ D$ }8 Q# W" a( }. {% j& g
+ Y* y$ _1 C9 S3 i1 W- h
$ ?( f% b" Z2 {4 S7 t
6 Y n' n; l6 _0 e2 ~. w/ b#include <linux/module.h>
$ o4 e: m9 H2 E3 J4 v* |
& B ~4 b/ v9 s" [
8 }. ]0 d N. z2 D8 P. p0 A7 D2 j/ r2 ^
" P- Z3 I2 @" l( N& Z% D1 pstatic int hello_init(void)
# K, B5 J" B" I6 v* c d0 ]- m# T* P3 C8 O$ I
- * K+ k) j4 | }/ X& ^- t
0 D& X0 L- M* s m
{, ], x- ~! B- b1 g
' ?4 C8 | J7 [5 V+ }. |5 A; [# [
- 0 t: C1 f2 o# T9 w/ g
9 K5 U' `5 W1 T; w) l8 ?
printk(KERN_ALERT "Hello world\n"); f; ]9 Y1 q& l# C
J! R6 ]. }# j: w
4 {6 g/ A- F6 t( [6 `( {" s& R$ C: W
return 0;% c( t2 j) K; W5 U
+ h5 b+ W8 C0 \! d1 s9 }; o- 6 \# z R' u: w4 P/ f* ~# Q
4 a( A+ M' V, _3 U}- U- k+ E8 P. Q2 J2 `+ D' Z7 B7 [
( [8 j8 g" l- S# [6 |7 O
; `& c! p' E$ D( I0 R) w" G1 H3 A) G7 {/ j2 ?5 c: z$ `3 Y8 m0 B
static void hello_exit(void)
$ G$ X* [! m6 J. P7 ]# R7 K9 O. v+ c6 W" l
) U P" E& x s7 n* ~3 I' A, a
. ]7 N' I. F+ t, V. \- {{( s. p: d3 ^' Y% T5 X2 _% Y
Q V2 W* S' S" K# L
H& l1 D4 W; ^* h! }1 Z# ^7 |$ j1 Y+ y/ ~
printk(KERN_ALERT "Goodbye world\n");: _& F" w: w4 m/ Y8 u
9 u6 c* X$ j3 l; [( |
! t9 E( o2 X6 H3 }, S% Z4 q$ N! l% |' w& M9 D$ D
}# V$ C$ e! u# U4 Z5 Y! i/ P
% {8 n& N$ T" }/ f& s2 y$ O
1 p8 p* Y# i2 Y# I) f1 J1 [) n! O( k7 R
module_init(hello_init);5 U9 j ?, Y$ w( m9 Y" l% H
+ u+ x( ?$ M: E$ u* W; N3 u- $ ]9 N& h& ~; D" l, e
8 G! Y* r, j0 J' d2 H- M4 rmodule_exit(hello_exit);. f1 A0 Q1 S+ i. x; L
2 D5 i% P( |* [ m3 B% {( m4 M& L - ! P# h' B8 O6 Z5 p- `# d
/ {; V5 J! q8 Q# q4 NMODULE_LICENSE("Dual BSD/GPL");6 s; o: V, O8 |
" a$ ?$ L9 ~8 A9 M- ^9 D) } m
4 r( N0 y4 `, F5 C
# K7 ?1 X- p7 B6 p2 i
程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world & g5 C! g; E# J% [' |! `+ d
03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
5 a$ V9 c9 O! `, M5 l/ D9 I在Kconfig文件中写入如下内容:
. g; i2 w; `1 T! f5 ^. ?
% O+ Y# k& |/ o4 g1 fconfig HAVE_HELLO
; |! v! Z, F: t2 t! I' ?8 v4 J+ H% e- E8 g& l, T- `
& d5 _, V0 g' S' V# p* b' A- @3 I+ l4 m; ?. k
tristate "hello driver"+ s9 S$ Q$ w8 M
& t& W" @5 |2 R/ L4 P
5 w. U( t. x9 v2 H* ~8 O* P0 j. w* E9 ^% ` v( R
help3 o3 A* C% a: O' }& _) L
3 R5 A+ F' l- b+ N! d- ( }" [$ P- a4 B; b2 O5 d7 a
9 E5 r) R9 X2 {: a" i; p* MThis hello driver is just to show how to develop driver process.& |) v# J+ B' B9 m/ L: h, T
& V) x) i2 B+ n7 L' `, U3 \2 v" l
- F5 N1 `4 G$ E: p$ O! P
3 W) E8 d9 |2 o2 [1 [! c% A' J! U
G& h; \( l" O4 w+ e. i/ \+ q3 L V+ i @3 b1 ~1 _4 N
$ J6 w) E* e' \* p; D! D: z
& J, U4 Z9 s+ H! _- E
$ W9 h0 c. Q' U% Q5 M5 Y
6 {, I+ Q2 E& {& k8 [. g- ' w' |9 U5 |% B# b
" S2 A" @( T0 T) U) ~4 A3 M/ X& }
This driver can also be built as a module. If so, the module will be called .5 C' F Y' q6 l* y, U3 q
8 @3 r5 _0 `' \, M1 L - % q) ]/ T* _% x" j5 F
6 G- u. C, k+ \7 r3 \+ Ddefault y; x" O+ q9 |- Z
( e% T6 \/ `+ N% S3 v% {
6 T' y6 a8 R( {- h; C) z
# R* J; O# B5 g) y- O" {#endmenu
& N1 m! u% r( T/ t
/ E* M" {" m9 X Y c* _
" C6 K& q+ x& Q, G, h0 }
; v! a) R% k; C/ b. a- _表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig5 y5 J, _8 A' E+ O
在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o Z4 A+ z) D3 l! ?
注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。
/ N: E, c- a. Y6 J" ]给添加的这三个文件权限:
5 [) L; a& y# L7 @6 \: e: \, z' C$ t/ Z0 G: }/ q
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c0 `" N) g7 ~" F1 ^) l, |
5 [% r4 S+ Y! Y- " `5 z0 A/ Y j& K2 A+ v; {
) N. ^/ C0 k1 `& E! t7 B
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig. `2 W3 x4 {0 e5 a+ b
: H6 n( f6 M- b: ?8 X) s+ |3 Z- ?0 B
- 4 @9 J; P$ | @& T3 i7 e/ v
# Q; e; R! }- Q5 M' A
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile
( I0 J& X4 G1 B1 g& K8 b \
* s' U* f7 X" n; F: {$ Q0 b+ H' t2 `) V' ? H* N d: w3 M
+ ]% q- d7 R5 a: o
04编辑drivers顶层的Kconfig,Makefile文件。
9 K3 I8 o: A) P6 \& r& j. c3 k" w0 t4 c
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ../ D6 p- v @ \
8 F( E. Q9 Y! `; f6 H. m( e$ v
' U# ]2 B w2 E: D! |( `3 k2 t8 l) W4 I6 q( l
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig: z% e- a# r, j) B
" Q# O7 B- y P5 N' X& O3 m# K+ {
4 q8 w) a+ {1 g) Y% `, M
/ t; x5 S5 q9 e3 `# ~# T在Kconfig文件中写入如下内容: - - u' j: m% A# [
8 D0 n0 Z3 X5 l+ k9 z; E' M4 Y, v3 Dsource "drivers/counter/Kconfig"; v) |( d n2 M* G3 r s
% B& F# R( h8 p6 O( J. H5 ~
* o) V6 J6 D1 U) U& C8 p
3 G$ b* D j7 ` ]! c# ksource "drivers/mxc/Kconfig"/ g! I6 e4 V9 w: L
$ E2 ]; T5 l: j( X2 i- ; X g/ }* w+ n+ c
1 H2 ]( J5 W% Q* b6 h
source "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析) R7 f. v+ f; z; ^8 F, ^, f6 ]
6 A2 {6 U2 j5 R3 b1 d
- " O5 p6 j* m. t: x
8 R$ {) x! O! A* `. W8 k: ?% N5 j$ ]; oendmenu% f8 }% o( D N* [$ ~( @
( h* r; L: P7 ] R7 K. x+ ?$ @
' y$ w5 ]8 S) v
! G3 C+ S/ \, B如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。
& e2 w4 m2 j9 ~" f编辑Makefile: forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile
5 d- u) e2 x8 L: p. }4 _在Makefile文件中写入如下内容:
1 J: k3 [+ S& J% Y* X" ?* y# Q
. I; s: r- s6 f" a1 x$ ^obj-$(CONFIG_COUNTER) += counter/6 O3 C/ S" z: v0 M
7 I6 m9 E% c; M- M4 f, U
- 3 F* U' R2 t/ _9 h6 t
8 O# W* X! ]! c( U- ~# O/ Z
obj-y += mxc/, ]: c$ [; P9 Z8 {4 d
$ C/ y0 N- w/ Z: z, Y! k O9 Y - 0 A* f7 V7 @ G5 ?7 z3 x& F
. w* G: |& C5 p2 s( v! {
obj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句
# r% l, L! j& D; {5 K0 [: |# ]# T# C0 A x5 S
, o7 I- }$ d" P+ I/ g0 k 8 L8 @ M9 ?( E% ]# |6 L
这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。
/ D0 T, g A0 H5开始编译:
8 {. k4 ^1 ]% T* [& w3 ~- m7 x1 ^9 n/ A8 X- a# p4 X, U
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..
) ]5 \0 P2 z9 v) w. h" J _8 j: B! ?/ J. d
5 O7 c* h% j$ g' w6 i7 {/ v6 {9 `2 V. _2 `* W% {
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux% c% f* b: Z9 {4 r8 V
- G1 [4 O1 R% D. u& T# o
4 Y+ ~# k# I9 [4 Q1 J% o9 M+ h9 d; Y/ B L
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux
! D5 r8 D, R% S6 f& E# P: ^9 z
- h' O# w' n4 k4 N- 8 z1 `; u4 R# o+ ]% X$ e8 Q3 G1 E5 l
! r, ^8 w7 ?: B# T: h- B; C$ uforlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel
% y: \3 V5 R; B" S: @1 T; s' g1 B
! M! `. ^8 D2 P" P# ? - % T8 G0 k3 l0 H
. Y5 T" L3 B2 P3 iforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules! ?% I* h; W) e3 y) O- B
# Q" c# u0 P6 i1 A, C1 f7 ^8 M
- ' _; j" V8 C6 O# I6 [
' u8 r' }! `# T, g0 k5 Uscripts/kconfig/conf --syncconfig Kconfig& k8 m8 ?6 j/ d3 F
" A( x: l) S4 h/ g% A
- 6 D4 Q. K& J1 G% n
% D8 P0 J$ d: R/ i% Adrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
' f# Q+ R. @+ a& h4 z7 p) z9 o' X& `3 z/ n5 W8 o9 n& X6 I; J# E
- * @0 Q4 g9 I- f0 C0 E' W9 p
1 J. M' j& D( ]( U, `' Z
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
9 r! p0 ?# Y0 ^) { c e$ m N
; `+ i' p" L7 m# o, ~ - " [0 Y2 x6 {3 } b! z$ k9 i, Q
. Z3 s* [$ r9 U& z, L R6 B7 ?drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
/ u( b4 o) ^* H9 p
/ h1 W5 T" S& `8 D5 A* d - + ~; G# m8 k9 L) Q# y* [
+ d3 X1 H, @0 w6 ^- \# W+ Y
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
# K5 ?# ?3 J, \5 x1 f0 y' W% B- n- n6 D
- / M# j/ ~8 ]5 h' d* J4 B/ n- H
* r4 V$ D7 z" n/ g( H3 @& E q*; W0 i" ^9 B$ y
1 \0 ^" G o! y' h - ! c. x' M3 ?+ z: L0 X3 `4 M
/ L6 p# e- _/ c- y B8 f( w. z
* Restart config...- g2 R& i$ U/ ?3 g! E* n
* F& r; w/ B, |6 E
' w+ P: p `4 O' g& t' i' ]8 \$ ?; _$ e% i* b, {
*
6 C5 i, R4 R$ o$ O4 D; G7 m$ g7 v8 @1 Z5 V4 k) {+ K$ n) b1 P
; B' F. M* O7 P1 T
^. W9 ~) X+ t- r** A; A2 ]0 G& N& G
- D, y1 u+ z8 P1 O$ f2 P2 | M, _- ( W$ r" z5 Y: q6 ~6 b3 C
# m r7 Q( p5 ^3 J' |2 e. z* Device Drivers: P: s! I8 O2 M" m& x
( G( V2 z) n' M- A# ]4 `
& X& z* C7 E( O. ?4 |6 r- G
: o2 A! f! V9 ]& W: q! q*
* M7 h8 w5 e& U; c1 P. A- x, F: c, V) {7 m! [# f
1 B! u$ q" T8 w8 ^% j6 }; w
9 @1 _3 J0 y; n; E" r. zTrust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n- z4 V5 v8 @$ f, B
" A0 \$ q, v8 a6 z5 l6 K- q2 a
- $ [# H2 c, \8 P a$ U( [, p2 l' r+ [
% B' I" h2 T: P! N1 A( n. XPlatform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y; j6 ]/ w- B6 {4 s% H' m
& j6 t- M. s; w- Z0 O
- & C* X5 W4 T; O
7 \3 ]' v: w' L4 _8 D J
Trusted Execution Environment support (TEE) [Y/n/m/?] y
( d5 O+ Y7 C y# k" ?
- I( Z s- M/ d; e6 ]9 m - + X) l( \) G0 I# E
! F1 R1 K% @4 H- Jhello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
( H! W, u% R$ ^5 J# O8 b, y* C6 @7 g @' W/ o& k( g; }
- : ?# i: o3 i+ M% c% z" U
& {$ m; x) H3 H0 I1 Q
CALL scripts/checksyscalls.sh: V; D# C5 i$ r! a3 K1 l
3 Y% p5 G4 e- c p
8 F+ J+ v M4 J) U" ^" x2 V2 ^2 }
CALL scripts/atomic/check-atomics.sh
7 ?, d) o& \, `$ p; d
( |5 i2 U8 ]+ U7 h
& o2 v& H5 T; `& j6 P" g
6 {5 E. s+ F2 h0 bCHK include/generated/compile.h
8 a+ H% L: P: S, o# q) z* p6 R( F. [5 {- _* d+ @+ w) k& N
- # ~9 \2 b, W2 V: q/ `4 h2 y* N4 D0 e
, B, A3 n) Q; ~8 qGZIP kernel/config_data.gz$ J9 Z8 M0 M( \# v6 V3 B& B9 m3 W
! \+ ~& o% m/ N0 U/ o9 W
- M* `5 Q4 B W- x) a
" j4 s' A- Z FCC kernel/configs.o
/ j! i- [+ Y$ g) W
/ J+ A+ ?' m' U8 F2 u- s. ?
9 @; z+ ^/ O8 o% I# k: P- |8 r& Q: ]3 e; `: X5 x( |: _+ c1 e0 V1 r3 R
[…]
6 X4 [; ^3 \" z# G0 C
9 U& u, G: }, L/ p4 m# V- 7 b% I+ F/ E, _+ g
1 S' Z/ k& {7 p) P y5 kLD vmlinux& o+ }- _" H! z2 d. E, H4 m
' h+ G- j2 \0 m- a - 9 ?* S4 w/ U( |1 P- b5 X w# {
4 p& P# U, G- k: j% F! Z' sSORTEX vmlinux' n9 `) l4 w: y) j9 x* j6 E
3 [' U1 Q {& E# X" n& H- k) r
; _$ ~4 W: ]! x! u4 `5 B/ M- [/ ^& p# ~6 ]7 _
SYSMAP System.map9 q- Y9 C1 U% }8 g2 S
0 j/ A' G- a! o7 K+ m4 N7 P7 v
- ; U- }/ Z3 _1 p, o2 b# d
0 z, n2 G* M! H0 R. nBuilding modules, stage 2.2 H- ]* ^6 J' ~
' z, W& B0 F7 I1 R/ i+ R, P# |
- 6 _1 i) H6 t% g
6 ?3 [) D/ R5 j8 {% jMODPOST 536 modules" |. {) }* Q, J" f. e' v ?0 O
" [$ \/ M0 I6 L4 O# x* m - ; e" A+ [( ~% G0 h
$ J! L! S; J2 Q% J* i; S
CC [M] drivers/hello/hello.mod.o3 S+ @8 p2 D' [- A8 U2 t! Q
! Q/ n. B9 T% ?' ^/ H w& o2 G
6 N( I/ Y0 @9 ]* ~" }5 ~* W2 k3 W# k' f8 p8 `7 v/ J% P% q( o4 u
LD [M] drivers/hello/hello.ko
7 u. x* T; M5 O6 m; o8 o6 K* d& B) @( u( K4 M1 W! I" A
" O( q' K& m! l( H; e& ]+ s' ^
* [% V a; k) s9 n' x0 O. n1 @) l0 K
6 ? G3 C1 Q+ A4 _! [编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了: - 7 {$ x1 z& l3 g% H% |
1 {7 j- W6 E: k; Z3 @5 kforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello
! k3 k3 D4 ^% P6 N8 q) d9 c- _5 ^4 U: \8 `" F$ _3 p* C1 Z
6 E z4 {7 l; c1 j3 l. g6 o; M/ d" d* c
hello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order
- S: G) x: L* l. w8 N
% |, v- B" m* Z& e+ T3 a
`0 D/ n5 s! R- M6 d. Y& q
0 t/ a- L K, \4 s1 g6
! F, F2 ~5 [0 V% i2 k9 V6 b2 Z! `6 b3 p$ P4 `
将hello.ko使用U盘或TF卡拷贝到开发板里进行验证:
4 s7 l6 W1 d- q, g' }
* k0 o; Y4 W" E! \$ y/ `' Rroot@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下2 g& L5 U/ z9 L1 Q, {
* Y# l, z' F9 k7 w* t; m
# o6 O5 C) ?0 Q1 s, W8 O, w. }
- X9 T% v1 Z! M( _) hroot@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko
2 f# t' u1 K. g) R4 w* M; k/ {# D7 v p9 h
9 S1 L2 B! Q( P- i, S/ t6 C
5 H% G" {9 ]. m, a) c[ 138.679964] Hello world //挂载驱动打印信息* X) J/ R+ E0 z" p9 x6 }. Y* [
s; X) c2 H, q! [& S4 ], w% y- [
- ! `6 M: Y! M* k2 E
& u: m; Q0 Q; M7 m5 xroot@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko! N& d4 ]3 G& {3 O
: c/ u7 }% M' u
! R7 f: r1 U* _# }% I) h
6 |: Z" L' k @/ Y; e% Q. o[ 142.022115] Goodbye world //卸载驱动打印信息
: S. A4 ^5 }* q6 i
8 o9 ^ D1 F7 J+ S4 ~
4 d; U+ Y) y& T; H; g$ ~
' m8 U5 V& J G' s% X. c* Mroot@OK8MP:/run/media/sda1#& J# \$ `, k; ]
4 W% w9 p1 P' o _1 S O; N9 n1 A4 T$ B# K5 c- I
: a D+ U9 V/ W. Z ]由上述测试可看,hello.ko驱动可正常运行。 2 G3 a5 j/ `, Q' T
以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。 9 m$ n2 m& P2 w( D& b, u% [# V
|