最简单的嵌入式Linux驱动程序模块
2011-11-19 08:55
381 查看
注意:开发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
注意: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
相关文章推荐
- mini2440:最简单的嵌入式Linux驱动程序模块
- mini2440:最简单的嵌入式Linux驱动程序模块 解决找不到mini2440……sample
- mini2440:最简单的嵌入式Linux驱动程序模块
- 最简单的嵌入式Linux驱动程序模块
- Tiny6410 我的第一个嵌入式Linux驱动程序模块
- 嵌入式Linux简单字符设备驱动程序---helloworld
- linux 最简单的模块的编写和运行
- 如何在嵌入式LINUX中增加自己的设备驱动程序
- 实验题目:实现嵌入式Linux系统下的字符设备驱动程序(报告)
- linux嵌入式系统驱动程序的阻塞与异步
- 嵌入式linux驱动开发之给linux系统添加温度传感器模块
- Linux环境下最简单内核模块的实践
- 一个简单的Linux驱动程序和Makefile
- .Linux设备驱动程序学习(0)——设备驱动介绍& Hello, world!模块 内核参数传递
- linux 嵌入式驱动程序测试实例
- 嵌入式 编译简单驱动程序的几种makefile
- 嵌入式Linux系统下I2C设备驱动程序的开发
- 关于linux模块驱动简单的Makefile
- 嵌入式Linux系统下I2C设备驱动程序的开发
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结