EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。
6 x0 ~% h# a7 N, y% u+ T3 E# y![]() 7 O. }5 r1 {6 D
01进入源码的drivers目录下,并创建一个名为hello的目录: - 4 g9 _: Z/ I h! s3 c9 M( \0 P
0 o$ D9 T9 V! S
forlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers' [, ?5 [) q4 ]9 q0 j# O+ }* W
+ A4 i: O+ n: l/ m
* m* a" \& s% |( x4 E/ \% z# X4 o% V. j& d6 ?4 k) }% M- ^% z% v
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello( [8 t% Y% h# S% ]% w* f1 b9 p
& U& a3 I/ e" l0 V; |4 U, s& A, s
! ~3 H+ T& K- f( y$ @( S
7 y$ N( K, g% M; u3 d02进入hello目录,创建hello.c:
+ i$ [/ ^5 T5 y( h% }! ]! H$ {4 i" ]* Z% G) S) K3 j
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello5 u1 X& T- r0 o+ y
5 }) d4 i1 t( K" U
3 z l1 }! \: ~
" c/ x" p0 ]( R7 ]forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c4 a# m! z$ Q( x8 x1 P1 r: K
* ~" f8 I( g) t9 ]( l* R/ g3 z0 G% u0 L* T) t5 R
0 l* D8 E6 G1 r, L2 [9 G" I, L
在hello.c中写入如下内容: - 9 `- p, h/ ?( K5 y; V" l- S
8 ] Y& ]' P/ g G3 y+ e#include <linux/init.h>) D$ _* h- o5 O4 G* u( b, z
6 {& O$ ]. |" a/ P
. i( ?5 D( H0 A) {- `& d0 I. p( i: F
#include <linux/module.h>
4 m3 e) U9 l+ u! c. K9 C8 H$ Y4 a8 Z. p: e
- & P9 [$ b6 j( `3 x3 ^5 c2 i
6 Y/ k2 X( `; C1 Fstatic int hello_init(void)
1 G( L) f* U: V' n7 T
- E. K# @# k" }. q/ t
7 |* m% }7 ^( G' {: o/ g7 Y! C j# z/ x5 M, S; p
{
2 z+ }" W; k b$ @$ u/ \9 e8 X! t; {. M/ i
- ' c- M5 R9 d+ M S
3 u! X8 S* Y. i! ^7 M
printk(KERN_ALERT "Hello world\n");. z! m0 K ~+ {' ?0 e2 u9 w% d$ O
- n; ~! V5 K2 r9 {! V4 c$ Z' Q
0 ~8 ~+ o4 C& U8 f
1 ~0 U' {& @: sreturn 0;0 u( A6 ^1 p0 t2 ?% E6 {
9 P$ @+ j( M5 x3 w! j; s
6 S- r0 a: _, B
' e# x- s9 [/ O8 ~}
3 J$ y8 m' f. ~
# P# t+ }4 ?/ G2 O2 N' O- ; R. L' A# Q( ]8 X! e. u
' S& u* O- Q, Z/ x! E: R, J
static void hello_exit(void): Y `2 D: E; n V- r2 ?
f3 @4 @# I) g" O- g6 W - : m4 g ~# N# ~5 C7 d+ Z( m- j2 {5 \9 v5 N
0 q1 B @ K$ j Q5 H! a- D* L' W7 u. X
{* D: ~. B0 o% ^, a/ t
, N k: T! Z: b) \) R8 f6 u2 T - 1 ]. r$ }) p0 U% a5 f+ M
2 c M1 V7 c3 T7 t+ r7 eprintk(KERN_ALERT "Goodbye world\n");
$ ~7 J9 _/ q5 B, q6 @& X7 n/ }' H
3 u* |2 d4 x' D" W! X6 Y0 \3 y1 }' M. Y/ V! Y! j
}
* i6 D8 p8 V; @; Z% V
; ]' l- Y6 o V2 c9 {% }- 5 Y" Y! F: `- w; E% T& q! y9 c, x9 M
% v1 V' M' G4 d6 t [module_init(hello_init);0 `/ W# K, i1 b$ u) x6 P( Q
9 F( D$ I, p' F: v& I/ I - % m& w9 h' e8 |
) C0 ?+ ~& |6 O# i& Nmodule_exit(hello_exit);; W' Y9 ^0 Y' G; b
8 F0 t4 r8 \$ R: J+ o, R
# D: N2 O& F. G/ E# x# Z9 @" U- t
MODULE_LICENSE("Dual BSD/GPL");
) l& L8 C& h, o" r5 C" t% r: q+ K1 Q) g1 {' H) g7 ?# j
( O4 Q0 ?+ \1 V% j9 j) M
6 r: }" Q+ M" Z n4 [程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world , g, W/ X3 x& `8 q! M/ d3 D
03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
- N- W* J' H/ h2 S, M9 {3 }" o" Y在Kconfig文件中写入如下内容:
& C) d& F5 ]( ?9 g$ A7 a* ^5 L: k! X/ w$ k4 n, u
config HAVE_HELLO) N. ?! G, |( f0 t6 Y7 R$ R
1 w ~2 {) _! ~: ?: E& r
# V3 r! Q# A3 C5 a# i+ j/ E9 T6 w% ?' R1 p5 ?6 K4 N+ p' R
tristate "hello driver" h. q9 V8 J' F
3 G; f; f" t0 V' T
- - R( W9 y2 A) _4 f' W
2 R% X) L9 N1 O% u8 U4 K# \; Uhelp/ D3 G1 C* [+ v8 a7 f
/ i9 k+ n, q N$ H0 Z7 N
/ w3 H8 A1 r% _) l& g8 C1 [1 v3 K- @8 O) N
This hello driver is just to show how to develop driver process.8 {* I, }' [: o7 j# e. r
, g% s$ v# h. h1 a3 F2 P
- 5 _ v1 T7 n- k6 H0 X
9 d! I7 s4 S* v/ k( N; R( M
" y4 Q5 W/ H8 D/ \" f# Z% `
) F. w( |( C! L - ' Z! d- }8 O4 c/ @3 j9 \! b9 l
2 P; g# X' Y: e7 L$ j3 C- @/ Z
) s- o* F; h0 g c, y8 A8 V! @* g
) [! t; s( k& }* L9 P9 a x; d
- 6 k/ v9 V" b M* i+ x, @" o9 h- C
. E# Y' g8 U0 zThis driver can also be built as a module. If so, the module will be called .
/ s. w/ a8 ]$ B
. S# }! H \9 A; o0 c - * O' a5 x1 p# q1 J
/ h3 c8 Z+ ?$ C6 T4 b8 }8 c
default y
u9 E, H* n }, d$ }$ Y e8 J! h3 K* r5 g- v8 E+ }/ B6 Z
/ ^0 p# F, `8 d
; E/ l' D7 P7 u' x* b#endmenu
0 S/ Q9 m. Q5 y" C* C: R% z* j# w8 u* u1 ]8 [7 Z; T
8 ~2 D- }; t* N2 d; j 0 d0 J9 q9 y* t. \% [
表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig- \2 l( |; W9 N/ P4 e
在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o
7 k9 U U# Z- s4 `: F# w注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。 # {- _' F+ @3 x3 b2 O3 E) i- W
给添加的这三个文件权限: - 8 Z+ H$ E. e! [: |' a# Q* U- ~, V$ A
: _0 }1 r8 X, e8 w9 h; w9 Y
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c
9 S9 e' W& V" Z/ @% z# Y! z% }5 P z1 ~9 F4 b# |( N+ G4 k) ~
- 1 l# w# C& _# O: D
- a4 ~- ~: f3 I7 L r
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig
% r: ]/ {: n+ M6 R1 n4 i7 S! A4 n& \% f8 K8 q
& F) _ M: [1 g" H& P0 C2 F3 U& X6 e3 p% a9 c) \; b8 w3 Q
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile
% D7 a! Z0 U* o% w) i: X4 x# X
$ k3 `! ~- m$ U# c! e0 V) }$ L H7 }" ?1 r3 ]9 [& h
9 p6 Q( r& ~/ V( ?04编辑drivers顶层的Kconfig,Makefile文件。 - ^. v/ h& }% C$ D% R4 I
5 H7 u6 c7 I* ~. h5 Aforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..! X# K1 ?' _1 D2 N, A1 m
9 I2 O0 a4 I2 i2 E& L
- 4 u- v* Y1 p# h# [- h; X0 }
" X/ B3 Z5 ~8 P3 ?
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig
/ w+ e6 T7 g9 T1 ~" F* O; M4 K; H, g
~$ [. t6 H3 e4 S n! B( X3 K
/ x M; n: q: O; b6 j8 b ) p9 v" x/ |2 }4 s1 d
在Kconfig文件中写入如下内容: - ' c5 c) N C+ a6 l5 o
. d5 }# v% W' esource "drivers/counter/Kconfig"
' ?* N' w( g! }
- X. i8 }- u1 Z( v6 J$ P3 o
* W; j' S0 ]: P. f# L; M4 X O- S: [& `- Q# R
source "drivers/mxc/Kconfig"
, m+ c+ }: T; a& x& ^( N0 E8 B5 Q/ C/ j: ^+ n* }3 M0 B+ |
- 6 \6 _, W3 K, }) @7 P# Q
; K) V4 f& Q# `* ]# Psource "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析% R) }# [/ i4 H5 l
, ]! l7 w+ N9 j) b! _& \ - 4 \3 k1 }0 J3 M
5 `3 B$ X- @$ l/ oendmenu8 T& s) o8 }4 v6 w: X6 s7 H
* E" W% P4 j* }$ B4 ]) W- k1 h7 {; Z) h( ~) B: r4 F8 M
! J& r/ a) ?/ ^- b0 A; T; B如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。 ; Y$ X" M0 _) F6 i& _0 n% {
编辑Makefile: forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile& b2 c: f. f- e; @8 \( L6 q H
在Makefile文件中写入如下内容: - 6 E; ]* r ]4 N' A
3 B4 V" F% Q U8 p H
obj-$(CONFIG_COUNTER) += counter/" l! C5 x l; ?6 \3 W# G
' Z& W' @5 W! g4 W1 ]
: a& g) {, l3 m e% D, {, h# j2 O$ Y, ]# {; e8 ^; c: Q: Q
obj-y += mxc// n: t) G" P F P' W6 k
8 |; M4 F, }& F( D
- 9 @; N j( r2 v7 M+ ]
- g: \; T: F" f; F g' p9 hobj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句
+ P2 x2 v8 n) M: n0 y8 Q' I0 n' g# g4 A; i5 c' w
! g6 x% Q4 H E
% a3 ]2 {- P$ J7 M' g这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。
C8 ]# ^- R3 u! i( t& o9 v$ j: m N5开始编译: - 8 j. B4 R/ E' ]) U; `& o
/ e+ {# Q" T5 p q7 w# rforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..$ o- a; } s1 z* k+ I8 G# g0 U
4 _; a, E; S0 I d; t
`+ N% y+ `% Q+ m/ E" R
' Z' ^$ X9 J' z* B `forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux
1 P3 {0 b! |; q- t# G; N9 c2 M, a& I4 X% n
- & K( D3 i7 T7 W6 a3 n; B: m/ Y
( s' i m% N# O& Sforlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux
# X# Y' V$ X5 E# k8 Q( c" S; _
+ r% L* q+ f$ m
1 E! m7 u6 P' | j" Q7 [1 {& f S) C7 x& q# i5 B! k
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel
6 e% X, I/ f2 h: [( z8 u
. W, |" r; {1 |+ C* V
, Q2 R/ P, q# O! E/ O8 _
$ l9 q J6 P- m# ?1 rforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules) r- z5 d+ e6 g: E, c2 H+ s$ e1 O
0 G2 c4 a) n1 p+ L+ z5 m8 |' V1 j. m t
& ]) q& p. y1 y8 L* Q' v5 f
2 f5 E/ q4 u& ~8 s, jscripts/kconfig/conf --syncconfig Kconfig# y2 Q& i, ]! J$ @+ a; X9 Z; d
: {. g8 V1 X: N1 k2 x. D
, O! L3 V: @" _1 x' j: n! Y+ L, `. h2 j+ y8 [5 C! E8 O
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'% q$ r7 e p& k
( B; | w! b" k; C L- ( P: \4 o" t8 `5 t
. M$ g, _( A, a7 y* ~8 P
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'8 p+ C+ f' u% [) V; V( K3 @
* K$ k7 l6 |: c6 c) [$ n A; W6 X - & [1 g1 b# T; Z! B8 x
3 s9 I& N1 n6 _- N" C
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'# _7 o+ Q( ?! b7 }9 t( G2 b, O4 }# ^: P
0 r. y* r; _6 f+ H: B/ K* w - G; [- o }' ?; y5 G
/ e. J! ^: O9 X y# \
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'$ i' [) I0 L3 q! F+ W2 u0 k
( \: {4 q+ O6 K# |+ Q
* V: ], ^; h+ y& F5 H6 ~7 `
5 c! ]' }+ O) x# s+ f U) m7 w. t2 h*
0 O. j' j' f' w0 \, Y# t& m6 Y# a8 A r# ]! g9 ]: x2 j, ^1 L" K! D# x
- . C( e7 z6 c* o: |0 m a
* |3 ^ Y9 T2 m0 n) g, Q) X' N* Restart config...1 g& H+ Y0 X: _2 o% ?+ U+ j
, L1 K6 x9 T/ h, _5 D. X7 h
; [6 K+ ^" v4 W3 ~8 i% z7 }7 J- Y2 Z, ^: i7 `
*. S+ }2 P" H- w
3 w, b3 J* t4 z; P- d- Y
( l9 a- [5 M1 Y N7 ]+ l& t% E! Q1 |6 r9 W8 v
*
' t* `( \+ }* ^* e" g( r! o, i# l e H+ X# l% J' }6 t9 {
8 m( ?* s# L7 h- W+ u" a) o2 _( w+ j
* Device Drivers
1 O6 @& F: M7 V' D. Z" m
1 V6 K) I: m& r5 x1 K2 [' Y- ' b. Q8 V% j2 P
" N8 m. c1 n2 t6 I) u*
y, J! k& f3 B7 W5 \8 S% j5 @: L6 p) }! D1 U& \- Z+ a1 A2 c9 W
- 5 |& X5 X$ }- l8 T% U0 u
# A0 Y9 J3 z3 DTrust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n- z: o$ [- H: P8 T" _6 l
% V0 e6 Z2 T R0 e2 z
1 K5 g, A( _' j1 `6 z& k9 Q" n* I3 C5 p
Platform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y5 h7 a( {& {1 h: j# F! x2 j3 P
$ z. G5 t$ s" }$ z" s
O- @3 q6 L$ `- a2 C' z
6 W, c0 Z5 k) RTrusted Execution Environment support (TEE) [Y/n/m/?] y
& i; ]- _4 G1 p
- P/ `( M/ b2 K; o/ k/ d6 h2 G- / x- u! S0 q$ m9 O' n
! Y' X$ A: `& ]( u9 n' thello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
# K$ ]- {" ] t o
7 Q- t* }1 L1 a- H - 4 H z9 e) ^# t& m% ?+ o8 i/ p
1 b" _) D) p7 A& O; J- ~
CALL scripts/checksyscalls.sh2 l; z, R8 N7 n! y
' T3 N+ S" e J1 [8 f - 3 o9 R0 L$ Y% F E# W) `9 q
# I; J2 V+ X. a: p3 @* uCALL scripts/atomic/check-atomics.sh4 c: S1 t" C, D( Y) A8 }; `8 o' o
/ r" K! d5 x. i+ N9 d
q! Q, A# W! W5 j1 E I J7 O- W! f. T! @
CHK include/generated/compile.h4 [( I7 r" e9 {, E- U# n8 l* j) B! j
# }: K( \6 e4 }
, E: ~& l5 G: g" Y$ z# G
& b5 z! O% @1 @9 v) q7 v) X: cGZIP kernel/config_data.gz1 z; p- v4 ? t* J7 e% G
b I. |) a( f4 R8 `
3 y) l; T" z; F: E
" V/ }. V {/ ]1 cCC kernel/configs.o
+ f* i& z% o" Q
4 l9 I' T/ K( k+ B0 H9 J- $ _9 q$ O: f% M1 B& p" h* U" u$ {
; m# F% t1 b1 h& r r
[…]8 @2 Z7 g0 }; K# m- E5 C* C/ v
) c3 o* k% B. F% x
9 \2 V8 D% X- ^/ ~2 s& j W H+ q) [0 R! t. o
LD vmlinux
1 `7 E3 C/ g9 f8 {* `( I( X2 V& ^
- 5 z/ Q' g% u9 N- K
! i; ?* Q# ?( a, ]
SORTEX vmlinux
3 }9 Y0 t* T( D9 D' Y1 J
( K, k9 u1 a; p9 y - $ e1 z3 j: t9 }9 c* Z" J+ X
& ^% A5 g! c. _
SYSMAP System.map
( z5 m' b: @" Q0 m4 s& P' X& n" ^% g, ]
; V; Q9 L1 U# \- ~
0 J8 Z4 f8 F7 v% g! mBuilding modules, stage 2.
2 ^( G4 o) J) I4 \* i, d
- O) `. {3 c+ u; q, t" D- + O- E. g) e; y. Y
, T# H/ d3 |9 {) }
MODPOST 536 modules; ^1 a4 }6 b$ t* i
2 |$ n+ f. n7 S } - & {0 w5 h& f) }
0 K& Q) ]% ?. _- L1 q
CC [M] drivers/hello/hello.mod.o
% l% |. F1 {4 Z! h/ j8 A+ k4 n5 W, k
. c/ b- D! u; T( T
+ U6 @% ]3 _0 ?2 m" t. E. S5 ?LD [M] drivers/hello/hello.ko
8 [- T/ x: D7 v- ]4 g/ O
$ G) Q% z9 Z8 W% a! `& C& d
9 B7 s- E; j) R
![]()
@2 x- `9 d: \7 {. a2 O0 W& _0 ?- E: i1 ], U7 U8 N6 D5 w
编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了:
5 _; ]2 l1 H% \8 B8 F1 I- @
' H" ^" ]0 L7 z' U4 u7 S, T, \. ` Eforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello, |1 l% S8 i# _: L
" I$ V1 J- `; C8 ^3 C$ Y2 a0 ^5 [
3 O4 O0 V1 A3 c1 q
( {' Q c5 Q$ e! L) O1 xhello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order7 [8 C6 [1 @1 n. a
6 u2 z% q R' q; {" M3 [
( `0 {* \# C/ g2 l
& V# Y! M5 w, a# H4 Z7 Z% h1 d% Y: z6 # t$ E7 K/ E9 v
i# h$ P" Y4 t1 s9 _2 P" e
将hello.ko使用U盘或TF卡拷贝到开发板里进行验证: - ) q1 y$ y6 V" x( _# `/ ^
' u2 ]5 }" t- i) |9 Y$ X$ H* ?% Oroot@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下! I) V7 d9 N1 E( |5 _3 @- ~
3 J) o& n; i* T ~2 ?& N
- l R" I7 I- @# B: c( Q- \5 I! M# C2 C7 \. W0 p- ]
root@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko8 {# f0 f, R# v5 B
7 o4 }1 M- r# `1 B" I- 3 S5 C( c$ {. Q9 z$ B5 x. Q
$ h% M# C4 _& v8 D
[ 138.679964] Hello world //挂载驱动打印信息6 }& k& a; t. W5 p$ z$ R
. P2 n0 m6 y V6 \5 f% v4 s
- : @1 X- Q% g& F
- ]& L# ]6 E# |0 v
root@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko
4 f7 j) ^; p8 Y0 v3 ~
) Q# K$ s @1 m - 3 u' ?# l& c$ l2 b- _, q3 A
% k g- d# e6 c8 p6 B- p/ T* j[ 142.022115] Goodbye world //卸载驱动打印信息- h l* J- n7 _$ a3 X& y7 F
/ a9 s$ I2 T, ]9 l6 Y. y
- - v; ^3 e3 m) R+ j6 [0 W t+ f( l. i
9 F1 ]8 O) V& {7 V5 D; p
root@OK8MP:/run/media/sda1#$ O+ r$ K, i2 Y2 b7 x, W; B' T
( y: \: g" }3 x3 h- V1 }
8 O( r( Y% M- F! u& P6 e! ?
! D& _1 Z% g3 G. D. ^由上述测试可看,hello.ko驱动可正常运行。
2 U0 T6 j' r! q+ o" Y& i" B+ V( f以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。
' h$ B! n+ T% G0 E3 x! x |