|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以模块的方式编译内核驱动。! ]" E4 U5 N4 K0 Q: v
要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章。
6 s' I' ^! Y) N: y1.4418 内核编译器的查询和环境变量设置, G& w; m' v0 G8 g( I" G
在开发中,大家会遇到源码和编译器集成到一起的情况。迅为的 4418 源码和 ARM 编译器就是集成到一起的,本节主要介绍如何找到编译器路径和配置环境变量。
3 ^3 b: R7 S7 |- c# _& [进入 android 源码目录(这个目录是作者的,用户如果解压目录不一样,请注意后面的Makefile 文件以及环境变量参数也要修改)。
) U4 W1 y9 j- P 4 ?4 z: m6 G0 e/ l
如下图所示,使用命令“cd kernel”。
4 g* Z: V7 [2 Q5 J9 k- ~. o3 P$ [ 7 \$ q( Q- L1 h- j& B: Q
使用命令“cp -r config_for_iTOP4418_android_RTL8211 .config”配置内核缺省文件,然后使用命令“export ARCH=arm”将平台设置为 ARM。
0 T9 w* Y/ c7 Y, l, x最后使用命令“make menuconfig”。1 G% l, Q2 E# @' s
h" _$ N6 Z) w6 \) e7 W) M% V6 }
如下图所示,内核配置界面。
2 s/ `9 D2 {9 i4 k Z. J7 [进入“ General setup ---> ”,如下图所示。下图红色方框中的“arm-eabi-”就是我们需要的信息,内核使用的编译器是“arm-eabi-”。
; p; v5 M H/ U+ Q) h![]()
) Q0 B0 x( V' W h J; F6 x9 ]退出 menuconfig 界面,使用命令“cd ../”返回到 android 目录下,接着使用命令“find ./ -name *arm-eabi-*”查找源码中自带的编译器在那个目录下。# c- |( Q, b- k. l, ?9 G5 K/ q; }5 Z
![]()
5 Y- D$ U& w5 u2 x2 A, f如上图所示,我们找到内核使用的编译器在“prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin”目录下。大家可能很奇怪,为什么 arm 编译器要放到“prebuilts/gcc/linux-x86/”目录下,可能是三星工作人员懒得再建文件夹了吧。另外有 4.6 和 4.7 两个版本,我们
9 u2 B" [& x8 Z直接用高版本就成。; p1 h2 U" ]! I# `+ W4 e+ [
那么编译器完整的路径为“/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/”。# h7 G1 `3 t1 u w: R9 h* W
使用命令“cd”命令,接着使用命令“vim .bashrc”打开环境变量文件,如下图所示。
# D$ L* X5 O+ w6 l* ^5 _. X2 b 1 d j2 r6 s8 R8 A& U
在接着按键 Shift+g,进入环境变量文本的最底行,如下图所示。
- c6 A. Q- r5 I8 W如下所示,作者以前的编译器使用的是 arm-2009,作者这里需要注释掉。用户如果前没有设置过,则这一步可以忽略。
; w9 M7 S* M! ^1 E 0 e! B0 s/ N1 H$ [( c! ^1 H
接着添加 4418 的编译器环境变量,export PATH=$PATH:/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/
. g6 _5 t5 Y$ N+ a" R8 S/ s如下图所示。" t7 {, \# q. x; o) g
3 ^$ D/ l& a5 x" A F
保存退出,使用命令“source .bashrc”更新环境变量。控制台输入“arm”,然后按Tab 键,如下图所示。如果不出现如下界面或者仍然出现原来的编译器,可以关掉这个控制台,再开一下。
- `; U' W% m9 a. ?7 e7 | " V4 Y0 _( |0 v, [
到这一步编译器和环境变量就介绍完了。
D4 F2 F0 h; S/ v2 Makefile 和测试驱动源码以及编译
( _$ V0 h) c8 g3 M1 D" n2.1Makefile3 @' |6 r' ` l( u
Makefile 脚本文件: ~4 p9 C& A4 S: G; @" `4 B
export ARCH=arm2 }2 L" P% \9 N0 G4 g2 [
obj-m += iTOP4418_driver_hello.o% d; f Y$ C# | ~ P; }
KDIR := /home/4418/android/kernel3 N& g* [; |7 w* E- w
PWD = $(shell pwd)5 V- {- y* t5 \. z5 @& v
all:
. s/ r" d, ~1 t' [" T, D5 x: _make -C $(KDIR) M=$(PWD) modules' j6 v- K& [, V% X$ Z
clean:+ O- P/ [% B, Z* X: ]+ D" Y# ]0 a
rm -RF *.o9 E; w/ y$ m, ~& h* c
脚本中,export ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM。
9 v6 z- A0 n0 z8 dobj-m += iTOP4418_driver_hello.o 表示编译的源文件为 iTOP4418_driver_hello.c,- b) G$ |% w5 S% P
如果源文件名有变化,则需要修改成对应的。
, |- n/ L) g5 m( FKDIR 参数指向对应的内核源码目录。作者的内核源码是在. ?7 P# X r3 p" K2 I
/home/4418/android/kernel 目录下,用户要根据自己的具体情况来修改。
% ? F6 u* Y E h2.2 简单驱动源码
* s0 B; O7 B# z$ L& [驱动文件名称为:iTOP4418_driver_hello.c,源码如下: R3 K2 z! E7 L6 g
#include
[0 q# w% H% x1 |3 |; G+ ?#include
2 a1 X4 X( B/ C, u% e0 L, [3 tMODULE_LICENSE("Dual BSD/GPL");
1 ~3 o; z3 X; Z+ M; f7 o. MMODULE_AUTHOR("iTOPEET_dz");
% ?- I. a+ a% E7 S Fstatic int hello_init(void)
' Q# w+ b' K6 D/ J8 n& M{
) _( m" x. j; g) g$ Vprintk(KERN_EMERG "Hello World enter!\n"); O0 S: R3 s. F0 t" r4 d6 l
return 0;
: \! x0 W) b, g6 _: l# {9 A9 c}
! P' ]) o0 e: ostatic void hello_exit(void)
, R7 |0 V' e( U- \ r{5 W+ S- `5 i* g# a
printk(KERN_EMERG "Hello world exit!\n");8 r4 R8 a9 @$ h j
}9 U! Z5 b% O$ P* p/ d3 p0 R
module_init(hello_init);; `1 p' n0 m/ l8 u, B
module_exit(hello_exit);
, x( ]6 B; F1 B7 y% |驱动源码只有基本的入口和出口函数。加载和卸载的时候分别打印“Hello Worldenter!”和“Hello world exit!”。
# i% s# Y3 c H5 R0 `: J# `5 g2.3 编译
$ C' t# ?* y* L: Y' U$ D如下图所示,将源码拷贝到 Ubuntu 系统下。) U% R5 O/ l) c* @: i4 \
![]()
9 Q, V9 k6 v. x6 H0 G/ R5 z6 H% X使用命令“make”,如下图所示,可以看到有“iTOP4418_driver_hello.ko”文件生成。
. V1 [. @( Q/ B( |$ q - y' c& p$ R5 T9 L' O2 F3 i
3 常见问题6 C2 B% Y7 A4 f5 K
在以模块的方式编译驱动的过程中,新手可能会以下问题。4 m0 T& a! f6 i) U
1.内核源码没有编译或者内核源码路径设置不正确。9 N; B0 l" h }; s
如果内核源码没有编译,那么模块将会提示缺少库之类的错误;如果路径设置不正确,会提示找不到内核。 W W" b% r6 r
2.编译器未设置正确。
) [0 `/ m+ w& J% Z2 t3 r6 ~; |会提示找不到 arm-gcc 库之类的错误,请仔细检查编译器路径,确定在控制台输入arm+Tab 之后可以出现 arm-eabi 编译器。
5 C0 o4 n. {3 x& ?$ {( |另外部分用户可能尝试使用其它的编译器,例如 arm-2009q3,之类的,理论上很多编译器也是可以编译通过,但是不建议这么做,驱动最好和内核使用同一个编译器。
* Y* P2 u! i9 t3.源码和 Makefile 文件在 Windows 下编写,然后拷贝到 Ubuntu 上,由于编辑器不同导致转码错误。- k- q* I9 Y- t3 V6 T
这种错误比较容易解决,Make 编译之后,系统会提示 Makefile 或者驱动文件具体某一行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下再编译即可。
2 Y* U; k5 e o7 {. ^) s; H' Z; R 1 `4 }* M. |( L) u% i# _% [9 [
|
|