首先把什么是驱动程序搞清楚。
所谓驱动程序就是控制与管理硬件设备数据收发的软件,它是应用程序与硬件设备沟通的桥梁。
驱动程序大致可分为三类:
一、字符设备驱动
字符设备顾名思义就是发送和接收数据以字符的形式进行,它不经过系统的快速缓存,要负责管理自己的缓冲区结构,只支持顺序存取的有限长度I/O操作。我们一开始接触的LED灯、按键、UART等都属于字符设备。
二、块设备驱动
它是以块的方式进行I/O操作,利用一块系统内存做缓冲区,主要针对磁盘等慢速设备设计,以免耗费过多的CPU时间来等待相应。常见的包括硬盘、SD卡等。
三、网络设备
网络这块最主要是数据结构(SK_BUFF),它是通过(SK_BUFF)来实现数据的传递。
驱动程序的加载方式分两种,一是直接编译进内核,二是采用模块可动态加载,具体细节找本书看看。直接编译进内核的驱动,系统启动后可以直接调用,但这种方式的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译下载内核,效率较低。动态加载利用了LINUX的module特性,可以在系统启动后用insmod命令把驱动程序(.ko文件)添加上去,在不需要的时候用rmmod命令来卸载。在嵌入式产品里可以先用动态加载的方式来调试,调试完毕后再编译到内核里。
下面实现一个最简单的内核模块
22 static int demo_module_init(void)
23 {
24 printk("demo_module_init\n");
25 return 0;
26 }
27
28 static void demo_module_exit(void)
29 {
30 printk("demo_module_exit\n");
31 }
32
33 module_init(demo_module_init);
34 module_exit(demo_module_exit);
35
36 MODULE_DESCRIPTION("drives_example");
37 MODULE_LICENSE("GPL");
Makefile文件,该文件具有通用性,可作为模板
1 ARCH = arm
2 CROSS_COMPILE = arm-linux-
3
4 obj-m := printk_example.o
5 KDIR := /opt/linux-2.6.38 //内核存放路径
6 PWD := $(shell pwd)
7
8 modules:
9 $(MAKE) -C $(KDIR) M=$(PWD) modules
10 clean:
11 $(MAKE) -C $(KDIR) M=$(PWD) clean
运行的shell程序、
1 #!/bin/sh
2
3 cd /home/plg
4 echo "insmod printk_drive.ko"
5 chmod +x printk_example.ko
6 insmod printk_example.ko