设备驱动程序的加载涉及几个重要的概念,下面分别进行介绍。在Linux下,操作系统没有对I/O端口屏蔽,任何驱动程序都可以对任意的I/O端口操作,这样很容易引起混乱,因此每个驱动程序都应该避免误用端口。......
2023-11-19
设备驱动程序通过功能接口函数完成对设备的各种操作。一个设备驱动程序模块包含有5个部分的功能接口函数:
(1)驱动程序的注册与释放;
(2)设备的打开与关闭;
(3)设备的读写操作;
(4)设备的控件操作;
(5)设备的中断或轮询处理。
下面对功能接口函数进行具体介绍。
1.设备驱动程序的注册与释放
设备要能使操作系统找到并正确识别,必须向内核注册。设备的注册函数通常包含在设备驱动程序的初始化模块中。
字符设备的注册函数为:
devfs_register_chrdev(Demo_ID,"demo_drv",&Test_ctl_ops);
其中:参数Demo_ID是设备驱动程序向系统申请的主设备号,Linux系统通过设备号来区分不同的设备,“demo_drv”是设备名。该设备名与在文件系中创建的设备进人点一致,&Test_ctL_ops为驱动程序中所定义的结构体struct file_options,在这个数据体中定义了设备的各种操作功能。如果设备注册成功,则设备名就会出现在proc/devices文件里。
一旦将设备注册到内核表中,对它的操作就与指定的主设备号相联系。无论何时对与主设备号相匹配的设备文件进行操作,内核都会从file_operations结构体中找出并调用相应的功能函数。
从本质上来说,设备注册的过程,其实就是将设备驱动程序与该设备的设备号及设备名(设备节点)相关联。
将不需要的资源及时释放是一个良好的设计习惯。释放设备资源只需要调用函数。
devfs_unregister_chrdev(Demo_ID,"demo drv");
块设备的注册函数为:
devfs_register_blkdev()
块设备的注销函数为:
devfs_unregister_blkdev()
2.设备的打开与关闭
(1)open()函数。在设备驱动程序中,设备的打开操作由功能接口函数open()完成。它主要提供驱动程序初始化的能力,为以后对设备进行I/O操作做准备。(www.chuimin.cn)
如果功能接口函数的返回值为O,表示打开设备成功;如果返回值为负数,则表示打开设备失败,比如设备尚未准备好。
如果设备驱动程序没有提供功能接口函数open()入口,则只要/dev目录下设备文件存在,就默认这个函数为NULL,那么,设备的打开操作永远成功,且系统不通知驱动程序,就默认为打开设备成功。
(2)release()函数。release()函数是释放设备的接口。需要指出的是,释放设备和关闭设备是完全不同的。当一个进程释放设备时,其他进程还可以继续使用该设备,只是暂时停止对该设备的使用。而当一个进程关闭设备时,其他进程必须重新打开此设备才能使用。
open()和release()这两个接口函数所需要的头文件为:
#include<linux/kernel.h>
3.设备的读写操作
在设备驱动程序中,由接口函数read()和write()完成字符设备的读写操作。函数read()和write()的主要任务就是把内核空间的数据复制到用户空间,或者从用户空间把数据复制到内核空间。
read()和write()这两个接口函数所需要的头文件为:
#include<linux/fs.h>
4.设备的控制操作
在设备驱动程序中,接口函数ioctl(),主要用于对设备进行读写之外的其他控制操作。函数ioct()的操作与设备密切相关。比如,串口的传输波特率、马达的转速等,这些操作一般无法通过read()和write()操作来完成。
在用户空间ioctl函数的定义为:
int ioctl(int fd,ind cmd,…);
其中,fd是用户程序打开设备时使用open丽数返回的文件标识符;cmd是用户程序对设备的控制命令;后面的省略号代表可选参数,一般最多一个,有或没有是和cmd的意义相关的。
在驱动程序中定义的ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl()的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。
ioctl()接口函数所需要的头文件为:
#include<linux/fs.h>
5.设备中断与设备循环查询处理
在设备驱动程序的初始化模块中还定义了设备中断。设备驱动程序通过调用request_irq()函数来申请中断,并通过中断信息将中断号和中断服务联系起来。中断使用结束。可以通过调用free_irq()函数来释放中断。
对于不支持中断处理的设备,在对其进行读写操作时驱动程序需要循环查询设备的状态,以便决定是否继续进行数据处理。
有关ARM嵌入式系统原理与应用的文章
设备驱动程序的加载涉及几个重要的概念,下面分别进行介绍。在Linux下,操作系统没有对I/O端口屏蔽,任何驱动程序都可以对任意的I/O端口操作,这样很容易引起混乱,因此每个驱动程序都应该避免误用端口。......
2023-11-19
图8-20合并单元定义合并单元按照功能可分为间隔合并单元和母线合并单元。间隔合并单元用于线路或变压器的间隔合并单元,发送一个间隔的电气量数据。通过RP1285/RP1286或RP1296板件上的FT3接口或SMV9-2接口接收来自母线合并单元的数据,并完成切换功能。NSR-386A 间隔合并单元的前面板如图8-21 所示。合并单元通过 RP1296 采集电子式互感器输入电压。......
2023-06-28
I/O接口是一组电子电路,它是CPU和I/O设备之间交换信息的媒介和桥梁,负责实现CPU通过系统总线把I/O电路和外围设备联系在一起。1)I/O接口的功能由于计算机的外围设备品种繁多,特性各异,每种设备都有各自的接口。PC中常见的接口标准有IDE接口、USB接口、显示器输出接口等,图2.23显示的是机箱背面的I/O接口。图2.23 PC机箱背面的I/O接口IDE接口和SATA接口IDE接口主要用于连接硬盘、光驱和软驱,采用并行双向传送方式,体积小,数据传输速率快。......
2023-10-22
SPC3只集成了传输技术的部分功能,而没有集成模拟功能、FDL 传输协议。它支持接口功能、FMA功能和整个DP从站协议。SPC3内部集成了1.5 KB的双口RAM作为SPC3与软件/程序的接口。基址指针可位于存储器的任何段。SPC3为最佳诊断提供两个诊断缓存器,用户可存入刷新的诊断数据。在这一过程中,有一诊断缓存总是分配给SPC3。SPC3有一个共同的中断输出。在UART中,并行、串行数据相互转换,SPC3能自动调整波特率。......
2023-11-22
因此,驱动程序的设计,要求开发人员熟悉Linux的内核机制、驱动程序和用户级应用程序的接口关系、系统中对设备的并发操作,同时要求开发人员非常熟悉所开发硬件的工作原理。嵌入式Linux中的设备驱动程序有以下三个方面的特点。......
2023-11-19
PSMU 602 合并单元,适用于 110 kV及以上各电压等级智能变电站,配合传统电流、电压互感器,实现二次输出模拟量的数字采样及同步,并通过DL/T 860.92及 GB/T 20840.8规定的标准规约格式,向站内保护、测控、录波、PMU 等智能电子设备输出采样值。110 kV 线路、母联分段各配置 1 台智能终端,分别安装在各间隔 GIS 就地智能柜,主进单元配置 2 台智能终端。电压互感器间隔:220 kV 及 110 kV 每段母线电压互感器配置1台智能终端,布置于各间隔电压互感器控制柜内。......
2023-06-28
输入设备用于把原始数据和处理数据的程序输入到计算机中。③图像输入设备:数码相机、扫描仪等。④语音输入设备:语言模数转换识别系统等。下面介绍目前几种常用的输入设备,并简要说明它们的功能。3)数码相机数码相机是一种利用电子传感器把光学影像转换成电子数据的照相机,是一种重要的图像输入设备。......
2023-10-22
相关推荐