(三)补充1:简单字符设备的驱动开发

Ø设备驱动简单介绍

ØLinux的“模块”特性

Ø文件系统与设备的联系

Ø设备驱动的开发实例

设备驱动简单介绍 

 驱动的分类

 驱动的“两种”加载方式

Ø静态加载

ü把驱动程序直接编译进内核,系统启动后可以直接调用。

ü缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低。

Ø动态加载

ü动态加载利用了Linuxmodule特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块。

ü采用这种动态加载的方式便于驱动程序的调试,便于内核裁剪,可将不需要的驱动去除,大大减小了内核的存储容量。

ØLinux的“模块”特性 

 Linux内核“模块”

Ø模块特点

ü模块本身不被编译入内核映像,从而控制了内核大小。

ü模块一旦被加载,就和内核中的其他部分完全一样。

Ø模块程序结构

ü模块加载函数

ü模块卸载函数

ü模块许可声明

ü模块参数(可选)

ü模块导出函数(可选)

ü模块作者等描述信息(可选)

 最简单的内核模块“Hello World

Ø文件系统与设备的联系 

 文件系统与设备驱动

 

 sysfs文件系统与设备驱动模型

Øsysfs文件系统

ü是一个虚拟的文件系统

üproc文件系统相似,属同一级

ü它把连接在系统上的设备和总线组织成一个分级的文件,可以由用户空间存取,向用户空间导出内核数据结构以及它们的属性

ü目的就是展示设备驱动模型中各组件的层级关系

Ø设备驱动模型

ü可自动创建设备文件

ü提供统一的电源管理机制

ü提供各种对象实例的引用计数,防止对象被应用层误

ü设备驱动模型侧重于内核对总线、设备和驱动的管理,并向应用层暴露这些管理的信息

 sysfs文件夹目录

 设备驱动模型

 Ø设备驱动的开发实例

platform设备驱动与字符设备驱动

platform设备驱动中的“platform”是指“平台总线”,是众多总线中的一种,为一种虚拟的总线。有些设备是直接取址访问的,这种类型的设备就“挂载”到该“platform总线”上。platform设备驱动相当于设备驱动模型的一个子集。

  platform驱动的开发流程不同于字符设备,需要将init函数的实现搬到platform_driverprobe接口中,然后在init中调用platform_device_registerplatform_driver_register分别注册设备和驱动。

字符设备驱动开发流程 

Ø定义struct file_opertions my_fops并实现其中的各个接口,如openreadwriteioctl等接口

Ø实现驱动的入口函数,如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,安装模块

 

 

猜你喜欢

转载自blog.csdn.net/qq_34863439/article/details/88365910
今日推荐