注意:開發Arm平台的驅動,需要Arm平台的源碼樹;
注意:ARM平台的linux核心源碼需要先編譯,否則無法編譯驅動;
一、第一種編譯驅動方式,共6步
第1步:建立源碼樹
解壓安裝Linux 核心原始碼在工作目錄/opt/FriendlyARM/mini2440 中執行:
#cd /opt/FriendlyARM/mini2440
#tar xvzf /tmp/linux/linux-2.6.32.2-mini2440-20100106.tar.gz
將建立產生linux-2.6.32.2 目錄,裡麵包含了完整的Linux-2.6.32.2 核心原始碼說明:20100106 是我們的發行更新日期標誌,請以光碟片中實際日期尾綴為準。
第2步:編輯驅動源檔案mini2440_hello_module.c
該檔案所在目錄:/opt/FriendlyARM/mini2440/linux-2.6.32.2/drivers/char/
*********************************************************************************************
#include <linux/kernel.h>
#include <linux/module.h>
static int __init mini2440_hello_module_init(void)
{
printk("Hello, Mini2440 module is installed !\n");
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good-bye, Mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
*********************************************************************************************
第3步:編輯設定檔linux-2.6.32.2/drivers/char/Kconfig
增加如下欄位,:
儲存退出,這時在linux-2.6.32.2目錄“/opt/FriendlyARM/mini2440/linux-2.6.32.2"位置運行一下
#cp config_mini2440_t35 .config ;t35後面有個空格,然後有個“.”開頭的config
#make menuconfig
就可以在Device Drivers---> Character devices 菜單中看到剛才所添加的選項了,按下空格鍵將會選擇為<M>,此意為要把該選項編譯為模組方式;再按下空格會變為<*>,意為要把該選項編譯到核心中,在此我們選擇<M>,
第4步:編輯linux-2.6.32.2/drivers/char/Makefile
通過上一步,我們雖然可以在配置核心的時候進行選擇,但實際上此時執行編譯核心還是不能把mini2440_hello_module.c 編譯進去的,還需要在Makefile 中把核心配置選項和真正的原始碼聯絡起來,開啟 linux-2.6.32.2/drivers/char/Makefile,添加並儲存退出:
第5步:編譯驅動模組
這時回到linux-2.6.32.2 原始碼根目錄位置/opt/FriendlyARM/mini2440/linux-2.6.32.2
#make modules
就可以產生我們所需要的核心模組檔案mini2440_hello_module.ko 了,
至此,我們已經完成了模組驅動的編譯。
第6步:載入驅動模組
將把編譯出的mini2440_hello_module.ko下載到板子中,並把它移動到/lib/modules/2.6.29.4-FriendlyARM目錄,然後在板子中現在執行
#modprobe mini2440_hello_module
可以看到該模組已經被裝載了(注意:使用modprobe 命令載入模組不需要加“ko”尾綴),再執行以下命令,可以看到該模組被卸載
#rmmod mini2440_hello_module
注意:要能夠正常卸載模組,必須把模組放入開發板的/lib/modules/2.6.29.4-FriendlyARM 目錄
注意:核心有時會升級更新,如果核心版本已經改變,請依照具體的核心版本重建立立一個模組存放目錄,在此為/lib/modules/2.6.29.4-FriendlyARM。
二、第二種編譯驅動方式
核驅動模組的結構hello.c
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_ALERT "Hello, World!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
源檔案hello.c同目錄下一個簡單的Makefile檔案:
KERNELDIR = /opt/FriendlyARM/mini2440/linux-2.6.32.2
PWD := $(shell
pwd)
INSTALLDIR =
/lib/modules/2.6.29.4-FriendlyARM
CROSS_COMPILE =
arm-linux-
CC = $(CROSS_COMPILE)gcc
obj-m := hello.o
.PHONY: modules modules_install clean
modules:
$(MAKE) -C
$(KERNELDIR) M=$(PWD) modules
modules_install:
cp hello.ko $(INSTALLDIR)
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions