驱动编写举例完整流程(模块化形式)
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