驱动开发(一)

linux设备驱动程序模型 

首先把什么是驱动程序搞清楚。

所谓驱动程序就是控制与管理硬件设备数据收发的软件,它是应用程序与硬件设备沟通的桥梁。

驱动程序大致可分为三类:

一、字符设备驱动

字符设备顾名思义就是发送和接收数据以字符的形式进行,它不经过系统的快速缓存,要负责管理自己的缓冲区结构,只支持顺序存取的有限长度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
  



你可能感兴趣的:(Linux驱动开发)