万能的helloworld适用于任何场面。fl2440的驱动也不列外。废话不多说,直接上代码:
#include<linux/init.h> #include<linux/kernel.h> #include<linux/module.h> #define MOD_AUTHOR "TangBin<[email protected]>" #define MOD_DESC "hello,world!" static int __init hello_init(void) { printk("hello,world!\n"); printk("This is my first driver program.\n"); return 0; } static void __exit hello_exit(void) { printk("Bye!\n"); return; } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR(MOD_AUTHOR); MODULE_DESCRIPTION(MOD_DESC); MODULE_LICENSE("GPL");
这是一个简单的c程序代码,但是要怎样才能让代码在开发板上跑起来呢。
首先,这是要编译成一个模块,模块是可以在内核空间工作的,与我们在用户空间的应用程序是有很大不同的。内核就是一个大的、独立的程序,为了将它的各个片断放在一起,要满足很多详细、明确的要求。
为了将这个.c文件编译成.ko模块并加载到内核中运行,我们需要制作一个Makefile来制定一些规则。 代码如下:
LINUX_SRC ?= ../linux/linux-3.0 CROSS_COMPILE=/opt/xtools/arm920t/bin/arm-arm920t-linux-gnueabi- obj-m := s3c_hello.o modules: ? ? @make -C $(LINUX_SRC) M=`pwd` modules ? ? ? @make clean clean: ? ? rm -f *.ko.* *.o *mod.c *.order *.symvers
注意:
1、Linux驱动Makefile里指定的内核源码路径必须是当前开发板正在运行的内核源码。(LINUX_SRC)
2、指定好交叉编译器的路径。(CROSS_COMPILE)
3、obj-m := s3c_hello.o 说明有一个模块要从目标文件s3c_hello.o中构造从而该目标文件中构造的模块名称为s3c_hello.ko。
4、M=选项让Makefile在构造modules目标之前返回到模块源代码目录。modules目标指向obj-m变量中设定的模块。
5、clean 将一些中间文件删除,因为不是必须的。