当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 字符设备驱动

字符设备驱动 时间:2019-09-25      来源:创客学院,权老师

在linux系统中我们一直在说驱动,那么我们的驱动到底是什么东西呢?它又有什么作用呢?下面让我们从最常见、最常用的字符设备驱动入手,掌握linux驱动开发的精髓。

一、驱动到底是什么?

1、概念:安装操作系统之后,如果没有外围硬件的支持,用户想操作的功能就实现不了,需要驱动工程师开发相应的驱动(硬件),有驱动代码来操作硬件,完成相应的工作。

2、这里我们区分这样两个概念,大部分做过stm32开发的会说我以前直接操作寄存器也能实现硬件的驱动,那么与linux内核的驱动又有什么不同?我们都知道我们的linux内核具有五大功能:内存管理、进程管理、文件管理、网络管理、设备管理。

1)、ARM裸机驱动:这段代码是不需要依赖其他的代码,由汇编语言或者c语言直接操作硬件寄存器。

2)、内核驱动:这一小段代码必须依赖内核才能够实现相应的功能,又C语言开发,这段代码在写时必须依赖一定框架。

二、驱动的种类

在Linux系统驱动程序中,我们要面临各种硬件设备,所以我们的设备驱动有很多,比如: LED驱动,LCD驱动,触摸屏驱动,摄像头驱动,鼠标,键盘,u盘,硬盘,Flash,网卡,猫,路由器等等。

1、我们通常将这些驱动划分为这几类:   

一)、字符设备驱动:字符设备驱动是以字节为单位,顺序访问的,字符设备是面向流的设备,也是我们最常见的一类设备驱动,常见的有鼠标、键盘、LED设备等。

二)、块设备驱动:在访问的时候是以扇区或者块(512字节),访问时是无序的,包括硬盘、U盘,磁盘和SD卡等。

三)、 网卡设备驱动:网络适配器就是计算机的网络连接设备,俗称网卡,网卡通常有有线网卡和无线网卡,这就是硬件设备,而网卡驱动是配套的软件,这个不怎么常见。

三、驱动的框架

     我们通过驱动的一个层次架构模型可以清晰直观的看到我们的驱动所处的位置有多重要。

    四、字符设备驱动

    1、那么对于刚接触驱动的我们来说如何快速编写一个驱动程序呢?

最好也是最快的方法是参考内核源代码中的demo。例如现在,我想编写我们第一个字符驱动程序,那么我们可以看看别人是怎么实现的,在内核driver目录下找到led的驱动程序,参考别人是如何实现。还有就是厂家的参考demo。这是我们最快的学习方式。

2、下面我们要开始码代码了:

   我们编写一个字符设备文件,通常有这么几步:

    一)、定义结构体对象 struct cdev *cdev;

二)、为结构体分配空间

三)、对cdev结构体对象初始化

四)、分配设备号

五)、字符设备驱动的注册(cdev和设备号关联的过程)

     我们首先写出几个函数模型,例如open、read、write。

然后我们要告诉内核有这两个函数,通过file_operations 这个结构体来完成,通常定义在内核的include/linux/fs.h文件中,当应用程序操作设备文件时所调用的open、read、write等函数,最终会调用这个结构中所指定的对应函数:

然后通过一个函数告诉内核:

然后由我们的模块入口函数指定的函数来调用上面这个函数,也就是我们的mycdev_init函数,里面完成了为cdev分配空间、设备号的申请、字符设备驱动的注册等:

设备号:主设备号和次设备号(二者一起为设备号):一个字符设备或块设备都有一个主设备号和一个次设备号。主设备号用来标识与设备文件相连的驱动程序,用来反映设备类型。次设备号被驱动程序用来辨别操作的是哪个设备,用来区分同类型的设备。

最后我们在模块的出口函数进行资源的释放。

下面这是我们编写的Makefile

最后,我们通过手动创建设备文件:

sudo mknod /dev/first_drv(可以在任何路径下) c 主设备号 次设备号

sudo chmod 777 /dev/first_drv

然后通过cat  /proc/devices就可以查看我们添加的设备文件,

上一篇:ARM指令集详解

下一篇:嵌入式c语言编码规范

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部