EDA365电子论坛网
标题:
迅为4418开发板-驱动-以模块的方式编译内核驱动
[打印本页]
作者:
孤久厌闹
时间:
2020-11-19 10:47
标题:
迅为4418开发板-驱动-以模块的方式编译内核驱动
内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以模块的方式编译内核驱动。
M" P; C7 g- j3 r
要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章。
" ~2 b b* S+ s. f4 ?% _
1.4418 内核编译器的查询和环境变量设置
; Y* M% ?* k2 i! o8 p4 y
在开发中,大家会遇到源码和编译器集成到一起的情况。迅为的 4418 源码和 arm 编译器就是集成到一起的,本节主要介绍如何找到编译器路径和配置环境变量。
6 S/ j B7 X% Z! E' H9 n! N: C
进入 android 源码目录(这个目录是作者的,用户如果解压目录不一样,请注意后面的Makefile 文件以及环境变量参数也要修改)。
# M8 n1 t4 U+ R8 Q6 U
- @2 D3 j9 `* t" A
如下图所示,使用命令“cd kernel”。
; [. t' X% M5 N5 K% P
( X8 I. Z4 R2 K1 T( E' w- ^
使用命令“cp -r config_for_iTOP4418_android_RTL8211 .config”配置内核缺省文件,然后使用命令“export ARCH=arm”将平台设置为
ARM
。
0 t' ?9 r0 K7 O% x; l! n' B+ P
最后使用命令“make menuconfig”。
4 W3 T% b' M( q# _
8 [" U8 M, u; W; `
如下图所示,内核配置界面。
5 y+ p" P% L, H3 o+ g3 g' Z
进入“ General setup ---> ”,如下图所示。下图红色方框中的“arm-eabi-”就是我们需要的信息,内核使用的编译器是“arm-eabi-”。
3 g$ \: ] I2 a! |8 ?
7 \! ^# ]8 n" v: B3 R3 g# K' C
退出 menuconfig 界面,使用命令“cd ../”返回到 android 目录下,接着使用命令“find ./ -name *arm-eabi-*”查找源码中自带的编译器在那个目录下。
7 l3 ^5 W6 p8 m6 x9 z6 ]* d" f" @
- c+ B: O8 h! D) V2 W6 U1 m
如上图所示,我们找到内核使用的编译器在“prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin”目录下。大家可能很奇怪,为什么 arm 编译器要放到“prebuilts/gcc/linux-x86/”目录下,可能是三星工作人员懒得再建文件夹了吧。另外有 4.6 和 4.7 两个版本,我们
- G) i8 Z5 U/ p V4 w3 ], r2 i6 J
直接用高版本就成。
7 j1 P- y9 _! ?- ]/ \
那么编译器完整的路径为“/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/”。
! w+ j8 \% _( m/ W4 h
使用命令“cd”命令,接着使用命令“vim .bashrc”打开环境变量文件,如下图所示。
; B& R# L, ?. \& k& L! O
- X. A/ ~6 Q( j$ [
在接着按键 Shift+g,进入环境变量文本的最底行,如下图所示。
) ~& y: L- Z/ E( u/ O, Q
如下所示,作者以前的编译器使用的是 arm-2009,作者这里需要注释掉。用户如果前没有设置过,则这一步可以忽略。
/ R0 s y3 G# s( Z
7 Z1 L5 J" g5 K
接着添加 4418 的编译器环境变量,export PATH=$PATH:/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/
" Q, q( X6 U* n I# ~
如下图所示。
) u \5 r% R! ], a+ C/ d
5 V+ c" h& F D2 ]$ f) Y# G
保存退出,使用命令“source .bashrc”更新环境变量。控制台输入“arm”,然后按Tab 键,如下图所示。如果不出现如下界面或者仍然出现原来的编译器,可以关掉这个控制台,再开一下。
( ?+ s4 c# u' L0 K5 ?* D: a- Z
( m/ I1 d6 `+ W- ~6 C# L
到这一步编译器和环境变量就介绍完了。
7 n0 f% F+ |3 X- f
2 Makefile 和测试驱动源码以及编译
! Q, z# U* C& T' {; ?
2.1Makefile
! @' S7 {; q- v" _/ M% v
Makefile 脚本文件:
' ~ N* w; ?) h8 p" r
export ARCH=arm
# m, w! z# ~' r
obj-m += iTOP4418_driver_hello.o
! a9 H. C! W8 Q) y s8 |8 Q' V
KDIR := /home/4418/android/kernel
' p. U" v* w7 J" ^5 g
PWD = $(shell pwd)
. C+ P) O. g. S' G
all:
3 R. \; J+ m$ x9 v! O, ]
make -C $(KDIR) M=$(PWD) modules
5 \3 ?% m3 E9 k
clean:
/ Z4 K5 F5 w+ c& D, X6 H
rm -rf *.o
( x7 F6 I- b( H! N% ?1 J. L2 T1 c5 F
脚本中,export ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM。
% i A8 k h8 n+ [
obj-m += iTOP4418_driver_hello.o 表示编译的源文件为 iTOP4418_driver_hello.c,
' z& t1 B* h- ?/ @' |) Z5 ?
如果源文件名有变化,则需要修改成对应的。
! U7 W7 s: A5 }. y
KDIR 参数指向对应的内核源码目录。作者的内核源码是在
5 r. f' b6 j2 Z _* q z* i8 l
/home/4418/android/kernel 目录下,用户要根据自己的具体情况来修改。
, L. g) {; H: |5 V% P
2.2 简单驱动源码
4 u$ N8 h3 U% T) }
驱动文件名称为:iTOP4418_driver_hello.c,源码如下:
C1 [; l7 F8 R8 k% a* ^
#include
5 T8 v9 {7 Z5 i+ k. e
#include
: k- }1 F* g- G& G: d
MODULE_LICENSE("Dual BSD/GPL");
* j3 B0 b3 s: O& I( o
MODULE_AUTHOR("iTOPEET_dz");
$ D; X" }+ I2 x/ z" ]! v
static int hello_init(void)
4 t9 h5 N% r; H/ ` u- e, o
{
" q( }# q+ M" J1 o" b" M
printk(KERN_EMERG "Hello World enter!\n");
5 C% U) L: U( X6 K5 v; T- u/ ]/ n
return 0;
% i/ V1 C6 [% b7 n; T
}
6 [: L6 [2 ~0 J! M+ U
static void hello_exit(void)
: r9 A4 h7 r% N# X
{
, g. ^( N6 L9 q, J
printk(KERN_EMERG "Hello world exit!\n");
$ s# J" D g) t' v
}
# T+ N9 m% f7 d2 V# T8 d k$ f7 W
module_init(hello_init);
7 z0 k' b8 N' m$ n
module_exit(hello_exit);
2 H4 q# Y7 g! Q9 }- K
驱动源码只有基本的入口和出口函数。加载和卸载的时候分别打印“Hello Worldenter!”和“Hello world exit!”。
( X( D9 K J& K; p( _( |) S! @
2.3 编译
/ B0 E n: D9 \
如下图所示,将源码拷贝到
Ubuntu
系统下。
. N) p# _: Q- B, E% F
: I, {7 q+ K4 `" {( \
使用命令“make”,如下图所示,可以看到有“iTOP4418_driver_hello.ko”文件生成。
8 l/ [. u# M% p) U, s3 }
7 C4 A6 B' u; d0 Y7 I A
3 常见问题
/ M3 I) `9 w! _3 X" |7 O# W5 K
在以模块的方式编译驱动的过程中,新手可能会以下问题。
, q# O5 W2 v: u& H1 j8 }( F
1.内核源码没有编译或者内核源码路径设置不正确。
+ T |# L: T: ` O8 A0 V
如果内核源码没有编译,那么模块将会提示缺少库之类的错误;如果路径设置不正确,会提示找不到内核。
% v4 U1 h' {! q2 n# `) v
2.编译器未设置正确。
7 u" j9 m1 f# t8 i1 N7 X/ ?
会提示找不到 arm-gcc 库之类的错误,请仔细检查编译器路径,确定在控制台输入arm+Tab 之后可以出现 arm-eabi 编译器。
" t6 T! Z- p# M( X. l$ H) j
另外部分用户可能尝试使用其它的编译器,例如 arm-2009q3,之类的,理论上很多编译器也是可以编译通过,但是不建议这么做,驱动最好和内核使用同一个编译器。
! |" K8 F+ @; N/ a& @. F
3.源码和 Makefile 文件在 Windows 下编写,然后拷贝到 Ubuntu 上,由于编辑器不同导致转码错误。
# a; e! B) w& g
这种错误比较容易解决,Make 编译之后,系统会提示 Makefile 或者驱动文件具体某一行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下再编译即可。
4 k5 z, p: y2 X0 o
' q; c, {7 C4 j! C) J7 ~
作者:
ESCAPE
时间:
2020-11-19 16:00
谢谢诶分享
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2