Chinaunix首页 | 论坛 | 博客
  • 博客访问: 669615
  • 博文数量: 183
  • 博客积分: 9166
  • 博客等级: 中将
  • 技术积分: 1920
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-31 16:17
文章分类

全部博文(183)

文章存档

2010年(159)

2009年(24)

分类: 嵌入式

2010-05-27 15:49:39

 

1.Linux驱动程序编写基本流程:

1.首先是一些版本信息,没什么用,但是不能少

#define __NO_VERSION__

#include

#include

char kernel_version[] = UTS_RELEASE;

2.为了把系统调用和驱动程序关联起来,需要一个非常关键的数据结构:struct file_operations

file_operations结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是linux的设备驱动程序工作的基本原理。编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域

3.简单驱动程序的编写(test.c):

a.包含一些基本的头文件。

b.编写一些功能函数,比如read()write()等。这些函数被调用时系统进入和心态。

c.定义struct file_operations结构的对象,填充结构体。结构体中功能的顺序不能改变,若一些功能没有实现就用NULL填充,已经实现的功能如read()write()分别添加到对应的位置。这步实现的是函数的注册。到这里驱动程序的主体可以说是写好了。现在需要把驱动程序嵌入内核。

d.注册设备驱动程序,使用register_chrdev注册字符型设备。函数原型为:

int register_chrdev(0, test_name, &test_file_operations)

函数返回主设备号,若注册成功返回值大于0

第一个参数:主设备号。第二个参数:注册的设备名。第三个参数:结构体名(设备相关操作方式,驱动程序实际执行操作的函数的指针)。

这个函数由int init_module(void)函数调用,这个函数在系统启动时注册到内核时调用。

e.在用rmmod卸载模块时,cleanup_module函数被调用,它释放字符设备test在系统字符设备表中占有的表项。

void cleanup_module(void)

{

unregister_chrdev(test_major, test);

}

到这里test.c基本就编写完成了。一个简单的字符设备可以说写好了。

4.编译

$ gcc -O2 -DMODULE -D__KERNEL__ -c test.o test.c

得到文件test.o就是一个设备驱动程序。

如果设备驱动程序有多个文件,把每个文件按上面的命令行编译,然后

ld -r file1.o file2.o -o modulename

驱动程序已经编译好了,现在把它安装到系统中去。

$ insmod -f test.o

安装成功在/proc/devices文件中就可以看到设备test,并可以看到主设备号。要卸载运行:

$ rmmod test

5.创建设备节点

mkmod /dev/test c major minor

c是指字符设备,major是主设备号,minor是从设备号,一般可以设置为0

阅读(2045) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~