基本驱动模型

应用程序使用驱动:

一个设备驱动其实就是一个内核模块。

应用程序使用一个字符设备是通过使用其设备文件来完成的,通过对其设备文件的读写来完成对设备的交互:

那么,想要使用字符设备驱动就首先得有一个字符设备文件,创建一个字符设备文件的方式有两种:

驱动初始化

因为驱动程序是一个内核模块,所以驱动的初始化操作是放在内核模块的初始化函数里:

主要流程如下:

下面展示一段示例代码:

下面来解释一下这段初始化代码中的函数和数据结构:

Struct cdev是用来表示设备的结构体,具体实现如下:

其中比较重要的就是其中特殊颜色的几个属性,设备操作集是指一些操作函数。设备号是用来标示设备的。设备数是用来表示同类型的设备一共有几个,这几个设备的主设备号相同,次设备号不同。比如串口1,串口2,它们的主设备号相同,次设备号不同。

Cdev有两种分配方式:

Det_t类型,指的是设备号。实际为32位的无符号整型。这个32位无符号整型包含了两部分,分别是主设备号,和次设备号,它们相互转化的方式为:

分配一个设备号的方式有两种:

因为设备号是一种资源,所以当驱动退出的时候,应该使用unregister_chrdev_region函数释放掉这个设备号。

Struct file_operations是一个函数指针的集合,定义的是能在设备上进行的操作,这个结构体里就是各种函数指针,你需要重新给这些函数指针赋值,来重定向各种文件操作。下面是给这个结构体赋值的语句。

关于上面那种赋值方式只说明两点:1.无所谓顺序。2.注意下面:

Cedv_init函数使用来初始化cdev结构体的,主要是为了将操作函数集加入到cdev中。

Cdev_add用来向内核注册一个设备:

实现设备操作:

一般来说:常用的设备操作有以下几个:

v int (*open) (struct inode *, struct file *)打开设备,响应open系统

Open设备方法是驱动程序用来为以后的操作完成初始化准备工作的,在绝大部分驱动程序中,open完成如下工作:

1. 标明设备号。

2. 启动设备

解释一下其中的比较重要的结构体:

Struct file,在linux系统中,每一个打开的文件关联一个struct file结构,在内核打开文件的时候创建,在文件关闭后释放。他的重要成员如下:

Struct inode,在linux中,每一个存在于文件系统里的文件都会关联一个inode结构(不论有没有打开),该结构主要记录物理信息,主要数据结构如下:

例子程序如下:

v int (*release) (struct inode *, struct file *);关闭设备,响应close系统调用

Release方法要做的就是关闭设备。

下面是示例代码:

v loff_t (*llseek) (struct file *, loff_t, int)重定位读写指针,响应lseek系统调用

文件当前读写指针重定位:

示例代码:

v ssize_t (*read) (struct file *, char __user *, size_t, loff_t *)从设备读取数据,响应read系统调用

参数意义如下:

Read设备方法通常完成两件事情:

1. 从设备中读取数据(属于硬件访问类操作)。

2. 将读取到的数据返回给应用程序。

示例代码:

用一张图说明read函数的工作流程:

v ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)向设备写入数据,响应write系统调用

Write设备方法通常完成两件事:

1. 从应用程序提供的地址中取出数据,

2. 将数据写入设备(属于硬件访问类操作)。

驱动注销:

从内核中卸载驱动程序的时候,需要使用cdev_del函数来完成字符设备的注销。

示例代码:

来自为知笔记(Wiz)

时间: 2024-11-04 16:34:07

基本驱动模型的相关文章

Linux 驱动之 platform 驱动模型总结 (基于tiny210 平台 LED 驱动)

1.概述 在一般情况下,2.6内核中已经初始化并挂载了一条platform总线在sysfs文件系统中.那么我们编写platform模型驱动时,需要完成两个工作:1:实现platform驱动 2:实现platform设备,然而在实现这两个工作的过程中还需要实现其他的很多小工作,在后面介绍.platform模型驱动的实现过程核心架构就很简单,如下所示. platform驱动模型三个对象:platform总线.platform设备.platform驱动. platform总线对应的内核结构:struc

20150223 IMX257 设备驱动模型之Kobject(一)

