EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位工程师用户在对飞凌嵌入式OKMX8MP-C开发板进行开发的过程中,可能会遇到需要移植驱动的情况。为避免用户因不了解移植驱动的过程而影响开发进度,今天小编会以写一个hello驱动为例,演示移植驱动的过程,有需求的小伙伴可参考此方法自行操作。
5 z" c" Z. k5 Y![]() ( X# z; K& L# u9 i
01进入源码的drivers目录下,并创建一个名为hello的目录: - / F, x, _. n6 \& H3 _3 X$ a$ H
* Q9 I& ~ ]0 T' m
forlinx@ubuntu:~$ cd /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers
3 }% Z& p( e+ [% M6 q8 m
2 U4 _2 ^+ D6 x! Y
+ `; C, C, y/ T2 C7 X" d1 T/ Y& V' D. d& Z m* i, S" P4 z
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir hello% M. ~& F! X( m; m0 R9 N! |
7 |# [7 w. K6 e; w' M K" j" u5 b5 `8 D7 Y. W
- _8 b v# a" `
02进入hello目录,创建hello.c: - 4 p; A+ m4 X; S$ R) ^: r5 r' r
/ Z" b6 m6 r' ?6 A6 v
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd hello
3 _5 j7 }. S8 Z6 F0 M1 f* P) S& H4 F8 M: r* s0 `: a
6 o. X4 E: j/ o# o; \8 l; p; h0 \5 _: ~. Z2 _% A
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi hello.c
" x& N; d0 O% s6 v' e/ f6 K
+ \2 K( o$ w W. N1 z S- `' w2 s, m" m8 G: k
7 e F; B* ]5 L6 }8 x, K在hello.c中写入如下内容: - 1 u. [ T0 M2 T
2 l" s- |8 K1 S0 L. [& `#include <linux/init.h>+ M9 f, x6 P/ b& n8 L
# v F7 n" A: @( k' `; J
% R7 A f7 S2 R0 y* Y5 R3 o7 h
$ J! z% S% W9 E3 j7 j#include <linux/module.h>: M Z" }3 m0 @( a1 N
7 r/ i3 k8 T0 ^4 y
- w6 {/ m& `, s2 i7 \9 t7 ^/ f5 N5 t8 i
static int hello_init(void)" t; y5 D8 Q7 z# {* @5 n
; n2 g6 ~# j- _# m, P/ h- ' T/ A8 N$ U5 t5 E. n" G; A+ y* U: w
* [/ B! S0 a8 f3 D{# X1 z; X3 g9 w8 |6 [. M
; o6 _, {. K# v9 ~ - 7 R0 D, Q' ^6 q0 L9 E9 h6 N C
0 O! C( \5 P4 V' A' \% ^# Q; `0 \
printk(KERN_ALERT "Hello world\n");
, y [, W: a( C. G; A9 ^! z0 S
* s& Y3 b4 _1 o& z6 | - . w' f' o& J9 K- Y! z( ?+ F* o/ A) L
6 j7 ?% U' D; y" w1 C4 i6 t) X
return 0;0 ~# M* {# {- I x1 L' S
0 O0 e8 m9 S% O, |+ _/ B
- ^' n( o7 D/ f/ X. a# q
: G7 B o( m0 e8 ^# F}
, C9 U- V: c2 n5 f% k: n4 [6 F6 @( z
) j; L" F1 F8 Y9 n- b8 U
6 S8 J1 H4 k/ E* t+ p4 K; t2 E. j% Xstatic void hello_exit(void)
: x5 y; h s+ Q9 [# G, R
( D& `; f, Q/ y( m- ; o$ ^1 ]; n# C, b8 f2 B; h' j
' o' i% U! s# x) q
{& L. `. T: {6 ?. X0 R3 U8 W
' D' R; ^( ?3 v
- % S; m) Q! Y$ p# q9 V4 ~0 a
* {* Z# R4 t7 {% B/ U2 t& |
printk(KERN_ALERT "Goodbye world\n");
/ w2 J* r7 |7 f2 O) b X4 l! z2 b
X9 F1 K0 u8 C+ b( Z% x5 D4 F* o! ^/ U# o- S3 o! R
}! {. h& i4 F- n' s" r1 _
9 G8 j: M, L. d6 m. T- 2 q) |' Z; a: P- h- e
& n0 K5 S/ y( f! d4 D2 ^0 q% a0 }module_init(hello_init);, I( b) K/ g0 i
n# \! X I9 n# [1 l
3 N! b! U& k5 p& E
* R( X2 h% w5 w: r C+ b( T8 y+ imodule_exit(hello_exit);
; F2 A, A" U5 z3 N; S
+ T s2 u% H. e
- L8 b% m0 i i/ ^* L" M* _1 C, v
MODULE_LICENSE("Dual BSD/GPL");8 i2 ]$ Z0 P" h) ^! ^( p# K1 e
: r+ K$ o0 f1 ^9 z
l2 f, W* _3 ]
; Y' o8 V0 u- S5 l% b7 ?程序含义:insmod驱动挂载时打印Hello world,rmmod驱动卸载时打印 Goodbye world
, j3 t# X5 Z. p) v" o" ^03在该文件夹下创建Kconfig,Makefile两个文件。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
9 O9 Q; a0 {% M5 l s在Kconfig文件中写入如下内容: - 7 o3 d* L9 R) Q, N1 U
- U7 r3 B! Z6 W' Tconfig HAVE_HELLO
! i5 G0 k# g2 {+ p C* N1 [0 K+ m" |" S. X
- 0 e& j1 g J7 D4 I* C
& ]$ a/ L$ D" w/ Y$ t
tristate "hello driver"
n6 j4 F% ?8 w* f/ E; j& D) P: \, A
# T' Y) z" B2 z. t/ b, [. T6 a
9 I9 p2 G& S# R: U0 d8 Zhelp# E6 S/ J& x! M' y" |& ]
% z: `/ {+ g0 W \
- 6 p. H: S- J9 J) d! ]
7 |6 V {3 n% c) w8 d2 ~
This hello driver is just to show how to develop driver process.2 ?9 o2 c: E) A1 N7 P
9 I& Q1 N' c7 l2 [ W2 @' y3 H - & \) I. p0 l6 L& D: L5 T
. ~' g3 [0 f, M
5 E; {" n' T# j" @( c1 q% q
, `) Q- b: r& q! o( `5 Z4 I
6 b3 T9 a- N# |3 M
8 W9 o# {0 w( B) e. D r# l" l
K/ d7 f/ _/ b4 _. ?; a% R- $ P; J2 ~* ^1 u& B5 m6 ?$ I" M, Z$ i) W
0 c. W- @4 z5 c. y+ L6 jThis driver can also be built as a module. If so, the module will be called .1 H- p6 Z& D2 Z/ E6 }+ Q
2 d) S. v0 y8 W4 q9 D- k
& s9 s1 |2 v0 L ]7 y b9 e. d) |" Y! _
default y2 D( |/ \0 d% z% E f# H" [
1 E4 A: {- _# `. y3 b1 y1 O
% D7 E8 F- c1 h% D9 D. n2 V. \/ W6 |# |
#endmenu3 C$ U' {" W: f
. X5 _* C4 L1 ^& W1 W# x* I! P0 j) j
* v- D3 V7 a$ U1 W7 P表示如果使能了CONFIG_HAVE_HELLO,在内核裁剪配置文件中,将显示hellodrivers菜单,默认编译进内核: y:编译进内核 m:编译为模块.ko文件 n:表示不编译,未使能。 forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ vi Kconfig
% ^( }4 \% B, q7 j/ s在Makefile文件中写入如下内容: obj-$(CONFIG_HAVE_HELLO) += hello.o4 j% v8 f$ p8 Y% {. x$ _
注意: 宏定义的名字要和Kconfig中的一样。后面添加需要编译的文件名,因为内核会自动添加前缀CONFIG,所以我们这里也要在名字前面添加CONFIG_,表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c。 ! J2 {: i* J* C1 c- w
给添加的这三个文件权限:
: r' G) G h6 c3 a, [4 E8 |0 _% {* z% m# l' H3 ]
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 hello.c
9 E. h% W" B( [% k' t& }8 s3 V* s( ?' l# H$ m5 L
/ ^4 _1 H, I+ Y8 J, v
% k3 q6 ?3 ~8 U- R. b: V6 Xforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Kconfig
* H/ v$ L( H- h% B+ B% P, m/ l1 n' Z- x
- 4 u$ G$ H0 d1 Z2 ~$ }
9 P! Y$ `4 g, ^0 D' Wforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ chmod 777 Makefile2 l# u! K5 ^2 ]' `& x+ z, m( t" U
2 j; E+ y m6 L0 Q! R4 v
+ n' L3 y q6 `& [. c0 ]; M9 n
Y$ m9 q7 r3 U- Q k3 n5 z04编辑drivers顶层的Kconfig,Makefile文件。
7 g. ^3 c. b- O+ ^8 `) i1 u, x
' c' [. L' ]3 hforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$ cd ..* }: o1 ]5 s$ s A
7 H8 I) D1 A( ~ S) K
/ l: H# }1 G6 v; C/ M# D' u0 ^2 `3 v: U2 X. z1 B
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Kconfig7 I a( N* \% n9 f
$ R: u" e" P# p& r; D' g- ?' ]
; ~1 r+ x9 _: t' ~1 y. ~5 p # {, P( h4 y( x! ?5 W
在Kconfig文件中写入如下内容: - 8 r% Z; F3 Y5 C0 z% m: s
$ l" S3 ]; E- U# u/ x/ L
source "drivers/counter/Kconfig"& ?/ ]# N% P4 p( `+ n7 [/ x
" T6 p3 P) g% {9 x) C
5 s0 l1 o# \' G* c4 A5 X) M
5 F$ b' F# c h# x( f5 [5 ]source "drivers/mxc/Kconfig"( G4 T) Y* }& s# M" n
) m6 G7 f1 `* N! A
$ k* P+ L8 m, Q# x$ p2 o O9 S0 J( G# O# k) @, G* L
source "drivers/hello/Kconfig" //在endmenu前添加hello文件夹的配置文件解析1 [4 p+ E% U+ i1 n. q7 @9 l4 y
+ u, u* q$ Q( a7 J+ j$ c5 Y2 Q
' @1 _$ Y8 q& ?# H2 [3 N8 E }7 K7 m; @ w
endmenu' R% I7 B6 M, X; \9 L- F
5 Q$ [" s6 y' K# G/ R- j
9 O5 }: p6 R+ J+ @) v( t% y, I
: T3 ]3 F: w6 _) p$ N& }( }如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig。 - M+ f3 p0 V4 ^5 |5 W
编辑Makefile: forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ vi Makefile( R. {" s5 \* `: b2 A
在Makefile文件中写入如下内容: - ( [" Q# t5 Q" ^, m3 d% J- @' ]/ K7 k$ R
2 M" D: Y* T! r4 e4 Q! hobj-$(CONFIG_COUNTER) += counter/+ @% |* n6 A; ^
" |6 g" A' e6 }; ~
) e$ f, h" \: e& F6 k; ?
0 }0 C9 |5 j; tobj-y += mxc/
$ h# ~3 {: D+ w0 V& u
, o2 |+ A, H% c( W3 K- 0 z1 R. j, d/ `& H0 Q7 D2 ]; ^
# V2 m3 K) |* y2 u9 S( X8 _# \0 w
obj-$(CONFIG_HAVE_HELLO) += hello/ //在Makefile最后加入这一句8 r0 q: Z# O7 Q% v
* B8 b# C; e* _- H
9 v5 d; Z6 G4 b& l- N2 @
; t3 N" l! e. O' X0 X3 h x9 D! ~0 _
这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。再结合hello文件下模块Makefile就形成了层次式Makefile。注意不要少了/,这里添加自定义文件夹的名字,表示把这个文件夹编译进内核。 5 _- s4 n% A n: J) `. l
5开始编译: - 4 i: t1 J# g; ]1 k" K2 i
7 c7 j* U1 U& `forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$ cd ../..0 L/ _' \- ~1 k: C
4 F2 @, b4 i. J7 W! {- d J
3 K! W3 [) j. R/ L- K/ p6 M5 n, w* @& R" ?! |8 l+ K n Y' q
forlinx@ubuntu:~/work/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux; e% `; u* H# W" k' c0 Q
: O, p+ |4 H& g' ?4 }5 m
8 k2 L! _ O2 I
7 `; F; M' p& zforlinx@ubuntu:~/work/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux
# `9 Q4 D. t3 l* ]% |2 O# P3 y& Z' Z1 p8 A. R- ~' \* {
- # \8 [" T! B7 ^% C; I
" C! P J- ~' a8 T$ @forlinx@ubuntu:~/work/OK8MP-linux-sdk$ cd OK8MP-linux-kernel# f/ }3 ^* ]7 j; d, O/ x
% W3 r0 N( ^/ T& X# G
- + z# F3 X6 f8 V* [! H5 y- C
, Q% ^- l& B L! e6 J! I/ X
forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$ make modules% d/ l% T9 ^4 n3 a7 M. S# N
' c0 q G7 S/ q
' z, T* a; p# e9 w
" P; \0 b/ m" h$ b: R) v4 }3 Nscripts/kconfig/conf --syncconfig Kconfig- Q: f, H2 R; S2 g; e
& a2 s( b+ B0 n9 s( O% U' @
" Z$ |+ T" ?$ Q6 F7 o" F
G2 E' {# q3 jdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
9 n3 C7 [" W' G0 `
& T% q4 @9 u) u2 N
! q; r6 q; N' h
6 S- O8 X0 ?" \drivers/hello/Kconfig:7:warning: ignoring unsupported character '�'
8 R9 o C$ c2 ?" V! S7 x$ y0 Y% }) g) M/ z
4 _" Y, v: C3 ?7 q: I( U
1 ~1 `. I: F `) i* mdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�'$ v' w/ Z2 d v; v/ d) K
; l M, `/ U* ?- - [7 F1 [5 f4 o3 U1 _8 m' Q
, ] ]$ Y8 H3 K1 K, C, p( q/ wdrivers/hello/Kconfig:7:warning: ignoring unsupported character '�', `' U$ F1 Q( b$ ?, b+ J1 ?% {& @
q7 h% v: Q! g2 }9 h) i: }: g b - 7 p. [" L" F, X* v4 n# v6 m) R
: y1 p- @( [1 s( r1 ]' _1 v
*
. E; G5 g% y. m& H+ N a% @7 N
; v" S0 i3 D; ~4 h. C" b
: x/ J, Q# U! A8 r# G8 ]5 i. p7 X
$ c- j! A8 i( i% z* |# X* Restart config.../ U% d( z1 c7 g W
2 b- Z6 d Q( }6 f8 j/ ]; \- k# \
9 l2 A, t- `) w: ]- h ^2 p. D# O
* G( W/ L9 L/ S$ P*
: @' f' h4 ~6 `: ]3 S2 j. ~* i- }9 ^+ x/ V% }7 F0 ^: v, P( }
$ k( G, u) I4 l+ [- U: I! q* p9 \" ?0 p7 n0 k9 T
*
- g5 ? ^0 q7 L- c4 p; F6 y9 Z! Z* ^5 p0 u$ J
- ; T7 ^4 `$ ^; n* W: S
- M7 R8 E4 S& [9 |
* Device Drivers8 `. E7 ? G0 M& n) b( |8 I
5 U) m, b: Y) @0 D* G. O
5 q. \# H2 h% ~$ n/ I! z2 g. _) G1 q) S6 J& `) j \0 o* i6 q) j; d
*7 |' `; J& C, Z* P
6 X, s. V2 U! o6 Q
: ?" M& J* Y- g, t8 y2 I
1 E5 Q1 O8 L3 gTrust the bootloader to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] n9 f. k, T, E( Z% n
" i8 a, ^! \; t! \9 }
- / `3 { P+ i; f% X
& q$ l8 v' L5 X# u
Platform support for Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] y; b" m V! e1 t8 K1 ~7 K/ w
( g2 x$ q* }0 i$ n1 Y0 D' z
; l6 o8 r' q; E) _$ p. v& N" }/ r7 p
Trusted Execution Environment support (TEE) [Y/n/m/?] y
* m' F/ g& S$ L9 ]
4 M$ y I& k+ \
5 A1 Z i, p7 @% H7 W* z# s2 P! q0 X# _& A9 i2 }
hello driver (HAVE_HELLO) [Y/n/m/?] (NEW) m //将hello驱动编译进内核就配置为m
1 B% n! s \: w4 k6 P
/ T# ~9 D6 @* I
1 `! T/ A3 L; t) G6 U ] r
1 `$ w6 y$ H: x! w+ g( t3 aCALL scripts/checksyscalls.sh
' h& ~+ C8 Y1 a* I
8 W3 D+ T- n9 A5 W1 a% k5 L- / x- J7 L. b9 B5 u
7 u8 C1 r3 v, g) SCALL scripts/atomic/check-atomics.sh z8 C/ ] ?, W' p7 e
# J6 [: f# |. ^ - 4 R }) w$ g1 S' o6 @$ s
- [) V5 {* @7 q9 a" ^, [
CHK include/generated/compile.h
0 a0 V: U( R( S# F! _! T4 V: D. L" p. v+ Z5 S' [
" f- L' E2 _- w* T
9 ~) j6 }& ^3 N2 _GZIP kernel/config_data.gz- ]* {8 X' d" C% t! g8 Y; J9 v
3 x' w2 h) f: i# [8 _5 E
" G% e; z* ~9 u: o3 B" C2 Z1 [7 t; Z G& a
CC kernel/configs.o
5 r! s1 H0 d c5 e
2 D, h* {4 R) w1 M0 D% |- ' h1 K) r- ]) M
! u3 w3 ~: q" W) b& t. o: y
[…]
: }8 U; ]0 G9 X
# c. p; t) `0 e3 `4 j1 p, y9 }3 S# o
% c" r. o j& D" K& f& w' L: u! [/ G5 Q
LD vmlinux
/ m2 K8 H _& T& F1 c0 d
1 } [/ j1 C( p
( s# X. X! C% \$ e% ]2 h3 R! d. d- Y. L
SORTEX vmlinux' ~1 T( W, O, |
% F% C& y/ ?$ t9 }* q9 {
) T0 |9 f! j$ @1 Y, t/ w4 l
8 j0 s/ ]. i/ e. @: @+ gSYSMAP System.map& v( n1 U8 I; U) C) [! {
& i0 w* {. h5 K% s
: z. g4 j/ b8 [/ b7 W& b8 k% J% V6 D" Q+ J
Building modules, stage 2.
. o' u7 c4 z {2 Y
\' G( t! s n3 b& X
3 c$ e" E9 A* @
9 m1 t0 Z0 W2 T- }* a- dMODPOST 536 modules
! M4 {* M6 w1 `# `+ R- O9 l0 W$ T2 P- ]: H
6 K& u1 w: c4 ?$ g! \- t8 _ d) n8 G7 V5 q+ \. h' ?) G+ j
CC [M] drivers/hello/hello.mod.o
& c% Y0 E. a4 k( B3 t& i# b/ x: y) l8 F5 s5 L B4 s# S8 ?
2 B" c! J+ U( W9 {* W! [2 j6 S1 _# b2 F1 |- d- [7 }7 z1 O
LD [M] drivers/hello/hello.ko$ b G! h7 i# h3 ?) h6 c" G# n+ u
: {- j z7 ]" c( O6 z Z4 i5 k; h( Z2 }' u8 o U: @
2 C- u2 ?, s; T8 o0 Z8 O
. D, \5 I" G1 j3 ^) C9 C' J9 n+ y
编译完成后,即可在OK8MP-linux-kernel/drivers/hello目录下看到编译生成的驱动了: - 8 t0 {8 C+ d+ w, p6 W M
& v: l: w0 H7 M) Gforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$ ls drivers/hello+ ]) i9 ~2 h. [. O/ J! f
- l7 E" V! V" T6 ]) t1 Y: z' V
- , m3 c3 d, [ a+ V+ V& |
( a* i" t, y6 k3 k y7 w
hello.c hello.ko hello.mod hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.order9 |0 G1 n, K) i# ?2 a# B
$ I; r5 M3 }6 H) m2 ^; e5 m7 O, Y" M$ j8 K* s
9 ~4 X" M: V3 ^0 a1 P0 q) g, e6
) g- c, Z% b) o* j6 e! ~9 ]: y+ N; |
将hello.ko使用U盘或TF卡拷贝到开发板里进行验证:
0 M: z" e1 c# c7 X* z- Z2 O
; F1 ^( q' Q5 |6 x* r0 Q uroot@OK8MP:~# cd /run/media/sda1/ //进入U盘的路径下
4 C5 p/ j* P4 k& R- O0 u2 O
/ A. A0 Q4 V5 S6 ~# `! c7 G- 7 R: v% N; a4 f+ l7 K
5 l- F* p( g0 w4 [- |5 {root@OK8MP:/run/media/sda1# insmod hello.ko //挂载hello.ko
& m, B" f& c* h, N/ V& k) T: o$ l+ p4 i4 i
- % w7 Y, Y& u3 \6 G0 m5 F
' c1 x8 c( p$ Y7 u0 c7 K, T
[ 138.679964] Hello world //挂载驱动打印信息
* P, ?9 k2 C+ x3 \* S2 A5 q, Q E
* S0 |7 U8 B) e) z# J
9 ~# k0 O; z8 s! |3 E% y5 `% E& m, s; R% |( Z& `
root@OK8MP:/run/media/sda1# rmmod hello.ko //卸载hello.ko! m8 S- o2 p! ~: S& v) e
# k) p7 B! V3 r& h" z. P2 f0 w( c
7 Z# s0 ^2 c( m# J9 U' a! F! a4 q
$ B3 ~/ X. j) u[ 142.022115] Goodbye world //卸载驱动打印信息' X. i. D& ]* g4 q- O/ {
- W _/ r- i& g: X
- 7 e# V3 o9 V, }9 _6 q
# R8 y: }* K% ^root@OK8MP:/run/media/sda1#5 W0 w' o4 y" W [9 F1 P$ Q+ f3 [, l
/ b3 i M/ x- V' K" ^& k1 G& i8 _: l! n9 O$ ?
( h/ l9 z. t7 \/ R& e由上述测试可看,hello.ko驱动可正常运行。
( ]. L! @1 a- [7 S( ?; r* F7 m以上就是小编为大家演示的自行书写并添加一个驱动的过程,若您想要移植某一个模块,可向模块厂家索要现成的驱动.c文件,之后再按照上述步骤配置Makefile和Kconfig即可。 $ R1 U2 i, e3 y+ l' E2 {6 j. `# g& v
|