我们知道,在我们编写驱动时,需要用到一些函数接口,这些接口是在内核源码的头文件中定义的。我们若需要用到这些函数,就需要先对其内核源码进行编译。下面给大家讲解如何制作及编写其Makefile。
I> 内核的配置
1.我们若想要我们编译的模块能在我们的开发板上运行,这就需要先在开发板上用 uname -r 命令查看我们开发板所使用的内核。比如我的开发板使用的是2.6.30.4的内核。
2.下载内核,可以直接去kernel的官网:https://www.kernel.org/网站下载。有时有些同学进到网站后,看不到一些老旧的内核版本,下面我讲解一下如何下载以往的内核。
点击https://www.kernel.org/ ----> 点击https://www.kernel.org/pub/ ----> linux ----> kernel ----> v2.6 ----> linux-2.6.30.4.tar.gz
即可下载我们需要的内核。然后tar -zxvf linux-2.6.30.4.tar.gz即可解压得到我们需要的内核。
3.编译内核
由于我的开发板是TQ2440的,所以在编译内核之前,需要将顶层的Makefile中的ARCH改为arm,将CROSS_COMPILE 改为arm-linux- ,在这里注意,你要确保你Linux主机上已经安装了交叉编译器,并且我使用的配置脚本是s3c2410_defconfig这个脚本,在内核源码目录的arch/arm/configs/目录下可以找到对应平台的默认的配置脚本。之后我们执行 make s3c2410_defconfig即可生成一个.config配置脚本。之后再make编译。即可得到我们开发板对应的内核版本进行驱动的开发了。
注:我当时没有使用s3c2410_defconfig这个配置脚本进行配置,直接用make menuconfig打开了一下图形界面,其实也没有配置,然后到make编译的时候就出现了一些错误和警告。所以在此的建议是你们先用默认的配置文件配置一下内核,再去编译内核。
II> Makefile的编写
ifneq ($(KERNELRELEASE),)
obj-m:=led_drv.o
else
KERNELDIR:=/home/ubuntu/workdir/code/linux-2.6.30.4
PWD :=$(shell pwd)
default:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
endif
注:在Makefile中,我们只需要修改两处。
<1>obj-m这个变量是我们的驱动的名字。
<2>KERNELDIR这个变量是我存放内核源码的绝对路径。
关注我,分享好玩科技,探索未知世界