20150223 IMX257 设备驱动模型之Kobject(一) 2015-02-23 李海沿 接下来我们开始涉及设备驱动模型,从简入深,我们先写一个驱动,实现的功能就是在sys目录下建立一个目录和一个属性文件,可读可写. 所以今天的任务就是把这个程序搞定,只要把这几个结构体了解,知道有这个结构体就够了,很晚了,剩下的我们交给明天吧. 一.结构体参数解释 1. kobject kobject是设备驱动模型的基础.sysfs是基于kobject建立起来的. struct kobject{ con

浅析Linux驱动模型中的底层数据结构kobject和kset

1.kobject Linux内核用kobject来表示一个内核对象.它和Sysfs文件系统联系密切,在内核中注册到系统中的每个kobject对象在sysfs文件系统中对对应着一个文件目录.kobject数据结构通常的用法是嵌入到其对他的数据结构中(即容器,比如cdev结构),用于实现内核对该类数据结构对象的管理.这些数据结构(容器)通过kobject连接起来,形成了一个树状结构. 它在源码中的定义为: /*<include/linux/kobject.h>*/ struct kobject

linux总线设备驱动模型

本篇文章通过平台总线设备模型为例,讲解总线设备驱动模型: platform_device_register的作用: 1.把device放入bus的device链表 2.从bus的driver链表中取出每一个driver,用bus的match函数判断driver能否支持这个device 3.若可以支持,调用driver的probe函数 platform_driver_register的作用: 1.将driver放入bus的driver链表 2.从bus的device链表中取出每一个device,用

SylixOS块设备驱动模型

1. 块设备简介 块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块有自己的地址,数据块大小通常在512字节到32768字节之间.块设备的基本特征是每个块都能独立于其他块而读写.磁盘是最常见的块设备. 2. 技术实现 SylixOS实现了兼容POSIX标准的输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的概念,认为一切皆为文件.本章介绍SylixOS在I/O层之下提供的块设备模型,用户驱动可以使用此标准化的设备模型来编写,这样可以对上层提供统一的.标准的设备API,

字符设备驱动模型

1.设备描述结构cdev驱动模型种类繁多,这就需要我从众多的模型中提取出他们的一些共性:a.驱动初始化a.1 分配设备描述结构a.2 初始化设备描述结构a.3 注册设备描述结构a.4 硬件初始化b.实现设备操作c.驱动注销 ------------------------------------------------------------------ 设备描述结构:在任何一种驱动模型中,设备都会用的内核中的一种结构来描述,我们的字符设备在内核中使用struct cdev 来来描述.struc

Linux内核部件分析 设备驱动模型之device

来源:Linux社区 -- http://www.linuxidc.com/Linux/2011-10/44627p6.htm 作者 : qb_2008 linux的设备驱动模型,是建立在sysfs和kobject之上的,由总线.设备.驱动.类所组成的关系结构.从本节开始,我们将对linux这一设备驱动模型进行深入分析. 头文件是include/linux/device.h,实现在drivers/base目录中.本节要分析的,是其中的设备,主要在core.c中. struct device {

Linux RTC驱动模型分析

RTC简介 RTC(real-time clock)简称实时时钟,主要作用是用来记时,产生闹钟等.RTC因为有备份电池,所以即使计算机关机掉电,也不会影响RTC记时.而RTC和系统时间(主要靠软件模拟)的区别在于,RTC会在掉电后数据不丢失,在下次启动依旧可以重新设置当前时间给计算机.而系统时间主要靠软件模拟产生,在掉电之后会丢失,需要在下次计算机重新启动之后重新模拟产生.RTC时间在每次系统启动的时候会使用,在以后需要的时候会将设置的时间写入到RTC中,别的时候获取时间都通过软件可以获得. R

8.总线设备驱动模型

总线设备驱动模型 总线:创建一条总线,跟我们前面的按键一样,首先是描述总线结构,接着是注册总线,注销总线.总线设备,例如usb总线,上面会有很多类型的usb的驱动,例如鼠标.键盘.....等,当我们把之一的usb插上的时候,usb总线会把每个驱动遍历一遍,找到相应的驱动程序执行. 接下来用bus.c创建一条总线. #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #in

平台设备驱动模型

对于字符设备驱动程序,之前都是在驱动程序中定义并设置file_operations结构体,实现各种需要用到的函数,注册file_operations结构体,框架比较简单,但是在Linux中,却很少看见这样框架的代码,那是因为在Linux中设备驱动模型一般都由总线.设备.驱动这个三大部分组成.这是一种分层分离的思想: 分层:核心层和设备相关层分开. 分离:讲硬件相关的代码和驱动分开. 这就是总线设备驱动(bus_drv_dev)模型: 对于dev模块,当调用device_add函数时: a.会将d