EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。 7 l4 r- P1 Y0 v7 B3 z
![]() 5 ^( {# q! G. D/ V
01进入源码的drivers目录下,并创建一个名为hello的目录:
$ r- G- X7 W5 ^* W
: E! o `6 `" R* j( A5 }( rforlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers" J( l8 U0 ^2 |: s/ ] m
; c) O x( F" G& f: p' Z; A
+ I) K! J9 Y9 |! x( f. O+ @4 i) n& L) t
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello
, @/ H4 }# V- E+ _5 I; k3 [" y' V) P% K7 H
5 y) f& m. X& X# K7 D8 l+ a % a& G' w1 G d: J: ]
02进入hello目录,创建hello.c: - % U7 O+ z: D" d( {1 f: S: U
T X, g- x* Y8 i) d* Y& ^
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello4 g: |- @1 K* d6 [) d* p
; A( J6 n# W, I) }8 D" J
8 ?* K$ i3 ~) q6 a6 @7 M6 B" z' N) G+ X9 |8 O4 m; h
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c
( ]/ `4 k/ E9 _- J3 W- O9 m) t
/ K& w7 T7 E% s" c9 d2 Y- _! N( T( a, e! _
" B: D, `" X, S$ r, h在hello.c中写入如下内容: - , C. I" ~1 h- D; c, h* n
2 ~( l2 \/ ?+ \3 g#include <linux/init.h>& d9 V' |5 G" Z* O6 H' m
& q+ U9 g6 a* p5 H h9 b - 2 y5 d: A7 w" [) e n' P/ `* J
7 U9 g- C) D& c+ w G, r% ^+ t! d
#include <linux/module.h>, K! z' ~2 ~4 y
( Z- @2 Z+ J* ^ - ^3 b, L% I Q" ]4 |" W
/ v8 _ P# B( X1 p6 l, V4 E# q- [
static int hello_init(void)
/ A2 T# b. J. C( l- D L
! d' M5 l t( C9 R) p" @ - 9 ^% {8 _3 ^5 ]8 V" ^
N, E3 v3 f1 M3 L' |2 T* F
{
) C& F9 I* h- A$ V: W% j4 R5 D6 _. |
# m: _* c! Y3 \5 E( c9 u - , t3 ^' R8 c8 U) }& b
# [; p: @9 T; S3 i# a, \( xprintk(KERN_ALERT "Hello world\n");
; L$ g; u3 [$ Y _7 p! z5 z* C/ J( e
- 5 Y2 A% _7 z9 H4 f
, f: m2 g% i8 ]0 P8 v, G
return 0;& C }0 N. a$ U5 `! e' d
% n `$ m2 y4 k& G* N, {$ K - 2 r+ h8 `8 M. ~" p: \
! [/ m( ~* X2 N& F1 p+ p
}
, c j* @0 s& V) }; `8 X$ ~
, O/ z( x+ W6 }& w4 X1 B" K0 A
2 d2 ~5 r% ~; @& S% `
" F t) D, k0 i; S# wstatic void hello_exit(void)6 F5 z1 p) U1 E* |1 X& W3 `: A
2 ^& T0 c8 P9 I& u/ ?- ( B$ J+ Z8 `4 z6 {$ |& a# \
/ Y& l& {* Z; H% u
{
$ @- D- [. j. m0 |$ k6 E% h) {3 e1 K$ ~
- ' n8 l1 g' T3 {3 V Q* |, ?+ ~
4 Q1 A+ B- N/ e- y" T
printk(KERN_ALERT "Goodbye world\n");
+ v3 W. c8 }. I _8 l( l/ b0 P' H K3 n
9 F8 o" F8 C9 W! o% z5 v
/ m7 d& a8 E* a! ]}4 b* [; D. `: g: i }! q3 t
- R. @7 ~, y- `
" q$ R5 N5 p, L* X1 n. U4 U7 H; t5 z. o& l/ q* L. t
module_init(hello_init);
3 i& B2 h# j2 e' _: q+ ?: S
4 Y! B% T' S3 L1 x# o% _- r: Q- " `6 n3 x8 C7 V8 s
& V2 D/ d- _7 d* h# @1 ^1 {2 c4 u8 kmodule_exit(hello_exit);& t4 v8 t& F5 |7 ~
3 O! G/ f3 ~( |, Z- c# [
3 T4 L; ]' V1 q9 c' A
! W$ N# z* b& m0 M4 m) o2 J1 H. cMODULE_LICENSE("Dual BSD/GPL");- f) W3 D1 \4 X7 O8 J* |( z
0 v) a9 k! C( l$ ^2 D1 \
* j+ v$ z3 o! w" `5 c , i. W: L$ q- p
程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world
2 P1 O k- X& @03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
; m6 f2 Z, J1 G/ V. ]* z在Kconfig文件中写入如下内容: - 3 n9 D' b- f- N% R6 f {
% A" T3 k" Z8 ~+ G5 I
config HAVE_HELLO
* r& j; t; r2 b4 |- z/ x5 A
- ^1 k% j* j( I5 O' x6 m6 S - 9 W4 t* g7 @3 ~9 R
/ i0 W) y/ x* N# Y% g) X
tristate "hello driver"
( O. ^' ?( c; L; s8 o* G& g7 j" K I& C( Z) }. {; f
- 5 ]* L% T9 X% u; G$ k1 C
3 P; ~" U, D1 R# O1 z. S
help$ n- L+ c+ X s r
! _2 z2 _) [& H - * s" k. ^, E! ~" q. Y; q) u
% a6 T! ^- ^9 K6 H$ t5 P1 P1 j
This hello driver is just to show how to develop driver process.* r' _" k3 J3 w6 d/ q
" \: |9 }4 a) m+ {
- , A; z" z2 f* k/ l& @) e; Y& Z
5 ^1 } ?! o' z' b8 U5 ^1 T" y
/ _* l4 A% e* v$ M5 }* c, W+ m9 C3 Q+ s, V" M% w* J4 Y; T
$ Q% b' m- ~4 K; x$ T4 C1 b. K6 d6 A& P( C" c! U0 A
. ^" h% m" C/ ?+ ` w. ^: {2 O
6 X) M! y" j+ g T! U- |- + F6 D( k/ k8 e# M( P
5 V. r& \1 b0 w2 ^6 y' Z; t/ {/ }This driver can also be built as a module. If so, the module will be called .
2 x9 Y/ ]$ q) u& z Q% D9 b$ P& S4 o; o7 u2 a" U
9 x( k& t: s$ v4 Y( S+ k0 I2 o2 p1 G, m- w/ t) g+ n
default y, ]4 k8 ?2 J5 X% H
: @7 U2 u1 \: F' V' N. s3 [0 p- ' `& a1 w/ i3 C# q" H+ a' a0 O& x
' ~$ u1 T3 W7 \6 A& {9 \8 t#endmenu6 p4 p! P3 S, G8 Q) A# D' W+ j
$ |. s9 l! ^, g" ]* D0 W" h
1 |) N9 v- G" d5 A* y9 s7 f
3 S: v* Z0 P+ }' F( B! O- G表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig+ o* S& v# r+ h3 a- U1 p$ x
在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o+ T9 m3 K* O$ ?6 a8 [# @% m# L/ {
注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。
( e" `; x% a r6 e给添加的这三个文件权限:
! M4 Z& D' P; O# i$ O1 f' ~0 g; k, L& ]# R* C$ l
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c
( w, E' O/ ?* u4 B7 I; c% A
) X0 [% Q8 d9 R; x- 7 F, p# {5 G. A# T- R, ~" o2 T
: ^5 C6 W( R, F- P: L
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig" F& [7 i' q$ W' R# e6 F
& Q2 }8 N' ^' F, h u
# `# s! O5 K5 L
3 w2 l- ]( i2 {% N6 s, Z) |2 cforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile
. x! A/ o0 E4 y l/ b
1 M" y& N$ y" s# l2 l9 T7 z" y) ^0 m0 Y% O4 K; V
- |# s% s' T d/ V" A+ E
04编辑drivers顶层的Kconfig,Makefile文件。
5 }! ]* @, L3 `9 t
4 M( \% \3 Q" b/ K- ?# k0 aforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..7 ]5 h( }- r+ A0 \
8 m) C9 |# P( g8 G( P
- % L) q- B. I# D0 I" G$ e$ e# q% H
6 M! k$ W3 {' \5 @: i" Lforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig
* R" J1 c/ ~3 j2 }$ B/ l. m/ _ E
, M) ]7 d- H7 g; X y. E& a
. e2 k. C" p+ h1 V
0 }5 l. [5 A, E2 J在Kconfig文件中写入如下内容: - 3 {; x( o( b# o
* [& V% n8 a* a- q: M
source "drivers/counter/Kconfig"0 d: N {$ ]8 m5 r1 }6 N
! _, d1 E' J1 ^, l' q/ ^ - 5 d; z1 J& Y: L% o* I! Y
& w( ?; e& a$ Y# z8 Isource "drivers/mxc/Kconfig". g5 R- p0 ^7 U: K; P
" i! c; ]( E, S' y9 n, j - 8 O1 Q- T; F* z4 E- u0 K
- A. n& ^6 [5 ?" x9 [& h( U
source "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析
3 o/ U. j3 m* u& }
" R: r& {' T+ y" j% H y - 2 o4 S$ h2 M j. B' e
, h& M) l& d# m# Oendmenu
: Z" `+ v0 W, K1 i' a
- U( z- I% M# I& |/ |& I; ~' q! J6 `
; V U/ w- w3 `/ Y
如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。 9 |0 {* X9 V9 ^& `
编辑Makefile: forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile" p/ ^- p( j2 f
在Makefile文件中写入如下内容:
4 d5 [! P# U C5 K+ c2 J
( V: S4 b7 M. c# b% G% \9 {# pobj-$(CONFIG_COUNTER) += counter/
9 t B `0 N* _/ z" Y* n6 k: y. S- o. C+ {+ @# l) B; e ~
- ! b! q3 p' S5 l2 N% `' I
J% d% _( S) e4 S
obj-y += mxc/6 a8 I1 |$ ?# t& m- X+ K
( N" N: q) j! C- e: ]- y. ~
9 a6 m5 s# Y! V& ?1 r' d
d: t. ?) a0 m% m1 `obj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句; e+ q. w! `, V$ M/ T: }
; I. i' ]$ L4 Z
3 V& T1 _& E: f3 `2 {" `- ^
4 ^2 M+ a4 h3 K这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。
, Q, d" L/ \* X% _! h9 k5开始编译: - + H. a; ^0 l8 r& I
4 F2 E* i) ~, d& A8 G1 ^
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..- [* o8 K: F0 S8 S# S+ _% w, n0 N
9 ~6 {- m5 B4 w) |. u [5 D4 j - & O% H- s4 G9 a
" a+ G2 N4 N' q1 z$ [forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux" s3 m( Z# m2 V9 j5 V
W* o% U7 ]( {0 U$ K3 N - % {; O4 P6 l- D- A7 O7 g, u H
, X0 d7 ~, o$ U$ x% e+ o8 iforlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux
: ^" x/ H! ?4 k: d& Q$ }- j% x9 w8 U6 Y; a" `$ O
- ( r( j/ O* ^$ _, V% e! N% C
/ x" j' t) { H5 \0 X1 e+ jforlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel
3 N7 j% B. n' v5 s( _/ Q2 [( ^7 `7 ?* q+ w* T2 s# i
6 i) f" ]; C1 K- `8 H: P/ x/ v- m% m
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules
6 U* s0 {7 c0 L! Z/ t- u, n7 y/ F" j& j( i; G1 B
- . f4 h' A9 L& [7 ^! R
' P4 ^" G0 p7 v( T" z/ W
scripts/kconfig/conf --syncconfig Kconfig
3 I5 b* F5 e7 m# c2 K* E$ F1 a3 ~5 B0 c& [/ p
: \( [" f1 B4 Z% q* j9 s
4 o) ]3 j* Z& ]% ldrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
# G4 w" G! J0 U& g3 }( N5 e5 T* K8 H/ c2 d
- ; D5 S1 f" g6 [4 J/ O( D+ n
, l1 L4 h, _. @) J7 i" A- ]drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'8 ]3 G8 i. p* }9 u y& A3 T7 o; ` a
2 \( m# t" ?# K2 w* ]) d4 u. \
/ p, d2 w8 `! ?1 s
' H3 J$ P3 M6 P' B: Gdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
4 b/ |) I1 }% a! \: ^; d9 K' c' V( b" [1 @
- 8 A& e# r; O) I% ^
7 |2 a! m9 R3 `4 J
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
/ Y" m/ }/ @$ y6 s
8 m/ o% ]: B0 R+ A# {, d - 7 b5 J; g# A8 g4 d/ j' P
- S- d1 I( B x7 v; U
*
: e, l* a& `7 E2 G; L) ~& U
( G* J# x& H$ Q0 \& `4 y# L) p - / ~" `9 N8 y- _. N
. ]- u( G$ e3 \+ H* Restart config...
, [% Y; I* F$ r: @' n! t" c; Z
9 X4 _8 i" k0 x
[# U( y6 w0 M7 ^& ~8 t9 u% r
! [ c+ m5 j/ h/ w7 g' y$ E/ p*
) I# R0 l7 f4 J x0 M/ G% ?- F0 g1 z! \- d% L- B. x
/ a" a6 {8 k! m- H/ n, }* e5 o0 V5 s$ ]
*' R$ d2 V) Z" u
& f7 M: p) l- D- A5 `7 `
) F+ @3 j; P* \3 w0 q) W8 \2 n9 q+ J' W, ]- R7 B
* Device Drivers
8 L- r- h7 w+ p' e3 j4 g/ O8 s( ~- P0 y9 ]
- . B. U3 G" C! N* I# {; L Z+ X
! S' K! H! U& k5 l' `
* s( T5 M2 y f
; k0 W [* Q: b0 C* ^3 U6 }% Y" M - 5 M: N- b" C" m
7 B0 a8 {* r$ n# x
Trust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n! q. Y3 G( \$ s# b
9 D; _+ f' c" C$ N
- ; n' l) f8 o8 q* D+ T2 A3 T% R9 r
/ _! U, h8 {7 O; m
Platform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y
7 v5 x: L$ R3 U1 J5 G7 Y" ^' }
! z. K4 Z3 l% `' M6 f7 d* A - % L6 W% W6 Q0 A! m8 w
7 k V" [/ z$ e: u: Y1 W
Trusted Execution Environment support (TEE) [Y/n/m/?] y( y9 S+ } t: B0 A
- C6 w' K% e, N( V2 F - ?, _0 w, r3 p2 D, `* e+ C- i
3 w" h' R( Q, X5 H
hello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m- q, V! q+ ^: X* z: q
; n9 _+ l4 { N. p
- ! v! H- z" g: }- i; ^
5 u4 _4 f& R7 C8 q1 VCALL scripts/checksyscalls.sh- e" J" T I% o
# l$ P2 r, c0 z9 w
, N; Y! v& v# @. E4 Y# h7 Y0 a8 d# g
CALL scripts/atomic/check-atomics.sh
! p! ^# P) w; h8 t3 C/ O& ?
# ]; Q$ V3 `. |/ H* I* r* U! H- 4 t5 I7 _# }/ R. m
8 f/ H9 |" l$ e6 R8 X6 q- R# q- y _CHK include/generated/compile.h
5 G' Q2 N- n0 W+ B2 B/ q+ \% z; I8 R$ C
- 5 k# F) @* C7 y' r. G0 P* _: m/ k. [
3 g. U- M8 p' b# I9 \! lGZIP kernel/config_data.gz
) d* @' R( e% n& {3 N- O# d, q8 t( r" I' B
U/ n5 q( F6 H7 W. L$ M" L p2 ~' y( D |, `8 x
CC kernel/configs.o1 u9 q. G7 B. i7 m
( _: R! |0 G6 J
) {; ?) m/ W* a, _7 E
0 \* W2 u; d0 Z/ ~; x[…]- n p) c$ W. Y! o" O
" l8 p/ n) c) l# R! A- u1 T
- N, f Y8 Y$ t S, D
/ M& m, K m. ?LD vmlinux2 Y; f& `6 ] n* R* g1 f
5 i+ v+ e# P. n6 X' W W1 E
6 M7 u4 r- X; ~; ^* \# t+ W$ c9 _8 s, I7 Q' \; N
SORTEX vmlinux
. I% l. w) g$ y
. \: p0 ^0 y% A' s( `2 j" I' k
0 b% H! B! U# {$ e' b
9 G/ c C: v5 N/ Z) }% K0 jSYSMAP System.map
6 c/ {( i- g* I5 V1 }: N1 V& m# E! z/ V6 s
- 2 v' r3 j8 _) h! V6 Z7 b g# m5 Y
$ |# T1 l b6 {. F- C# s) p4 T; lBuilding modules, stage 2.
/ |) H* \. ^5 G- Q ~/ a
# V6 e( n& r. z9 O/ o/ U9 u - / j+ \8 a6 R. p
! x$ w) n1 [( A- @
MODPOST 536 modules
5 \3 m" p. i; d# n, o( u: ?# k6 c0 A! D
- 8 S3 C) |' l0 Q& S8 p# ^. ^6 ?
% {) f! [1 U8 S. x+ ]3 ]/ tCC [M] drivers/hello/hello.mod.o+ E. |# t+ K) c2 F- L( _
! k; K8 H. d# j. E+ u6 j, n4 X
. D' ]% w4 }" K; v$ N6 {, N
N1 v H6 N8 O0 yLD [M] drivers/hello/hello.ko
. _7 X p9 ?$ W$ G X+ T
1 E& ~ {/ @/ ?" y' T; r) x
8 p* w& _9 Z9 y; C8 d( a0 I6 e
![]()
6 Q) Z& ?: \0 o+ [ p+ V* Q
h h; l) U* C" R% H编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了:
& @! E5 v# C, N# G+ O" M
( d" I" A. I$ x2 c j7 bforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello, p# N6 d3 o$ d: Q6 c1 a$ k* i
' P) d: m8 F" @- 8 A1 m/ s9 O2 \0 }' q* i) A
# G' K) x' E" V5 ^# b8 ^5 [
hello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order
6 j* q& M; K7 V* L* M/ ~ B( ]/ Q
7 M+ k, @( M3 o: N0 c3 ?* Z: F
; j& y. d' @+ F6 j: }, G
8 e8 f( d3 s2 w. \! Y3 J3 ^6
% O) T! {. c% p: `7 u! u' i/ b9 A+ Z* I: n
将hello.ko使用U盘或TF卡拷贝到开发板里进行验证: - ( @4 ]6 m; m$ y! s5 ]/ a i. [
0 @3 e" e' `1 J5 droot@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下
; [) k% P9 |0 L7 Y0 v2 [
' O) I4 l7 A) B0 c3 Y
4 U, |7 x) @1 Z2 A2 @" e0 y0 x! }9 X" \$ b
root@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko7 D. K( ] ^* v H
& ~) U( {$ ]: H3 f% e
& {1 ]$ J& P, x: W( L
+ [+ p! M5 p: F2 T+ g$ l' O! `1 M[ 138.679964] Hello world //挂载驱动打印信息
# K/ d' c* S: ~0 v1 L/ x( i/ l& p) c, N: v, F# \2 u% q
+ D0 l& _: d0 f. ^3 @: `) h9 s/ T1 X# B2 g- K( u+ e! G
root@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko
3 a7 u1 _* j- }! ?4 a
7 f) T% H a7 ` Y- [" a, ?
- V* R' F( g8 i. {& x- c
( `" _1 t5 B3 b- y. d[ 142.022115] Goodbye world //卸载驱动打印信息
1 e7 f4 ?* w4 z3 d* D
. e: ?" q2 o" e6 m$ s- 2 o1 Z0 m* w/ V/ @$ u2 B& x
! [! w' _" O* Q& lroot@OK8MP:/run/media/sda1#
2 X: F5 y; I8 H9 A5 x4 i, H* n- y( F7 }% |
! d% j; @6 U; b5 E# N; k
& G% G5 X5 H0 K( q8 c; k
由上述测试可看,hello.ko驱动可正常运行。 ( W2 \6 V5 J- Y3 c# {! _. A% c
以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。
' ?) z% e- m! k8 ]! a; ] |