编写 Hello world 模块驱动
华清远见-嵌入式领域著名讲师 O(∩_∩)O 牛牛猛
点击链接加我好友!
http://student.csdn.net/invite.php?u=111047&c=758a60d66d3a92d1
欢迎大家去我CSDN博客上踩踩
我的个人主页
晚上没事,同学邀我写个模块的实验手册,拿出来和大家分享一下
(1) 模块动态加载驱动方式
在内核源码的“drivers/char/”目录下新建一个名为“hello .c”的文件,内容如下:
#include #include #include
MODULE_LICENSE ("GPL");
static int __init hello_init (void) { printk (KERN_INFO "Hello world/n"); return 0; }
static void __exit hello_exit (void) { printk (KERN_INFO "Goodbye world/n"); }
module_init (hello_init); module_exit (hello_exit); |
修改Makefile里面的内核源码包的路径,这里我们必须用到一个已经编译好的内核的源码
这里我们用了
KERNELDIR ?= /mnt/mengyang/source/kernel/linux-2.6.33
根据自己的实际情况修改,一定确保你的内核可以编译通过,内核可以正常运行!
在命令行里运行make命令,顺利的会生成*.ko文件。将*.ko文件复制到nfs目录,或是其他的存储设备。
在命令行里运行插入模块的命令
ismod *.ko
顺利的可以看到init函数将会被调用。
同样,运行
rmmod *.ko
顺利的可以看到clean函数被执行了。
执行上面命令时,可能报错误rmmod: chdir(2.6.33.2-TE2440): No such file or directory
这是由于busybox 1.13.1导致的,,原来是现在的内核模块在插入卸载时都会要转到/lib/modules/内核版本号/ 这个目录里。 所以只要建立这个目录并且把要使用的模块*.ko文件复制到这个目录就行了。
(2)静态的加载驱动
在内核源码中添加对hello 驱动的支持
修改drivers/char/目录下的“Kconfig”文件,在7 行添加如下内容:(红色部分所示)
#
# Character device configuration
#
menu "Character devices"
config CCTE_HELLO
tristate "CCTE2440 Hello Driver"
depends on ARCH_S3C2440
help
CCTE2440 Hello.
修改同目录下的“Makefile”文件,在合适的行添加如下内容:
#
# Makefile for the kernel character device drivers.
#
#
# This file contains the font map for the default (hardware) font
#
obj-$(CONFIG_ CCTE_HELLO) += hello.o
配置内核
然后输入:#make menuconfig,然后配置如下:
Device Drivers --->
Character devices --->
<*> CCTE2440 Hello Driver
将其选择为“M”(模块),然后保存配置,编译出内核镜像烧写到开发板中。或是下载到开发板上运行。