EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。 # g/ y7 m3 ~# }. C! `) l2 r! ^
![]()
8 T( p4 C, u. k2 ^) R9 k! {- Z, n3 J01进入源码的drivers目录下,并创建一个名为hello的目录: - 8 x1 q- T: d, I
8 K& A8 N" _3 }" Gforlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers
! i7 T; _# m9 V$ d8 R* L1 E, q8 v9 p' Z
9 q1 |7 M+ V, f& r$ A
8 T. ~+ l0 {) t4 l6 ^forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello
8 A- ?; Z E) y& g
0 |3 U( _7 `8 |; ~; D
1 J F( H8 B8 Q3 h# z2 f7 a ) o+ f. m7 A& F* Y
02进入hello目录,创建hello.c:
6 D, f9 \$ h5 Z1 k* L, |! c, a
3 F3 z8 q% c. H" S, `6 Vforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello c- \3 g6 E7 H3 y2 d0 u
; k, p8 _. D7 Q' n( l" d- {- 7 k: t; B& B5 N( {6 `% d
) c; ^: W* `9 f V5 \; A
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c
* s* \2 H( `% u1 S* x. |- J1 C
W8 S2 q7 ^: v& U* T% X: _ n
4 O3 m% V, @5 k$ w3 @% `
! a9 o4 F5 \1 s( a0 e4 u) F在hello.c中写入如下内容:
7 w8 I1 ]* _( p- Y( I4 b
* Z/ k' e" P/ x2 N) i#include <linux/init.h>
O X* j# Q0 E; B% s2 A
; _7 t% G- w1 b+ Z( ^- % {8 l3 t y( P$ R, k! A
$ T2 u" Y' l; D/ P% A; V$ v) [
#include <linux/module.h>
4 X5 M, Y: K4 G% }4 ^$ M# y) }$ S+ p8 L. n, x/ @( {; y
) w; Y a6 z: m. Y
. ]/ O) W, [1 `1 S: T3 p; S% B2 ostatic int hello_init(void)) G' y- G0 o/ Y# @0 k8 D- e- i
5 \$ j2 f5 Z% ?1 F
- E7 \: {! @8 v6 i& J# T5 A2 a& m/ g7 B
{
b$ I1 T8 T) j8 S! | l, W7 w1 T. T9 I4 C! ]0 x
- 4 G# P8 G2 g" v% J
- d* q7 `+ i8 Y4 h; N0 ?printk(KERN_ALERT "Hello world\n");
# B( Q6 {- d+ t3 f8 M8 t9 B( x7 d- J8 H% t4 p2 A
& W3 K+ n! k4 k2 e5 O' ?6 m$ Q0 a( ^% M7 g
return 0;
0 a; b3 J9 r. w8 b: ^) Y1 }* K7 v. x2 `4 S9 m. [
" Y4 O2 K: Q& E: g
# r, g6 \. F9 Z8 i r}# V4 a% J- J: J/ B, `! G
" y0 ^3 T. Z) r6 S7 U- 9 m& {8 T, n2 g
1 @9 R" H* e0 `, c. M! S2 r8 Ustatic void hello_exit(void)
# f4 e4 y- f- t+ c/ ]
' C4 t. w5 Z8 c% ]$ y - : h8 W J4 C3 a" Y+ T& x! Z* e `
/ |; k2 {, l6 j5 g H8 N
{
. t0 c% y- t- P1 C& \ n, r3 J4 o k, h, s1 [$ u* g7 Z @: l
- & x2 R. Z# G/ F6 L2 s% |
; q5 E- b' z1 Z
printk(KERN_ALERT "Goodbye world\n");
+ \3 ]: v& i1 S8 q8 Q, }' m# R3 t/ `0 Q, O( h6 }3 P
4 ~$ ?* b7 F( |* I3 s( Z) l5 [8 m* s. @' @
} ]' ]' P2 ]0 F, t
' k- i& A3 T. v7 e- 1 V) w6 C8 Z% K
+ e/ a$ O" b+ E# j- Z. ]8 @module_init(hello_init);
9 a" n W* }( g$ j
( ~9 q9 k3 p' {) o2 b0 S$ e& T5 h! `. Z
- j, P/ q( W) B$ I% b
: S# w: Z9 {3 Q' U) n3 cmodule_exit(hello_exit);
% h6 `2 F* @" _2 [
: h* s1 [, n; f* F. N: l( n* Y( p# g- 9 l$ C) T2 S- d
8 e4 c8 k" a; y7 \. K$ z2 n% s& ?# r+ vMODULE_LICENSE("Dual BSD/GPL");
$ ~4 t/ F W( U `- p, v) d9 @5 I/ [: b, b3 }+ a; m
" s, p; b p' O7 r/ L & k' B/ y) s2 U% N# s
程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world
7 h( \9 @3 z4 v3 D: G" W" }4 T6 {+ D03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig7 Z* |; A& a u4 _2 e
在Kconfig文件中写入如下内容:
0 ?0 ~) y' F7 a$ @
, d- z2 x% g& }- `config HAVE_HELLO/ {% [" ^* D% o6 C: l8 N! a
; y. l9 ^ E* }
9 L/ ?, f* a; G0 w0 ~; U* l9 l2 e) L
. x* {( U$ n; c& _0 ~6 O; Btristate "hello driver"5 ]: h# i( u+ j# @! V, f
: h2 W9 z4 {& X" l
3 @, A5 q. ]$ i! k1 A0 y
. V6 W" h2 f( H: fhelp0 G9 @% [4 t Y" {& i# l- p
' ?, _5 u5 z. z
; [, [( D9 d/ e/ j* F' u
' X+ Y8 t* K/ `' k) yThis hello driver is just to show how to develop driver process.0 X: q1 u7 i3 i8 t
* f' R }/ _2 q' J" y
0 T8 {/ a! e1 P7 Q1 @, e3 i' i$ w' O/ s. P7 ]
2 ]5 d5 p2 c! M6 |0 [
! S: E! x E$ `3 m) m! C) ~; k- ; O/ j9 [: ^% L% e7 {4 U
2 A2 g+ U6 r0 N, ?" f. N3 H
% F& I8 j5 b5 T
" z5 ? c1 E {( ~
* k. }" f- v( `7 k. G2 _
6 o( G' h4 t' h) ~% w' DThis driver can also be built as a module. If so, the module will be called .
: c9 U1 @3 R! l6 O x4 _) z* b" E
2 p7 z; f( p: A; [% l0 i
# Z. h- ~" w# Q" ]4 ?- E: Ydefault y2 [3 V& h/ ]" H4 o; Q
& f9 k# U' X( w+ @# {$ o9 p
3 L/ H7 ]' a D* |6 E, n2 C/ U. o
#endmenu; L- J( W0 L& j0 _: v; B# z+ Q, n
' T) t+ P1 }2 M2 m
2 l" U! R0 f& U4 x1 F: {- R
! J4 {$ w7 n5 o) u表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig# R- e9 M4 B, N
在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o R- R9 r* U2 r/ R& L7 J
注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。 + g. R8 N- t% t+ f' L
给添加的这三个文件权限: - : j( g1 ?+ R, h2 x# T3 n8 c3 Q
f/ m! u) ~- F
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c
6 m8 R/ j3 w* y" x, C
6 Y+ @) N0 @) U7 ?+ |" h- V0 f' M9 t
' I1 O8 I4 S: K! x8 |
i1 T' I8 a6 @forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig
! E. E/ v2 u- ^( Q/ j" w" \3 b8 r9 ~
9 H' w @( s. |% K8 y. v6 ~' T% i" E U& A5 ]8 ?4 H
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile2 h( n6 C# w! S/ ^
7 L, m* Y, [( C, M3 t; @* p) A- p1 m( o$ J: S& K5 |& C* D" |
$ t E' q q% O, |$ u# E6 L: }* j) y
04编辑drivers顶层的Kconfig,Makefile文件。 - - ?3 }) c' n6 s* c9 t
# ?5 {; L1 Z/ S% v5 Q8 ?5 y ~& {
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..
5 R& E$ O9 D$ ?, J5 ?1 N+ G, h6 E2 T6 B& l: X
- . Q9 d+ a1 a% X( R2 R
. J) a! N9 v! `% lforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig
2 B' x8 I) r+ @4 E+ |
6 U) J& \: A! k+ |
6 H) M# f# r9 n/ L 2 c2 P% i" K) y" g2 W
在Kconfig文件中写入如下内容: - 9 w9 C3 ?. I" b7 p
2 X. ?- n* {5 `3 O8 I9 l0 d
source "drivers/counter/Kconfig"
: ~' f7 m$ r: x6 ^) |2 v6 E+ z1 v: \6 j/ \+ L" X: p
0 j0 V: A, e/ d9 o/ h
* f: E. U' m- Z5 P e0 Wsource "drivers/mxc/Kconfig"$ p, V Y7 K/ y$ e) W7 ^0 F
$ j& z; M* L/ y& v; |' [
- 2 l5 ]! O4 o4 m5 P8 q1 f
% J5 n5 Q5 t+ n2 T# k
source "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析
; f# a( k; F" i. h3 a
8 V& H6 Q4 g* _6 Z0 R - / C) J* j) J' ]
: I3 q$ C* [/ r5 _2 Vendmenu5 L) a) J6 _6 S# K) I% S
3 [4 r: t( y. }4 _- y$ }5 x( N! x
$ R. a& v/ K* _& r( H4 g, j
3 |# A4 [, ]8 P6 w0 @$ F如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。
- \& M' T! a, P9 F编辑Makefile: forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile0 ?' `, Y9 {! T0 f6 a
在Makefile文件中写入如下内容:
9 v( \" M# o0 A6 l: k4 n; ~' d6 i- g$ U9 d: U( p$ d) ~
obj-$(CONFIG_COUNTER) += counter/3 q; s" ?- R- Q: v
2 |1 _% g# h' v- - k# k, `4 b* C" T# \. u7 T
8 b0 H+ U, p: w
obj-y += mxc/7 m- m" C2 q* `" v: n" C
2 |3 q& E, \9 ^$ A2 C
- " U. a1 n+ D7 S$ m. `7 ^; N
! q) ?& |3 D5 n
obj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句# y) i4 y D6 J4 O# J; ?
# P7 \* |& T: O: g
" f% k2 Q# w8 ?# S, G( M; u
# X9 \- g" ?4 J5 ]3 F$ u这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。 5 ~) F7 d3 b7 F8 b7 Z
5开始编译: - 5 m- [3 _1 q5 c1 \) e( q% j
7 [2 L- c: [$ I' u+ W
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../.." C, i* C8 N: _
- B3 g: h; D4 I) F3 V, D9 Q' v! p
. o8 Y5 C7 Y' k# D$ a$ n& ?
% L' @0 @* L* `5 Yforlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux
, n- `6 M# s9 \: y ~
* Z( `7 S7 \+ ?, ^5 A2 M
$ M: z0 J, n3 U* @$ w' K( X# \- ?# E. d, k/ t' J6 y
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux
. x) [3 [0 P; ^( u
# t6 ~8 {" K/ o. F6 ^- 8 T( `' T/ B, }5 W/ z
( Z% Q$ g# }8 x, d0 c
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel4 V; }* e8 j! V, x( ^1 t. e3 P
$ E9 |* j% t1 T& b8 X$ O - 2 T w6 B6 ^* N2 E$ f( L& e
- m' k5 J6 r: n0 A+ M( |3 V tforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules. g x5 i/ M! m7 S# v7 w4 d# ?( C
, L2 t4 s b; O$ q* w; O - 6 J- s, F1 j+ W4 R/ c& | c
! ~0 O1 m1 E0 y+ ^2 |scripts/kconfig/conf --syncconfig Kconfig- u( u; L& D L" [! W0 Y
1 E% l% q# d4 v& K. ]
$ g# Y8 H( [6 l9 J. P$ s9 ^! s" P* e3 ]
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
# R9 p" w! E, V, X
% _3 d3 d) p$ j9 V
! e3 W7 d& ?2 b: o/ R# S! e# Q" g+ O; x/ N1 j
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'& M$ _' K2 l7 Z$ | {1 ?
8 q) O* p, u q$ o8 o
/ j8 q4 Z$ j4 E0 | x. V* |" c! y9 z7 a" \: g4 p
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
* s$ N8 y! c, U) C* \
/ ~, z; f( p- w6 e# u- 8 F1 g$ f2 ], `: q* r) {' t% }
, R" U' R7 ^6 ?( G2 u, f7 |& D
drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'; [) h/ J5 N z8 P+ J, C( | ]3 l. p; x
/ z/ i0 _: R2 h) c$ j
% K7 l- d# g3 v; a% p7 k( M/ e, ~; a# e
*- `6 X1 X4 d( V3 G* f0 s: `
6 Y! t! t* K3 ~$ S) W2 m! z1 [
/ I' Y" k% q" d* z8 K% V, ]2 N# _& m! e$ W& X
* Restart config...! E& z/ S5 a3 P4 c4 O4 e, O( u
. O; S4 U! a4 g8 }" i' }
0 d9 h0 j7 j6 ?# v5 K6 P3 q7 k: _/ J" Z/ |, _6 E
*# m/ S3 j# e: m- J" Z4 u- g
1 B& T; o" R: S. z
: d* Y; e; N$ C; C- u
4 W; F1 X. V$ Q$ K) c8 l*
2 E% f' {6 x) b2 K" x4 [! j2 k# [! A* X3 e8 R- ~
- " i! Y, h5 [; I0 E4 [9 i+ R% \% Y
% a$ I8 J4 ^' G N, i
* Device Drivers
4 j9 d* `- b( z/ r. x; s6 {6 ] q+ |5 j7 O6 @
5 m' I( p/ }3 i, _3 O4 ~; @6 L! ~0 m( {+ S7 B
*
) C' f" X+ Y( }: A2 q2 A6 e- C0 v4 T- V
- ; } m7 x2 O& X" e- B
% P( t# c2 x# t1 ]
Trust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n
1 t1 i" H C* B( i0 M7 }5 d6 I+ n. M5 a" E* O; e$ W) s
: T/ M% X" O% X/ L
+ I& o4 d f( ~, n9 RPlatform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y
# `. \6 ]3 Q/ T8 S* s# d2 I
4 a- X4 y( h- g* w3 ?9 y
# t; B! @: e; e7 ]) g
( a) U" x' z7 N t9 S* l; |Trusted Execution Environment support (TEE) [Y/n/m/?] y7 y; g/ l) D$ z/ L3 C
9 C3 m6 c) l; M$ m" p1 Q- 8 f0 w4 g) O/ E5 k
& `; g/ {* ~- ^: s, N3 Vhello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
) N( Z; B' ~2 N5 A" Y! @) d0 r" D3 C1 [5 i: W
- k- y- s+ X/ ~
7 m$ _9 s. k" M: x! TCALL scripts/checksyscalls.sh0 [ x7 Y5 g- T
2 ]# R. V6 w. z
9 M# V- {$ V% k4 b5 O0 X- D5 X% T7 N6 }" e% l( Q
CALL scripts/atomic/check-atomics.sh. P0 ?8 K5 U, S" }# d1 \
; N! R, Z9 n) G: Y- M+ ~9 Y
- Q5 d4 ^. e" o& |4 z. V) o! h, z- U9 y+ }* W4 Z+ q
CHK include/generated/compile.h
7 y% Z' ?" D9 j9 o7 ]7 r: s$ u/ H1 c% j! L5 c- h
% k5 P' u8 H; I! }' f" Q! Y( Y% M6 s! }( N: u" G2 k4 y G# h" r
GZIP kernel/config_data.gz
; C/ n2 \8 M$ p/ q+ @" J3 p% K: e7 y$ e, v. n: g, U3 I
- " n) C. f. y7 ~+ @7 m8 j# W
: ?# }8 M1 e4 P% |6 B0 `3 m* O
CC kernel/configs.o+ L) m; W4 W0 n( `$ ?* T
# A& v* ~" v2 t2 s! q
6 ~& |) T' i$ O1 k/ f1 y, ^; e, X2 i9 K; Q
[…]
) i/ t9 t; i Z; h3 n5 A0 _* X; [. D* s% @2 O8 }
- * V# E! v5 u, K! W8 x" w1 V
6 L4 O2 l0 N3 t& h& Z1 b8 o
LD vmlinux/ C6 I, G9 } T. ]5 e% i" C
; I y# k# D8 u. n: A - 6 W7 O& A: d/ U5 r' o* Z2 ]1 L
$ d7 Y2 E9 u1 z" X, Q! L# H% a
SORTEX vmlinux5 ]3 T7 A& L" c& k Y3 k
) L: E8 S0 E6 \7 x4 j5 c8 n
6 F2 x- B1 C( C- j" {
8 L8 e" d6 t- q6 I* G6 [SYSMAP System.map) s$ }8 T+ ?% ?6 c
: Q4 A3 n) @# ?4 |# q" l
- ! Y4 _1 v6 I7 ^7 w. w
& `9 A& s, M; Q8 q( kBuilding modules, stage 2.
, u: ?. g* U( o1 }% N7 Y
( |" W# s% I4 ?5 Q
+ G/ d" b5 p; Y" G
f" H1 G( o7 m% d, @5 }/ LMODPOST 536 modules
M- P. @/ m/ h: ]7 X# O* c/ M5 `0 d/ D
- U) u/ f$ D, d l6 }) k0 ?: a1 W0 m3 t' L9 E( q
CC [M] drivers/hello/hello.mod.o0 K8 a* f% s, ]+ {8 M: \
7 o% z. r( n( X# U. w, H l0 q% o* E
- ; I5 s* i- f1 e0 I: {; j/ X
) b/ E, K0 z: a0 K# WLD [M] drivers/hello/hello.ko
b; i- E; o8 U4 h: v
; U+ U# N5 W/ {! ]4 ]
+ q P+ h3 V7 o8 U( L
![]()
/ y6 ^, G4 C9 e3 @: Y4 H8 U; Y1 Q; ~3 t- h/ i
编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了: - 9 E2 q2 Y: _4 ~; `; s% {
y" t, }" ` j3 ~, @0 F2 c; p2 u: pforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello$ ~( ?7 R8 t! N- J2 ?
) B; L: ?; N$ j! J$ Z, \ - ! o: `; d* A0 n: I2 A" Y
% W; c) F" }4 T z8 Z
hello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order& y0 K( `. z' l1 j% e
B' A+ J8 _" V" [
: j8 d8 p# [" C0 j/ i+ k3 u
) F; H, c* a( W4 F
6 7 D# e" j& T" S( p0 @) S( m# s
8 x( x8 r# w0 K1 v6 ]将hello.ko使用U盘或TF卡拷贝到开发板里进行验证: - 4 T K- a8 F. n# ]
( Y D* ~8 P2 Q; Q
root@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下. f( y9 [2 Z; Z2 ^2 Q* b
. L W6 ^! X; f+ t
: T4 Q/ O% E+ l' h) }
: Y& _" Z2 R# q$ i, m8 oroot@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko R6 ?4 K/ C4 x* ^
- e/ N. T' l: G1 E; v9 j+ e- ~/ E6 |7 v7 F; a9 s, j
+ Q+ E2 ~" T+ m1 Q( F[ 138.679964] Hello world //挂载驱动打印信息
2 ~5 H5 W7 [9 e$ X. I: G4 \5 r7 t& O5 H
- " `$ ?) q, `7 `: V( m* x
, v0 A6 x& m P9 Q
root@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko
' b' E$ i# `' m0 I4 N* w
, c% S) \! E8 G. \' j2 P
6 @( f' h% o# K) \) x8 M C- n, X0 \6 d! o8 K
[ 142.022115] Goodbye world //卸载驱动打印信息+ m0 [! c4 n6 d7 y% z R7 h
# M2 o" k- m8 w( Z* {" j/ p- c( J
- & e9 r/ X8 |4 ]/ d
; n9 H0 W0 |! ]! \
root@OK8MP:/run/media/sda1#* T: p* R" S0 ` O7 l3 `) `
- n& g- b; [+ r* ]- `
/ A/ L* I" e' b9 q# }
7 O' s! V$ y3 I9 w( E由上述测试可看,hello.ko驱动可正常运行。 , s2 q6 x- t# q
以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。 ) b/ F" K4 w- A& u q% q
|