设备驱动程序

404 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情

一、什么是设备驱动程序

英文:Device Driver

简称:驱动(Driver)

一种添加到操作系统中的特殊程序,主要作用是协助操作系统完成应用程序与对应硬件设备之间数据传送的功能。 简言之,设备驱动程序就是操作系统中“驱动”对应硬件设备使之能正常工作的代码。所以说,它也是操作系统不可或缺的一部分。

注意:驱动对应外设正常工作,给上层应用提供接口函数;所以设备驱动程序是不能单独运行的,没有了它,上层应用也就无法使用了。

一个驱动程序主要完成如下工作:

  1. 初始化设备,让设备做好开始工作的准备

  2. 读数据:将设备产生的数据传递给上层应用程序

  3. 写数据:将上层应用程序交付过来的数据传递给设备

  4. 获取设备信息:协助上层应用程序获取设备的属性、状态信息

  5. 设置设备信息:让上层应用程序可以决定设备的一些工作属性、模式

  6. 其它相关操作:如休眠、唤醒、关闭设备等 其中最核心的工作就是设备数据的输入和输出,因此计算机外部设备(外设)也被称为IO设备

其中,读数据和写数据是驱动程序的核心功能,分别对应于外设的输入设备和输出设备。其中最核心的工作就是设备数据的输入和输出,因此计算机外部设备(外设)也被称为IO设备。

二、向内核添加新功能

Linux---单内核---为了扩展---内核模块形成

静态加载法(只能在同一目录下进行)

即新功能源码与内核其它代码一起编译进uImage文件内

  1. 新功能源码与Linux内核源码在同一目录结构下,在linux-3.14/driver/char/目录下编写myhello.c,文件内容如下:
#include <linux/module.h> 
#include <linux/kernel.h> 

int __init myhello_init(void) { 

printk("#####################################################\n"); 

printk("#####################################################\n"); 

printk("#####################################################\n"); 

printk("#####################################################\n"); 

printk("myhello is running\n"); 

printk("#####################################################\n"); 

printk("#####################################################\n"); 

printk("#####################################################\n"); 

printk("#####################################################\n"); 

return 0; 

} 
void __exit myhello_exit(void) 

{ 
printk("myhello will exit\n"); 
} 
MODULE_LICENSE("GPL"); 
module_init(myhello_init);
module_exit(myhello_exit);
  1. 给新功能代码配置Kconfig
#进入myhello.c的同级目录 
cd ~/fs4412/linux-3.14/drivers/char 

vim Kconfig 
#39行处添加如下内容: 
config MY_HELLO 
    tristate "This is a hello test" 
    help 
        This is a test for kernel new function
  1. 给新功能代码改写Makefile
#进入myhello.c的同级目录 
cd ~/fs4412/linux-3.14/drivers/char 
vim Makefile 
#拷贝18行,粘贴在下一行,修改成: 
obj-$(CONFIG_MY_HELLO) += myhello.o
  1. make menuconfig 界面里将新功能对应的那项选择成<*>
cd ~/fs4412/linux-3.14 
make menuconfig #make menuconfig
如果出错,一般是两个原因: 
#1. libncurses5-dev没安装 
#2. 命令行界面太小(太矮或太窄或字体太大了)
  1. make uImage

  2. cp arch/arm/boot/uImage /tftpboot

  3. 启动开发板观察串口终端中的打印信息

演示

image.png