|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以模块的方式编译内核驱动。
( ]6 M' [$ e5 c7 C1 k/ Y' k要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章。: r$ A' N1 h% y) q; S
1.4418 内核编译器的查询和环境变量设置
3 E" V9 V; o$ J. t在开发中,大家会遇到源码和编译器集成到一起的情况。迅为的 4418 源码和 ARM 编译器就是集成到一起的,本节主要介绍如何找到编译器路径和配置环境变量。
% ]+ F' b6 @6 K进入 android 源码目录(这个目录是作者的,用户如果解压目录不一样,请注意后面的Makefile 文件以及环境变量参数也要修改)。
/ R H Q1 ~% J2 I% l![]()
$ N! {6 }% }; X如下图所示,使用命令“cd kernel”。
6 o9 L- D" }9 q ) H1 F. q0 u: B0 P( |7 o, N
使用命令“cp -r config_for_iTOP4418_android_RTL8211 .config”配置内核缺省文件,然后使用命令“export ARCH=arm”将平台设置为 ARM。
% C$ k u4 t1 ^最后使用命令“make menuconfig”。) T: k \9 ]& u4 N; I
' Z* R9 Q) ^' a
如下图所示,内核配置界面。/ r* ~ j& Y; j& Q1 U
进入“ General setup ---> ”,如下图所示。下图红色方框中的“arm-eabi-”就是我们需要的信息,内核使用的编译器是“arm-eabi-”。: u8 n2 t( q2 }% k1 o7 [* r, p
![]()
! L* l$ C- c0 o( n( ?) ~4 M退出 menuconfig 界面,使用命令“cd ../”返回到 android 目录下,接着使用命令“find ./ -name *arm-eabi-*”查找源码中自带的编译器在那个目录下。
7 q/ C6 x/ \6 H) W ( ` s- y) X6 J. K* q: o$ d
如上图所示,我们找到内核使用的编译器在“prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin”目录下。大家可能很奇怪,为什么 arm 编译器要放到“prebuilts/gcc/linux-x86/”目录下,可能是三星工作人员懒得再建文件夹了吧。另外有 4.6 和 4.7 两个版本,我们
! ?; d; i4 D4 {5 |1 n- k# f直接用高版本就成。3 |& X# r) {! r9 _8 e( `8 m
那么编译器完整的路径为“/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/”。# T6 Y3 z& E% o; J8 E+ \
使用命令“cd”命令,接着使用命令“vim .bashrc”打开环境变量文件,如下图所示。
4 M7 K2 |9 b `+ @7 { 6 u' `) o3 B4 y. M, y0 h% q) p; s
在接着按键 Shift+g,进入环境变量文本的最底行,如下图所示。6 P7 O H% A$ |7 X" e, ~& D2 V9 u
如下所示,作者以前的编译器使用的是 arm-2009,作者这里需要注释掉。用户如果前没有设置过,则这一步可以忽略。
5 i% _ e& {4 \![]()
: s$ C0 z) r& m( ]接着添加 4418 的编译器环境变量,export PATH=$PATH:/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/
: U7 }. \! x$ j- A- _) Y; U如下图所示。 D- e. G' f1 T$ k
1 l- ~+ a$ u$ \( F* w3 T
保存退出,使用命令“source .bashrc”更新环境变量。控制台输入“arm”,然后按Tab 键,如下图所示。如果不出现如下界面或者仍然出现原来的编译器,可以关掉这个控制台,再开一下。
9 u1 }( q, F0 C3 N4 \# b! J " Q+ ^( k4 p# p
到这一步编译器和环境变量就介绍完了。
- P$ Y6 j# m$ T# o2 Makefile 和测试驱动源码以及编译1 A k8 H* E7 G2 r0 b7 O1 @+ y
2.1Makefile
3 W9 F b% i2 iMakefile 脚本文件:9 b; Y5 N% x1 q* H
export ARCH=arm
9 l( O0 o. W# s: T7 ]3 Bobj-m += iTOP4418_driver_hello.o0 I9 |2 D* v$ r, w l. q
KDIR := /home/4418/android/kernel
5 [5 S" \4 s% e4 Q, d0 L2 DPWD = $(shell pwd); t& Y: n9 z( f! R' q7 C
all:4 O+ O' f% B8 P2 N R: ^
make -C $(KDIR) M=$(PWD) modules) J# O6 H( z5 s: E0 D8 `% E1 A( ?
clean:
. X! Q- T+ X% j0 b) ?rm -RF *.o
?* _- v! R1 [脚本中,export ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM。
7 \: ?5 }, d! @5 q/ r" ]3 v/ Dobj-m += iTOP4418_driver_hello.o 表示编译的源文件为 iTOP4418_driver_hello.c,
5 h7 {7 U+ G2 j0 T& n' v如果源文件名有变化,则需要修改成对应的。
4 w+ l, B! o# I) b* H, AKDIR 参数指向对应的内核源码目录。作者的内核源码是在
5 `1 e2 J6 X+ ^( U+ ?+ \* B, v/ P/home/4418/android/kernel 目录下,用户要根据自己的具体情况来修改。
! H' k3 y5 Q3 v, w$ d a, _) q2.2 简单驱动源码
, e$ S4 \3 P6 n& E& r) ]/ H驱动文件名称为:iTOP4418_driver_hello.c,源码如下:
: s- c- F( z& s#include, {2 J0 N0 j# e
#include
, F/ \6 [* L! @MODULE_LICENSE("Dual BSD/GPL");
[9 t6 G* U b* H! ?& E+ J1 TMODULE_AUTHOR("iTOPEET_dz");( \# j1 I9 _0 E& U+ P2 ]/ {, f
static int hello_init(void)! d( M' T' d/ d# p
{ }0 s/ h5 ?+ Z4 K/ K' O/ Z) ?
printk(KERN_EMERG "Hello World enter!\n");8 p5 a9 d# [ ]4 H$ h6 z- r
return 0;: h) v" L5 L! J9 a% T, t s" [4 [
}
' t* o( Q4 X) r) P9 g) [. z( T) ostatic void hello_exit(void)* T/ p5 W6 L: n
{
" U" k- I: K' ?8 Qprintk(KERN_EMERG "Hello world exit!\n");/ D# [* Z3 e: a( }) O: n
}# `! j+ r1 D+ W1 Y9 k
module_init(hello_init);/ V! {6 `) o6 R% @4 C& u& q
module_exit(hello_exit);
S/ p( A+ t4 R& D% D驱动源码只有基本的入口和出口函数。加载和卸载的时候分别打印“Hello Worldenter!”和“Hello world exit!”。
% R5 R, h8 a. v z2.3 编译
& T+ ^# f) t4 `/ B6 x7 E4 u# m如下图所示,将源码拷贝到 Ubuntu 系统下。0 o" l' }+ `2 ?$ R
8 R0 L4 d) v, V. _4 z9 \
使用命令“make”,如下图所示,可以看到有“iTOP4418_driver_hello.ko”文件生成。
" T- ~7 t; }* t- _9 D4 c( W![]()
# U* s5 q, j9 C, U) k3 常见问题, `: d3 j8 R9 k6 r
在以模块的方式编译驱动的过程中,新手可能会以下问题。
% X2 ?, Y& T1 b8 M% U! V6 }8 `1.内核源码没有编译或者内核源码路径设置不正确。2 x7 c7 B0 M) l3 w2 \
如果内核源码没有编译,那么模块将会提示缺少库之类的错误;如果路径设置不正确,会提示找不到内核。; F$ l; W: `3 e! k; z; @' {
2.编译器未设置正确。! w2 T: G% s, w, `( S2 H
会提示找不到 arm-gcc 库之类的错误,请仔细检查编译器路径,确定在控制台输入arm+Tab 之后可以出现 arm-eabi 编译器。+ a% a# o, j) m4 k# b& E
另外部分用户可能尝试使用其它的编译器,例如 arm-2009q3,之类的,理论上很多编译器也是可以编译通过,但是不建议这么做,驱动最好和内核使用同一个编译器。
3 D8 _' G; l& W9 @+ ~3.源码和 Makefile 文件在 Windows 下编写,然后拷贝到 Ubuntu 上,由于编辑器不同导致转码错误。- g- a* l) p/ _7 i' c* x
这种错误比较容易解决,Make 编译之后,系统会提示 Makefile 或者驱动文件具体某一行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下再编译即可。
# \) n' s; s7 B8 Y: t1 X& E + c% m! p; n" o: f# S
|
|