首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

驱动编撰举例完整流程(模块化形式)

2013-02-24 
驱动编写举例完整流程(模块化形式)1.编写驱动程序(hello.c),并且把驱动程序放在linux-2.6.38/drivers/char

驱动编写举例完整流程(模块化形式)

1.编写驱动程序(hello.c),并且把驱动程序放在linux-2.6.38/drivers/char下。

#include<linux/module.h>

#include<linux/init.h>

static int __init hello_init(void)

{

printk(KERN_ALERT"hello world\n");

return0;

}

static void __exit hello_exit(void)

{

printk(KERN_ALERT"good bye,world\n");

}

module_init(hello_init);

module_exit(hello_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("BQL");

2.把hello加入内核代码树,并编译

Step1:编辑配置文件Kconfig,加入驱动选项,使之在makemenuconfig的时候出现

打开linux-2.6.38/drivers/char/Kconfig文件,添加如下所示:


config HELLO_WORLD_MODULE

tristate"This is an example of hello world "

depends  on CPU_S3C6410

defaulty

help

This is an example of hello world

保存退出,这时在linux-2.6.38目录位置运行一下make menuconfig就可以在 Device

Drivers---> Character devices菜单中看到刚才所添加的选项了,按下空格键将会选择为<M>,

此意为要把该选项编译为模块方式;再按下空格会变为<*>,意为要把该选项编译到内核中,在此选择<M>表示模块形式加载驱动。


Step2:通过上一步,虽然可以在配置内核的时候进行选择,但实际上此时执行编译内核还是不能hello.c编译进去的,还需要在Makefile中把内核配置,选项和真正的源代码联系起来,

打开linux-2.6.38/drivers/char/Makefile,

如下添加并保存退出:


obj-$(CONFIG_HELLO_WORLD_MODULE)+=hello.o


Step3:这时回到linux-2.6.38源代码根目录位置,执行makemodules,就可以生成所需要的内核模块文件hello.ko了,注意:执行makemodules之前,必须先执行makezImage,只需一次就可以了。至此,已经完成了模块驱动的编译。

3.把Hello下载到开发板并安装使用

在此使用 ftp命令把编译出的hello.ko下载到板子中,并把它移动

到/lib/modules/2.6.38-FriendlyARM目录然后在板子中现在执行

#modprobe hello

可以看到该模块已经被装载了(注意:使用modprobe命令加载模块不需要加“ko”尾

缀)

再执行以下命令,可以看到该模块被卸载

#rmmod hello

注 意 :要 能 够 正 常 卸 载 模 块,必 须 把 模 块 放 入 开 发 板 的

/lib/modules/2.6.38-FriendlyARM目录

另外需要注意的是:因为内核有时会升级更新,如果内核版本已经改变,请依

照具体的内核版本重新建立一个模块存放目录,在此为/lib/modules/2.6.38-FriendlyARM


热点排行