Ø设备驱动简单介绍
ØLinux的“模块”特性
Ø文件系统与设备的联系
Ø设备驱动的开发实例
设备驱动简单介绍
驱动的分类
驱动的“两种”加载方式
Ø静态加载
ü把驱动程序直接编译进内核,系统启动后可以直接调用。
ü缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低。
Ø动态加载
ü动态加载利用了Linux的module特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块。
ü采用这种动态加载的方式便于驱动程序的调试,便于内核裁剪,可将不需要的驱动去除,大大减小了内核的存储容量。
ØLinux的“模块”特性
Linux内核“模块”
Ø模块特点
ü模块本身不被编译入内核映像,从而控制了内核大小。
ü模块一旦被加载,就和内核中的其他部分完全一样。
Ø模块程序结构
ü模块加载函数
ü模块卸载函数
ü模块许可声明
ü模块参数(可选)
ü模块导出函数(可选)
ü模块作者等描述信息(可选)
最简单的内核模块“Hello World”
Ø文件系统与设备的联系
文件系统与设备驱动
sysfs文件系统与设备驱动模型
Øsysfs文件系统
ü是一个虚拟的文件系统
ü与proc文件系统相似,属同一级
ü它把连接在系统上的设备和总线组织成一个分级的文件,可以由用户空间存取,向用户空间导出内核数据结构以及它们的属性
ü其目的就是展示设备驱动模型中各组件的层级关系
Ø设备驱动模型
ü可自动创建设备文件
ü提供统一的电源管理机制
ü提供各种对象实例的引用计数,防止对象被应用层误删
ü设备驱动模型侧重于内核对总线、设备和驱动的管理,并向应用层暴露这些管理的信息
sysfs文件夹目录
设备驱动模型
Ø设备驱动的开发实例
platform设备驱动与字符设备驱动
platform设备驱动中的“platform”是指“平台总线”,是众多总线中的一种,为一种虚拟的总线。有些设备是直接取址访问的,这种类型的设备就“挂载”到该“platform总线”上。platform设备驱动相当于设备驱动模型的一个子集。
platform驱动的开发流程不同于字符设备,需要将init函数的实现搬到platform_driver的probe接口中,然后在init中调用platform_device_register和platform_driver_register分别注册设备和驱动。
字符设备驱动开发流程
Ø定义struct file_opertions my_fops并实现其中的各个接口,如open、read、write、ioctl等接口。
Ø实现驱动的入口函数,如chardev_init
static int __init chardev_init(void){
alloc_chrdev_region(&devno,…);//申请设备号
my_cdev=cdev_alloc();
cdev_init(my_cdev,&my_fops);
cdev_add(my_fops,devno, 1);//注册设备号和file_opertions
}
Ømodule_init(chardev_init);//宏定义该初始化入口函数。(卸载省略)
Øinsmod加载这个module后,可以人工在shell命令行利用mknod创建设备文件。
Ø应用层即可以用open来打开设备文件来进行访问了。
虚拟的字符设备并不需要挂载到总线上,为了体现设备、驱动、总线的关系,需要将虚拟的字符设备挂载到platform总线上。
步骤如下:
编写c文件
编写Makefile文件
执行make,进行编译
执行insmod,安装模块