EDA365电子论坛网
标题: i.MX8MP开发板移植驱动全过程 [打印本页]
作者: 罗罗诺亚 时间: 2022-11-4 11:40
标题: i.MX8MP开发板移植驱动全过程
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。
: F7 A E; J! K, T$ r
. {; T. ]) U. A- z6 Z9 V! v( C01进入源码的drivers目录下,并创建一个名为hello的目录:
- + x; Z$ V' R8 B+ c& G) U2 _# g
3 x+ v3 M. w1 C- i
forlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers5 }$ Z0 J. N* j. ^
8 l5 `; L& w2 d/ m: v5 ]
- # {4 n* i9 j( ], c% S
; b, z! F* D/ n' Rforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello& ^# V$ c( E8 ?3 L
" k' B7 [6 ^8 ~; _
: ?/ P H. V1 g; c& i: c1 L+ `# g
7 V; h! l% n8 q4 k: w$ D( _
02进入hello目录,创建hello.c:
- . {( ?" |# L K, G% @
5 U! j$ ~2 W( s% {: q$ }% B! M# y8 A
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello5 t1 ?4 D! `$ ]0 o" R% \3 \7 X9 v
( S; H" c; G4 u' E* ^' p$ b - P7 H5 u0 u2 F% N; J' b4 V* `
# F; S+ Q W8 w: ^. E+ ? b# g* xforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c. g3 \2 z9 Y* `( E3 Z- m
# U) @: B3 B4 t0 X& N
1 }0 o( T# \# O( Q# q/ }6 {
" C4 w: ?& A# [8 O5 @ t$ G
在hello.c中写入如下内容:
- 7 S4 P2 M, W. {# e4 [8 M
: m% n' O& q+ o" o#include <linux/init.h>: O F9 a$ w# g
. \% w. T" B+ X7 x% C
4 |4 x6 _6 u0 F& i2 k5 k# P
" U' N; k( ?/ ~2 J#include <linux/module.h>4 E" a; @3 T# H
5 H1 y0 i6 D& l' ]6 ]- M' C4 \, ~$ X5 E' d. N* s3 L5 r
( i/ x) O8 W6 k- Y: ?) _# hstatic int hello_init(void)- o( G0 {' c* z. @) H6 G* b
& Y+ I: W" e$ J; W, b- C
3 H, g! z" Q* C% |; b, b) d' y+ m8 w" i: \8 {; v
{
. o) b K% P1 C3 n
, Z. B6 q2 T" k( e7 x
6 |' i/ ~2 `/ J+ {
1 H" m4 @3 B& `printk(KERN_ALERT "Hello world\n");
) y6 u9 ]7 P( ~+ t( x/ ]/ G& M" d4 [% u) g
( M5 U5 C7 X$ ^" I/ e% c3 {: V) P4 x
return 0;
$ E: C9 R$ ^ h* W/ ]9 f, w; e( [0 x2 [ A$ [) G
- * }+ Z0 v0 L6 M3 Y0 x6 S; @3 c
. y" B: K3 f) f, y1 ?6 N
}' Y& W# ^ q ^0 k6 U! T5 u
+ q& J. Z. y3 o) k
8 \2 m$ {$ A0 Q! ]0 U' ^$ h& o$ @: n1 S0 I. E+ K
static void hello_exit(void)/ i8 A0 }. {* [& W! b
7 _0 w0 @2 m8 }0 \5 ?0 S. I
- ( c, y* A+ q# v$ V \
) @) z+ a- p% q9 Q% Q. d/ i* ^# h
{
" c' r3 E( a; S4 s8 z
5 @1 E2 k+ Y% x, m6 F2 b
7 h- H% G, T0 I: ]2 z
" P, h* v3 j; p! @8 Lprintk(KERN_ALERT "Goodbye world\n");: }/ B ~! H: q0 @
, L; Z2 V6 p0 @
9 u8 n2 t- i6 L+ f m# v* R5 i' j- ], ~6 l5 i- P. d
}
+ ]0 M& R. f; C6 R- e9 x! Q
2 Z* Y& X' ^/ b8 _5 i; ~- v
2 y1 C o! J T1 E; e7 i' _/ _
2 C. a( Z7 B5 T8 g+ a9 c0 zmodule_init(hello_init);
6 y$ J) k& X& C% h+ {
& r i5 c6 D3 w- 0 Q; A) {# C' f3 P
( X! @% p7 z+ m0 Cmodule_exit(hello_exit);
# Z1 ?! n2 D" E* ]1 _/ M$ k/ R) t& v) t4 J
# R5 K+ l4 F; V7 b8 D9 m2 k- U ?+ O3 G
+ i: P- p8 Z1 F& iMODULE_LICENSE("Dual BSD/GPL");
8 P% j4 b# Y. b- C" D; C1 J% U
6 j7 c$ I7 u3 o! F4 |* B% |- ` K0 }: H
3 Q' h$ G3 ?. y" Z
程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world
/ `/ E, B- W) f: k" x2 v N; F
03在该文件夹下创建Kconfig,Makefile两个文件。
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
& \) C0 h o+ k. Q在Kconfig文件中写入如下内容:
3 k' m" s# B- n+ S/ k6 j! A- U
% M0 Z" M: ~- p6 ?$ [config HAVE_HELLO
- g9 M6 q% x) C: y3 ]
0 T. F9 r) K1 J5 r( N- c8 U
) [7 u' q ~1 {2 X* j, f7 _4 P5 \9 y" x- s8 J9 L+ t3 v
tristate "hello driver"
; n) h6 Q+ t( Y$ L% I" ^% E
8 H7 W7 |8 r0 H! k# U, C3 M5 ~- 2 H9 b& F. n& [# K }; m
! K' A0 ~& \0 q! y& H' g% Uhelp
, C& o* S; C7 [; t0 z& y- Z0 y3 |4 ~' `; W/ }8 H a
- ' e" J/ m. O4 Q. W( ^% S
2 ?6 G1 A) U( o( g/ }* H1 k1 M' T
This hello driver is just to show how to develop driver process.: c* `3 o7 k' D* c' c3 T
7 ?" Q( P6 U9 I$ o- Y
0 D- V4 F) w( Y' C9 z# j9 g" i# j2 v9 j X) s8 @
9 |% i2 y d$ r6 x* |7 m
; {: E& L3 w% C/ F: U- " S) c0 T- H( Q4 g5 q
" [1 X; l, ]( N" `
' ~5 T$ _" m/ s! d `* o6 D* w0 W& w i1 N, F
4 A- D* p( `! x4 i& v5 y; y6 P% E% H7 J' _* C$ O0 X
This driver can also be built as a module. If so, the module will be called .8 z9 d9 V9 I0 i) t* ]: ^7 m- Z( K
+ D( m& Z9 p" z
' W) q2 |7 a/ Y: ]$ g0 i2 J6 B$ m: M3 ?/ U
default y
, q3 u) K$ W3 Q& t, t5 N5 c9 W% U* a# E( H: k0 s
- 7 v2 X( H) ^% d+ `3 B. u
* Q" _' X% \ N( H8 J#endmenu
0 Z9 P$ R, F2 F+ T Y( o& g
0 ]) y1 _7 m7 j7 _: _- ?4 b2 V& Y' T/ u/ i# A
8 \' x1 f) Z' `; B8 e% |
表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核:
y:编译进内核
m:编译为模块.ko文件
n:表示不编译,未使能。
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig' [" @% v! v. l$ N- v+ n
在Makefile文件中写入如下内容:
obj-$(CONFIG_HAVE_HELLO) += hello.o
7 f6 X. A6 h' f1 n, X0 Q/ i$ Q注意:
宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。
* j) o9 B1 X5 b# E; u& r
给添加的这三个文件权限:
: G) @( m3 Q6 Z+ H. @& }" }$ }9 [5 u* t& k7 L* d
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c
5 d9 f$ H1 W- |# Z0 e- }. |4 C+ ~0 g# y5 q# y3 u, ~
M9 E Q$ x- N7 J1 Y8 X3 C) X" O3 Y/ w7 h
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig# k. \. u) @- q" E0 x; j9 g
5 f- R# k: X L1 Z" N& U
9 {8 L u& j3 _. |; U" t) I8 a6 L! m
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile
# L. I% B: j( Z1 R) L% R. x* b7 `% n a _5 a; }" R0 [' n- F
8 d2 O- U# x |; b. T4 I
0 ?4 z$ C# ?8 Z5 ]. C; c9 r! r
04编辑drivers顶层的Kconfig,Makefile文件。
- ! Y g/ K6 Q# _
1 h( j6 \) }* T: E# Nforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..
3 e/ v% [ q. D) x/ R& {
" A/ T' r9 p6 M0 O" v# d - * |$ a% q* N' ?! p6 q$ O1 [
8 S6 W% Y0 j! v- lforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig$ z t; Y+ n0 Z" E, W' U
7 ^1 [" Y+ E' p4 C) Y( }
! r4 V" p, D5 t, w) w
2 U" I2 J3 f3 |9 u
在Kconfig文件中写入如下内容:
- 1 O" K. C5 ?* Y1 Q
, J1 N; W7 a5 |% X: wsource "drivers/counter/Kconfig"; L: [" m F7 y. [0 }1 b6 s
* z1 N' {7 W& a. H: W2 l1 q, k& \
y3 R4 p9 s& ^3 z; j' u' Q1 Z
- s. W$ b$ `) e& |& e4 y9 Vsource "drivers/mxc/Kconfig"$ m4 a# N* F( _# }4 F( N0 _
" P& V" b6 c! O5 O
- * Y2 } ?# E# d2 u9 a2 U$ a
7 n I' C- p3 a0 |) X" H2 G6 }source "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析
/ x3 |: A Z9 A
1 p" r+ P. y6 W. A' r
8 R. [! v2 Y7 K: R
$ s, S9 f! o& A ~endmenu
) d" M( v( `9 L1 X% r5 j& S) _6 i$ j9 a3 Q
- q; z1 m' X9 ]
3 r" ~6 d, R: Y+ e' @* q如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。
3 k$ C! @/ c; T! S编辑Makefile:
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile U6 |& P1 F6 i! _
在Makefile文件中写入如下内容:
7 U" g! E4 O5 h! E
* l* U; `$ _' lobj-$(CONFIG_COUNTER) += counter/) ^) k8 W% |' l
8 c) { x2 [' Y. C9 k
- # h0 m, w. A* u
4 R8 V0 ~8 `. h9 I5 P2 }obj-y += mxc/
. t0 x; o. ^; m
) \& y7 Z& G1 j- k- T
, O- s/ ?4 h8 J- y. V
7 ?$ `5 j, D: s6 E& f, fobj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句8 [5 V _3 |: v
5 z. e7 P* M9 @4 o* t4 d ~! @% t; r2 H+ i
/ u+ ~! {" _3 p4 b* \' A这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。
" H' h$ `( s( v% i$ L: E( ^% O5开始编译:
- ( m% R( r+ _9 T9 `
& y+ ^( |, t" |3 b9 [
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..
" e! {! p9 D+ @4 h+ |6 k& V A
, o# z- U9 m0 C& Z# Y7 X( _
$ p* l7 A8 `/ ?$ f8 V4 ^6 z, h- w! s |& ~$ i
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux
8 H4 I* `+ S5 _! ^ x2 [. C1 W6 I: V. p! b, I
- : J0 `7 d1 \1 N
" `5 Y0 `" K6 {5 g$ z9 ~forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux
9 {- h) y8 j. l5 b- @$ r1 a9 S7 H8 X* ^! J7 a) ^
- m/ E) X9 T: y$ |# i( F; h- H2 U/ x+ n- }* G( R' ?
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel3 `: d* g% b0 m0 `; f6 i
5 I( T, B1 K& [' l |
2 G* m( g* k1 t; L% V G6 A9 T4 \1 n0 m+ i6 I t
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules
2 m# ^ d3 d% Q! c$ \
& h5 E7 i) @' j+ w/ }0 f- % h/ o- S9 F! y- `: f+ l& Z
( w( d9 w4 y1 E! O" }% l+ Q
scripts/kconfig/conf --syncconfig Kconfig
* p( m; S7 f2 ?+ G9 v' Q' B/ q. p
( ^3 u0 H0 z4 @" m: Q
. h P: M* q9 X" s! x, m
7 S: [. i4 A" R/ b* cdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'' ^6 o# Q* c# w; b
3 @7 l/ B0 ~$ Z2 N- 9 L; _ V S2 ^
7 q" i. g6 m) y, b# y. _+ O N7 Odrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
% M+ x: T1 |; Y5 V2 z; N0 e1 L" z
3 h) _" t6 D( ~& l* f6 v
$ \" E: F& M% j8 i( w
% W: c. L5 s X( D0 O1 Adrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
% t4 [2 h4 U1 p
3 q: D. w O& }6 q. m- & |" ` O1 M4 J4 }& }, U
B0 l2 W5 q; u4 t' i: {drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
; x" C# O( t" X2 ]- o( A( c
! T6 I8 ~, A8 `0 O: L* l - 6 e$ p S$ o$ t% S) H% ~
( `! r8 m/ M5 C& n" M2 t: P. A*
8 ^7 U9 ^3 ~( [# m# R
9 F, k/ S J- M6 u5 O1 G& i! U& [ - ! [& g* N$ I' Q% K
9 Z( J3 z9 P- [% b* Restart config...# `4 D4 I7 h7 M: o$ ~8 G i
- e' Z! _, r y1 c0 I. D, Y - % m7 U5 _% N* c
8 {# D" p7 y7 d! r8 ^5 v7 D5 \
*; Z5 A( p8 E9 V" x/ d
) |, M) w5 V w0 G2 H
- 9 \4 d: K9 o5 w4 `, ]
# U" `7 {/ ?0 C% x! ]8 b9 C
*) {6 u: M1 _: d1 _4 M" G$ J$ H
6 D4 H7 p# ^, V5 G2 l0 l" }
& [: L( V1 m9 h6 Y( P# V7 n6 M4 y* X2 H6 ?9 [
* Device Drivers4 `5 H/ w! _# G6 X) c
0 v, Z* c. _+ O# f7 H- 3 r' T+ {$ ~. S& | ~2 ], p: @5 T
3 i- S) s9 Z4 I( M3 B2 I2 }' [% r
*9 g% b/ Q* _+ M2 l% D* d
4 B- b9 W8 U7 y' ^
- $ D. I0 Q% s6 z: l2 z/ b# h2 {' T! v
I% n* d1 U* }1 r( V4 OTrust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n* I! X o2 K# |; ]
+ d" w; s7 e6 `
9 I$ V* H9 T$ @' V. u6 d: E1 {% P! q/ I2 d) b$ X8 r f
Platform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y# A! L5 s( G- e+ }: M" x9 j, V0 [
. c2 c" h( v" `) `9 X% H$ f
( J: r# Q, R) o ~0 N
- o2 |+ y5 `( S& T' |Trusted Execution Environment support (TEE) [Y/n/m/?] y
0 m; X9 N8 [ i$ I
, q# c6 H2 h) g% @" U* t
0 [) s0 k4 N0 S( X% r/ l8 n/ _
. g+ X( |3 e/ T/ I& u9 thello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
! m+ \/ W3 ^) {) ~/ A: [$ i' s" m# X2 ?, P
- / z" M1 E* }/ q' w
; G- v: G% ~4 X9 V3 L3 A* {CALL scripts/checksyscalls.sh8 K& w1 G& r+ q: A' {
b! v* F- S7 A# b
% g5 x6 M$ Q; ], T
* c& ~* Z4 B6 ?3 d8 X' YCALL scripts/atomic/check-atomics.sh
5 [+ a/ N# P7 K0 \/ u2 S: a7 V5 e# |; x# D- Q: u
% w) o% C/ W( X0 ?" h* H* O/ c* h7 {( M1 m: K
CHK include/generated/compile.h
3 U4 K* k' x" ?8 v2 F) E
% U0 K' m7 g0 N7 V" }; I0 M- @% C3 V
. M2 T8 ~# _1 r# ?5 J2 ~8 R& h
GZIP kernel/config_data.gz
U: b4 V: ^, H6 v5 A8 {+ H' P7 a: g% v
% S$ P6 T# p% o8 ~" P8 E
; h* q; f* L: E8 O. `8 G) T
$ S6 _5 \% R/ v$ jCC kernel/configs.o" i) E6 ~6 W" \! S
3 c J( i) q, o
- I6 D4 V4 P2 F* I
' N. @; g/ V0 z" ~
[…], B- [. H9 V/ m6 V1 ^
8 `* O% P! x" k9 _ ^
3 r; k' {% H* X# m, H- U l. W- D! m1 d9 d; o3 ~+ t/ a1 i5 P
LD vmlinux, z6 U: `6 N+ ^% `; m. h
5 [# w- w$ c) j V w
- ! }# _5 T* {( R5 ?/ S& F6 H4 s; N1 M
$ u; i% e" j, }6 {% _& S. f8 N
SORTEX vmlinux
5 j1 G1 c( r, C4 I4 A9 M- v! \) l1 g6 O& o3 i
: z' ?" @* ?2 V4 i5 J$ g! s' ?( @0 z9 f1 g% ?9 u+ ~! s
SYSMAP System.map
9 j _) U7 A9 K7 {4 t" {! {
2 C9 d& B# b9 M
7 D- m2 S* c! t8 Z% z/ @
3 V$ S# \% o- v& I/ rBuilding modules, stage 2.
% l' d/ x5 b. L4 Z# ^3 h y. s7 z& @" M' X* ?7 b* _( W
4 b( F0 j& K Y0 J
0 J; h; F1 e2 V ~, QMODPOST 536 modules
- K( ?7 E4 k1 z8 Y1 V
' Y& V% i/ R6 T% r
& V0 y; k0 b( f. @2 @4 e$ ]1 S% F
CC [M] drivers/hello/hello.mod.o: j% ^; _$ I# I. T' X
: x6 f) I% ^3 [' [% E+ ^$ R
- ) W" Z6 K1 d: {# G
9 |$ V7 H0 R9 D# V6 N6 JLD [M] drivers/hello/hello.ko
+ A5 `" `: Y3 w5 {# J1 z. t4 g! J- R) }, ^* a
$ v6 Q) `& f& P- _# f2 g

4 t. \1 G2 m" K- [4 x& L' c% U) S# f1 O1 [4 i
编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了:
- 9 m1 P- ^3 S, k
2 \$ J d u- G% O$ j- D* V v
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello
* Q- j2 w& s" e# i+ k' x Q8 I. b0 Q' y! ]$ R) S
- ' V9 w7 q Z" j4 g
; z7 y- k' b4 t4 S7 c7 `
hello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order
6 K- Z0 z0 p! | V" f6 | K$ _5 a& o {9 w
) Y8 V+ S: C0 G5 `
0 r- r' D9 Q; a7 }- S: t1 ]. g
6
0 [0 F: X8 X5 H0 ]
q6 E, y0 p2 }+ p7 H
将hello.ko使用U盘或TF卡拷贝到开发板里进行验证:
- 6 B2 \" F0 v: a. i8 \# c% s
1 O1 U( d: W9 r+ Croot@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下
. h; e& ]8 u8 F- ]
0 C0 Z& R" o. g. |! j& v - % c `) w0 h- e, j+ B4 e- j
+ W: e* w; R8 U+ C9 a. ?
root@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko/ E% j& m; e; T2 ~2 B, z
; n0 t* \0 ~7 Z - & U7 L3 w& Z/ A5 W/ \
# U% L3 |0 v1 _9 N# z1 a[ 138.679964] Hello world //挂载驱动打印信息! o# L4 b3 x+ h/ Q5 o, Z6 w/ ?. `" V
- X) O, T! I: d0 R+ M - 8 d" c! q; a5 ?& k
, Z0 M% c; e, A' M8 S& C
root@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko
# E5 j2 A4 E) o/ }: o) k# Z+ u- h- l3 e! D# ^4 G' d, B
- 2 N" R6 \9 _" F/ P8 s
+ q2 E- I9 b5 _$ h
[ 142.022115] Goodbye world //卸载驱动打印信息; A& o' W$ _5 Q: X- J+ g) V/ p9 C$ f
5 y k% [& V, E) g) y
- , i) P. F/ O: _1 p4 u1 V! o
5 d O8 C5 b- n/ Q( groot@OK8MP:/run/media/sda1#/ i$ v8 N2 m+ I5 k9 N" O
& @3 I ~: O! F2 V) b
/ G3 @2 R+ U& o0 J: B0 m1 N
0 X* }- \! T- v$ [3 Z+ e$ \
由上述测试可看,hello.ko驱动可正常运行。
( Z2 M" P* X' Z1 I" P, d
以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。
5 T( M% S' e% [2 C+ G
作者: nocturne 时间: 2022-11-4 15:44
可以直接下载驱动不,那个更方便呢?
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) |
Powered by Discuz! X3.2 |