|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以模块的方式编译内核驱动。9 W: [' w+ D# }+ G& q
要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章。
' N" o" g0 f4 A1 v9 O2 ]6 u1.4418 内核编译器的查询和环境变量设置
9 c" x5 g" {7 i" F4 [* ?! u; {在开发中,大家会遇到源码和编译器集成到一起的情况。迅为的 4418 源码和 ARM 编译器就是集成到一起的,本节主要介绍如何找到编译器路径和配置环境变量。3 J" K# l; _5 d2 T
进入 android 源码目录(这个目录是作者的,用户如果解压目录不一样,请注意后面的Makefile 文件以及环境变量参数也要修改)。 M; A1 n2 e; X6 K w
7 Q$ x% F2 T, [( s4 D
如下图所示,使用命令“cd kernel”。
6 X9 G, x2 G% \![]()
0 F9 b+ I/ Q' w0 h6 o8 m使用命令“cp -r config_for_iTOP4418_android_RTL8211 .config”配置内核缺省文件,然后使用命令“export ARCH=arm”将平台设置为 ARM。2 C$ k# Q, t6 J x1 Q y0 r
最后使用命令“make menuconfig”。
+ q5 C, y8 Z( `. n( R8 a, _3 ?![]()
4 \% x2 |# Q# z) Q+ N# \如下图所示,内核配置界面。
: j; B( m; y" O0 y进入“ General setup ---> ”,如下图所示。下图红色方框中的“arm-eabi-”就是我们需要的信息,内核使用的编译器是“arm-eabi-”。2 i2 g3 x! a" G
![]()
" g) g( U9 ^9 V. u1 ]9 C退出 menuconfig 界面,使用命令“cd ../”返回到 android 目录下,接着使用命令“find ./ -name *arm-eabi-*”查找源码中自带的编译器在那个目录下。$ r! y7 }! h( @. q' P; \
![]()
" {* S0 D+ R8 H1 B* r8 V2 Y0 M如上图所示,我们找到内核使用的编译器在“prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin”目录下。大家可能很奇怪,为什么 arm 编译器要放到“prebuilts/gcc/linux-x86/”目录下,可能是三星工作人员懒得再建文件夹了吧。另外有 4.6 和 4.7 两个版本,我们% T. f8 x) k6 w
直接用高版本就成。
) [0 B5 r+ J6 \2 M那么编译器完整的路径为“/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/”。! }$ ]) u3 }' q6 V! r4 W
使用命令“cd”命令,接着使用命令“vim .bashrc”打开环境变量文件,如下图所示。
. Q0 k9 c$ G2 h, n' D![]()
+ i# x2 O+ t8 a4 M# O3 H- i在接着按键 Shift+g,进入环境变量文本的最底行,如下图所示。
5 g1 _) P2 P& u0 _如下所示,作者以前的编译器使用的是 arm-2009,作者这里需要注释掉。用户如果前没有设置过,则这一步可以忽略。
: x6 M7 P* A2 ?+ }( V2 J![]()
9 I$ W; V" N+ f. W接着添加 4418 的编译器环境变量,export PATH=$PATH:/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/
: i; y' d! w) ]如下图所示。
* S3 ~3 D6 Z2 j 7 C; r; b9 q) p- `. @3 V5 E2 y+ T
保存退出,使用命令“source .bashrc”更新环境变量。控制台输入“arm”,然后按Tab 键,如下图所示。如果不出现如下界面或者仍然出现原来的编译器,可以关掉这个控制台,再开一下。' p/ h$ P# U4 H- v" b6 K
![]()
- O* B6 Y% Y3 ?" H1 E到这一步编译器和环境变量就介绍完了。; d& Z* S/ D- Z7 Y$ r9 H% F2 U& l
2 Makefile 和测试驱动源码以及编译
: L- ?* s! X! S0 O# J; f4 s2.1Makefile( H( T2 J- @$ k y) K
Makefile 脚本文件:8 L4 G0 f( `* \4 R' T
export ARCH=arm
$ Q, z* z: C) V) _5 ]/ Iobj-m += iTOP4418_driver_hello.o
: L7 |/ U( w2 ]5 _0 uKDIR := /home/4418/android/kernel
4 V8 L% Y( m, c* m7 z$ |PWD = $(shell pwd)
u: \ f' F: Eall:. f9 H8 x( c q2 ^2 y8 |
make -C $(KDIR) M=$(PWD) modules8 |/ d/ `0 s& W( _" i6 u
clean:
/ `3 o% W1 N* c$ F* V/ m$ Qrm -RF *.o
$ d/ U# y! v" j B7 v7 |0 ~脚本中,export ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM。
5 r: |# s, i7 C! vobj-m += iTOP4418_driver_hello.o 表示编译的源文件为 iTOP4418_driver_hello.c,
" |4 Z7 x& b) v+ x如果源文件名有变化,则需要修改成对应的。
2 b' H' Y* X; H( |' ], f1 rKDIR 参数指向对应的内核源码目录。作者的内核源码是在
* Q3 |/ a7 U1 P# }3 r6 w/home/4418/android/kernel 目录下,用户要根据自己的具体情况来修改。
" r9 e' c9 Z3 X6 j& w2 u2.2 简单驱动源码6 B6 U; F6 ^) c5 J
驱动文件名称为:iTOP4418_driver_hello.c,源码如下:
! L, J0 @, a6 l( ?- n#include+ @ f, ]* R' o( ^+ M/ { k
#include; b4 ^4 J. O/ w; ?% {: y
MODULE_LICENSE("Dual BSD/GPL");. Q9 F, |9 H4 l- A- f' Q
MODULE_AUTHOR("iTOPEET_dz");: w, R7 T" l2 z6 Y: s
static int hello_init(void)
5 ]4 j6 B7 o% L3 [ Y- k" m{% \. k1 N8 C8 u/ j
printk(KERN_EMERG "Hello World enter!\n");
* ]' |6 h! x! j3 { t2 v7 ~. G# kreturn 0;/ C8 C/ H: r# y" Y" J4 I
}
1 b6 q+ a" J I3 Sstatic void hello_exit(void)3 A1 B2 \+ _) C
{
# k5 [2 j# M6 f8 W9 w( N# gprintk(KERN_EMERG "Hello world exit!\n");
5 n4 o4 E8 m1 C, U}: e7 @+ m- V7 u1 b. S; ]
module_init(hello_init);
/ I! F- F. {0 d0 Y+ F3 ]module_exit(hello_exit);$ ^% V; ^2 ]4 Y# g. i
驱动源码只有基本的入口和出口函数。加载和卸载的时候分别打印“Hello Worldenter!”和“Hello world exit!”。
8 B$ Z% {( Q% \9 O2.3 编译
, a; x2 X: y4 g* Y' ^. |2 l如下图所示,将源码拷贝到 Ubuntu 系统下。+ g6 o, I# j* s3 C: R, c8 Q- i
6 d4 d) @& ^+ C* g6 l0 f0 y7 U
使用命令“make”,如下图所示,可以看到有“iTOP4418_driver_hello.ko”文件生成。
4 ?7 k$ H3 Q0 T7 s4 _( h - \# ?6 {& V) e! ^. U3 l
3 常见问题
# p* I; r1 l' w* A# J$ `! U% h在以模块的方式编译驱动的过程中,新手可能会以下问题。" P9 f" L4 x% i* m* z: `
1.内核源码没有编译或者内核源码路径设置不正确。: R7 {7 p# y; k
如果内核源码没有编译,那么模块将会提示缺少库之类的错误;如果路径设置不正确,会提示找不到内核。
* A! q* K, _4 X9 l( l2.编译器未设置正确。9 e# j' `& B0 _0 Y* G3 T0 ~
会提示找不到 arm-gcc 库之类的错误,请仔细检查编译器路径,确定在控制台输入arm+Tab 之后可以出现 arm-eabi 编译器。# v$ z8 t0 o9 ?! ]' w
另外部分用户可能尝试使用其它的编译器,例如 arm-2009q3,之类的,理论上很多编译器也是可以编译通过,但是不建议这么做,驱动最好和内核使用同一个编译器。
' y! x- Z7 m$ U$ _$ _; ^2 L3.源码和 Makefile 文件在 Windows 下编写,然后拷贝到 Ubuntu 上,由于编辑器不同导致转码错误。( G4 x( A) A. t( n+ T/ {. E9 E' ~
这种错误比较容易解决,Make 编译之后,系统会提示 Makefile 或者驱动文件具体某一行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下再编译即可。
; V7 [8 u& E7 T* g% } N![]()
* D& V4 l) S: p0 k |
|